aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/bloodasp/galacticgreg/GT_TileEntity_Ores_Space.java144
-rw-r--r--src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_Layer_Space.java390
-rw-r--r--src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_SmallPieces_Space.java123
-rw-r--r--src/main/java/bloodasp/galacticgreg/GT_Worldgenerator_Space.java578
-rw-r--r--src/main/java/bloodasp/galacticgreg/GalacticGreg.java143
-rw-r--r--src/main/java/bloodasp/galacticgreg/ModRegisterer.java283
-rw-r--r--src/main/java/bloodasp/galacticgreg/WorldGenGaGT.java89
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/AsteroidBlockComb.java77
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/BlockMetaComb.java50
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/Enums.java57
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/GTOreTypes.java66
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/ISpaceObjectGenerator.java58
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/ModContainer.java85
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/ModDBMDef.java165
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/ModDimensionDef.java470
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/SpecialBlockComb.java71
-rw-r--r--src/main/java/bloodasp/galacticgreg/api/StructureInformation.java59
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/ConfigManager.java79
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/GTOreGroup.java19
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/GalacticGregConfig.java141
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/LogHelper.java267
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/PlayerChatHelper.java106
-rw-r--r--src/main/java/bloodasp/galacticgreg/auxiliary/ProfilingStorage.java74
-rw-r--r--src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_Layer_Space.java271
-rw-r--r--src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_SmallOre_Space.java165
-rw-r--r--src/main/java/bloodasp/galacticgreg/command/AEStorageCommand.java180
-rw-r--r--src/main/java/bloodasp/galacticgreg/command/ProfilingCommand.java99
-rw-r--r--src/main/java/bloodasp/galacticgreg/dynconfig/DynamicDimensionConfig.java168
-rw-r--r--src/main/java/bloodasp/galacticgreg/dynconfig/DynamicOreMixWorldConfig.java93
-rw-r--r--src/main/java/bloodasp/galacticgreg/generators/GenEllipsoid.java126
-rw-r--r--src/main/java/bloodasp/galacticgreg/registry/GalacticGregRegistry.java181
-rw-r--r--src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematic.java100
-rw-r--r--src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicFactory.java33
-rw-r--r--src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java182
-rw-r--r--src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicWrapper.java104
-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/com/github/technus/tectech/Reference.java15
-rw-r--r--src/main/java/com/github/technus/tectech/TecTech.java119
-rw-r--r--src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java307
-rw-r--r--src/main/java/com/github/technus/tectech/loader/MainLoader.java202
-rw-r--r--src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java25
-rw-r--r--src/main/java/com/github/technus/tectech/loader/TecTechConfig.java257
-rw-r--r--src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java37
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java3029
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java128
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java49
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java46
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java57
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java57
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java563
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java3272
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java48
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java2101
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java21
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java99
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java104
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java62
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java50
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java134
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java39
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java47
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java145
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java12
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java17
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java11
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java136
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java149
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java57
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java169
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java24
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java81
-rw-r--r--src/main/java/com/github/technus/tectech/proxy/ClientProxy.java182
-rw-r--r--src/main/java/com/github/technus/tectech/proxy/CommonProxy.java94
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java206
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java499
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java184
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java82
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java76
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java101
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java278
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java77
-rw-r--r--src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java98
-rw-r--r--src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java270
-rw-r--r--src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java91
-rw-r--r--src/main/java/com/github/technus/tectech/thing/CustomItemList.java609
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java79
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java70
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java107
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java30
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java122
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java111
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java33
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java129
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java104
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java104
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java96
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java36
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java130
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java200
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java77
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java227
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java64
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java196
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java111
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java15
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java133
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java114
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java56
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java47
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java46
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java124
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java120
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java117
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java28
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java120
-rw-r--r--src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java252
-rw-r--r--src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java53
-rw-r--r--src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java71
-rw-r--r--src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java44
-rw-r--r--src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java184
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java53
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java56
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java169
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java234
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java55
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java91
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java108
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java72
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java87
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java54
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java318
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java268
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java133
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java96
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java58
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java202
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java128
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java225
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java134
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java152
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java181
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java102
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java246
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java116
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java141
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java559
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java291
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java470
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java474
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java216
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java5101
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java5429
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java1767
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java2385
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java525
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java302
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java315
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java823
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java291
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java221
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java348
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java1080
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java2823
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java6
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java6
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java64
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java327
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java59
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java25
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java497
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java529
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java227
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java226
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java228
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java52
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java52
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java316
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java285
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java271
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java246
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java392
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java300
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java239
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java73
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java404
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java49
-rw-r--r--src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java0
-rw-r--r--src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java143
-rw-r--r--src/main/java/com/github/technus/tectech/util/CommonValues.java33
-rw-r--r--src/main/java/com/github/technus/tectech/util/Converter.java41
-rw-r--r--src/main/java/com/github/technus/tectech/util/FluidStackLong.java29
-rw-r--r--src/main/java/com/github/technus/tectech/util/GodforgeMath.java308
-rw-r--r--src/main/java/com/github/technus/tectech/util/ItemStackLong.java28
-rw-r--r--src/main/java/com/github/technus/tectech/util/TT_Utility.java192
-rw-r--r--src/main/java/gregtech/api/enums/TAE.java145
-rw-r--r--src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java23
-rw-r--r--src/main/java/gregtech/api/util/FishPondFakeRecipe.java80
-rw-r--r--src/main/java/gregtech/api/util/GasSpargingRecipe.java103
-rw-r--r--src/main/java/gregtech/api/util/GasSpargingRecipeMap.java45
-rw-r--r--src/main/java/gregtech/api/util/HotFuel.java40
-rw-r--r--src/main/java/gregtech/api/util/SemiFluidFuelHandler.java136
-rw-r--r--src/main/java/gtPlusPlus/GTplusplus.java395
-rw-r--r--src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java139
-rw-r--r--src/main/java/gtPlusPlus/api/interfaces/IPlugin.java41
-rw-r--r--src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java15
-rw-r--r--src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java6
-rw-r--r--src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java7
-rw-r--r--src/main/java/gtPlusPlus/api/objects/Logger.java162
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/AutoMap.java364
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/Pair.java35
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/Quad.java44
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/Triplet.java26
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java177
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java102
-rw-r--r--src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java14
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java67
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java185
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java231
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java245
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java56
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java33
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java57
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java34
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java65
-rw-r--r--src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java251
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java68
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java17
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java232
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java46
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java147
-rw-r--r--src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java57
-rw-r--r--src/main/java/gtPlusPlus/core/block/ModBlocks.java104
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BasicBlock.java70
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java322
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java102
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java245
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java217
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java100
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java197
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java141
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/HellFire.java535
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/LightGlass.java137
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java193
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java161
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java68
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java153
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java186
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/FishTrap.java136
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java137
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java177
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java160
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java558
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java157
-rw-r--r--src/main/java/gtPlusPlus/core/client/CustomTextureSet.java30
-rw-r--r--src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java45
-rw-r--r--src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java87
-rw-r--r--src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java117
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java84
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java2469
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java92
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java111
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java96
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java163
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java89
-rw-r--r--src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java105
-rw-r--r--src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java279
-rw-r--r--src/main/java/gtPlusPlus/core/commands/CommandMath.java92
-rw-r--r--src/main/java/gtPlusPlus/core/commands/CommandUtils.java18
-rw-r--r--src/main/java/gtPlusPlus/core/common/CommonProxy.java210
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java58
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java18
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java14
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java58
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java47
-rw-r--r--src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java28
-rw-r--r--src/main/java/gtPlusPlus/core/config/ConfigHandler.java670
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java176
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java133
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_FishTrap.java134
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_PestKiller.java147
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java196
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java232
-rw-r--r--src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java170
-rw-r--r--src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java25
-rw-r--r--src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java405
-rw-r--r--src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java64
-rw-r--r--src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java224
-rw-r--r--src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java652
-rw-r--r--src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java79
-rw-r--r--src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java334
-rw-r--r--src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java65
-rw-r--r--src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java52
-rw-r--r--src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java14
-rw-r--r--src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java47
-rw-r--r--src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java10
-rw-r--r--src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java28
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java46
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java54
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java52
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java175
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java58
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java88
-rw-r--r--src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java228
-rw-r--r--src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java104
-rw-r--r--src/main/java/gtPlusPlus/core/handler/AchievementHandler.java491
-rw-r--r--src/main/java/gtPlusPlus/core/handler/BookHandler.java486
-rw-r--r--src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java35
-rw-r--r--src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java299
-rw-r--r--src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java50
-rw-r--r--src/main/java/gtPlusPlus/core/handler/GuiHandler.java159
-rw-r--r--src/main/java/gtPlusPlus/core/handler/PacketHandler.java94
-rw-r--r--src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java38
-rw-r--r--src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java27
-rw-r--r--src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java25
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java144
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java61
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java126
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java20
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java109
-rw-r--r--src/main/java/gtPlusPlus/core/handler/events/SneakManager.java131
-rw-r--r--src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java161
-rw-r--r--src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java16
-rw-r--r--src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java4
-rw-r--r--src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java52
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java156
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java157
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java157
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java157
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java157
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java154
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java156
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java173
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java160
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java173
-rw-r--r--src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java160
-rw-r--r--src/main/java/gtPlusPlus/core/item/ModItems.java988
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java42
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java100
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java459
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java194
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java69
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java332
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java30
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java238
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/CoreItem.java286
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java73
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java76
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java135
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java164
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java20
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java111
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java106
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java51
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java184
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java106
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java148
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java154
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java66
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java24
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java272
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java23
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java12
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java91
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java11
-rw-r--r--src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java133
-rw-r--r--src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java261
-rw-r--r--src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java220
-rw-r--r--src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java120
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java667
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java319
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java961
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java171
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java752
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java105
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java562
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java156
-rw-r--r--src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java321
-rw-r--r--src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java213
-rw-r--r--src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java92
-rw-r--r--src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java509
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/BufferCore.java68
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java143
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java152
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java297
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java232
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java18
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java197
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java56
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java419
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java84
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java260
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java122
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java72
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java70
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java70
-rw-r--r--src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java278
-rw-r--r--src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java50
-rw-r--r--src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java97
-rw-r--r--src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java1320
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java14
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java38
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java10
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java9
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java179
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java61
-rw-r--r--src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java35
-rw-r--r--src/main/java/gtPlusPlus/core/lib/CORE.java242
-rw-r--r--src/main/java/gtPlusPlus/core/lib/VanillaColours.java43
-rw-r--r--src/main/java/gtPlusPlus/core/material/ALLOY.java828
-rw-r--r--src/main/java/gtPlusPlus/core/material/ELEMENT.java651
-rw-r--r--src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java592
-rw-r--r--src/main/java/gtPlusPlus/core/material/Material.java1725
-rw-r--r--src/main/java/gtPlusPlus/core/material/MaterialGenerator.java428
-rw-r--r--src/main/java/gtPlusPlus/core/material/MaterialStack.java116
-rw-r--r--src/main/java/gtPlusPlus/core/material/NONMATERIAL.java42
-rw-r--r--src/main/java/gtPlusPlus/core/material/ORES.java701
-rw-r--r--src/main/java/gtPlusPlus/core/material/Particle.java154
-rw-r--r--src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java244
-rw-r--r--src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java311
-rw-r--r--src/main/java/gtPlusPlus/core/material/state/MaterialState.java22
-rw-r--r--src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java14
-rw-r--r--src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java38
-rw-r--r--src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java14
-rw-r--r--src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java8
-rw-r--r--src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java127
-rw-r--r--src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java126
-rw-r--r--src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java10
-rw-r--r--src/main/java/gtPlusPlus/core/proxy/ClientProxy.java190
-rw-r--r--src/main/java/gtPlusPlus/core/proxy/ServerProxy.java28
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java114
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java1806
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java475
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java135
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java10
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java2960
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java168
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java142
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java118
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java62
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java50
-rw-r--r--src/main/java/gtPlusPlus/core/recipe/common/CI.java1008
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotCrafting.java154
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java139
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotDataStick.java42
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotGeneric.java22
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java110
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotJukebox.java35
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotNoInput.java22
-rw-r--r--src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java28
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java35
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java1419
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java313
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java378
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java294
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java148
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java418
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java140
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java241
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java532
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java128
-rw-r--r--src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java165
-rw-r--r--src/main/java/gtPlusPlus/core/util/MovingAverageLong.java59
-rw-r--r--src/main/java/gtPlusPlus/core/util/Utils.java436
-rw-r--r--src/main/java/gtPlusPlus/core/util/data/AES.java135
-rw-r--r--src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java44
-rw-r--r--src/main/java/gtPlusPlus/core/util/data/FileUtils.java112
-rw-r--r--src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java86
-rw-r--r--src/main/java/gtPlusPlus/core/util/data/StringUtils.java177
-rw-r--r--src/main/java/gtPlusPlus/core/util/math/MathUtils.java528
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java146
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java667
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java68
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java1012
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java41
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java372
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java133
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java164
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java20
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java206
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java465
-rw-r--r--src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java147
-rw-r--r--src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java95
-rw-r--r--src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java116
-rw-r--r--src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java77
-rw-r--r--src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java727
-rw-r--r--src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java37
-rw-r--r--src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java31
-rw-r--r--src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java442
-rw-r--r--src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java194
-rw-r--r--src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java361
-rw-r--r--src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java83
-rw-r--r--src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java26
-rw-r--r--src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java32
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java23
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java68
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java26
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java70
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java393
-rw-r--r--src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java73
-rw-r--r--src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java560
-rw-r--r--src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java29
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java25
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java90
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java49
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java580
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java590
-rw-r--r--src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java263
-rw-r--r--src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java37
-rw-r--r--src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java113
-rw-r--r--src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java472
-rw-r--r--src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java250
-rw-r--r--src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java59
-rw-r--r--src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java273
-rw-r--r--src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java502
-rw-r--r--src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java102
-rw-r--r--src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java126
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java49
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java10
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java1257
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java56
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java12
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java77
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java268
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java225
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java129
-rw-r--r--src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java4
-rw-r--r--src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java6
-rw-r--r--src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java101
-rw-r--r--src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java64
-rw-r--r--src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java85
-rw-r--r--src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java131
-rw-r--r--src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java94
-rw-r--r--src/main/java/gtPlusPlus/preloader/CORE_Preloader.java33
-rw-r--r--src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java103
-rw-r--r--src/main/java/gtPlusPlus/preloader/Preloader_Logger.java50
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java144
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java70
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java47
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java187
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java233
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java297
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java317
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java79
-rw-r--r--src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java92
-rw-r--r--src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java134
-rw-r--r--src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java73
-rw-r--r--src/main/java/gtPlusPlus/recipes/RecipeRemovals.java107
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java16
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java109
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java34
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java67
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java73
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java41
-rw-r--r--src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java17
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java178
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java173
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java106
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java85
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java166
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java41
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java52
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java12
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java65
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java172
-rw-r--r--src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java310
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java23
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java94
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java604
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java172
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java76
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java142
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java62
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java61
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java60
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java61
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java120
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java14
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java126
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java142
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java131
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java131
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java92
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java110
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java134
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java50
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java301
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java86
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java69
-rw-r--r--src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java89
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java98
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java980
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java39
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java1324
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java9
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java139
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java40
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java40
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java380
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java46
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java202
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java204
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java357
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java745
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java266
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java692
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java78
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java128
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java37
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java67
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java229
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java255
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java235
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java370
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java203
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java222
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java75
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java72
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java279
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java215
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java435
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java221
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java65
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java105
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java117
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java156
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java49
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java214
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java74
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java117
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java1799
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java428
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java361
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java241
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java338
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java180
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java71
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java71
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java353
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java28
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java27
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java147
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java55
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java123
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java35
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java96
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java79
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java111
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java379
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java126
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java159
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java341
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java151
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java91
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java10
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java67
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java76
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java120
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java99
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java84
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java146
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java57
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java71
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java61
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java151
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java134
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java486
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java51
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java410
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java16
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java203
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java184
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java346
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java62
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java19
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java125
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java256
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java222
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java292
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java54
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java91
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java225
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java140
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java50
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java500
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java107
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java1250
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java873
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java834
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java644
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java333
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java52
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java52
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java52
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java173
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java176
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java156
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java379
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java59
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java42
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java716
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java893
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java458
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java502
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java190
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java672
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java168
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java223
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java337
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java228
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java342
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java209
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java230
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java250
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java169
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java194
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java204
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java244
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java458
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java213
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java241
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java514
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java218
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java209
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java184
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java261
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java372
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java215
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java529
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java224
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java507
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java491
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java333
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java200
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java200
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java414
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java177
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java156
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java165
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java196
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java353
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java352
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java287
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java524
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java809
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java235
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java331
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java489
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java367
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java524
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java332
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java337
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java939
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java220
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java675
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java376
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java676
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java468
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java208
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java314
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java126
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java204
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java215
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java893
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java939
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java343
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java250
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java194
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java439
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java92
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java175
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java96
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java34
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java133
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java137
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java63
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java69
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java15
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java321
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java252
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java448
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java159
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java222
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java212
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java267
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java318
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java112
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java187
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java750
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java62
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java225
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java400
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java222
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java13
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java192
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java661
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java45
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java395
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java135
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java78
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java680
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java258
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java719
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java1220
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java95
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java109
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java50
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java20
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java133
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java1269
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java278
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java19
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java199
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java149
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java44
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java78
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java163
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java22
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java31
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java137
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java15
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java22
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java24
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java25
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java26
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java93
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java48
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java93
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java61
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java20
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java22
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java98
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java46
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java166
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java46
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java30
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java30
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java29
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java13
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java31
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java21
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java96
-rw-r--r--src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java23
-rw-r--r--src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java15
-rw-r--r--src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java244
-rw-r--r--src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java77
-rw-r--r--src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java365
-rw-r--r--src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java73
-rw-r--r--src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java217
-rw-r--r--src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java22
-rw-r--r--src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java92
-rw-r--r--src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java165
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java36
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java178
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java61
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java192
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java23
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java69
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java75
-rw-r--r--src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java93
-rw-r--r--src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java30
-rw-r--r--src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java200
-rw-r--r--src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java129
-rw-r--r--src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java377
-rw-r--r--src/main/resources/META-INF/tectech_at.cfg17
-rw-r--r--src/main/resources/TecTechIcon.pngbin0 -> 395911 bytes
-rw-r--r--src/main/resources/TecTechIconSmall.pngbin0 -> 262972 bytes
-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.oggbin0 -> 236744 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.pngbin0 -> 812 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/background/brown.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.pngbin0 -> 994 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.pngbin0 -> 684 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.pngbin0 -> 714 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.pngbin0 -> 156 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.pngbin0 -> 133 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.pngbin0 -> 1002 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/slot/brown.pngbin0 -> 109 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.pngbin0 -> 559 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.pngbin0 -> 835 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.pngbin0 -> 666 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.pngbin0 -> 680 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.pngbin0 -> 680 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.pngbin0 -> 795 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.pngbin0 -> 623 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.pngbin0 -> 665 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.pngbin0 -> 125 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.pngbin0 -> 549 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/blocks/windmill_top.pngbin0 -> 591 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/Agarose.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BISOPelletBall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BWmotor.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BWrawtube.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DNASampleFlask.pngbin0 -> 775 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/DetergentPowder.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT2Coin.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.pngbin0 -> 5702 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.pngbin0 -> 5691 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.pngbin0 -> 5716 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.pngbin0 -> 6022 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.pngbin0 -> 5971 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.pngbin0 -> 6020 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.pngbin0 -> 5726 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.pngbin0 -> 5709 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.pngbin0 -> 5725 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.pngbin0 -> 6031 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.pngbin0 -> 5964 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.pngbin0 -> 6030 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.pngbin0 -> 5973 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.pngbin0 -> 5937 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.pngbin0 -> 5988 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.pngbin0 -> 5932 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.pngbin0 -> 5885 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.pngbin0 -> 5971 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.pngbin0 -> 5658 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.pngbin0 -> 5673 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.pngbin0 -> 5703 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/IncubationModule.pngbin0 -> 623 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.pngbin0 -> 2522 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmidCell.pngbin0 -> 777 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPellet.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/TransformationModule.pngbin0 -> 529 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/WrapOverlay.pngbin0 -> 496 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/completed_grindstone.pngbin0 -> 932 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/grindstone_bottom.pngbin0 -> 823 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/grindstone_top.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/petriDish.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.pngbin0 -> 699 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.pngbin0 -> 407 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.pngbin0 -> 600 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/paperParts.pngbin0 -> 510 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.pngbin0 -> 2294 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.pngbin0 -> 1295 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.pngbin0 -> 1123 bytes
-rw-r--r--src/main/resources/assets/bartworks/textures/items/rotors/woolParts.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.pngbin0 -> 934 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.pngbin0 -> 1048 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.pngbin0 -> 990 bytes
-rw-r--r--src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.pngbin0 -> 1260 bytes
-rw-r--r--src/main/resources/assets/forestry/AlvearyFrame.pngbin0 -> 931 bytes
-rw-r--r--src/main/resources/assets/forestry/AlvearyMutator.pngbin0 -> 731 bytes
-rw-r--r--src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.pngbin0 -> 670 bytes
-rw-r--r--src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.pngbin0 -> 670 bytes
-rw-r--r--src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.pngbin0 -> 558 bytes
-rw-r--r--src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.pngbin0 -> 558 bytes
-rw-r--r--src/main/resources/assets/galacticgreg/galacticgreg.pngbin0 -> 82740 bytes
-rw-r--r--src/main/resources/assets/gregtech/lang/en_US.lang285
-rw-r--r--src/main/resources/assets/gregtech/lang/zh_CN.lang224
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.pngbin0 -> 387 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.pngbin0 -> 345 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.pngbin0 -> 668 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 366 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.pngbin0 -> 704 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.pngbin0 -> 1049 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.pngbin0 -> 366 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.pngbin5227 -> 178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.pngbin0 -> 5538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.pngbin0 -> 685 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.pngbin0 -> 16790 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.pngbin0 -> 939 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.pngbin0 -> 943 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.pngbin0 -> 582 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.pngbin0 -> 1007 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.pngbin0 -> 874 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.pngbin0 -> 549 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.pngbin0 -> 683 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.pngbin0 -> 5289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.pngbin0 -> 687 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.pngbin0 -> 722 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.pngbin0 -> 592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.pngbin0 -> 2518 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.pngbin0 -> 2516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.pngbin0 -> 2586 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.pngbin0 -> 2519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.pngbin0 -> 2514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.pngbin0 -> 2542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.pngbin0 -> 2512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.pngbin0 -> 2517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.pngbin0 -> 5471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.pngbin0 -> 4267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.pngbin0 -> 3108 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.pngbin0 -> 3117 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.pngbin0 -> 3109 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.pngbin0 -> 3151 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.pngbin0 -> 3109 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.pngbin0 -> 3150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.pngbin0 -> 3084 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.pngbin0 -> 3095 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.pngbin0 -> 6006 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.pngbin0 -> 910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.pngbin0 -> 910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.pngbin0 -> 910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.pngbin0 -> 397 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.pngbin0 -> 4342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.pngbin0 -> 709 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.pngbin0 -> 9479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.pngbin0 -> 772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.pngbin0 -> 4254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.pngbin0 -> 597 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.pngbin0 -> 5153 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.pngbin0 -> 522 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.pngbin0 -> 4836 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.pngbin0 -> 3752 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.pngbin0 -> 3586 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.pngbin431 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.pngbin431 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.pngbin431 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.pngbin411 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.pngbin411 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.pngbin411 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.pngbin417 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.pngbin417 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.pngbin417 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.pngbin419 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.pngbin419 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.pngbin419 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.pngbin414 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.pngbin414 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.pngbin414 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.pngbin0 -> 4254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.pngbin0 -> 2206 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.pngbin0 -> 4286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.pngbin0 -> 662 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.pngbin0 -> 559 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.pngbin357 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.pngbin0 -> 6612 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.pngbin0 -> 7917 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.pngbin0 -> 8627 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.pngbin342 -> 1147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.pngbin0 -> 868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.pngbin0 -> 640 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.pngbin0 -> 730 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.pngbin0 -> 4267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.pngbin0 -> 783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.pngbin0 -> 849 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.pngbin0 -> 1041 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.pngbin0 -> 2422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.pngbin0 -> 2460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.pngbin0 -> 2463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.pngbin0 -> 2426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.pngbin0 -> 2449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.pngbin0 -> 2415 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.pngbin0 -> 2453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.pngbin0 -> 2465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.pngbin0 -> 5764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.pngbin0 -> 808 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.pngbin0 -> 799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.pngbin0 -> 592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.pngbin0 -> 527 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.pngbin0 -> 2387 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.pngbin0 -> 724 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.pngbin0 -> 634 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.pngbin0 -> 1156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.pngbin0 -> 1125 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.pngbin0 -> 1156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.pngbin0 -> 1145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.pngbin0 -> 1151 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.pngbin0 -> 1182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.pngbin0 -> 814 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.pngbin0 -> 1145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.pngbin0 -> 1096 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.pngbin0 -> 1123 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.pngbin0 -> 1137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.pngbin0 -> 1124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.pngbin0 -> 1152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.pngbin0 -> 838 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.pngbin0 -> 1233 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.pngbin0 -> 1319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.pngbin0 -> 536 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.pngbin0 -> 591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.pngbin0 -> 589 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.pngbin0 -> 487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.pngbin0 -> 632 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.pngbin0 -> 500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.pngbin0 -> 540 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.pngbin0 -> 2393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.pngbin0 -> 528 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.pngbin0 -> 1013 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.pngbin0 -> 1010 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.pngbin0 -> 433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.pngbin0 -> 859 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.pngbin0 -> 252 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.pngbin0 -> 487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.pngbin0 -> 594 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.pngbin0 -> 1646 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.pngbin0 -> 413 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.pngbin0 -> 285 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.pngbin0 -> 458 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.pngbin0 -> 487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.pngbin0 -> 594 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.pngbin0 -> 413 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.pngbin0 -> 458 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.pngbin0 -> 462 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.pngbin0 -> 538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.pngbin0 -> 568 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.pngbin0 -> 543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.pngbin0 -> 1464 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/bottle.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/ic2/lang/de_DE.lang29
-rw-r--r--src/main/resources/assets/ic2/lang/en_US.lang35
-rw-r--r--src/main/resources/assets/ic2/lang/zh_CN.lang35
-rw-r--r--src/main/resources/assets/ic2/textures/armor/hazmatEx_1.pngbin0 -> 2669 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/armor/hazmatEx_2.pngbin0 -> 967 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.pngbin0 -> 409 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.pngbin0 -> 445 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.pngbin0 -> 464 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.pngbin0 -> 608 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.pngbin0 -> 523 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.pngbin0 -> 542 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.pngbin0 -> 3650 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.pngbin0 -> 3748 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.pngbin0 -> 3748 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.pngbin0 -> 3748 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.pngbin0 -> 3748 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.pngbin0 -> 3502 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/death.oggbin0 -> 8428 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/hit1.oggbin0 -> 5843 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/hit2.oggbin0 -> 5455 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/hit3.oggbin0 -> 5424 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/hit4.oggbin0 -> 5160 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/idle1.oggbin0 -> 8605 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/idle2.oggbin0 -> 10948 bytes
-rw-r--r--src/main/resources/assets/minecraft/sounds/mob/witch/idle3.oggbin0 -> 7106 bytes
-rw-r--r--src/main/resources/assets/miscutils/lang/de_DE.lang1899
-rw-r--r--src/main/resources/assets/miscutils/lang/en_US.lang3572
-rw-r--r--src/main/resources/assets/miscutils/lang/ru_RU.lang3351
-rw-r--r--src/main/resources/assets/miscutils/lang/zh_CN.lang3351
-rw-r--r--src/main/resources/assets/miscutils/textures/DevCapeHD.pngbin0 -> 4788 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/FancyCapeHD.pngbin0 -> 9643 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/Orange.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/OrangeHD.pngbin0 -> 5904 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/PatreonCapeHD.pngbin0 -> 10267 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/TesterCapeHD.pngbin0 -> 7976 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/Blank.pngbin0 -> 75 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.pngbin0 -> 1131 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.pngbin0 -> 1222 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcnbin0 -> 1583 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.pngbin0 -> 1627 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.pngbin0 -> 1869 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.pngbin0 -> 1309 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.pngbin0 -> 1617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.pngbin0 -> 607 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.pngbin0 -> 2084 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.pngbin0 -> 624 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.pngbin0 -> 1593 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.pngbin0 -> 677 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.pngbin0 -> 738 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.pngbin0 -> 2249 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.pngbin0 -> 666 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.pngbin0 -> 670 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.pngbin0 -> 586 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.pngbin0 -> 632 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.pngbin0 -> 522 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.pngbin0 -> 825 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.pngbin0 -> 647 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.pngbin0 -> 1232 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.pngbin0 -> 633 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.pngbin0 -> 677 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.pngbin0 -> 416 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.pngbin0 -> 656 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.pngbin0 -> 11243 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta39
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.pngbin0 -> 643 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.pngbin0 -> 662 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.pngbin0 -> 642 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.pngbin0 -> 649 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.pngbin0 -> 635 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.pngbin0 -> 529 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.pngbin0 -> 659 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.pngbin0 -> 665 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.pngbin0 -> 654 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.pngbin0 -> 623 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.pngbin0 -> 662 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.pngbin0 -> 649 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.pngbin0 -> 665 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.pngbin0 -> 624 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.pngbin0 -> 1660 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.pngbin0 -> 1383 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.pngbin0 -> 694 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.pngbin0 -> 762 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.pngbin0 -> 12342 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.pngbin0 -> 12342 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.pngbin0 -> 12342 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.pngbin0 -> 3126 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.pngbin0 -> 272 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.pngbin0 -> 823 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.pngbin0 -> 263 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.pngbin0 -> 252 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.pngbin0 -> 510 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.pngbin0 -> 252 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.pngbin0 -> 252 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.pngbin0 -> 239 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.pngbin0 -> 229 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.pngbin0 -> 166 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.pngbin0 -> 1178 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/blockBlock.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.pngbin0 -> 942 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/blockStone.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.pngbin0 -> 298 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.pngbin0 -> 834 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.pngbin0 -> 941 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.pngbin0 -> 900 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.pngbin0 -> 997 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.pngbin0 -> 1138 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.pngbin0 -> 1175 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.pngbin0 -> 1276 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.pngbin0 -> 656 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.pngbin0 -> 757 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.pngbin0 -> 801 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.pngbin0 -> 814 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.pngbin0 -> 787 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.pngbin0 -> 770 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.pngbin0 -> 572 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.pngbin0 -> 534 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.pngbin0 -> 661 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.pngbin0 -> 2943 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.pngbin0 -> 3595 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.pngbin0 -> 2001 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.pngbin0 -> 3210 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.pngbin0 -> 3691 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.pngbin0 -> 3601 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.pngbin0 -> 2038 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.pngbin0 -> 2001 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.pngbin0 -> 9232 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.pngbin0 -> 7019 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.pngbin0 -> 3454 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.pngbin0 -> 1558 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.pngbin0 -> 1461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta45
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.pngbin0 -> 13281 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta38
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.pngbin0 -> 13886 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.pngbin0 -> 1784 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.pngbin0 -> 1921 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.pngbin0 -> 2065 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.pngbin0 -> 2074 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.pngbin0 -> 2144 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.pngbin0 -> 2219 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.pngbin0 -> 2183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.pngbin0 -> 1999 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.pngbin0 -> 2094 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.pngbin0 -> 1601 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.pngbin0 -> 2024 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.pngbin0 -> 647 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.pngbin0 -> 663 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.pngbin0 -> 665 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.pngbin0 -> 528 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.pngbin0 -> 625 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.pngbin0 -> 748 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.pngbin0 -> 766 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.pngbin0 -> 849 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdnbin0 -> 5038 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pngbin0 -> 897 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.pngbin0 -> 464 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.pngbin0 -> 971 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.pngbin0 -> 768 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.pngbin0 -> 757 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.pngbin0 -> 747 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.pngbin0 -> 546 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.pngbin0 -> 530 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.pngbin0 -> 546 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.pngbin0 -> 670 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.pngbin0 -> 863 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.pngbin0 -> 687 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.pngbin0 -> 944 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.pngbin0 -> 880 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.pngbin0 -> 955 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.pngbin0 -> 866 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.pngbin0 -> 1601 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.pngbin0 -> 5273 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.pngbin0 -> 456 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.pngbin0 -> 651 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.pngbin0 -> 1371 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.pngbin0 -> 724 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.pngbin0 -> 733 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.pngbin0 -> 1652 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.pngbin0 -> 754 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.pngbin0 -> 878 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.pngbin0 -> 969 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.pngbin0 -> 650 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.pngbin0 -> 1079 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.pngbin0 -> 890 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.pngbin0 -> 1151 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.pngbin0 -> 628 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.pngbin0 -> 1009 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.pngbin0 -> 616 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.pngbin0 -> 413 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.pngbin0 -> 456 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.pngbin0 -> 2035 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.pngbin0 -> 2048 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.pngbin0 -> 2039 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.pngbin0 -> 1887 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.pngbin0 -> 1929 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.pngbin0 -> 2055 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.pngbin0 -> 2060 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.pngbin0 -> 1952 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.pngbin0 -> 2049 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.pngbin0 -> 2112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.pngbin0 -> 1156 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.pngbin0 -> 2174 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.pngbin0 -> 1220 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.pngbin0 -> 493 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.pngbin0 -> 2503 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta6
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.pngbin0 -> 532 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.pngbin0 -> 266 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.pngbin0 -> 285 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.pngbin0 -> 469 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.pngbin0 -> 668 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox1.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox2.pngbin0 -> 721 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox3.pngbin0 -> 776 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox4.pngbin0 -> 781 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox5.pngbin0 -> 794 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redox/redox6.pngbin0 -> 779 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.pngbin0 -> 822 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.pngbin0 -> 3676 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_1.pngbin0 -> 532 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_2.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_3.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_4.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_5.pngbin0 -> 722 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_6.pngbin0 -> 725 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_7.pngbin0 -> 716 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/special/block_8.pngbin0 -> 730 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.pngbin0 -> 688 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.pngbin0 -> 687 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.pngbin0 -> 457 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.pngbin0 -> 572 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.pngbin0 -> 579 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.pngbin0 -> 580 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/blocks/workbench.pngbin0 -> 410 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/entity/golemStaballoy.pngbin0 -> 5433 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/entity/sickBlaze.pngbin0 -> 1221 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/enviroment/snow.pngbin0 -> 849 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.pngbin0 -> 2857 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/FishTrap.pngbin0 -> 882 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/PestKiller.pngbin0 -> 1833 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/ProjectTable.pngbin0 -> 1124 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/SuperJukebox.pngbin0 -> 5198 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.pngbin0 -> 2482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/background/yellow.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/nei/decayables.pngbin0 -> 2623 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/nei/widgets.pngbin0 -> 1876 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.pngbin0 -> 164 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/east.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.pngbin0 -> 610 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.pngbin0 -> 732 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/north.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/south.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/top.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.pngbin0 -> 142 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/west.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.pngbin0 -> 148 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.pngbin0 -> 160 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.pngbin0 -> 178 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.pngbin0 -> 142 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.pngbin0 -> 83 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.pngbin0 -> 84 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.pngbin0 -> 123 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.pngbin0 -> 551 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/blue.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/cyan.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/green.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/magenta.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/red.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/slot/yellow.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.pngbin0 -> 148 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.pngbin0 -> 144 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.pngbin0 -> 2112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.pngbin0 -> 9891 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta1
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.pngbin0 -> 345 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.pngbin0 -> 396 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.pngbin0 -> 660 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.pngbin0 -> 627 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.pngbin0 -> 675 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.pngbin0 -> 651 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.pngbin0 -> 630 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.pngbin0 -> 648 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.pngbin0 -> 659 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.pngbin0 -> 667 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.pngbin0 -> 292 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.pngbin0 -> 788 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.pngbin0 -> 750 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.pngbin0 -> 834 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.pngbin0 -> 936 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.pngbin0 -> 498 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.pngbin0 -> 498 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.pngbin0 -> 498 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.pngbin0 -> 24039 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.pngbin0 -> 390 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.pngbin0 -> 323 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.pngbin0 -> 462 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.pngbin0 -> 466 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.pngbin0 -> 477 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.pngbin0 -> 1153 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.pngbin0 -> 1142 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.pngbin0 -> 1139 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.pngbin0 -> 1143 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.pngbin0 -> 1326 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.pngbin0 -> 1122 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.pngbin0 -> 1045 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.pngbin0 -> 605 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.pngbin0 -> 627 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.pngbin0 -> 704 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.pngbin0 -> 397 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.pngbin0 -> 442 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.pngbin0 -> 633 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.pngbin0 -> 701 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.pngbin0 -> 648 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.pngbin0 -> 646 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.pngbin0 -> 622 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.pngbin0 -> 654 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.pngbin0 -> 602 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.pngbin0 -> 715 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.pngbin0 -> 2141 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta23
-rw-r--r--src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.pngbin0 -> 387 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.pngbin0 -> 397 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/1.pngbin0 -> 1327 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/2.pngbin0 -> 1335 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/3.pngbin0 -> 1340 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/4.pngbin0 -> 1306 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/5.pngbin0 -> 1302 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/6.pngbin0 -> 1338 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/7.pngbin0 -> 1317 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/8.pngbin0 -> 1402 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/chargepack/9.pngbin0 -> 1183 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/0.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/1.pngbin0 -> 451 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/10.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/11.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/12.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/13.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/14.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/15.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/2.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/3.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/4.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/5.pngbin0 -> 462 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/6.pngbin0 -> 477 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/7.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/8.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/covers/9.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dust.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dustSmall.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/dustTiny.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.pngbin0 -> 548 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameAccelerated.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameArborists.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameBusy.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameDecaying.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameMutagenic.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameSlowing.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameStabilizing.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/frameUseless.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.pngbin0 -> 387 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.pngbin0 -> 313 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/iconsets/VOID.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/ion/0.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/ion/1.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/ion/IonBase.pngbin0 -> 1789 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/item.empty.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemAirFilter.pngbin0 -> 1469 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemBlueprint.pngbin0 -> 782 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.pngbin0 -> 1821 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemBook.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemBufferCore.pngbin0 -> 1329 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemCell.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemCellPlasma.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.pngbin0 -> 653 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.pngbin0 -> 735 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemGear.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemIngot.pngbin0 -> 390 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.pngbin0 -> 420 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemIngotHot.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemLavaFilter.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemPlate.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemShard.pngbin0 -> 620 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemShovel.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.pngbin0 -> 544 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.pngbin0 -> 530 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/magicfeather.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustBlizz.pngbin0 -> 914 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.pngbin0 -> 1303 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.pngbin0 -> 1202 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta5
-rw-r--r--src/main/resources/assets/miscutils/textures/items/material/RodBlizz.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/0.pngbin0 -> 1672 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/1.pngbin0 -> 1669 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/10.pngbin0 -> 1644 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/11.pngbin0 -> 1678 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/12.pngbin0 -> 1658 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/13.pngbin0 -> 1668 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/14.pngbin0 -> 1676 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/15.pngbin0 -> 1675 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/16.pngbin0 -> 1679 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/17.pngbin0 -> 1674 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/18.pngbin0 -> 1674 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/19.pngbin0 -> 1685 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/2.pngbin0 -> 1683 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/20.pngbin0 -> 1663 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/21.pngbin0 -> 1653 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/22.pngbin0 -> 1665 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/23.pngbin0 -> 1680 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/24.pngbin0 -> 1673 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/3.pngbin0 -> 1681 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/4.pngbin0 -> 1682 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/5.pngbin0 -> 1675 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/6.pngbin0 -> 1674 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/7.pngbin0 -> 1667 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/8.pngbin0 -> 1656 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/9.pngbin0 -> 1663 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/0.pngbin0 -> 1217 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/1.pngbin0 -> 1493 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/10.pngbin0 -> 1616 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/11.pngbin0 -> 1450 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/12.pngbin0 -> 1635 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/13.pngbin0 -> 1601 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/14.pngbin0 -> 1522 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/15.pngbin0 -> 1710 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/16.pngbin0 -> 1647 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/17.pngbin0 -> 1569 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/18.pngbin0 -> 1451 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/19.pngbin0 -> 1404 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/2.pngbin0 -> 1561 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/20.pngbin0 -> 1517 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/21.pngbin0 -> 1498 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/22.pngbin0 -> 1554 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/23.pngbin0 -> 1196 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/24.pngbin0 -> 1323 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/3.pngbin0 -> 1465 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/4.pngbin0 -> 1501 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/5.pngbin0 -> 1487 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/6.pngbin0 -> 1512 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/7.pngbin0 -> 1485 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/8.pngbin0 -> 1595 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/particle/new/9.pngbin0 -> 1567 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.pngbin0 -> 595 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/research/note.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.pngbin0 -> 510 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.pngbin0 -> 496 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.pngbin0 -> 514 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.pngbin0 -> 510 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.pngbin0 -> 528 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.pngbin0 -> 527 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.pngbin0 -> 527 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.pngbin0 -> 451 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.pngbin0 -> 524 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/spawn_egg.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/token/0.pngbin0 -> 3345 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/token/1.pngbin0 -> 3688 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/token/2.pngbin0 -> 3698 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/token/3.pngbin0 -> 3758 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/items/token/4.pngbin0 -> 3719 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/models/TinFoil.pngbin0 -> 536 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/space/hd10180/A.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/space/hd10180/B.pngbin0 -> 810 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/space/hd10180/C.pngbin0 -> 810 bytes
-rw-r--r--src/main/resources/assets/miscutils/textures/space/hd10180/D.pngbin0 -> 817 bytes
-rw-r--r--src/main/resources/assets/spiceoflife/lang/de_DE.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/en_US.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/es_ES.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/fr_FR.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/it_IT.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/ko_KR.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/ru_RU.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/lang/zh_CN.lang2
-rw-r--r--src/main/resources/assets/spiceoflife/textures/items/foodcrate.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/stevescarts/lang/en_US.lang1
-rw-r--r--src/main/resources/assets/stevescarts/lang/zh_CN.lang1
-rw-r--r--src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.pngbin0 -> 540 bytes
-rw-r--r--src/main/resources/assets/tectech/lang/en_US.lang1675
-rw-r--r--src/main/resources/assets/tectech/lang/zh_CN.lang1296
-rw-r--r--src/main/resources/assets/tectech/models/Space.obj8442
-rw-r--r--src/main/resources/assets/tectech/models/Star.obj2537
-rw-r--r--src/main/resources/assets/tectech/models/StarLayer0.pngbin0 -> 3696361 bytes
-rw-r--r--src/main/resources/assets/tectech/models/StarLayer1.pngbin0 -> 831699 bytes
-rw-r--r--src/main/resources/assets/tectech/models/StarLayer2.pngbin0 -> 243011 bytes
-rw-r--r--src/main/resources/assets/tectech/models/spaceLayer.pngbin0 -> 7200691 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds.json52
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_alarm.oggbin0 -> 14122 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_click.oggbin0 -> 9928 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_hi_freq.oggbin0 -> 71722 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_lo_freq.oggbin0 -> 29373 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_mid_freq.oggbin0 -> 26378 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_noise.oggbin0 -> 5413 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_scan.oggbin0 -> 28323 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_whooum.oggbin0 -> 17069 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/fx_woo_uu.oggbin0 -> 17197 bytes
-rw-r--r--src/main/resources/assets/tectech/sounds/microwave_ding.oggbin0 -> 48584 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.pngbin0 -> 1147 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.pngbin0 -> 349 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.pngbin0 -> 285 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.pngbin0 -> 293 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/blocks/turretBaseEM.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/entity/projectileEM.pngbin0 -> 4254 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/assLineRender.pngbin0 -> 3191 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/blue_glow.pngbin0 -> 5301 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/green_glow.pngbin0 -> 3975 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/orange_glow.pngbin0 -> 5653 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/purple_glow.pngbin0 -> 9762 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/screen_blue.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.pngbin0 -> 1418 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/space.pngbin0 -> 15406 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/star.pngbin0 -> 119474 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/background/white_glow.pngbin0 -> 18002 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/button/celestial.pngbin0 -> 1943 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/button/standard_16x16.pngbin0 -> 107 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.pngbin0 -> 109 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.pngbin0 -> 806 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.pngbin0 -> 723 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/flag.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.pngbin0 -> 880 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.pngbin0 -> 144 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.pngbin0 -> 272 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.pngbin0 -> 396 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.pngbin0 -> 151 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/connector.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/connector_empty.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/connector_switch.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.pngbin0 -> 1043 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/green_selector.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/heat_sink.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.pngbin0 -> 1527 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.pngbin0 -> 2215 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.pngbin0 -> 1274 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.pngbin0 -> 2379 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.pngbin0 -> 1566 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.pngbin0 -> 3506 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.pngbin0 -> 1454 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.pngbin0 -> 2544 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/overlay_green.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.pngbin0 -> 79 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_green.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/parameter_red.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/rack_large.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.pngbin0 -> 134 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.pngbin0 -> 119 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.pngbin0 -> 134 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.pngbin0 -> 119 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.pngbin0 -> 520 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.pngbin0 -> 1502 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.pngbin0 -> 1500 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.pngbin0 -> 1509 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.pngbin0 -> 1501 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.pngbin0 -> 1414 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.pngbin0 -> 1411 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.pngbin0 -> 1471 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.pngbin0 -> 1467 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.pngbin0 -> 114 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayItem.pngbin0 -> 262972 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.pngbin0 -> 97514 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.pngbin0 -> 98360 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.pngbin0 -> 97606 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.pngbin0 -> 98319 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.pngbin0 -> 96650 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.pngbin0 -> 262931 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.pngbin0 -> 97446 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.pngbin0 -> 97833 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemAstralArray.pngbin0 -> 4919 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorEV.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorHV.pngbin0 -> 581 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorIV.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorLV.pngbin0 -> 577 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorMV.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemConstructable.pngbin0 -> 667 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDebugContainer.pngbin0 -> 4295 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.pngbin0 -> 1588 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.pngbin0 -> 7526 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.pngbin0 -> 5511 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemEuMeterGT.pngbin0 -> 776 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemFrontRotate.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.pngbin0 -> 571 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemTeslaComponent.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemTeslaCover.pngbin0 -> 451 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemTeslaStaff.pngbin0 -> 433 bytes
4241 files changed, 272263 insertions, 0 deletions
diff --git a/src/main/java/bloodasp/galacticgreg/GT_TileEntity_Ores_Space.java b/src/main/java/bloodasp/galacticgreg/GT_TileEntity_Ores_Space.java
new file mode 100644
index 0000000000..dfa1307bce
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/GT_TileEntity_Ores_Space.java
@@ -0,0 +1,144 @@
+package bloodasp.galacticgreg;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import bloodasp.galacticgreg.api.Enums.ReplaceState;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_Log;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class GT_TileEntity_Ores_Space {
+
+ // Renamed function to prevent function shadowing with base GT-code
+ public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
+ int pMetaData) {
+ return setOuterSpaceOreBlock(pDimensionDef, pWorld, pX, pY, pZ, pMetaData, false, -1);
+ }
+
+ public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
+ int pMetaData, boolean pAir) {
+ return setOuterSpaceOreBlock(pDimensionDef, pWorld, pX, pY, pZ, pMetaData, pAir, -1);
+ }
+
+ /**
+ * Check if the block at given position may be replaced by an ore
+ *
+ * @param pWorld the world in question
+ * @param pX X-Cord
+ * @param pY Y-Cord
+ * @param pZ Z-Cord
+ * @return
+ */
+ private static ReplaceState CheckForReplaceableBlock(World pWorld, int pX, int pY, int pZ,
+ ModDimensionDef pDimDef) {
+ try {
+ ReplaceState tFlag = ReplaceState.Unknown;
+
+ Block targetBlock = pWorld.getBlock(pX, pY, pZ);
+ int targetBlockMeta = pWorld.getBlockMetadata(pX, pY, pZ);
+
+ if (targetBlock == Blocks.air) tFlag = ReplaceState.Airblock;
+ else tFlag = pDimDef.getReplaceStateForBlock(targetBlock, targetBlockMeta);
+
+ return tFlag;
+ } catch (Exception e) {
+ e.printStackTrace(GT_Log.err);
+ GalacticGreg.Logger.error("Error while processing CheckForReplaceableBlock(), defaulting to UNKNOWN");
+ return ReplaceState.Unknown;
+ }
+ }
+
+ /**
+ * Actually set the OreBlock
+ *
+ * @param pWorld the world in question
+ * @param pX
+ * @param pY
+ * @param pZ
+ * @param pMetaData GT-Ore metadata
+ * @param pAir
+ * @return
+ */
+ public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
+ int pMetaData, boolean pAir, int pCustomGTOreOffset) {
+ if (!pAir) pY = Math.min(pWorld.getActualHeight(), Math.max(pY, 1));
+
+ if (pDimensionDef == null) {
+ GalacticGreg.Logger
+ .warn("Unknown DimensionID: %d. Will not set anything here", pWorld.provider.dimensionId);
+ return false;
+ }
+ try {
+ Block tBlock = pWorld.getBlock(pX, pY, pZ);
+ // If the meta is non-zero, and the target block is either non-air or the air-override is active
+ if ((pMetaData > 0) && ((tBlock != Blocks.air) || pAir)) {
+ // make sure we're either going with normal ore-metas, or small ores.
+ // Probably should do another check for <= 1700
+ if (pMetaData < 1000 || pMetaData >= 16000) {
+ ReplaceState tRS = CheckForReplaceableBlock(pWorld, pX, pY, pZ, pDimensionDef);
+
+ // Unable to lookup replacement state. Means: The block is unknown, and shall not be replaced
+ if (tRS == ReplaceState.Unknown) {
+ GalacticGreg.Logger.trace("Not placing ore Meta %d, as target block is unknown", pMetaData);
+ return false;
+ } else if (tRS == ReplaceState.Airblock && !pAir) {
+ GalacticGreg.Logger.trace("Not placing ore Meta %d in midair, as AIR is FALSE", pMetaData);
+ return false;
+ }
+ if (tRS == ReplaceState.CannotReplace) {
+ // wrong metaData ID for target block
+ GalacticGreg.Logger.trace("Not placing ore Meta %d, as the state is CANNOTREPLACE", pMetaData);
+ return false;
+ }
+
+ if (pCustomGTOreOffset == -1) pMetaData += pDimensionDef.getStoneType()
+ .getOffset();
+ else pMetaData += pCustomGTOreOffset;
+ // This fix seems like cargo cult coding...The Abstract class just returns 0 for the harvest level.
+ // But it aligns with the GT5U method, so yay?
+ pWorld.setBlock(
+ pX,
+ pY,
+ pZ,
+ GregTech_API.sBlockOres1,
+ GT_TileEntity_Ores.getHarvestData(
+ (short) pMetaData,
+ ((GT_Block_Ores_Abstract) GregTech_API.sBlockOres1)
+ .getBaseBlockHarvestLevel(pMetaData % 16000 / 1000)),
+ 0);
+ TileEntity tTileEntity = pWorld.getTileEntity(pX, pY, pZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ ((GT_TileEntity_Ores) tTileEntity).mMetaData = ((short) pMetaData);
+ ((GT_TileEntity_Ores) tTileEntity).mNatural = true;
+ } else {
+ // This is somehow triggered randomly, and most times the target block is air, which should
+ // never happen as we check for air...
+ // That's why I put this behind a debug config option. If you ever find the reason for it,
+ // please tell me what caused this
+ if (GalacticGreg.GalacticConfig.ReportOreGenFailures) GalacticGreg.Logger.warn(
+ "Something went wrong while placing GT OreTileEntity. Meta: %d X [%d] Y [%d] Z [%d]",
+ pMetaData,
+ pX,
+ pY,
+ pZ);
+ }
+
+ return true;
+ } else GalacticGreg.Logger.warn(
+ "Not replacing block at pos %d %d %d due unexpected metaData for OreBlock: %d",
+ pX,
+ pY,
+ pZ,
+ pMetaData);
+ }
+ } catch (Exception e) {
+ if (GalacticGreg.GalacticConfig.ReportOreGenFailures) e.printStackTrace();
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_Layer_Space.java b/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_Layer_Space.java
new file mode 100644
index 0000000000..44fa0bf5a4
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_Layer_Space.java
@@ -0,0 +1,390 @@
+package bloodasp.galacticgreg;
+
+import static gregtech.api.enums.GT_Values.oreveinPlacerOres;
+import static gregtech.api.enums.GT_Values.oreveinPlacerOresMultiplier;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.auxiliary.GTOreGroup;
+import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_Layer_Space;
+import bloodasp.galacticgreg.dynconfig.DynamicOreMixWorldConfig;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen;
+
+public class GT_Worldgen_GT_Ore_Layer_Space extends GT_Worldgen {
+
+ 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;
+
+ private long mProfilingStart;
+ private long mProfilingEnd;
+
+ private DynamicOreMixWorldConfig _mDynWorldConfig;
+
+ public GT_Worldgen_GT_Ore_Layer_Space(String pName, boolean pDefault, int pMinY, int pMaxY, int pWeight,
+ int pDensity, int pSize, Materials pPrimary, Materials pSecondary, Materials pBetween, Materials pSporadic) {
+ super(pName, GalacticGreg.oreVeinWorldgenList, pDefault);
+ mMinY = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math
+ .max(this.mMinY + 5, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mWeight = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "RandomWeight", pWeight));
+ mDensity = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Density", pDensity));
+ mSize = ((short) Math.max(1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Size", pSize)));
+ mPrimaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OrePrimaryLayer", pPrimary.mMetaItemSubID));
+ mSecondaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSecondaryLayer", pSecondary.mMetaItemSubID));
+ mBetweenMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSporadiclyInbetween", pBetween.mMetaItemSubID));
+ mSporadicMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSporaticlyAround", pSporadic.mMetaItemSubID));
+
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName);
+ _mDynWorldConfig.InitDynamicConfig();
+
+ GalacticGreg.Logger.trace("Initialized new OreLayer: %s", pName);
+
+ if (mEnabled) GT_Worldgen_GT_Ore_Layer_Space.sWeight += this.mWeight;
+
+ }
+
+ public GT_Worldgen_GT_Ore_Layer_Space(String pName, boolean pDefault, int pMinY, int pMaxY, int pWeight,
+ int pDensity, int pSize, short pPrimary, short pSecondary, short pBetween, short pSporadic) {
+ super(pName, GalacticGreg.oreVeinWorldgenList, pDefault);
+ mMinY = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math
+ .max(this.mMinY + 5, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mWeight = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "RandomWeight", pWeight));
+ mDensity = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Density", pDensity));
+ mSize = ((short) Math.max(1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Size", pSize)));
+ mPrimaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OrePrimaryLayer", pPrimary));
+ mSecondaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSecondaryLayer", pSecondary));
+ mBetweenMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSporadiclyInbetween", pBetween));
+ mSporadicMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "OreSporaticlyAround", pSporadic));
+
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName);
+ _mDynWorldConfig.InitDynamicConfig();
+
+ GalacticGreg.Logger.trace("Initialized new OreLayer: %s", pName);
+
+ if (mEnabled) sWeight += this.mWeight;
+
+ }
+
+ /**
+ * Check if *this* orelayer is enabled for pDimensionDef
+ *
+ * @param pDimensionDef the ChunkProvider in question
+ * @return
+ */
+ public boolean isEnabledForDim(ModDimensionDef pDimensionDef) {
+ return _mDynWorldConfig.isEnabledInDim(pDimensionDef);
+ }
+
+ private static Map<String, Integer> _mBufferedVeinCountList = new HashMap<>();
+
+ /**
+ * Get the number of enabled OreMixes for given Dimension. This query is buffered and will only consume calculation
+ * time on the first run for each dimension
+ *
+ * @param pDimensionDef
+ * @return
+ */
+ private static int getNumOremixedForDim(ModDimensionDef pDimensionDef) {
+ int tVal = 0;
+ if (_mBufferedVeinCountList.containsKey(pDimensionDef.getDimIdentifier()))
+ tVal = _mBufferedVeinCountList.get(pDimensionDef.getDimIdentifier());
+ else {
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList)
+ if (tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space
+ && ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).isEnabledForDim(pDimensionDef)) tVal++;
+
+ _mBufferedVeinCountList.put(pDimensionDef.getDimIdentifier(), tVal);
+ }
+
+ return tVal;
+ }
+
+ private static Map<String, List<String>> _mBufferedVeinList = new HashMap<>();
+
+ /**
+ * Get a List of all Veins which are enabled for given Dim. Query is buffered
+ *
+ * @param pDimensionDef
+ * @return null if nothing is found or error
+ */
+ private static List<String> getOreMixIDsForDim(ModDimensionDef pDimensionDef) {
+ List<String> tReturn;
+
+ if (_mBufferedVeinList.containsKey(pDimensionDef.getDimIdentifier()))
+ tReturn = _mBufferedVeinList.get(pDimensionDef.getDimIdentifier());
+ else {
+ tReturn = new ArrayList<>();
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList)
+ if (tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space
+ && ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).isEnabledForDim(pDimensionDef))
+ tReturn.add(tWorldGen.mWorldGenName);
+ else if (tWorldGen instanceof BW_Worldgen_Ore_Layer_Space
+ && ((BW_Worldgen_Ore_Layer_Space) tWorldGen).isEnabledForDim(pDimensionDef))
+ tReturn.add(tWorldGen.mWorldGenName);
+
+ _mBufferedVeinList.put(pDimensionDef.getDimIdentifier(), tReturn);
+ }
+
+ return tReturn;
+ }
+
+ private static short getMaxWeightForDim(ModDimensionDef pDimensionDef) {
+ short tVal = 0;
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList)
+ if (tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space
+ && ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).isEnabledForDim(pDimensionDef)
+ && tVal < ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mWeight)
+ tVal = ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mWeight;
+
+ return tVal;
+ }
+
+ /**
+ * Select a random ore-vein from the list
+ *
+ * @param pDimensionDef
+ * @param pRandom
+ * @return
+ */
+ public static GTOreGroup getRandomOreGroup(ModDimensionDef pDimensionDef, Random pRandom, boolean pIgnoreWeight) {
+ short primaryMeta = 0;
+ short secondaryMeta = 0;
+ short betweenMeta = 0;
+ short sporadicMeta = 0;
+
+ // int tRangeSplit = getMaxWeightForDim(pDimensionDef) / 2;
+
+ if (pIgnoreWeight) {
+ List<String> tEnabledVeins = getOreMixIDsForDim(pDimensionDef);
+ int tRnd = pRandom.nextInt(tEnabledVeins.size());
+ String tVeinName = tEnabledVeins.get(tRnd);
+
+ // No lambda in Java 1.6 and 1.7 :(
+ // GT_Worldgen_GT_Ore_Layer_Space tGen = GalacticGreg.oreVeinWorldgenList.stream().filter(p ->
+ // p.mWorldGenName == tVeinName).findFirst();
+
+ GT_Worldgen tGen = null;
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList)
+ if (tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space
+ && ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mWorldGenName.equals(tVeinName)) tGen = tWorldGen;
+
+ if (tGen != null) {
+ // GT_Worldgen_GT_Ore_Layer_Space tGen = GalacticGreg.oreVeinWorldgenList.get(tRndMix);
+ GalacticGreg.Logger.trace("Using Oremix %s for asteroid", tGen.mWorldGenName);
+ primaryMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tGen).mPrimaryMeta;
+ secondaryMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tGen).mSecondaryMeta;
+ betweenMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tGen).mBetweenMeta;
+ sporadicMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tGen).mSporadicMeta;
+ }
+ } else {
+ if ((GT_Worldgen_GT_Ore_Layer_Space.sWeight > 0) && (GalacticGreg.oreVeinWorldgenList.size() > 0)) {
+ GalacticGreg.Logger.trace("About to select oremix");
+ boolean temp = true;
+ int tRandomWeight;
+ for (int i = 0; (i < 256) && (temp); i++) {
+ tRandomWeight = pRandom.nextInt(GT_Worldgen_GT_Ore_Layer_Space.sWeight);
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList) {
+ if (!(tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space)) continue;
+
+ tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ if (((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).isEnabledForDim(pDimensionDef)) {
+ GalacticGreg.Logger.trace("Using Oremix %s for asteroid", tWorldGen.mWorldGenName);
+ primaryMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mPrimaryMeta;
+ secondaryMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mSecondaryMeta;
+ betweenMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mBetweenMeta;
+ sporadicMeta = ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mSporadicMeta;
+
+ temp = false;
+ break;
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (primaryMeta != 0 || secondaryMeta != 0 || betweenMeta != 0 || sporadicMeta != 0)
+ return new GTOreGroup(primaryMeta, secondaryMeta, betweenMeta, sporadicMeta);
+ else return null;
+ }
+
+ @Override
+ public boolean executeWorldgen(World pWorld, Random pRandom, String pBiome, int pDimensionType, int pChunkX,
+ int pChunkZ, IChunkProvider pChunkGenerator, IChunkProvider pChunkProvider) {
+ GalacticGreg.Logger.trace("Entering executeWorldgen for [%s]", mWorldGenName);
+ ModDimensionDef tMDD = GalacticGregRegistry.getDimensionTypeByChunkGenerator(pChunkGenerator);
+ if (tMDD == null) {
+ GalacticGreg.Logger
+ .trace("Can't find dimension definition for ChunkProvider %s, skipping", pChunkGenerator.toString());
+ return false;
+ }
+
+ if (!_mDynWorldConfig.isEnabledInDim(tMDD)) {
+ GalacticGreg.Logger
+ .trace("OreGen for %s is disallowed in dimension %s, skipping", mWorldGenName, tMDD.getDimensionName());
+ return false;
+ }
+
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) mProfilingStart = System.currentTimeMillis();
+ // ---------------------------
+ int tMinY = this.mMinY + pRandom.nextInt(this.mMaxY - this.mMinY - 7);
+
+ int cX = pChunkX - pRandom.nextInt(this.mSize);
+ int eX = pChunkX + 16 + pRandom.nextInt(this.mSize);
+ int cZ = pChunkZ - pRandom.nextInt(this.mSize);
+ int eZ = pChunkZ + 16 + pRandom.nextInt(this.mSize);
+ for (int tX = cX; tX <= eX; tX++) {
+ for (int tZ = cZ; tZ <= eZ; tZ++) {
+ if (this.mSecondaryMeta > 0) {
+ for (int i = tMinY - 1; i < tMinY + 3; i++) {
+ int placeX = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cX - tX), MathHelper.abs_int(eX - tX))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cZ - tZ), MathHelper.abs_int(eZ - tZ))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ if ((pRandom.nextInt(placeZ) == 0) || (pRandom.nextInt(placeX) == 0)) {
+ GT_TileEntity_Ores_Space
+ .setOuterSpaceOreBlock(tMDD, pWorld, tX, i, tZ, this.mSecondaryMeta);
+ }
+ }
+ }
+ if (this.mBetweenMeta > 0) {
+ for (int i = tMinY + 2; i < tMinY + 6; i++) {
+ int placeX = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cX - tX), MathHelper.abs_int(eX - tX))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cZ - tZ), MathHelper.abs_int(eZ - tZ))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ if (((pRandom.nextInt(placeZ) == 0) || (pRandom.nextInt(placeX) == 0))
+ && (pRandom.nextInt(2) == 0)) {
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(tMDD, pWorld, tX, i, tZ, this.mBetweenMeta);
+ }
+ }
+
+ }
+ if (this.mPrimaryMeta > 0) {
+ for (int i = tMinY + 4; i < tMinY + 8; i++) {
+ int placeX = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cX - tX), MathHelper.abs_int(eX - tX))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cZ - tZ), MathHelper.abs_int(eZ - tZ))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ if ((pRandom.nextInt(placeZ) == 0) || (pRandom.nextInt(placeX) == 0)) {
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(tMDD, pWorld, tX, i, tZ, this.mPrimaryMeta);
+ }
+ }
+ }
+ if (this.mSporadicMeta > 0) {
+ for (int i = tMinY - 1; i < tMinY + 8; i++) {
+ int placeX = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cX - tX), MathHelper.abs_int(eX - tX))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(cZ - tZ), MathHelper.abs_int(eZ - tZ))
+ / getDensityFromPos(tX, tZ, pChunkX, pChunkZ));
+ if (((pRandom.nextInt(placeX) == 0) || (pRandom.nextInt(placeZ) == 0))
+ && (pRandom.nextInt(7) == 0)) {
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(tMDD, pWorld, tX, i, tZ, this.mSporadicMeta);
+ }
+ }
+ }
+ }
+ }
+
+ if (oreveinPlacerOres) {
+ int nSmallOres = (cX - eX) * (cZ - eZ) * this.mDensity / 10 * oreveinPlacerOresMultiplier;
+ for (int nSmallOresCount = 0; nSmallOresCount < nSmallOres; nSmallOresCount++) {
+ int tX = pRandom.nextInt(16) + pChunkX + 2;
+ int tZ = pRandom.nextInt(16) + pChunkZ + 2;
+ int tY = pRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mPrimaryMeta > 0)
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(tMDD, pWorld, tX, tY, tZ, this.mPrimaryMeta + 16000);
+ tX = pRandom.nextInt(16) + pChunkX + 2;
+ tZ = pRandom.nextInt(16) + pChunkZ + 2;
+ tY = pRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mSecondaryMeta > 0) GT_TileEntity_Ores_Space
+ .setOuterSpaceOreBlock(tMDD, pWorld, tX, tY, tZ, this.mSecondaryMeta + 16000);
+ tX = pRandom.nextInt(16) + pChunkX + 2;
+ tZ = pRandom.nextInt(16) + pChunkZ + 2;
+ tY = pRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mBetweenMeta > 0)
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(tMDD, pWorld, tX, tY, tZ, this.mBetweenMeta + 16000);
+ tX = pRandom.nextInt(16) + pChunkX + 2;
+ tZ = pRandom.nextInt(16) + pChunkZ + 2;
+ tY = pRandom.nextInt(190) + 10; // Y height can vary from 10 to 200 for small ores.
+ if (this.mSporadicMeta > 0) GT_TileEntity_Ores_Space
+ .setOuterSpaceOreBlock(tMDD, pWorld, tX, tY, tZ, this.mSporadicMeta + 16000);
+ }
+ }
+
+ // ---------------------------
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) {
+ try {
+ mProfilingEnd = System.currentTimeMillis();
+ long tTotalTime = mProfilingEnd - mProfilingStart;
+ GalacticGreg.Profiler.AddTimeToList(tMDD, tTotalTime);
+ GalacticGreg.Logger.debug(
+ "Done with OreLayer-Worldgen in DimensionType %s. Generation took %d ms",
+ tMDD.getDimensionName(),
+ tTotalTime);
+ } catch (Exception ignored) {} // Silently ignore errors
+ }
+
+ GalacticGreg.Logger.trace("Leaving executeWorldgen");
+ return true;
+ }
+
+ public int getDensityFromPos(int aX, int aZ, int aSeedX, int aSeedZ) {
+ if (aX < 0) aX -= 16;
+ if (aZ < 0) aZ -= 16;
+ return Math.max(
+ 1,
+ this.mDensity
+ / ((int) Math.sqrt(2 + Math.pow(aX / 16 - aSeedX / 16, 2) + Math.pow(aZ / 16 - aSeedZ / 16, 2))));
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_SmallPieces_Space.java b/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_SmallPieces_Space.java
new file mode 100644
index 0000000000..11e264b4fb
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/GT_Worldgen_GT_Ore_SmallPieces_Space.java
@@ -0,0 +1,123 @@
+package bloodasp.galacticgreg;
+
+import java.util.Random;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.dynconfig.DynamicOreMixWorldConfig;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.world.GT_Worldgen;
+
+public class GT_Worldgen_GT_Ore_SmallPieces_Space extends GT_Worldgen {
+
+ public final short mMinY;
+ public final short mMaxY;
+ public final short mAmount;
+ public final short mMeta;
+
+ private long mProfilingStart;
+ private long mProfilingEnd;
+ private DynamicOreMixWorldConfig _mDynWorldConfig;
+
+ public GT_Worldgen_GT_Ore_SmallPieces_Space(String pName, boolean pDefault, int pMinY, int pMaxY, int pAmount,
+ Materials pPrimary) {
+ super(pName, GalacticGreg.smallOreWorldgenList, pDefault);
+
+ mMinY = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math
+ .max(this.mMinY + 1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mAmount = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Amount", pAmount)));
+ mMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen." + this.mWorldGenName, "Ore", pPrimary.mMetaItemSubID));
+
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName);
+ _mDynWorldConfig.InitDynamicConfig();
+
+ GalacticGreg.Logger.trace("Initialized new OreLayer: %s", pName);
+ }
+
+ public GT_Worldgen_GT_Ore_SmallPieces_Space(String pName, boolean pDefault, int pMinY, int pMaxY, int pAmount,
+ short pPrimary) {
+ super(pName, GalacticGreg.smallOreWorldgenList, pDefault);
+
+ mMinY = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math
+ .max(this.mMinY + 1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mAmount = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Amount", pAmount)));
+ mMeta = ((short) GregTech_API.sWorldgenFile.get("worldgen." + this.mWorldGenName, "Ore", pPrimary));
+
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName);
+ _mDynWorldConfig.InitDynamicConfig();
+
+ GalacticGreg.Logger.trace("Initialized new OreLayer: %s", pName);
+ }
+
+ /**
+ * Check if *this* orelayer is enabled for pDimensionDef
+ *
+ * @param pDimensionDef the ChunkProvider in question
+ * @return
+ */
+ public boolean isEnabledForDim(ModDimensionDef pDimensionDef) {
+ return _mDynWorldConfig.isEnabledInDim(pDimensionDef);
+ }
+
+ @Override
+ public boolean executeWorldgen(World pWorld, Random pRandom, String pBiome, int pDimensionType, int pChunkX,
+ int pChunkZ, IChunkProvider pChunkGenerator, IChunkProvider pChunkProvider) {
+ GalacticGreg.Logger.trace("Entering executeWorldgen for [%s]", mWorldGenName);
+ ModDimensionDef tMDD = GalacticGregRegistry.getDimensionTypeByChunkGenerator(pChunkGenerator);
+ if (tMDD == null) {
+ GalacticGreg.Logger
+ .trace("Can't find dimension definition for ChunkProvider %s, skipping", pChunkGenerator.toString());
+ return false;
+ }
+
+ if (!_mDynWorldConfig.isEnabledInDim(tMDD)) {
+ GalacticGreg.Logger
+ .trace("OreGen for %s is disallowed in dimension %s, skipping", mWorldGenName, tMDD.getDimensionName());
+ return false;
+ }
+
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) mProfilingStart = System.currentTimeMillis();
+ // ---------------------------
+
+ if (this.mMeta > 0) {
+ int i = 0;
+ for (int j = Math.max(1, this.mAmount / 2 + pRandom.nextInt(this.mAmount) / 2); i < j; i++) {
+ GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(
+ tMDD,
+ pWorld,
+ pChunkX + pRandom.nextInt(16),
+ this.mMinY + pRandom.nextInt(Math.max(1, this.mMaxY - this.mMinY)),
+ pChunkZ + pRandom.nextInt(16),
+ this.mMeta + 16000);
+ }
+ }
+ // ---------------------------
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) {
+ try {
+ mProfilingEnd = System.currentTimeMillis();
+ long tTotalTime = mProfilingEnd - mProfilingStart;
+ GalacticGreg.Profiler.AddTimeToList(tMDD, tTotalTime);
+ GalacticGreg.Logger.debug(
+ "Done with SmallOre-Worldgen in DimensionType %s. Generation took %d ms",
+ tMDD.getDimensionName(),
+ tTotalTime);
+ } catch (Exception ignored) {} // Silently ignore errors
+ }
+
+ GalacticGreg.Logger.trace("Leaving executeWorldgen");
+ return true;
+ }
+
+ public boolean isAllowedForHeight(int pTargetHeight) {
+ return (pTargetHeight >= mMinY && pTargetHeight <= mMaxY);
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/GT_Worldgenerator_Space.java b/src/main/java/bloodasp/galacticgreg/GT_Worldgenerator_Space.java
new file mode 100644
index 0000000000..d2060ca71e
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/GT_Worldgenerator_Space.java
@@ -0,0 +1,578 @@
+package bloodasp.galacticgreg;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.util.Vec3;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraftforge.common.ChestGenHooks;
+
+import bloodasp.galacticgreg.api.AsteroidBlockComb;
+import bloodasp.galacticgreg.api.BlockMetaComb;
+import bloodasp.galacticgreg.api.Enums.DimensionType;
+import bloodasp.galacticgreg.api.Enums.SpaceObjectType;
+import bloodasp.galacticgreg.api.Enums.TargetBlockPosition;
+import bloodasp.galacticgreg.api.GTOreTypes;
+import bloodasp.galacticgreg.api.ISpaceObjectGenerator;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.api.SpecialBlockComb;
+import bloodasp.galacticgreg.api.StructureInformation;
+import bloodasp.galacticgreg.auxiliary.GTOreGroup;
+import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_Layer_Space;
+import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_SmallOre_Space;
+import bloodasp.galacticgreg.dynconfig.DynamicDimensionConfig;
+import bloodasp.galacticgreg.dynconfig.DynamicDimensionConfig.AsteroidConfig;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import cpw.mods.fml.common.IWorldGenerator;
+import cpw.mods.fml.common.eventhandler.EventBus;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen;
+import gregtech.common.GT_Worldgenerator;
+
+public class GT_Worldgenerator_Space implements IWorldGenerator {
+
+ public static boolean sAsteroids = true;
+ private final EventBus eventBus = new EventBus();
+ private World worldObj;
+
+ private int chunkX;
+ private int chunkZ;
+ private int mSize = 100;
+
+ private long mProfilingStart;
+ private long mProfilingEnd;
+
+ public GT_Worldgenerator_Space() {
+ GameRegistry.registerWorldGenerator(this, Integer.MAX_VALUE);
+ }
+
+ public void generate(Random pRandom, int pX, int pZ, World pWorld, IChunkProvider pChunkGenerator,
+ IChunkProvider pChunkProvider) {
+ pX *= 16;
+ pZ *= 16;
+
+ String tBiome = pWorld.getBiomeGenForCoords(pX + 8, pZ + 8).biomeName;
+ pRandom = new Random(pRandom.nextInt());
+ if (tBiome == null) {
+ tBiome = BiomeGenBase.plains.biomeName;
+ }
+ GalacticGreg.Logger
+ .trace("Triggered generate: [ChunkGenerator %s] [Biome %s]", pChunkGenerator.toString(), tBiome);
+
+ ModDimensionDef tDimDef = GalacticGregRegistry.getDimensionTypeByChunkGenerator(pChunkGenerator);
+
+ if (tDimDef == null) {
+ GalacticGreg.Logger.trace(
+ "Ignoring ChunkGenerator type %s as there is no definition for it in the registry",
+ pChunkGenerator.toString());
+ return;
+ } else {
+ GalacticGreg.Logger.trace("Selected DimDef: [%s]", tDimDef.getDimIdentifier());
+ }
+
+ /*
+ * In some later addons maybe, not for now. Ignoring Biome-based worldgen String tBiome =
+ * pWorld.getBiomeGenForCoords(pX + 8, pZ + 8).biomeName; pRandom = new Random(pRandom.nextInt()); if (tBiome ==
+ * null) { tBiome = BiomeGenBase.plains.biomeName; }
+ */
+
+ if (tDimDef.getDimensionType() != DimensionType.Planet) {
+ if (tDimDef.getRandomAsteroidMaterial() == null) GalacticGreg.Logger.error(
+ "Dimension [%s] is set to Asteroids, but no asteroid material is specified! Nothing will generate",
+ tDimDef.getDimensionName());
+ else Generate_Asteroids(tDimDef, pRandom, pWorld, pX, pZ);
+ } else if (tDimDef.getDimensionType() != DimensionType.Asteroid) {
+ Generate_OreVeins(tDimDef, pRandom, pWorld, pX, pZ, "", pChunkGenerator, pChunkProvider);
+ }
+
+ Chunk tChunk = pWorld.getChunkFromBlockCoords(pX, pZ);
+ if (tChunk != null) {
+ tChunk.isModified = true;
+ }
+ }
+
+ private void Generate_Asteroids(ModDimensionDef pDimensionDef, Random pRandom, World pWorld, int pX, int pZ) {
+ GalacticGreg.Logger.trace("Running asteroid-gen in Dim %s", pDimensionDef.getDimIdentifier());
+
+ AsteroidConfig tAConf = DynamicDimensionConfig.getAsteroidConfig(pDimensionDef);
+ if (tAConf == null) {
+ GalacticGreg.Logger.error(
+ "Dimension %s is set to asteroid, but no config object can be found. Skipping!",
+ pDimensionDef.getDimIdentifier());
+ return;
+ } else {
+ GalacticGreg.Logger.trace("Asteroid probability: %d", tAConf.Probability);
+ }
+
+ if ((tAConf.Probability <= 1) || (pRandom.nextInt(tAConf.Probability) == 0)) {
+ GalacticGreg.Logger.trace("Generating asteroid NOW");
+ // ---------------------------
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) mProfilingStart = System.currentTimeMillis();
+ // -----------------------------
+
+ // Get Random position
+ int tX = pX + pRandom.nextInt(16);
+ int tY = 50 + pRandom.nextInt(200 - 50);
+ int tZ = pZ + pRandom.nextInt(16);
+
+ // Check if position is free
+ if ((pWorld.getBlock(tX, tY, tZ)
+ .isAir(pWorld, tX, tY, tZ))) {
+
+ int tCustomAsteroidOffset = -1;
+ int tGraniteMeta = 0;
+
+ // Select Random OreGroup and Asteroid Material
+ GTOreGroup tOreGroup = GT_Worldgen_GT_Ore_Layer_Space.getRandomOreGroup(pDimensionDef, pRandom, true);
+ AsteroidBlockComb tABComb = pDimensionDef.getRandomAsteroidMaterial();
+ if (tABComb == null) return;
+
+ // Fill Vars for random Asteroid
+ Block tFinalAsteroidBlock = tABComb.getBlock();
+ int tFinalAsteroidBlockMeta = tABComb.getMeta();
+ int tFinalOreOffset = tABComb.getOreMaterial()
+ .getOffset();
+ int tFinalUpdateMode = tABComb.getOreMaterial()
+ .getUpdateMode();
+ GalacticGreg.Logger.debug(
+ "Asteroid will be build with: Block: [%s] OreType: [%s]",
+ Block.blockRegistry.getNameForObject(tABComb.getBlock()),
+ tABComb.getOreMaterial()
+ .toString());
+
+ // get random Ore-asteroid generator from the list of registered generators
+ ISpaceObjectGenerator aGen = pDimensionDef.getRandomSOGenerator(SpaceObjectType.OreAsteroid);
+ if (aGen == null) {
+ GalacticGreg.Logger.ot_error(
+ "GalacticGreg.Generate_Asteroids.NoSOGenFound",
+ "No SpaceObjectGenerator has been registered for type ORE_ASTEROID in Dimension %s. Nothing will generate",
+ pDimensionDef.getDimensionName());
+ return;
+ }
+
+ aGen.reset();
+ aGen.setCenterPoint(tX, tY, tZ);
+ aGen.randomize(tAConf.MinSize, tAConf.MaxSize); // Initialize random values and set size
+ aGen.calculate(); // Calculate structure
+
+ // Random loot-chest somewhere in the asteroid
+ Vec3 tChestPosition = Vec3.createVectorHelper(0, 0, 0);
+ boolean tDoLootChest = false;
+ int tNumLootItems = 0;
+ if (tAConf.LootChestChance > 0) {
+ GalacticGreg.Logger.trace("Random loot chest enabled, flipping the coin");
+ int tChance = pRandom.nextInt(100); // Loot chest is 1 in 100 (Was: 1:1000 which actually never
+ // happend)
+ if (tAConf.LootChestChance >= tChance) {
+ GalacticGreg.Logger.debug("We got a match. Preparing to generate the loot chest");
+ // Get amount of items for the loot chests, randomize it (1-num) if enabled
+ if (tAConf.RandomizeNumLootItems) tNumLootItems = pRandom.nextInt(tAConf.NumLootItems - 1) + 1;
+ else tNumLootItems = tAConf.NumLootItems;
+
+ GalacticGreg.Logger
+ .debug(String.format("Loot chest random item count will be: %d", tNumLootItems));
+
+ // try to find any block that is not on the asteroids outer-shell
+ GalacticGreg.Logger.trace("Starting lookup for valid asteroid-block for the chest");
+ for (int x = 0; x < 64; x++) // 64 enough? Should be
+ {
+ int tRndBlock = pRandom.nextInt(
+ aGen.getStructure()
+ .size());
+ StructureInformation tChestSI = aGen.getStructure()
+ .get(tRndBlock);
+ if (tChestSI.getBlockPosition() != TargetBlockPosition.AsteroidShell) {
+ GalacticGreg.Logger.debug(
+ String.format(
+ "Chest position found [x:%d y:%d z:%d]",
+ tChestSI.getX(),
+ tChestSI.getY(),
+ tChestSI.getZ()));
+ // Found valid position "Somewhere" in the asteroid, set position...
+ tChestPosition = Vec3
+ .createVectorHelper(tChestSI.getX(), tChestSI.getY(), tChestSI.getZ());
+ // .. and set CreateFlag to true
+ tDoLootChest = true;
+ break;
+ }
+ }
+ }
+ }
+
+ // Now build the structure
+ GalacticGreg.Logger.trace("Now generating Space-Structure");
+ for (StructureInformation si : aGen.getStructure()) {
+ // Only replace airblocks
+ if (pWorld.isAirBlock(si.getX(), si.getY(), si.getZ())) {
+ // === Loot-chest generator >>
+ if (tDoLootChest) // If gen-lootchest enabled...
+ {
+ // Check if current x/y/z is the location where the chest shall be created
+ if ((int) tChestPosition.xCoord == si.getX() && (int) tChestPosition.yCoord == si.getY()
+ && (int) tChestPosition.zCoord == si.getZ()) {
+ GalacticGreg.Logger.trace("Now generating LootChest and contents");
+ // Get items for the configured loot-table
+ WeightedRandomChestContent[] tRandomLoot = ChestGenHooks
+ .getItems(DynamicDimensionConfig.getLootChestTable(tAConf), pRandom);
+
+ // Get chest-block to spawn
+ BlockMetaComb tTargetChestType = GalacticGreg.GalacticConfig.CustomLootChest;
+
+ // Place down the chest
+ if (tTargetChestType.getMeta() > 0) pWorld.setBlock(
+ si.getX(),
+ si.getY(),
+ si.getZ(),
+ tTargetChestType.getBlock(),
+ tTargetChestType.getMeta(),
+ 2);
+ else pWorld.setBlock(si.getX(), si.getY(), si.getZ(), tTargetChestType.getBlock());
+
+ // Retrieve the TEs IInventory that should've been created
+ IInventory entityChestInventory = (IInventory) pWorld
+ .getTileEntity(si.getX(), si.getY(), si.getZ());
+ // If it's not null...
+ if (entityChestInventory != null) {
+ // and if we're on the server...
+ if (!pWorld.isRemote) {
+ // Fill the chest with stuffz!
+ WeightedRandomChestContent.generateChestContents(
+ pRandom,
+ tRandomLoot,
+ entityChestInventory,
+ tNumLootItems);
+ GalacticGreg.Logger.trace("Loot chest successfully generated");
+ }
+ } else {
+ // Something made a boo..
+ GalacticGreg.Logger.warn(
+ "Could not create lootchest at X[%d] Y[%d] Z[%d]. getTileEntity() returned null",
+ si.getX(),
+ si.getY(),
+ si.getZ());
+ }
+ // Make sure we never compare coordinates again (for this asteroid/Structure)
+ tDoLootChest = false;
+ // Do some debug logging
+ GalacticGreg.Logger
+ .debug("Generated LootChest at X[%d] Y[%d] Z[%d]", si.getX(), si.getY(), si.getZ());
+ // And skip the rest of this function
+ continue;
+ }
+ }
+ // << Loot-chest generator ===
+
+ // === Ore generator >>
+ boolean tPlacedOreBlock = false;
+ // If a valid oregroup has been selected (more than 0 ore-veins are enabled for this dim)
+ if (tOreGroup != null) {
+ // GalacticGreg.Logger.trace("tOreGoup is populated, continuing");
+ // Choose a number between 0 and 100
+ int ranOre = pRandom.nextInt(100);
+ int tFinalOreMeta = 0;
+
+ // If choosen number is below the configured orechance, do random between and sporadic
+ if (ranOre < tAConf.OreChance) {
+ if (pRandom.nextBoolean()) {
+ // Only take as final value if meta is not zero
+ if (tOreGroup.SporadicBetweenMeta > 0)
+ tFinalOreMeta = tOreGroup.SporadicBetweenMeta;
+ } else {
+ // Only take as final value if meta is not zero
+ if (tOreGroup.SporadicAroundMeta > 0) tFinalOreMeta = tOreGroup.SporadicAroundMeta;
+ }
+ }
+ // If choosen number is below the configured orechance, do random primary and secondary
+ // We use an offset here, so this part is always higher than the first check.
+ else if (ranOre < tAConf.OreChance + tAConf.OrePrimaryOffset) {
+ if (pRandom.nextBoolean()) {
+ // Only take as final value if meta is not zero
+ if (tOreGroup.PrimaryMeta > 0) tFinalOreMeta = tOreGroup.PrimaryMeta;
+ } else {
+ // Only take as final value if meta is not zero
+ if (tOreGroup.SecondaryMeta > 0) tFinalOreMeta = tOreGroup.SecondaryMeta;
+ }
+ }
+
+ // if the final oreMeta has been found...
+ // GalacticGreg.Logger.info("tFinalOreMeta is %d", tFinalOreMeta);
+ if (tFinalOreMeta > 0) {
+ // make sure we obey the configured "HiddenOres" setting (No ores on the shell)
+ if (tAConf.HiddenOres && (si.getBlockPosition() == TargetBlockPosition.AsteroidShell)) {
+ // Ore would be placed around the shell, which is disabled (hiddenores)
+ GalacticGreg.Logger.trace(
+ "Skipping ore-placement event (HiddenOres=true; TargetBlockPosition=AsteroidShell)");
+ } else {
+ // try to place the ore block. The result is stored in tPlacedOreBlock
+ tPlacedOreBlock = GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(
+ pDimensionDef,
+ pWorld,
+ si.getX(),
+ si.getY(),
+ si.getZ(),
+ tOreGroup.SecondaryMeta,
+ true,
+ tFinalOreOffset);
+ }
+ }
+ }
+ // << Ore generator ===
+
+ // === Additional special blocks >>
+ // If no ore-block has been placed yet...
+ if (!tPlacedOreBlock) {
+ // try to spawn special blocks
+ boolean tFlag = doGenerateSpecialBlocks(
+ pDimensionDef,
+ pRandom,
+ pWorld,
+ tAConf,
+ si.getX(),
+ si.getY(),
+ si.getZ(),
+ si.getBlockPosition());
+
+ // No special block placed? Try smallores
+ if (tFlag) tFlag = doGenerateSmallOreBlock(
+ pDimensionDef,
+ pRandom,
+ pWorld,
+ tAConf,
+ si.getX(),
+ si.getY(),
+ si.getZ(),
+ tFinalOreOffset);
+
+ // no smallores either? do normal block
+ if (tFlag) pWorld.setBlock(
+ si.getX(),
+ si.getY(),
+ si.getZ(),
+ tFinalAsteroidBlock,
+ tFinalAsteroidBlockMeta,
+ tFinalUpdateMode);
+
+ }
+ // << Additional special blocks ===
+ }
+ }
+ }
+ // ---------------------------
+ // OreGen profiler stuff
+ if (GalacticGreg.GalacticConfig.ProfileOreGen) {
+ try {
+ mProfilingEnd = System.currentTimeMillis();
+ long tTotalTime = mProfilingEnd - mProfilingStart;
+ GalacticGreg.Profiler.AddTimeToList(pDimensionDef, tTotalTime);
+ GalacticGreg.Logger.debug(
+ "Done with Asteroid-Worldgen in DimensionType %s. Generation took %d ms",
+ pDimensionDef.getDimensionName(),
+ tTotalTime);
+ } catch (Exception ignored) {} // Silently ignore errors
+ }
+ // ---------------------------
+ }
+ GalacticGreg.Logger.trace("Leaving asteroid-gen for Dim %s", pDimensionDef.getDimIdentifier());
+ }
+
+ /**
+ * Generate Special Blocks in asteroids if enabled
+ *
+ * @param pDimensionDef
+ * @param pRandom
+ * @param pWorld
+ * @param tAConf
+ * @param eX
+ * @param eY
+ * @param eZ
+ * @return
+ */
+ private boolean doGenerateSpecialBlocks(ModDimensionDef pDimensionDef, Random pRandom, World pWorld,
+ AsteroidConfig tAConf, int eX, int eY, int eZ, TargetBlockPosition pBlockPosition) {
+
+ boolean tFlag = true;
+ // Handler to generate special BlockTypes randomly if activated
+ if (tAConf.SpecialBlockChance > 0) {
+ if (pRandom.nextInt(100) < tAConf.SpecialBlockChance) {
+ SpecialBlockComb bmc = pDimensionDef.getRandomSpecialAsteroidBlock();
+ if (bmc != null) {
+ boolean tIsAllowed = false;
+
+ switch (bmc.getBlockPosition()) {
+ case AsteroidCore:
+ if (pBlockPosition == TargetBlockPosition.AsteroidCore) tIsAllowed = true;
+ break;
+ case AsteroidCoreAndShell:
+ if (pBlockPosition == TargetBlockPosition.AsteroidCore
+ || pBlockPosition == TargetBlockPosition.AsteroidShell) tIsAllowed = true;
+ break;
+ case AsteroidShell:
+ if (pBlockPosition == TargetBlockPosition.AsteroidShell) tIsAllowed = true;
+ break;
+ case AsteroidInnerCore:
+ if (pBlockPosition == TargetBlockPosition.AsteroidInnerCore) tIsAllowed = true;
+ break;
+ default:
+ break;
+ }
+
+ if (tIsAllowed) {
+ pWorld.setBlock(eX, eY, eZ, bmc.getBlock(), bmc.getMeta(), 2);
+ tFlag = false;
+ }
+ }
+ }
+ }
+ return tFlag;
+ }
+
+ /**
+ * Pick a random small-ore block from the list of enabled small ores for this dim
+ *
+ * @param pDimDef
+ * @param pRandom
+ * @return
+ */
+ private boolean doGenerateSmallOreBlock(ModDimensionDef pDimDef, Random pRandom, World pWorld,
+ AsteroidConfig pAConf, int pX, int pY, int pZ, int pTargetBlockOffset) {
+ boolean tFlag = true;
+ // If smallores are enabled...
+ if (pAConf.SmallOreChance > 0) {
+ // ... and we hit the random-chance ...
+ if (pRandom.nextInt(100) < pAConf.SmallOreChance) {
+ // Do small ores.
+ int tRandomWeight;
+ boolean continueSearch = true;
+ int tFoundOreMeta = -1;
+ BW_Worldgen_Ore_SmallOre_Space bwOreGen = null;
+ // First find a small ore...
+ for (int i = 0; (i < 256) && (continueSearch); i++) {
+ tRandomWeight = pRandom.nextInt(GT_Worldgen_GT_Ore_Layer_Space.sWeight);
+ for (GT_Worldgen tWorldGen : GalacticGreg.smallOreWorldgenList) {
+ if (tWorldGen instanceof BW_Worldgen_Ore_SmallOre_Space) {
+ tRandomWeight = ((BW_Worldgen_Ore_SmallOre_Space) tWorldGen).mDensity;
+ if (tRandomWeight <= 0) {
+ tFoundOreMeta = ((BW_Worldgen_Ore_SmallOre_Space) tWorldGen).mPrimaryMeta;
+ continueSearch = false;
+ bwOreGen = ((BW_Worldgen_Ore_SmallOre_Space) tWorldGen);
+ }
+ } else if (tWorldGen instanceof GT_Worldgen_GT_Ore_SmallPieces_Space) {
+ // That is enabled for *this* dim...
+ if (!((GT_Worldgen_GT_Ore_SmallPieces_Space) tWorldGen).isEnabledForDim(pDimDef)) continue;
+
+ // And in the correct y-level, of ObeyLimits is true...
+ if (pAConf.ObeyHeightLimits
+ && !((GT_Worldgen_GT_Ore_SmallPieces_Space) tWorldGen).isAllowedForHeight(pY)) continue;
+
+ // Care about weight
+ tRandomWeight -= ((GT_Worldgen_GT_Ore_SmallPieces_Space) tWorldGen).mAmount;
+ if (tRandomWeight <= 0) {
+ // And return found ore meta
+ tFoundOreMeta = ((GT_Worldgen_GT_Ore_SmallPieces_Space) tWorldGen).mMeta;
+ continueSearch = false;
+ }
+ }
+ }
+ }
+ if (tFoundOreMeta > -1) {
+ if (bwOreGen == null) {
+ // Make the oreID a small ore with correct type
+ int tCustomOffset = (GTOreTypes.SmallOres.getOffset() + pTargetBlockOffset);
+
+ // Set the smallOre block
+ GT_TileEntity_Ores_Space
+ .setOuterSpaceOreBlock(pDimDef, pWorld, pX, pY, pZ, tFoundOreMeta, true, tCustomOffset);
+ tFlag = false;
+ } else {
+ bwOreGen.setOreBlock(pWorld, pX, pY, pZ, tFoundOreMeta, true);
+ }
+ }
+ }
+ }
+ return tFlag;
+ }
+
+ /**
+ * Untested! But should work... Comments are todo
+ *
+ * @param pDimensionDef
+ * @param pRandom
+ * @param pWorld
+ * @param pX
+ * @param pZ
+ * @param pBiome
+ * @param pChunkGenerator
+ * @param pChunkProvider
+ */
+ private void Generate_OreVeins(ModDimensionDef pDimensionDef, Random pRandom, World pWorld, int pX, int pZ,
+ String pBiome, IChunkProvider pChunkGenerator, IChunkProvider pChunkProvider) {
+ GalacticGreg.Logger.trace("Running orevein-gen in Dim %s", pDimensionDef.getDimIdentifier());
+
+ if (GT_Worldgenerator.isOreChunk(pX / 16, pZ / 16)) {
+ if ((GT_Worldgen_GT_Ore_Layer_Space.sWeight > 0) && (GalacticGreg.oreVeinWorldgenList.size() > 0)) {
+
+ boolean temp = true;
+ int tRandomWeight;
+ for (int i = 0; (i < 256) && (temp); i++) {
+ tRandomWeight = pRandom.nextInt(GT_Worldgen_GT_Ore_Layer_Space.sWeight);
+ for (GT_Worldgen tWorldGen : GalacticGreg.oreVeinWorldgenList) {
+ if (tWorldGen instanceof GT_Worldgen_GT_Ore_Layer_Space)
+ tRandomWeight -= ((GT_Worldgen_GT_Ore_Layer_Space) tWorldGen).mWeight;
+ else if (tWorldGen instanceof BW_Worldgen_Ore_Layer_Space)
+ tRandomWeight -= ((BW_Worldgen_Ore_Layer_Space) tWorldGen).mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ if (tWorldGen.executeWorldgen(
+ pWorld,
+ pRandom,
+ pBiome,
+ Integer.MIN_VALUE,
+ pX,
+ pZ,
+ pChunkGenerator,
+ pChunkProvider)) {
+ temp = false;
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ break;
+ }
+ }
+ }
+ }
+ // Generate Small Ores
+
+ int i = 0;
+ for (int tX = pX - 16; i < 3; tX += 16) {
+ int j = 0;
+ for (int tZ = pZ - 16; j < 3; tZ += 16) {
+ for (GT_Worldgen tWorldGen : GalacticGreg.smallOreWorldgenList) {
+ try {
+ tWorldGen.executeWorldgen(
+ pWorld,
+ pRandom,
+ "",
+ Integer.MIN_VALUE,
+ tX,
+ tZ,
+ pChunkGenerator,
+ pChunkProvider);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ j++;
+ }
+ i++;
+ }
+ }
+ GalacticGreg.Logger.trace("Leaving orevein-gen for Dim %s", pDimensionDef.getDimIdentifier());
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/GalacticGreg.java b/src/main/java/bloodasp/galacticgreg/GalacticGreg.java
new file mode 100644
index 0000000000..3becbcb92b
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/GalacticGreg.java
@@ -0,0 +1,143 @@
+package bloodasp.galacticgreg;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import bloodasp.galacticgreg.auxiliary.GalacticGregConfig;
+import bloodasp.galacticgreg.auxiliary.LogHelper;
+import bloodasp.galacticgreg.auxiliary.ProfilingStorage;
+import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_Layer_Space;
+import bloodasp.galacticgreg.bartworks.BW_Worldgen_Ore_SmallOre_Space;
+import bloodasp.galacticgreg.command.AEStorageCommand;
+import bloodasp.galacticgreg.command.ProfilingCommand;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import bloodasp.galacticgreg.schematics.SpaceSchematicHandler;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.world.GT_Worldgen;
+
+@Mod(
+ modid = GalacticGreg.MODID,
+ name = GalacticGreg.MODNAME,
+ version = GalacticGreg.VERSION,
+ dependencies = "required-after:GalacticraftCore; required-after:gregtech@5.09.32.30;",
+ acceptableRemoteVersions = "*")
+public class GalacticGreg {
+
+ public static final List<GT_Worldgen> smallOreWorldgenList = new ArrayList<>();
+ public static final List<GT_Worldgen> oreVeinWorldgenList = new ArrayList<>();
+
+ public static final String NICE_MODID = "GalacticGreg";
+ public static final String MODID = "galacticgreg";
+ public static final String MODNAME = "Galactic Greg";
+
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+
+ public static final LogHelper Logger = new LogHelper(NICE_MODID);
+ public static ProfilingStorage Profiler = new ProfilingStorage();
+ public static SpaceSchematicHandler SchematicHandler;
+
+ public static Random GalacticRandom = null;
+
+ public static GalacticGregConfig GalacticConfig = null;
+
+ /**
+ * Preload phase. Read config values and set various features.. n stuff...
+ *
+ * @param aEvent
+ */
+ @EventHandler
+ public void onPreLoad(FMLPreInitializationEvent aEvent) {
+ GalacticConfig = new GalacticGregConfig(aEvent.getModConfigurationDirectory(), NICE_MODID, NICE_MODID);
+ if (!GalacticConfig.LoadConfig()) GalacticGreg.Logger
+ .warn("Something went wrong while reading GalacticGregs config file. Things will be wonky..");
+
+ GalacticRandom = new Random(System.currentTimeMillis());
+
+ if (GalacticConfig.SchematicsEnabled)
+ SchematicHandler = new SpaceSchematicHandler(aEvent.getModConfigurationDirectory());
+
+ Logger.trace("Leaving PRELOAD");
+ }
+
+ // @EventHandler
+ // public void onLoad(FMLInitializationEvent event){
+ // GalacticGregRegistry.registerModContainer(ModRegisterer.Setup_GalactiCraftCore());
+ // }
+
+ public static final ArrayList<Runnable> ADDITIONALVEINREGISTER = new ArrayList<>();
+
+ /**
+ * Postload phase. Mods can add their custom definition to our api in their own PreLoad or Init-phase Once
+ * GalacticGregRegistry.InitRegistry() is called, no changes are accepted. (Well you can with reflection, but on a
+ * "normal" way it's not possible)
+ *
+ * @param aEvent
+ */
+ @EventHandler
+ public void onPostLoad(FMLPostInitializationEvent aEvent) {
+ Logger.trace("Entering POSTLOAD");
+
+ if (!GalacticGregRegistry.InitRegistry()) throw new RuntimeException(
+ "GalacticGreg registry has been finalized from a 3rd-party mod, this is forbidden!");
+
+ // new WorldGenGaGT().run(); DO NOT UNCOMMENT, was moved to gregtech.loaders.postload.GT_Worldgenloader
+
+ if (Loader.isModLoaded("bartworks")) {
+ for (int f = 0,
+ j = GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks", "AmountOfCustomLargeVeinSlots", 0); f
+ < j; f++) {
+ new BW_Worldgen_Ore_Layer_Space(
+ "mix.custom." + (f < 10 ? "0" : "") + f,
+ GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + "mix.custom." + (f < 10 ? "0" : "") + f, "Enabled", false));
+ }
+
+ for (int f = 0,
+ j = GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks", "AmountOfCustomSmallSlots", 0); f
+ < j; f++) {
+ new BW_Worldgen_Ore_SmallOre_Space(
+ "small.custom." + (f < 10 ? "0" : "") + f,
+ GregTech_API.sWorldgenFile.get(
+ "worldgen.GaGregBartworks." + "small.custom." + (f < 10 ? "0" : "") + f,
+ "Enabled",
+ false));
+ }
+ }
+
+ for (Runnable r : ADDITIONALVEINREGISTER) {
+ try {
+ r.run();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ GalacticConfig.serverPostInit();
+
+ Logger.trace("Leaving POSTLOAD");
+ }
+
+ /**
+ * If oregen profiling is enabled, then register the command
+ *
+ * @param pEvent
+ */
+ @EventHandler
+ public void serverLoad(FMLServerStartingEvent pEvent) {
+ Logger.trace("Entering SERVERLOAD");
+
+ if (GalacticConfig.ProfileOreGen) pEvent.registerServerCommand(new ProfilingCommand());
+
+ if (Loader.isModLoaded("appliedenergistics2") && GalacticConfig.EnableAEExportCommand
+ && GalacticConfig.SchematicsEnabled) pEvent.registerServerCommand(new AEStorageCommand());
+
+ Logger.trace("Leaving SERVERLOAD");
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/ModRegisterer.java b/src/main/java/bloodasp/galacticgreg/ModRegisterer.java
new file mode 100644
index 0000000000..889cee0ca6
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/ModRegisterer.java
@@ -0,0 +1,283 @@
+package bloodasp.galacticgreg;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.world.gen.ChunkProviderEnd;
+
+import bloodasp.galacticgreg.api.AsteroidBlockComb;
+import bloodasp.galacticgreg.api.Enums;
+import bloodasp.galacticgreg.api.Enums.AllowedBlockPosition;
+import bloodasp.galacticgreg.api.Enums.DimensionType;
+import bloodasp.galacticgreg.api.GTOreTypes;
+import bloodasp.galacticgreg.api.ModContainer;
+import bloodasp.galacticgreg.api.ModDBMDef;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.api.SpecialBlockComb;
+
+/**
+ * In this class, you'll find everything you need in order to tell GGreg what to do and where. Everything is done in
+ * here. If you're trying to use anything else, you're probably doing something wrong (Or I forgot to add it. In that
+ * case, find me on github and create an issue please)
+ */
+public class ModRegisterer {
+
+ /**
+ * Just a helper to convert a single element to a list
+ *
+ * @param pDef
+ * @return
+ */
+ private static List<ModDBMDef> singleToList(ModDBMDef pDef) {
+ List<ModDBMDef> tLst = new ArrayList<>();
+ tLst.add(pDef);
+ return tLst;
+ }
+
+ private static Method registerModContainer;
+
+ /**
+ * Use loose binding of the register-method. Should be enough to provide support for GGreg without the requirement
+ * to have it in a modpack at all
+ *
+ * @param pModContainer
+ */
+ public static void registerModContainer(ModContainer pModContainer) {
+ /*
+ * try { registerModContainer.invoke(null, pModContainer); } catch (Exception e) { e.printStackTrace(); }
+ */
+ }
+
+ /**
+ * Try to get the instance of GalacticGregs registry in order to register stuff
+ *
+ * @return
+ */
+ public boolean Init() {
+ return false;
+ /*
+ * try { Class gGregRegistry = Class.forName("bloodasp.galacticgreg.registry.GalacticGregRegistry");
+ * registerModContainer = gGregRegistry.getMethod("registerModContainer", ModContainer.class); return true; }
+ * catch (Exception e) { // GalacticGreg is not installed or something is wrong return false; }
+ */
+ }
+
+ public void Register() {
+ /*
+ * if (GalacticGreg.GalacticConfig.RegisterVanillaDim) registerModContainer(Setup_Vanilla()); if
+ * (GalacticGreg.GalacticConfig.RegisterGalacticCraftCore) registerModContainer(Setup_GalactiCraftCore()); if
+ * (GalacticGreg.GalacticConfig.RegisterGalacticCraftPlanets) registerModContainer(Setup_GalactiCraftPlanets());
+ * if (GalacticGreg.GalacticConfig.RegisterGalaxySpace) registerModContainer(Setup_GalaxySpace());
+ */
+ }
+
+ /**
+ * Vanilla MC (End Asteroids)
+ */
+ private ModContainer Setup_Vanilla() {
+ // --- Mod Vanilla (Heh, "mod")
+ ModContainer modMCVanilla = new ModContainer("Vanilla");
+
+ // If you happen to have an asteroid dim, just skip the blocklist, and setDimensionType() to
+ // DimensionType.Asteroid
+ // also don't forget to add at least one asteroid type, or nothing will generate!
+ ModDimensionDef dimEndAsteroids = new ModDimensionDef(
+ "EndAsteroids",
+ ChunkProviderEnd.class,
+ DimensionType.Asteroid);
+
+ dimEndAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.Netherrack));
+ dimEndAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.RedGranite));
+ dimEndAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.BlackGranite));
+ dimEndAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.EndStone));
+
+ // These Blocks will randomly be generated
+ dimEndAsteroids.addSpecialAsteroidBlock(new SpecialBlockComb(Blocks.glowstone));
+ dimEndAsteroids.addSpecialAsteroidBlock(new SpecialBlockComb(Blocks.lava, AllowedBlockPosition.AsteroidCore));
+
+ modMCVanilla.addDimensionDef(dimEndAsteroids);
+
+ return modMCVanilla;
+ }
+
+ /**
+ * Mod GalactiCraft Just another setup based on existing classes, due the fact that we're working with GalactiCraft
+ */
+ public static ModContainer Setup_GalactiCraftCore() {
+ ModContainer modGCraftCore = new ModContainer("GalacticraftCore");
+ ModDBMDef DBMMoon = new ModDBMDef("tile.moonBlock", 4);
+
+ ModDimensionDef tMoonDim = new ModDimensionDef(
+ "Moon",
+ "micdoodle8.mods.galacticraft.core.world.gen.ChunkProviderMoon",
+ Enums.DimensionType.Planet,
+ singleToList(DBMMoon));
+ modGCraftCore.addDimensionDef(tMoonDim);
+
+ return modGCraftCore;
+ }
+
+ /**
+ * As GalactiCraftPlanets is an optional mod, don't hardlink it here
+ *
+ * @return
+ */
+ private ModContainer Setup_GalactiCraftPlanets() {
+ ModContainer modGCraftPlanets = new ModContainer("GalacticraftMars");
+ ModDBMDef DBMMars = new ModDBMDef("tile.mars", 9);
+ ModDimensionDef dimMars = new ModDimensionDef(
+ "Mars",
+ "micdoodle8.mods.galacticraft.planets.mars.world.gen.ChunkProviderMars",
+ DimensionType.Planet,
+ singleToList(DBMMars));
+
+ // Overwrite ore blocks on mars with red granite ones. This will default to regular stone if not set
+ dimMars.setStoneType(GTOreTypes.RedGranite);
+ modGCraftPlanets.addDimensionDef(dimMars);
+
+ ModDimensionDef dimAsteroids = new ModDimensionDef(
+ "Asteroids",
+ "micdoodle8.mods.galacticraft.planets.asteroids.world.gen.ChunkProviderAsteroids",
+ DimensionType.Asteroid);
+ dimAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.BlackGranite));
+ dimAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.RedGranite));
+ dimAsteroids.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.Netherrack));
+ modGCraftPlanets.addDimensionDef(dimAsteroids);
+
+ return modGCraftPlanets;
+ }
+
+ /**
+ * Mod GalaxySpace by BlesseNtumble
+ */
+ private ModContainer Setup_GalaxySpace() {
+ // First, we create a mod-container that will be populated with dimensions later.
+ // The Name must match your modID, as it is checked if this mod is loaded, in order
+ // to enable/disable the parsing/registering of dimensions
+ ModContainer modCGalaxySpace = new ModContainer("GalaxySpace");
+
+ // Now lets first define a block here for our dimension. You can add the modID, but you don't have to.
+ // It will automatically add the mods name that is defined in the modcontainer.
+ ModDBMDef DBMPhobos = new ModDBMDef("phobosstone");
+ ModDBMDef DBMDeimos = new ModDBMDef("deimossubgrunt");
+ ModDBMDef DBMCeres = new ModDBMDef("ceressubgrunt");
+ ModDBMDef DBMIO = new ModDBMDef("iorock", 4); // This meta-4 is a copy&paste bug in GSpace and might not work in
+ // further versions
+ ModDBMDef DBMGanymede = new ModDBMDef("ganymedesubgrunt");
+ ModDBMDef DBMCallisto = new ModDBMDef("callistosubice");
+ ModDBMDef DBMVenus = new ModDBMDef("venussubgrunt");
+ ModDBMDef DBMMercury = new ModDBMDef("mercurycore");
+ ModDBMDef DBMEnceladus = new ModDBMDef("enceladusrock");
+ ModDBMDef DBMTitan = new ModDBMDef("titanstone");
+ ModDBMDef DBMOberon = new ModDBMDef("oberonstone");
+ ModDBMDef DBMProteus = new ModDBMDef("proteusstone");
+ ModDBMDef DBMTriton = new ModDBMDef("tritonstone");
+ ModDBMDef DBMPluto = new ModDBMDef("plutostone");
+
+ // Now define the available dimensions, and their chunkprovider.
+ // Same as above, to not have any dependency in your code, you can just give it a string.
+ // But it's better to use the actual ChunkProvider class. The Name is used for the GalacticGreg config file.
+ // The resulting config setting will be: <ModID>_<Name you give here as arg0>_false = false
+ // make sure to never change this name once you've generated your config files, as it will overwrite everything!
+
+ // 25.10.2015 GSpace v2.5
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Pluto",
+ "blessentumble.planets.SolarSystem.pluto.dimension.ChunkProviderPluto",
+ DimensionType.Planet,
+ singleToList(DBMPluto)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Triton",
+ "blessentumble.moons.triton.dimension.ChunkProviderTriton",
+ DimensionType.Planet,
+ singleToList(DBMTriton)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Proteus",
+ "blessentumble.moons.proteus.dimension.ChunkProviderProteus",
+ DimensionType.Planet,
+ singleToList(DBMProteus)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Oberon",
+ "blessentumble.moons.oberon.dimension.ChunkProviderOberon",
+ DimensionType.Planet,
+ singleToList(DBMOberon)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Titan",
+ "blessentumble.moons.titan.dimension.ChunkProviderTitan",
+ DimensionType.Planet,
+ singleToList(DBMTitan)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Callisto",
+ "blessentumble.moons.SolarSystem.callisto.dimension.ChunkProviderCallisto",
+ DimensionType.Planet,
+ singleToList(DBMCallisto)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Ganymede",
+ "blessentumble.moons.ganymede.dimension.ChunkProviderGanymede",
+ DimensionType.Planet,
+ singleToList(DBMGanymede)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Ceres",
+ "blessentumble.planets.SolarSystem.ceres.dimension.ChunkProviderCeres",
+ DimensionType.Planet,
+ singleToList(DBMCeres)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Deimos",
+ "blessentumble.moons.SolarSystem.deimos.dimension.ChunkProviderDeimos",
+ DimensionType.Planet,
+ singleToList(DBMDeimos)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Enceladus",
+ "blessentumble.moons.SolarSystem.enceladus.dimension.ChunkProviderEnceladus",
+ DimensionType.Planet,
+ singleToList(DBMEnceladus)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Io",
+ "blessentumble.moons.io.dimension.ChunkProviderIo",
+ DimensionType.Planet,
+ singleToList(DBMIO)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Phobos",
+ "blessentumble.moons.phobos.dimension.ChunkProviderPhobos",
+ DimensionType.Planet,
+ singleToList(DBMPhobos)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Venus",
+ "blessentumble.planets.SolarSystem.venus.dimension.ChunkProviderVenus",
+ DimensionType.Planet,
+ singleToList(DBMVenus)));
+ modCGalaxySpace.addDimensionDef(
+ new ModDimensionDef(
+ "Mercury",
+ "blessentumble.planets.SolarSystem.mercury.dimension.ChunkProviderMercury",
+ DimensionType.Planet,
+ singleToList(DBMMercury)));
+
+ // GSpace 2.2-Beta: Kupierbelt
+ ModDimensionDef dimKupierBelt = new ModDimensionDef(
+ "Kuiperbelt",
+ "blessentumble.planets.SolarSystem.kuiperbelt.dimension.ChunkProviderKuiper",
+ DimensionType.Asteroid);
+ dimKupierBelt.setDimensionType(DimensionType.Asteroid);
+ dimKupierBelt.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.RedGranite));
+ dimKupierBelt.addAsteroidMaterial(new AsteroidBlockComb(GTOreTypes.BlackGranite));
+ modCGalaxySpace.addDimensionDef(dimKupierBelt);
+
+ return modCGalaxySpace;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/WorldGenGaGT.java b/src/main/java/bloodasp/galacticgreg/WorldGenGaGT.java
new file mode 100644
index 0000000000..90f51ec7e1
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/WorldGenGaGT.java
@@ -0,0 +1,89 @@
+package bloodasp.galacticgreg;
+
+import gregtech.common.GT_Worldgen_GT_Ore_Layer;
+import gregtech.common.GT_Worldgen_GT_Ore_SmallPieces;
+
+public class WorldGenGaGT implements Runnable {
+
+ @Override
+ public void run() {
+ new GT_Worldgenerator_Space();
+
+ /*
+ * new GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.copper", true, 60, 120, 32, Materials.Copper); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.tin", true, 60, 120, 32, Materials.Tin); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.bismuth", true, 80, 120, 8, Materials.Bismuth); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.coal", true, 60, 100, 24, Materials.Coal); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.iron", true, 40, 80, 16, Materials.Iron); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.lead", true, 40, 80, 16, Materials.Lead); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.zinc", true, 30, 60, 12, Materials.Zinc); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.gold", true, 20, 40, 8, Materials.Gold); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.silver", true, 20, 40, 8, Materials.Silver); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.nickel", true, 20, 40, 8, Materials.Nickel); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.lapis", true, 20, 40, 4, Materials.Lapis); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.diamond", true, 5, 10, 2, Materials.Diamond); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.redstone", true, 5, 20, 8, Materials.Redstone); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.platinum", true, 20, 40, 8, Materials.Platinum); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.iridium", true, 20, 40, 8, Materials.Iridium); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.netherquartz", true, 30, 120, 64, Materials.NetherQuartz);
+ * new GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.saltpeter", true, 10, 60, 8, Materials.Saltpeter); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.sulfur_n", true, 10, 60, 32, Materials.Sulfur); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.sulfur_o", true, 5, 15, 8, Materials.Sulfur); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.emerald", true, 5, 250, 1, Materials.Emerald); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.ruby", true, 5, 250, 1, Materials.Ruby); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.sapphire", true, 5, 250, 1, Materials.Sapphire); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.greensapphire", true, 5, 250, 1, Materials.GreenSapphire);
+ * new GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.olivine", true, 5, 250, 1, Materials.Olivine); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.topaz", true, 5, 250, 1, Materials.Topaz); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.tanzanite", true, 5, 250, 1, Materials.Tanzanite); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.amethyst", true, 5, 250, 1, Materials.Amethyst); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.opal", true, 5, 250, 1, Materials.Opal); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.jasper", true, 5, 250, 1, Materials.Jasper); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.bluetopaz", true, 5, 250, 1, Materials.BlueTopaz); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.amber", true, 5, 250, 1, Materials.Amber); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.foolsruby", true, 5, 250, 1, Materials.FoolsRuby); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.garnetred", true, 5, 250, 1, Materials.GarnetRed); new
+ * GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.garnetyellow", true, 5, 250, 1, Materials.GarnetYellow);
+ */
+ /*
+ * This part here enables every GT Small Ore for Space Dims.
+ */
+ for (int k = 0; k < GT_Worldgen_GT_Ore_SmallPieces.sList.size(); ++k) {
+ new GT_Worldgen_GT_Ore_SmallPieces_Space(
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mWorldGenName,
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mEnabled,
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mMinY,
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mMaxY,
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mAmount,
+ GT_Worldgen_GT_Ore_SmallPieces.sList.get(k).mMeta);
+ }
+
+ /*
+ * This part here enables every GT Ore for Space Dims.
+ */
+ for (int k = 0; k < GT_Worldgen_GT_Ore_Layer.sList.size(); ++k) {
+ new GT_Worldgen_GT_Ore_Layer_Space(
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mWorldGenName,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mEnabled,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mMinY,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mMaxY,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mWeight,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mDensity,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mSize,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mPrimaryMeta,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mSecondaryMeta,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mBetweenMeta,
+ GT_Worldgen_GT_Ore_Layer.sList.get(k).mSporadicMeta);
+ }
+
+ /*
+ * int f = 0; for (int j = GregTech_API.sWorldgenFile.get("worldgen", "AmountOfCustomSmallOreSlots", 16); f < j;
+ * f++) { new GT_Worldgen_GT_Ore_SmallPieces_Space("ore.small.custom." + (f < 10 ? "0" : "") + f, false, 0, 0,
+ * 0, Materials._NULL); } int i = 0; for (int j = GregTech_API.sWorldgenFile.get("worldgen",
+ * "AmountOfCustomLargeVeinSlots", 16); i < j; i++) { new GT_Worldgen_GT_Ore_Layer_Space("ore.mix.custom." + (i
+ * < 10 ? "0" : "") + i, false, 0, 0, 0, 0, 0, Materials._NULL, Materials._NULL, Materials._NULL,
+ * Materials._NULL); }
+ */
+ }
+
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/AsteroidBlockComb.java b/src/main/java/bloodasp/galacticgreg/api/AsteroidBlockComb.java
new file mode 100644
index 0000000000..7976eadc0a
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/AsteroidBlockComb.java
@@ -0,0 +1,77 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.block.Block;
+
+/**
+ * Class for a bit more advanced combinations for Asteroids, which supports Custom Blocks as base material and Values
+ * required to generate Gregtech ores
+ */
+public class AsteroidBlockComb extends BlockMetaComb {
+
+ private final GTOreTypes _mGTOreMaterial;
+
+ /**
+ * Create an advanced definition which uses the GregTech-OreType values for ores, and your own definition of Block
+ * for the asteroid material
+ *
+ * @param pOreType The GregTech oreType
+ * @param pBlock Your block
+ */
+ public AsteroidBlockComb(GTOreTypes pOreType, Block pBlock) {
+ super(pBlock, 0);
+ _mGTOreMaterial = pOreType;
+ }
+
+ /**
+ * Create an advanced definition which uses the GregTech-OreType values for ores, and your own definition of Block
+ * for the asteroid material
+ *
+ * @param pOreType The GregTech oreType
+ * @param pBlock Your block
+ * @param pMeta The metavalue for your block (If required)
+ */
+ public AsteroidBlockComb(GTOreTypes pOreType, Block pBlock, int pMeta) {
+ super(pBlock, pMeta);
+ _mGTOreMaterial = pOreType;
+ }
+
+ /**
+ * Create a simple definition which uses the GregTech-OreType values for both asteroidStone and ores
+ *
+ * @param pOreType The GregTech oreType
+ */
+ public AsteroidBlockComb(GTOreTypes pOreType) {
+ super(pOreType.getBlock(), pOreType.getMeta());
+ _mGTOreMaterial = pOreType;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The GT Material for the oregen
+ */
+ public GTOreTypes getOreMaterial() {
+ return _mGTOreMaterial;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) return false;
+ if (other == this) return true;
+ if (!(other instanceof AsteroidBlockComb)) return false;
+ AsteroidBlockComb otherObj = (AsteroidBlockComb) other;
+
+ boolean tFlag = true;
+ String otherName = Block.blockRegistry.getNameForObject(otherObj.getBlock());
+ String thisName = Block.blockRegistry.getNameForObject(this.getBlock());
+ if (otherName != null && thisName != null) {
+ if (!otherName.equals(thisName)) tFlag = false;
+
+ if (!(otherObj.getMeta() == this.getMeta())) tFlag = false;
+
+ if (!(otherObj.getOreMaterial() == this.getOreMaterial())) tFlag = false;
+ } else tFlag = false;
+
+ return tFlag;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/BlockMetaComb.java b/src/main/java/bloodasp/galacticgreg/api/BlockMetaComb.java
new file mode 100644
index 0000000000..7bf504d144
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/BlockMetaComb.java
@@ -0,0 +1,50 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.block.Block;
+
+/**
+ * Class used for Simple Block - Meta constructs
+ */
+public class BlockMetaComb {
+
+ private int mMeta;
+ private Block mBlock;
+
+ /**
+ * Creates a simple instance for a block that has no meta value
+ *
+ * @param pBlock The Block in question. 0 is used as meta
+ */
+ public BlockMetaComb(Block pBlock) {
+ this(pBlock, 0);
+ }
+
+ /**
+ * Creates a simple instance for a block with a meta value
+ *
+ * @param pBlock The Block in question
+ * @param pMeta The MetaValue in question ([block]:[meta])
+ */
+ public BlockMetaComb(Block pBlock, int pMeta) {
+ mMeta = pMeta;
+ mBlock = pBlock;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The metadata for this block
+ */
+ public int getMeta() {
+ return mMeta;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The block
+ */
+ public Block getBlock() {
+ return mBlock;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/Enums.java b/src/main/java/bloodasp/galacticgreg/api/Enums.java
new file mode 100644
index 0000000000..0c8afaf243
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/Enums.java
@@ -0,0 +1,57 @@
+package bloodasp.galacticgreg.api;
+
+public class Enums {
+
+ public enum SpaceObjectType {
+ OreAsteroid,
+ NonOreSchematic
+ }
+
+ public enum TargetBlockPosition {
+ Invalid,
+ AsteroidInnerCore,
+ AsteroidCore,
+ AsteroidShell,
+ StructureBlock
+ }
+
+ public enum AllowedBlockPosition {
+ AsteroidInnerCore,
+ AsteroidCore,
+ AsteroidShell,
+ AsteroidCoreAndShell
+ }
+
+ public enum AirReplaceRule {
+ NeverReplaceAir,
+ AllowReplaceAir,
+ OnlyReplaceAir
+ }
+
+ public enum ReplaceState {
+ Unknown,
+ Airblock,
+ CanReplace,
+ CannotReplace
+ }
+
+ public enum DimensionType {
+ /**
+ * The Dimension is a void dimension and asteroids shall be generated. They will randomly spawn bewteen 0 and
+ * 250 Additional config values will be generated in worldconfig
+ */
+ Asteroid,
+
+ /**
+ * The Dimension is a planet, and only ores shall be generated in the ground
+ */
+ Planet,
+
+ /**
+ * The Dimension is a special dim where Asteroids *and* ores shall spawn. Additional config values will be
+ * generated in worldconfig
+ */
+ AsteroidAndPlanet
+ }
+
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/GTOreTypes.java b/src/main/java/bloodasp/galacticgreg/api/GTOreTypes.java
new file mode 100644
index 0000000000..dedbc8f5cc
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/GTOreTypes.java
@@ -0,0 +1,66 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+
+import gregtech.api.GregTech_API;
+
+/**
+ * Representation of the various GregTech ores, with their counterpart in VanillaBlocks, and the OreOffset that is
+ * required to generate the proper ores
+ */
+public enum GTOreTypes {
+
+ /**
+ * The Definition for Gregtech's RedGranite
+ **/
+ RedGranite(4000, GregTech_API.sBlockGranites, 8, 3),
+ /**
+ * The Definition for Gregtech's BlackGranite
+ */
+ BlackGranite(3000, GregTech_API.sBlockGranites, 0, 3),
+ /**
+ * The Definition for EndStone
+ */
+ EndStone(2000, Blocks.end_stone, 0, 0),
+ /**
+ * The Definition for Netherrack
+ */
+ Netherrack(1000, Blocks.netherrack, 0, 0), // Unsure about blockupdate value!
+ /**
+ * The Definition for SmallOres (And BlockType Stone)
+ */
+ SmallOres(16000, Blocks.stone, 0, 0), // Unsure about blockupdate value!
+ /**
+ * The Definition for Ores (And BlockType Stone)
+ */
+ NormalOres(0, Blocks.stone, 0, 0); // Unsure about blockupdate value!
+
+ private int _mOffset;
+ private Block _mStoneBlock;
+ private int _mBlockMeta;
+ private int _mUpdateMode;
+
+ GTOreTypes(int pOffset, Block pBlock, int pMeta, int pUpdateMode) {
+ _mOffset = pOffset;
+ _mStoneBlock = pBlock;
+ _mBlockMeta = pMeta;
+ _mUpdateMode = pUpdateMode;
+ }
+
+ public Block getBlock() {
+ return _mStoneBlock;
+ }
+
+ public int getMeta() {
+ return _mBlockMeta;
+ }
+
+ public int getOffset() {
+ return _mOffset;
+ }
+
+ public int getUpdateMode() {
+ return _mUpdateMode;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/ISpaceObjectGenerator.java b/src/main/java/bloodasp/galacticgreg/api/ISpaceObjectGenerator.java
new file mode 100644
index 0000000000..881efa08eb
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/ISpaceObjectGenerator.java
@@ -0,0 +1,58 @@
+package bloodasp.galacticgreg.api;
+
+import java.util.List;
+
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.api.Enums.SpaceObjectType;
+
+public interface ISpaceObjectGenerator {
+
+ Vec3 getCenterPoint();
+
+ /**
+ * Set the center-point of the object to generate, by providing X, Y and Z directly
+ *
+ * @param pX
+ * @param pY
+ * @param pZ
+ */
+ void setCenterPoint(int pX, int pY, int pZ);
+
+ /**
+ * Set the center-point of the object to generate, by providing a Vec3 instance
+ *
+ * @param pCenter
+ */
+ void setCenterPoint(Vec3 pCenter);
+
+ List<StructureInformation> getStructure();
+
+ /**
+ * Calculate the structure Called after randomize()
+ */
+ void calculate();
+
+ /**
+ * Randomize the structure. Called before calculate()
+ *
+ * @param pSizeMin The minimum size for the structure. It is up to you how you handle this value. it's what the user
+ * sets in his config file
+ * @param pSizeMax The maximum size for the structure. It is up to you how you handle this value. it's what the user
+ * sets in his config file
+ */
+ void randomize(int pSizeMin, int pSizeMax);
+
+ /**
+ * Define the type of the generator. OreAsteroid will be used to spawn ores at given coordinates, where
+ * NonOreSchematic will use the Blocks provided in the structural information to generate your structure
+ *
+ * @return
+ */
+ SpaceObjectType getType();
+
+ /**
+ * This function is called every time the generator shall be reset in order to generate a blank, new structure
+ */
+ void reset();
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/ModContainer.java b/src/main/java/bloodasp/galacticgreg/api/ModContainer.java
new file mode 100644
index 0000000000..b5416b164f
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/ModContainer.java
@@ -0,0 +1,85 @@
+package bloodasp.galacticgreg.api;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Defines a Mod where this Generator shall be active. Note: This will only work (obviously) for Dimensions where
+ * either: - Gregtech has a hook in the OreGen or - For mods which are addons to GalactiCraft
+ *
+ */
+public class ModContainer {
+
+ private String _mModName;
+ private List<ModDimensionDef> _mDimensionLookup;
+ private boolean _mEnabled = false;
+
+ /**
+ * Internal function
+ *
+ * @return The state if the Registry could find the mod or not
+ */
+ public boolean getEnabled() {
+ return _mEnabled;
+ }
+
+ /**
+ * Internal function
+ *
+ * Never set this to true. This is an internal marker which is set by the registry if the mod could be found or not
+ *
+ * @param pEnabled
+ */
+ public void setEnabled(boolean pEnabled) {
+ _mEnabled = pEnabled;
+ }
+
+ /**
+ * Define a new Mod where GT OreGen shall be enabled
+ *
+ * @param pModName The modID. Make sure to use the proper mod-id, or it won't load correctly
+ */
+ public ModContainer(String pModName) {
+ _mModName = pModName;
+ _mDimensionLookup = new ArrayList<>();
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The mods name
+ */
+ public String getModName() {
+ return _mModName;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The list of attached dimensions for this mod
+ */
+ public List<ModDimensionDef> getDimensionList() {
+ return _mDimensionLookup;
+ }
+
+ /**
+ * Adds a new dimension to this modcontainer. Make sure you've added all blocks there first
+ *
+ * @param pDimDef The dimension definition to be added
+ * @return true if it could be added, false if not
+ */
+ public boolean addDimensionDef(ModDimensionDef pDimDef) {
+ for (ModDimensionDef mdd : _mDimensionLookup) {
+ if (mdd.getChunkProviderName()
+ .equals(pDimDef.getChunkProviderName())) {
+ // Cannot add DimensionDefinition; The Given chunk-provider name is already taken!
+ return false;
+ }
+ }
+
+ // Set the parent modName of this dimension. This will finalize it
+ pDimDef.setParentModName(_mModName);
+ _mDimensionLookup.add(pDimDef);
+ return true;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/ModDBMDef.java b/src/main/java/bloodasp/galacticgreg/api/ModDBMDef.java
new file mode 100644
index 0000000000..bd0df8652b
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/ModDBMDef.java
@@ -0,0 +1,165 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.block.Block;
+
+import bloodasp.galacticgreg.api.Enums.ReplaceState;
+
+/**
+ * Mod "Dimension Block Meta Definition" Defines the Block-Meta combination for Blocks that can be replaced by the
+ * oregen.
+ *
+ */
+public class ModDBMDef {
+
+ private String _targetBlockName;
+ private int _targetMeta;
+ private boolean _canAlwaysReplace;
+
+ public String getBlockName() {
+ return _targetBlockName;
+ }
+
+ public int getMeta() {
+ return _targetMeta;
+ }
+
+ public boolean getCanAlwaysReplace() {
+ return _canAlwaysReplace;
+ }
+
+ /**
+ * Internal function
+ *
+ * Check if the given Block is equal to the block in this instance
+ *
+ * @param pBlock the Block in question
+ * @return
+ */
+ public ReplaceState blockEquals(Block pBlock) {
+ if (pBlock == null) return ReplaceState.Unknown;
+
+ if (Block.blockRegistry.getNameForObject(pBlock)
+ .equals(_targetBlockName)) return ReplaceState.CanReplace;
+ else return ReplaceState.CannotReplace;
+ }
+
+ /**
+ * Internal function
+ *
+ * Check if the given Block is equal to the block in this instance and matches the metadata
+ *
+ * @param pBlock the block in question
+ * @param pMeta the metadata in question
+ * @return
+ */
+ public ReplaceState blockEquals(Block pBlock, int pMeta) {
+ ReplaceState tFlag = ReplaceState.Unknown;
+ if (blockEquals(pBlock) == ReplaceState.CanReplace) {
+ if (pMeta == _targetMeta || _canAlwaysReplace) tFlag = ReplaceState.CanReplace;
+ else tFlag = ReplaceState.CannotReplace;
+ }
+
+ return tFlag;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) return false;
+ if (other == this) return true;
+ if (!(other instanceof ModDBMDef)) return false;
+ ModDBMDef otherModDBMDef = (ModDBMDef) other;
+ return (otherModDBMDef._targetBlockName.equals(_targetBlockName) && otherModDBMDef._targetMeta == _targetMeta);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition. Meta defaults to 0 here
+ *
+ * @param pTargetBlockName The unlocalizedName of the block
+ */
+ public ModDBMDef(String pTargetBlockName) {
+ this(pTargetBlockName, 0, false);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition
+ *
+ * @param pTargetBlockName The unlocalizedName of the block
+ * @param pMetaData The blocks metadata
+ */
+ public ModDBMDef(String pTargetBlockName, int pMetaData) {
+ this(pTargetBlockName, pMetaData, false);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition
+ *
+ * @param pTargetBlock The instance of the block that can be replaced
+ * @param pMetaData The blocks metadata
+ */
+ public ModDBMDef(Block pTargetBlock, int pMetaData) {
+ this(Block.blockRegistry.getNameForObject(pTargetBlock), pMetaData, false);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition. Meta defaults to 0 here
+ *
+ * @param pTargetBlock The instance of the block that can be replaced
+ */
+ public ModDBMDef(Block pTargetBlock) {
+ this(Block.blockRegistry.getNameForObject(pTargetBlock), 0, false);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition
+ *
+ * @param pTargetBlock
+ * @param pCanAlwaysReplace set to true if this block can always be replaced, regardless of it's metavalue. Like:
+ * [block]:*
+ */
+ public ModDBMDef(Block pTargetBlock, boolean pCanAlwaysReplace) {
+ this(Block.blockRegistry.getNameForObject(pTargetBlock), -1, pCanAlwaysReplace);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition
+ *
+ * @param pTargetBlockName The unlocalizedName of the block
+ * @param pCanAlwaysReplace set to true if this block can always be replaced, regardless of it's metavalue. Like:
+ * [block]:*
+ */
+ public ModDBMDef(String pTargetBlockName, boolean pCanAlwaysReplace) {
+ this(pTargetBlockName, -1, false);
+ }
+
+ /**
+ * Create a new "Block that can be replaced by ores" definition
+ *
+ * @param pTargetBlockName The unlocalizedName of the block
+ * @param pMetaData The blocks metadata
+ * @param pCanAlwaysReplace set to true if this block can always be replaced, regardless of it's metavalue. Like:
+ * [block]:*
+ */
+ public ModDBMDef(String pTargetBlockName, int pMetaData, boolean pCanAlwaysReplace) {
+ _targetBlockName = pTargetBlockName;
+ _targetMeta = pMetaData;
+ _canAlwaysReplace = pCanAlwaysReplace;
+ }
+
+ /**
+ * Internal function Never run this function. It is used to update the blocks name when GalacticGreg is initializing
+ * its internal structures
+ *
+ * @param pParentModName The modname to be attached to the block-name
+ */
+ public void updateBlockName(String pParentModName) {
+ // Do we already have a FQBN? then do nothing
+ if (_targetBlockName.contains(":")) {
+ // GalacticGreg.Logger.trace("Not updating blockname, as it already contains a mods name: %s",
+ // _targetBlockName);
+ return;
+ }
+ // GalacticGreg.Logger.trace("Updating blockname: Old: %s new: %s:%s", _targetBlockName, pParentModName,
+ // _targetBlockName);
+ _targetBlockName = String.format("%s:%s", pParentModName, _targetBlockName);
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/ModDimensionDef.java b/src/main/java/bloodasp/galacticgreg/api/ModDimensionDef.java
new file mode 100644
index 0000000000..4b634173f1
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/ModDimensionDef.java
@@ -0,0 +1,470 @@
+package bloodasp.galacticgreg.api;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import bloodasp.galacticgreg.api.Enums.AirReplaceRule;
+import bloodasp.galacticgreg.api.Enums.DimensionType;
+import bloodasp.galacticgreg.api.Enums.ReplaceState;
+import bloodasp.galacticgreg.api.Enums.SpaceObjectType;
+
+// import bloodasp.galacticgreg.GalacticGreg;
+
+/**
+ * Class to define a Dimension. Supposed to be added to a ModContainer
+ */
+public class ModDimensionDef {
+
+ private static final String STR_NOTDEFINED = "iiznotdefined";
+ private String _mDimensionName;
+ private String _mInternalDimIdentifier;
+ private String _mChunkProvider;
+ private AirReplaceRule _mDimAirSetting;
+ private ArrayList<ModDBMDef> _mReplaceableBlocks;
+ private DimensionType _mDimensionType;
+
+ private List<ISpaceObjectGenerator> _mSpaceObjectsGenerators;
+ private List<ISpaceObjectGenerator> _mSpaceStructureGenerators;
+
+ // Special Planets config settings
+ private int _mGroundOreMaxY = 64;
+ private int _mFloatingAsteroidsMinY = 128;
+ // ------
+
+ // Override for stonetype
+ private GTOreTypes _mStoneType;
+
+ // Asteroid stuff
+ private List<AsteroidBlockComb> _mValidAsteroidMaterials;
+ private List<SpecialBlockComb> _mSpecialBlocksForAsteroids;
+
+ private Random _mRandom = new Random(System.currentTimeMillis());
+
+ /**
+ * Internal function
+ *
+ * @return A list of possible asteroid-mixes that shall be generated
+ */
+ public List<AsteroidBlockComb> getValidAsteroidMaterials() {
+ return _mValidAsteroidMaterials;
+ }
+
+ // =================================================
+ /**
+ * Internal function The only purpose of this functions is to get a default config value for this dim, that can be
+ * altered by the mod author which adds the dimension definition to his mod, but also provide the
+ * modpack-author/serveradmin to change these values aswell
+ */
+ public int getPreConfiguratedGroundOreMaxY() {
+ return _mGroundOreMaxY;
+ }
+
+ /**
+ * Internal function The only purpose of this functions is to get a default config value for this dim, that can be
+ * altered by the mod author which adds the dimension definition to his mod, but also provide the
+ * modpack-author/serveradmin to change these values aswell
+ */
+ public int getPreConfiguratedFloatingAsteroidMinY() {
+ return _mFloatingAsteroidsMinY;
+ }
+
+ /**
+ * Register new generator for objects in space. You can register as many as you want. If you don't register
+ * anything, no structures will generate and the default Asteroid-Generator will be used
+ *
+ * @param pSpaceObjectGenerator An instance of your own object generator
+ */
+ public void registerSpaceObjectGenerator(ISpaceObjectGenerator pSpaceObjectGenerator) {
+ SpaceObjectType tType = pSpaceObjectGenerator.getType();
+ switch (tType) {
+ case NonOreSchematic:
+ _mSpaceStructureGenerators.add(pSpaceObjectGenerator);
+ break;
+ case OreAsteroid:
+ _mSpaceObjectsGenerators.add(pSpaceObjectGenerator);
+ break;
+ default:
+ // GalacticGreg.Logger.error("registerSpaceObjectGenerator() found unhandled generator type %s. Please
+ // report asap, the author was lazy!", tType.toString());
+ break;
+
+ }
+ }
+
+ /**
+ * Internal function Return a random generator for space objects
+ */
+ public ISpaceObjectGenerator getRandomSOGenerator(SpaceObjectType pTargetType) {
+ ISpaceObjectGenerator tGen = null;
+ List<ISpaceObjectGenerator> tLst = null;
+ try {
+ switch (pTargetType) {
+ case NonOreSchematic:
+ tLst = _mSpaceStructureGenerators;
+ break;
+ case OreAsteroid:
+ tLst = _mSpaceObjectsGenerators;
+ break;
+ default:
+ break;
+ }
+
+ if (tLst != null) {
+ if (tLst.size() == 1) tGen = tLst.get(0);
+ else if (tLst.size() > 1) tGen = tLst.get(_mRandom.nextInt(tLst.size()));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return tGen;
+ }
+
+ /**
+ * Define the default values for the floating asteroids and the oregen here. As both generators run in the same
+ * dimension, and you probably don't want to have asteroids stuck in the ground, both generators are separated from
+ * each other. Basically, you can go with the default values. If you want to change them, make sure that pOregenMaxY
+ * is lower than pAsteroidMinY
+ *
+ * @param pOregenMaxY The maximum Y-height where ores will be allowed to spawn. Default: 64
+ * @param pAsteroidMinY The minimum Y-height that has to be reached before asteroids will spawn. Default: 128
+ * @throws IllegalArgumentException if the limits are invalid
+ *
+ */
+ public void setAsteroidAndPlanetLimits(int pOregenMaxY, int pAsteroidMinY) {
+ if (pOregenMaxY >= pAsteroidMinY)
+ throw new IllegalArgumentException("pOregenMaxY must be LOWER than pAsteroidMinY!");
+
+ _mFloatingAsteroidsMinY = pAsteroidMinY;
+ _mGroundOreMaxY = pOregenMaxY;
+ }
+ // =================================================
+
+ /**
+ * Internal function
+ *
+ * @return A list of all special blocks that shall be used to generate the asteroids.
+ */
+ public List<SpecialBlockComb> getSpecialBlocksForAsteroids() {
+ return _mSpecialBlocksForAsteroids;
+ }
+
+ public List<ISpaceObjectGenerator> getSpaceObjectGenerators() {
+ return _mSpaceObjectsGenerators;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The type for this dimension
+ */
+ public DimensionType getDimensionType() {
+ return _mDimensionType;
+ }
+
+ /**
+ * Set whether this DimensionDefinition defines an void-dimension that shall spawn asteroids instead of ores in
+ * stone
+ *
+ * @param pType The dimensiontype to be used
+ */
+ public void setDimensionType(DimensionType pType) {
+ _mDimensionType = pType;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The configuration for AirBlocks
+ */
+ public AirReplaceRule getAirSetting() {
+ return _mDimAirSetting;
+ }
+
+ /**
+ * Define how the oregen shall handle air-blocks. These settings should be pretty self-explandatory, but anyways:
+ * NeverReplaceAir: No matter what, if there is an Air-Block found, it will not replace it. AllowReplaceAir: This
+ * will generate Ores in Stones (defined by addBlockDefinition()) and air if found OnlyReplaceAir : This will not
+ * generate Ores in solid blocks, but only in air
+ *
+ * Note that "OnlyReplaceAir" is a special setting if you have a dimension that is not defined as "Asteroids" but
+ * you still need/want to generate ores in midair.
+ *
+ * @param pSetting
+ */
+ public void setAirSetting(AirReplaceRule pSetting) {
+ _mDimAirSetting = pSetting;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The dimension identifier that is used internally to identify the dimension
+ */
+ public String getDimIdentifier() {
+ return _mInternalDimIdentifier;
+ }
+
+ /**
+ * Set a manual override for ores that shall be generated. This setting is ignored if getIsAsteroidDimension()
+ * returns true
+ *
+ * For example, on GalactiCraft Mars, this value is set to GTOreTypes.RedGranite, because it matches the color
+ * better. If you don't set anything here, it will generate regular stone-ores.
+ *
+ * @param pStoneType
+ */
+ public void setStoneType(GTOreTypes pStoneType) {
+ _mStoneType = pStoneType;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The stone override for gregtech ores
+ */
+ public GTOreTypes getStoneType() {
+ return _mStoneType;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The attached chunk-provider for this dimension
+ */
+ public String getChunkProviderName() {
+ return _mChunkProvider;
+ }
+
+ /**
+ * Adds a new blockdefinition to this dimension. This block will then later be replaced by ores. You can add as many
+ * blocks as you want. Just don't add Blocks.Air, as there is another setting for allowing Air-Replacement
+ *
+ * @param pBlockDef
+ * @return
+ */
+ public boolean addBlockDefinition(ModDBMDef pBlockDef) {
+ if (_mReplaceableBlocks.contains(pBlockDef)) {
+ // GalacticGreg.Logger.error("Cannot add Block %s:%d, as it is already existing!", pBlockDef.getBlockName(),
+ // pBlockDef.getMeta());
+ return false;
+ } else {
+ _mReplaceableBlocks.add(pBlockDef);
+ return true;
+ }
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The DimensionName in a Human-readable format
+ */
+ public String getDimensionName() {
+ return _mDimensionName;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return A list of all defined Blocks that can be replaced while generating ores
+ */
+ public ArrayList<ModDBMDef> getReplaceableBlocks() {
+ return _mReplaceableBlocks;
+ }
+
+ /**
+ * Define a new dimension
+ *
+ * @param pDimensionName The human-readable. Spaces will be removed
+ * @param pChunkProvider The chunkprovider class that shall be observed for the oregen
+ */
+ public ModDimensionDef(String pDimensionName, Class<? extends IChunkProvider> pChunkProvider,
+ DimensionType pDimType) {
+ this(
+ pDimensionName,
+ pChunkProvider.toString()
+ .substring(6),
+ pDimType,
+ null);
+ }
+
+ /**
+ * Define a new dimension
+ *
+ * @param pDimensionName The human-readable. Spaces will be removed
+ * @param pChunkProvider The chunkprovider class that shall be observed for the oregen
+ * @param pBlockDefinitions The list of predefined blocks to be replaced by ores
+ */
+ public ModDimensionDef(String pDimensionName, Class<? extends IChunkProvider> pChunkProvider,
+ DimensionType pDimType, List<ModDBMDef> pBlockDefinitions) {
+ this(
+ pDimensionName,
+ pChunkProvider.toString()
+ .substring(6),
+ pDimType,
+ pBlockDefinitions);
+ }
+
+ /**
+ * Define a new dimension
+ *
+ * @param pDimensionName The human-readable DimensionName. Spaces will be removed
+ * @param pChunkProviderName The human-readable, full-qualified classname for the chunkprovider
+ */
+ public ModDimensionDef(String pDimensionName, String pChunkProviderName, DimensionType pDimType) {
+ this(pDimensionName, pChunkProviderName, pDimType, null);
+ }
+
+ /**
+ * Define a new dimension
+ *
+ * @param pDimensionName The human-readable DimensionName. Spaces will be removed
+ * @param pChunkProviderName The human-readable, full-qualified classname for the chunkprovider
+ * @param pBlockDefinitions The list of predefined blocks to be replaced by ores
+ */
+ public ModDimensionDef(String pDimensionName, String pChunkProviderName, DimensionType pDimType,
+ List<ModDBMDef> pBlockDefinitions) {
+ _mInternalDimIdentifier = STR_NOTDEFINED;
+ _mDimensionName = pDimensionName;
+ _mChunkProvider = pChunkProviderName;
+ _mDimensionType = pDimType;
+
+ _mReplaceableBlocks = new ArrayList<>();
+ if (pBlockDefinitions != null) _mReplaceableBlocks.addAll(pBlockDefinitions);
+
+ _mValidAsteroidMaterials = new ArrayList<>();
+ _mSpecialBlocksForAsteroids = new ArrayList<>();
+ _mSpaceObjectsGenerators = new ArrayList<>();
+ _mSpaceStructureGenerators = new ArrayList<>();
+ }
+
+ /**
+ * Internal function
+ *
+ * Do not call this function by yourself. Ever. It will cause explosions, water to blood, death of firstborn,...
+ * Seriously, don't do it.
+ */
+ protected void setParentModName(String pModName) {
+ if (_mInternalDimIdentifier.equals(STR_NOTDEFINED)) {
+ _mInternalDimIdentifier = String.format("%s_%s", pModName, _mDimensionName);
+ // GalacticGreg.Logger.debug("Set Internal Identifier for Dimension %s to %s", _mDimensionName,
+ // _mInternalDimIdentifier);
+ }
+
+ // Else Don't update, we're already set
+
+ }
+
+ /**
+ * Internal function
+ *
+ * Check if pBlock can be replaced by an ore
+ *
+ * @param pBlock
+ * @param pMeta
+ * @return
+ */
+ public ReplaceState getReplaceStateForBlock(Block pBlock, int pMeta) {
+ ReplaceState tFlag = ReplaceState.Unknown;
+
+ for (ModDBMDef pDef : _mReplaceableBlocks) {
+ ReplaceState tResult = pDef.blockEquals(pBlock, pMeta);
+ if (tResult == ReplaceState.Unknown) continue;
+
+ if (tResult == ReplaceState.CanReplace) {
+ // GalacticGreg.Logger.trace("Targetblock found and metadata match. Replacement allowed");
+ tFlag = ReplaceState.CanReplace;
+ } else if (tResult == ReplaceState.CannotReplace) {
+ // GalacticGreg.Logger.trace("Targetblock found but metadata mismatch. Replacement denied");
+ tFlag = ReplaceState.CannotReplace;
+ }
+ break;
+ }
+
+ return tFlag;
+ }
+
+ /**
+ * Internal function
+ *
+ * Randomly select one material out of all defined materials
+ *
+ * @return
+ */
+ public AsteroidBlockComb getRandomAsteroidMaterial() {
+ if (_mValidAsteroidMaterials.size() == 0) return null;
+
+ if (_mValidAsteroidMaterials.size() == 1) return _mValidAsteroidMaterials.get(0);
+ else {
+ return _mValidAsteroidMaterials.get(_mRandom.nextInt(_mValidAsteroidMaterials.size()));
+ }
+ }
+
+ /**
+ * Internal function
+ *
+ * Randomly select one special block to be placed in the asteroids
+ *
+ * @return
+ */
+ public SpecialBlockComb getRandomSpecialAsteroidBlock() {
+ if (_mSpecialBlocksForAsteroids.size() == 0) return null;
+
+ if (_mSpecialBlocksForAsteroids.size() == 1) return _mSpecialBlocksForAsteroids.get(0);
+ else {
+ return _mSpecialBlocksForAsteroids.get(_mRandom.nextInt(_mSpecialBlocksForAsteroids.size()));
+ }
+ }
+
+ /**
+ * Define the material the asteroid shall be made of. Limited to GT-Based Ores and their stones
+ *
+ * @param pMaterial
+ */
+ public void addAsteroidMaterial(GTOreTypes pMaterial) {
+ addAsteroidMaterial(new AsteroidBlockComb(pMaterial));
+ }
+
+ /**
+ * Define the material the asteroid shall be made of, more advanced option to specify your own blocks
+ *
+ * @param pBlockComb
+ */
+ public void addAsteroidMaterial(AsteroidBlockComb pBlockComb) {
+ if (!_mValidAsteroidMaterials.contains(pBlockComb)) {
+ _mValidAsteroidMaterials.add(pBlockComb);
+ }
+ }
+
+ /**
+ * Adds a new material for asteroid generation. These will spawn randomly in asteroids if enabled. You can basically
+ * add every block you can imagine. Be warned though, if you use Liquids (Water / Lava / ..), it can affect
+ * performance if the liquid is flowing down to the void. So make sure you define "AsteroidCore" as position
+ *
+ * @param pBlock Block-Meta Combination that shall be used
+ */
+ public void addSpecialAsteroidBlock(SpecialBlockComb pBlock) {
+ if (!_mSpecialBlocksForAsteroids.contains(pBlock)) {
+ _mSpecialBlocksForAsteroids.add(pBlock);
+ }
+ }
+
+ /**
+ * Internal function Called when GalacticGreg will finalize all its internal structures. You should never call this
+ * yourself
+ */
+ public void finalizeReplaceableBlocks(String pParentModName) {
+ for (ModDBMDef rpb : _mReplaceableBlocks) {
+ try {
+ rpb.updateBlockName(pParentModName);
+ if (_mStoneType == null) _mStoneType = GTOreTypes.NormalOres;
+ } catch (Exception e) {
+ // GalacticGreg.Logger.error("Unable to finalize replaceable block with modname for block %s. Dimension
+ // %s will probably have problems generating ores", rpb.getBlockName(), _mDimensionName);
+ }
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/SpecialBlockComb.java b/src/main/java/bloodasp/galacticgreg/api/SpecialBlockComb.java
new file mode 100644
index 0000000000..d5f6feb1ca
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/SpecialBlockComb.java
@@ -0,0 +1,71 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.block.Block;
+
+import bloodasp.galacticgreg.api.Enums.AllowedBlockPosition;
+
+public class SpecialBlockComb extends BlockMetaComb {
+
+ private AllowedBlockPosition _mBlockPosition;
+
+ /**
+ * Creates a simple instance for a block that has a meta value and a block position it is allowed to spawn
+ *
+ * @param pBlock The Block in question
+ * @param pMeta The meta value of the block
+ * @param pBlockPosition The position this block is allowed to generate
+ */
+ public SpecialBlockComb(Block pBlock, int pMeta, AllowedBlockPosition pBlockPosition) {
+ super(pBlock, pMeta);
+ _mBlockPosition = pBlockPosition;
+ }
+
+ /**
+ * Creates a simple instance for a block that has no meta value but a position it is allowed to spawn
+ *
+ * @param pBlock The Block in question. 0 is used as meta
+ * @param pBlockPosition The position this block is allowed to generate
+ */
+ public SpecialBlockComb(Block pBlock, AllowedBlockPosition pBlockPosition) {
+ super(pBlock, 0);
+ _mBlockPosition = pBlockPosition;
+ }
+
+ /**
+ * Creates a simple instance for a block that has no meta value and is allowed to spawn everywhere
+ *
+ * @param pBlock The Block in question. 0 is used as meta, and "CoreAndShell" is used as position
+ */
+ public SpecialBlockComb(Block pBlock) {
+ super(pBlock, 0);
+ _mBlockPosition = AllowedBlockPosition.AsteroidCoreAndShell;
+ }
+
+ /**
+ * Internal function
+ *
+ * @return The position the block is supposed to spawn at
+ */
+ public AllowedBlockPosition getBlockPosition() {
+ return _mBlockPosition;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) return false;
+ if (other == this) return true;
+ if (!(other instanceof SpecialBlockComb)) return false;
+ SpecialBlockComb otherObj = (SpecialBlockComb) other;
+
+ boolean tFlag = true;
+ String otherName = Block.blockRegistry.getNameForObject(otherObj.getBlock());
+ String thisName = Block.blockRegistry.getNameForObject(this.getBlock());
+ if (!otherName.equals(thisName)) tFlag = false;
+
+ if (!(otherObj.getMeta() == this.getMeta())) tFlag = false;
+
+ if (!(otherObj.getBlockPosition() == this.getBlockPosition())) tFlag = false;
+
+ return tFlag;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/api/StructureInformation.java b/src/main/java/bloodasp/galacticgreg/api/StructureInformation.java
new file mode 100644
index 0000000000..db205e3ef7
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/api/StructureInformation.java
@@ -0,0 +1,59 @@
+package bloodasp.galacticgreg.api;
+
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.api.Enums.TargetBlockPosition;
+
+/**
+ * Structural information container. Holds X/Y/Z and block/meta information
+ */
+public class StructureInformation {
+
+ private Vec3 _mCoordinates;
+ private TargetBlockPosition _mBlockPosition;
+ private BlockMetaComb _mBlockMetaComb;
+
+ public TargetBlockPosition getBlockPosition() {
+ return _mBlockPosition;
+ }
+
+ public int getX() {
+ return (int) Math.round(_mCoordinates.xCoord);
+ }
+
+ public int getY() {
+ return (int) Math.round(_mCoordinates.yCoord);
+ }
+
+ public int getZ() {
+ return (int) Math.round(_mCoordinates.zCoord);
+ }
+
+ public BlockMetaComb getBlock() {
+ return _mBlockMetaComb;
+ }
+
+ /**
+ * Init StructureInfo only with Coords and block position
+ *
+ * @param pCoordinates The coords in question
+ * @param pPosition The position-enum value
+ */
+ public StructureInformation(Vec3 pCoordinates, TargetBlockPosition pPosition) {
+ this(pCoordinates, pPosition, null);
+ }
+
+ /**
+ * Init StructureInfo with Coords, block position and a populated block/meta info
+ *
+ * @param pCoordinates The coords in question
+ * @param pPosition The position-enum value
+ * @param pTargetBlock The target block in question
+ */
+ public StructureInformation(Vec3 pCoordinates, TargetBlockPosition pPosition, BlockMetaComb pTargetBlock) {
+ _mCoordinates = pCoordinates;
+ _mBlockPosition = pPosition;
+ _mBlockMetaComb = pTargetBlock;
+ }
+
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/ConfigManager.java b/src/main/java/bloodasp/galacticgreg/auxiliary/ConfigManager.java
new file mode 100644
index 0000000000..34f7a5cc8b
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/ConfigManager.java
@@ -0,0 +1,79 @@
+package bloodasp.galacticgreg.auxiliary;
+
+import java.io.File;
+
+import net.minecraftforge.common.config.Configuration;
+
+import bloodasp.galacticgreg.GalacticGreg;
+
+/**
+ * config class to read/setup config files and folders
+ *
+ * @author Namikon
+ */
+public abstract class ConfigManager {
+
+ private File _mainconfigDir = null;
+ private File _blocksconfigDir = null;
+ private String _mModCollection = "";
+ private String _mModID = "";
+
+ protected Configuration _mainConfig = null;
+
+ protected File _mConfigBaseDirectory;
+ public boolean DoDebugMessages = false;
+
+ protected abstract void PreInit();
+
+ protected abstract void Init();
+
+ protected abstract void PostInit();
+
+ public ConfigManager(File pConfigBaseDirectory, String pModCollectionDirectory, String pModID) {
+ _mModCollection = pModCollectionDirectory;
+ _mModID = pModID;
+ _mConfigBaseDirectory = pConfigBaseDirectory;
+ }
+
+ /**
+ * Load/init the config file
+ *
+ * @return true/false if the load/init was successful or not
+ */
+ public boolean LoadConfig() {
+ try {
+ InitConfigDirs();
+ if (_mainConfig == null) return false;
+
+ PreInit();
+ _mainConfig.load();
+ Init();
+ _mainConfig.save();
+ PostInit();
+
+ return true;
+ } catch (Exception e) {
+ GalacticGreg.Logger.error("Unable to init config file");
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * Search for required config-directory / file and create them if they can't be found
+ */
+ private void InitConfigDirs() {
+ GalacticGreg.Logger.debug("Checking/creating config folders");
+
+ _mainconfigDir = new File(String.format("%s%s%s", _mConfigBaseDirectory, File.separator, _mModCollection));
+
+ if (!_mainconfigDir.exists()) {
+ GalacticGreg.Logger.info("Config folder not found. Creating...");
+ _mainconfigDir.mkdir();
+ }
+
+ File tRealConfigFile = new File(String.format("%s%s%s%s", _mainconfigDir, File.separator, _mModID, ".cfg"));
+
+ _mainConfig = new Configuration(tRealConfigFile);
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/GTOreGroup.java b/src/main/java/bloodasp/galacticgreg/auxiliary/GTOreGroup.java
new file mode 100644
index 0000000000..8361a2bda9
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/GTOreGroup.java
@@ -0,0 +1,19 @@
+package bloodasp.galacticgreg.auxiliary;
+
+/**
+ * Just a simple container to wrap 4 GT Ore-Meta ids into one var
+ */
+public class GTOreGroup {
+
+ public short PrimaryMeta;
+ public short SecondaryMeta;
+ public short SporadicBetweenMeta;
+ public short SporadicAroundMeta;
+
+ public GTOreGroup(short pPrimaryMeta, short pSecondaryMeta, short pSporadicBetweenMeta, short pSporadicAroundMeta) {
+ PrimaryMeta = pPrimaryMeta;
+ SecondaryMeta = pSecondaryMeta;
+ SporadicBetweenMeta = pSporadicBetweenMeta;
+ SporadicAroundMeta = pSporadicAroundMeta;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/GalacticGregConfig.java b/src/main/java/bloodasp/galacticgreg/auxiliary/GalacticGregConfig.java
new file mode 100644
index 0000000000..156e620959
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/GalacticGregConfig.java
@@ -0,0 +1,141 @@
+package bloodasp.galacticgreg.auxiliary;
+
+import java.io.File;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.BlockMetaComb;
+import cpw.mods.fml.common.registry.GameRegistry;
+
+public class GalacticGregConfig extends ConfigManager {
+
+ public GalacticGregConfig(File pConfigBaseDirectory, String pModCollectionDirectory, String pModID) {
+ super(pConfigBaseDirectory, pModCollectionDirectory, pModID);
+
+ }
+
+ public boolean ProfileOreGen;
+ public boolean ReportOreGenFailures;
+ public boolean PrintDebugMessagesToFMLLog;
+ public boolean PrintTraceMessagesToFMLLog;
+
+ public boolean LootChestsEnabled;
+ public boolean EnableAEExportCommand;
+ public boolean SchematicsEnabled;
+ public String LootChestItemOverride;
+ public boolean QuietMode;
+
+ public BlockMetaComb CustomLootChest;
+
+ @Override
+ protected void PreInit() {
+ ProfileOreGen = false;
+ ReportOreGenFailures = false;
+ PrintDebugMessagesToFMLLog = false;
+ PrintTraceMessagesToFMLLog = false;
+
+ LootChestsEnabled = true;
+
+ // Default false, as it is WiP
+ EnableAEExportCommand = false;
+ SchematicsEnabled = false;
+
+ LootChestItemOverride = "";
+ QuietMode = false;
+ }
+
+ @Override
+ protected void Init() {
+ ProfileOreGen = _mainConfig.getBoolean(
+ "ProfileOreGen",
+ "Debug",
+ ProfileOreGen,
+ "Enable to profile oregen and register the ingame command ggregprofiler");
+ ReportOreGenFailures = _mainConfig.getBoolean(
+ "ReportOreGenFailures",
+ "Debug",
+ ReportOreGenFailures,
+ "Report if a ore tileentity could not be placed");
+ PrintDebugMessagesToFMLLog = _mainConfig.getBoolean(
+ "PrintDebugMessagesToFMLLog",
+ "Debug",
+ PrintDebugMessagesToFMLLog,
+ "Enable debug output, not recommended for servers");
+ PrintTraceMessagesToFMLLog = _mainConfig.getBoolean(
+ "PrintTraceMessagesToFMLLog",
+ "Debug",
+ PrintTraceMessagesToFMLLog,
+ "Enable trace output. Warning: This will produce gazillions of log entries");
+ QuietMode = _mainConfig.getBoolean(
+ "QuietMode",
+ "Debug",
+ QuietMode,
+ "In quiet-mode only errors, warnings and fatals will be printed to the logfile/console");
+
+ LootChestsEnabled = _mainConfig.getBoolean(
+ "LootChestsEnabled",
+ "Extras",
+ LootChestsEnabled,
+ "Enables/disables the dungeon-chest generator system for asteroids. New config values will be generated if set to true");
+ EnableAEExportCommand = _mainConfig.getBoolean(
+ "EnableAEExportCommand",
+ "Extras",
+ EnableAEExportCommand,
+ "If set to true, you can export any structure stored on a AE2 spatial storage disk. (Can't be spawned yet, WiP). Requires SchematicsEnabled to be true");
+ SchematicsEnabled = _mainConfig.getBoolean(
+ "SchematicsEnabled",
+ "Extras",
+ SchematicsEnabled,
+ "Enable the experimental Schematics-handler to spawn exported schematics in dimensions. This is WiP, use at own risk");
+ LootChestItemOverride = _mainConfig.getString(
+ "CustomLootChest",
+ "Extras",
+ LootChestItemOverride,
+ "Define the chest you wish to use as LootChest. use the <ModID>:<Name>:<meta> format or leave empty for the default Minecraft Chest");
+
+ GalacticGreg.Logger.setDebugOutput(PrintDebugMessagesToFMLLog);
+ GalacticGreg.Logger.setTraceOutput(PrintTraceMessagesToFMLLog);
+ GalacticGreg.Logger.setQuietMode(QuietMode);
+ }
+
+ @Override
+ protected void PostInit() {
+
+ }
+
+ public boolean serverPostInit() {
+ CustomLootChest = new BlockMetaComb(Blocks.chest);
+ try {
+ if (LootChestItemOverride != "") {
+ String[] args = LootChestItemOverride.split(":");
+ String tMod;
+ String tName;
+ int tMeta;
+
+ if (args.length >= 2) {
+ tMod = args[0];
+ tName = args[1];
+ if (args.length == 3) tMeta = Integer.parseInt(args[2]);
+ else tMeta = 0;
+
+ Block tBlock = GameRegistry.findBlock(tMod, tName);
+ if (tBlock != null) {
+ GalacticGreg.Logger
+ .debug("Found valid ChestOverride: %s. LootChest replaced", LootChestItemOverride);
+ CustomLootChest = new BlockMetaComb(tBlock, tMeta);
+ }
+ }
+ }
+
+ return true;
+ } catch (Exception e) {
+ GalacticGreg.Logger.error(
+ "Unable to find custom chest override %s. Make sure item exists. Defaulting to Minecraft:chest",
+ LootChestItemOverride);
+ e.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/LogHelper.java b/src/main/java/bloodasp/galacticgreg/auxiliary/LogHelper.java
new file mode 100644
index 0000000000..c8b450c27a
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/LogHelper.java
@@ -0,0 +1,267 @@
+package bloodasp.galacticgreg.auxiliary;
+
+import java.util.ArrayList;
+
+import org.apache.logging.log4j.Level;
+
+import cpw.mods.fml.common.FMLLog;
+
+/**
+ * Generic LogHelper to print stuff to the console
+ *
+ * @author Namikon
+ */
+public final class LogHelper {
+
+ private ArrayList<String> _mReportedCategories = new ArrayList<>();
+ private boolean doDebugLogs = false;
+ private boolean doTraceLogs = false;
+ private boolean quietMode = false;
+ private String _mModID = "";
+
+ private final static String STR_NOCAT = "ihaznocathegory";
+ private final static String STR_TOKEN_ONETIMEMESSAGE = " OTM";
+
+ public LogHelper(String pModID) {
+ _mModID = pModID;
+ }
+
+ /**
+ * If true, only error/fatal/warn messages will be printed
+ *
+ * @param pEnabled
+ */
+ public void setQuietMode(boolean pEnabled) {
+ quietMode = pEnabled;
+ }
+
+ /**
+ * Enable/Disable debug logs
+ *
+ * @param pEnabled
+ */
+ public void setDebugOutput(boolean pEnabled) {
+ doDebugLogs = pEnabled;
+ }
+
+ /**
+ * Enable/Disable trace logs
+ *
+ * @param pEnabled
+ */
+ public void setTraceOutput(boolean pEnabled) {
+ doTraceLogs = pEnabled;
+ }
+
+ /**
+ * Resets all One-Time categories, so they will be displayed again
+ */
+ public void ResetCategories() {
+ _mReportedCategories = new ArrayList<>();
+ }
+
+ /**
+ * Print a log-message with built-in String.format(x) support. This message will only appear once. usefull for
+ * error/warnings within loops
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param pLogLevel The logLevel for this message
+ * @param pMessage The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void log(String pCategory, Level pLogLevel, String pMessage, Object... args) {
+ if (pLogLevel == Level.DEBUG && !doDebugLogs) return;
+
+ if (pLogLevel == Level.TRACE && !doTraceLogs) return;
+
+ if (pLogLevel != Level.ERROR && pLogLevel != Level.FATAL && pLogLevel != Level.WARN) if (quietMode) return;
+
+ String tt = "";
+ if (!pCategory.equals(STR_NOCAT)) {
+ tt = STR_TOKEN_ONETIMEMESSAGE;
+ if (_mReportedCategories.contains(pCategory)) return;
+ else {
+ _mReportedCategories.add(pCategory);
+ }
+ }
+
+ FMLLog.log(_mModID.toUpperCase() + tt, pLogLevel, pMessage, args);
+ }
+
+ /**
+ * Prints a one-time message with Category ALL
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_all(String pCategory, String object, Object... args) {
+ log(pCategory, Level.ALL, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category DEBUG
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_debug(String pCategory, String object, Object... args) {
+ log(pCategory, Level.DEBUG, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category ERROR
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_error(String pCategory, String object, Object... args) {
+ log(pCategory, Level.ERROR, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category FATAL
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_fatal(String pCategory, String object, Object... args) {
+ log(pCategory, Level.FATAL, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category INFO
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_info(String pCategory, String object, Object... args) {
+ log(pCategory, Level.INFO, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category OFF
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_off(String pCategory, String object, Object... args) {
+ log(pCategory, Level.OFF, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category TRACE
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_trace(String pCategory, String object, Object... args) {
+ log(pCategory, Level.TRACE, object, args);
+ }
+
+ /**
+ * Prints a one-time message with Category WARN
+ *
+ * @param pCategory The category for this message. Used to identify the function, use an easy to memorize name. Will
+ * never be displayed
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void ot_warn(String pCategory, String object, Object... args) {
+ log(pCategory, Level.WARN, object, args);
+ }
+
+ /**
+ * Prints a message with Category ALL
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void all(String object, Object... args) {
+ log(STR_NOCAT, Level.ALL, object, args);
+ }
+
+ /**
+ * Prints a message with Category DEBUG
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void debug(String object, Object... args) {
+ log(STR_NOCAT, Level.DEBUG, object, args);
+ }
+
+ /**
+ * Prints a message with Category ERROR
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void error(String object, Object... args) {
+ log(STR_NOCAT, Level.ERROR, object, args);
+ }
+
+ /**
+ * Prints a message with Category FATAL
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void fatal(String object, Object... args) {
+ log(STR_NOCAT, Level.FATAL, object, args);
+ }
+
+ /**
+ * Prints a message with Category INFO
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void info(String object, Object... args) {
+ log(STR_NOCAT, Level.INFO, object, args);
+ }
+
+ /**
+ * Prints a message with Category OFF
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void off(String object, Object... args) {
+ log(STR_NOCAT, Level.OFF, object, args);
+ }
+
+ /**
+ * Prints a message with Category TRACE
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void trace(String object, Object... args) {
+ log(STR_NOCAT, Level.TRACE, object, args);
+ }
+
+ /**
+ * Prints a message with Category WARN
+ *
+ * @param object The log message
+ * @param args Optional args, if you've used format-specifier in pMessage
+ */
+ public void warn(String object, Object... args) {
+ log(STR_NOCAT, Level.WARN, object, args);
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/PlayerChatHelper.java b/src/main/java/bloodasp/galacticgreg/auxiliary/PlayerChatHelper.java
new file mode 100644
index 0000000000..409775ea1a
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/PlayerChatHelper.java
@@ -0,0 +1,106 @@
+package bloodasp.galacticgreg.auxiliary;
+
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+/**
+ * Method to easily send chat-messages to EntityPlayer
+ *
+ * @author Namikon
+ *
+ */
+public class PlayerChatHelper {
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be GREEN
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendInfo(ICommandSender pCommandSender, String pMessage) {
+ pCommandSender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + pMessage));
+ }
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be RED
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendError(ICommandSender pCommandSender, String pMessage) {
+ pCommandSender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + pMessage));
+ }
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be YELLOW
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendWarn(ICommandSender pCommandSender, String pMessage) {
+ pCommandSender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + pMessage));
+ }
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be GREEN
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendInfo(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + pMessage));
+ }
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be RED
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendError(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + pMessage));
+ }
+
+ /**
+ * Meant for notifications that are being send to an admin/op Color will be YELLOW
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendWarn(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + pMessage));
+ }
+
+ /**
+ * Meant for ingame notifications that are being send to a player, not an admin/op Color will be DARK_GREEN
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendNotifyPositive(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_GREEN + pMessage));
+ }
+
+ /**
+ * Meant for ingame notifications that are being send to a player, not an admin/op Color will be AQUA
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendNotifyNormal(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + pMessage));
+ }
+
+ /**
+ * Meant for ingame notifications that are being send to a player, not an admin/op Color will be DARK_PURPLE
+ *
+ * @param pPlayer
+ * @param pMessage
+ */
+ public static void SendNotifyWarning(EntityPlayer pPlayer, String pMessage) {
+ pPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_PURPLE + pMessage));
+ }
+
+}
diff --git a/src/main/java/bloodasp/galacticgreg/auxiliary/ProfilingStorage.java b/src/main/java/bloodasp/galacticgreg/auxiliary/ProfilingStorage.java
new file mode 100644
index 0000000000..3510c31341
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/auxiliary/ProfilingStorage.java
@@ -0,0 +1,74 @@
+package bloodasp.galacticgreg.auxiliary;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import bloodasp.galacticgreg.api.ModDimensionDef;
+
+/**
+ * A simple FIFO-storage for Long-values Will keep 50 values for each dimension in memory Doesn't need to be changed
+ * when adding new planets/mods
+ */
+public class ProfilingStorage {
+
+ private Map<String, List<Long>> mProfilingMap;
+
+ public ProfilingStorage() {
+ mProfilingMap = new HashMap<>();
+ }
+
+ /**
+ * Add a new time to the list of pDimension. Will be ignored it tTotalTime == 0
+ *
+ * @param pDimension
+ * @param pTotalTime
+ */
+ public void AddTimeToList(ModDimensionDef pDimension, long pTotalTime) {
+ try {
+ if (pTotalTime == 0) return;
+
+ if (!mProfilingMap.containsKey(pDimension.getDimIdentifier()))
+ mProfilingMap.put(pDimension.getDimIdentifier(), new LinkedList<>());
+
+ LinkedList<Long> ll = (LinkedList<Long>) mProfilingMap.get(pDimension.getDimIdentifier());
+
+ ll.addLast(pTotalTime);
+
+ while (ll.size() > 50) ll.removeFirst();
+ } catch (Exception e) {
+ // Just do nothing. profiling is for debug purposes only anyways...
+ }
+ }
+
+ /**
+ * Return the average time required to execute the oregen in Dimension pDimension
+ *
+ * @param pDimension The DimensionType in question
+ * @return
+ */
+ public long GetAverageTime(ModDimensionDef pDimension) {
+ try {
+ if (!mProfilingMap.containsKey(pDimension.getDimIdentifier())) return -1;
+
+ int tTotalVal = 0;
+ long tAverage = 0;
+ long tReturnVal = 0;
+
+ LinkedList<Long> ll = (LinkedList<Long>) mProfilingMap.get(pDimension.getDimIdentifier());
+
+ if (ll != null) {
+ for (Long aLong : ll) {
+ tAverage += aLong;
+ tTotalVal++;
+ }
+
+ tReturnVal = (long) ((float) (tAverage / tTotalVal));
+ }
+ return tReturnVal;
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_Layer_Space.java b/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_Layer_Space.java
new file mode 100644
index 0000000000..ae5e6af7c5
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_Layer_Space.java
@@ -0,0 +1,271 @@
+package bloodasp.galacticgreg.bartworks;
+
+import static bloodasp.galacticgreg.GalacticGreg.oreVeinWorldgenList;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+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.oregen.BW_OreLayer;
+
+import bloodasp.galacticgreg.GT_TileEntity_Ores_Space;
+import bloodasp.galacticgreg.api.Enums;
+import bloodasp.galacticgreg.api.ModDBMDef;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.dynconfig.DynamicOreMixWorldConfig;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class BW_Worldgen_Ore_Layer_Space extends BW_OreLayer {
+
+ private ModDimensionDef pDimensionDef;
+ private String name;
+ private DynamicOreMixWorldConfig _mDynWorldConfig;
+
+ /**
+ * Code-only Constructor Will work with NEI
+ *
+ * @param aName veinname, should start with mix.
+ * @param pDefault enabled?
+ * @param pMinY
+ * @param pMaxY
+ * @param pWeight
+ * @param pDensity
+ * @param pSize 5-32 at max
+ * @param primaryBW either a werkstoff or a materials
+ * @param secondaryBW either a werkstoff or a materials
+ * @param betweenBW either a werkstoff or a materials
+ * @param sporadicBW either a werkstoff or a materials
+ */
+ public BW_Worldgen_Ore_Layer_Space(String aName, boolean pDefault, int pMinY, int pMaxY, int pWeight, int pDensity,
+ int pSize, ISubTagContainer primaryBW, ISubTagContainer secondaryBW, ISubTagContainer betweenBW,
+ ISubTagContainer sporadicBW) {
+ super(aName, pDefault, 0, 0, 0, 0, 0, primaryBW, secondaryBW, betweenBW, sporadicBW);
+ mMinY = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math.max(
+ this.mMinY + 5,
+ GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mWeight = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "RandomWeight", pWeight));
+ mDensity = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "Density", pDensity));
+ mSize = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "Size", pSize)));
+ // short pPrimary = primaryBW instanceof Materials ? (short)((Materials)primaryBW).mMetaItemSubID : (primaryBW
+ // instanceof Werkstoff ? ((Werkstoff)primaryBW).getmID() : 0);
+ // short pSecondary = secondaryBW instanceof Materials ? (short)((Materials)secondaryBW).mMetaItemSubID :
+ // (secondaryBW instanceof Werkstoff ? ((Werkstoff)secondaryBW).getmID() : 0);
+ // short pBetween = betweenBW instanceof Materials ? (short)((Materials)betweenBW).mMetaItemSubID : (betweenBW
+ // instanceof Werkstoff ? ((Werkstoff)betweenBW).getmID() : 0);
+ // short pSporadic = sporadicBW instanceof Materials ? (short)((Materials)sporadicBW).mMetaItemSubID :
+ // (sporadicBW instanceof Werkstoff ? ((Werkstoff)sporadicBW).getmID() : 0);
+ // mPrimaryMeta = ((short) GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName,
+ // "OrePrimaryLayer", pPrimary));
+ // mSecondaryMeta = ((short) GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName,
+ // "OreSecondaryLayer", pSecondary));
+ // mBetweenMeta = ((short) GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName,
+ // "OreSporadiclyInbetween", pBetween));
+ // mSporadicMeta = ((short) GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName,
+ // "OreSporaticlyAround", pSporadic));
+ // bwOres = ((byte) GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName,
+ // "BWGTlogic", bwOres));
+ if (mEnabled) {
+ sWeight += this.mWeight;
+ oreVeinWorldgenList.add(this);
+ }
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName, true);
+ _mDynWorldConfig.InitDynamicConfig();
+
+ StringBuilder ret = new StringBuilder();
+ for (Map.Entry<String, Boolean> key : _mDynWorldConfig.get_mDynWorldConfigMap()
+ .entrySet()
+ .stream()
+ .filter(Map.Entry::getValue)
+ .collect(Collectors.toSet()))
+ ret.append(
+ key.getKey()
+ .split("_")[1])
+ .append("; ");
+ name = ret.substring(0, ret.length() - 1);
+ }
+
+ /**
+ * Script Friendly Constructor, WONT WORK WITH NEI
+ *
+ * @param aName
+ * @param pDefault
+ * @param pMinY
+ * @param pMaxY
+ * @param pWeight
+ * @param pDensity
+ * @param pSize
+ * @param pPrimary
+ * @param pSecondary
+ * @param pBetween
+ * @param pSporadic
+ * @param primaryBW
+ * @param secondaryBW
+ * @param betweenBW
+ * @param sporadicBW
+ */
+ public BW_Worldgen_Ore_Layer_Space(String aName, boolean pDefault, int pMinY, int pMaxY, int pWeight, int pDensity,
+ int pSize, int pPrimary, int pSecondary, int pBetween, int pSporadic, boolean primaryBW, boolean secondaryBW,
+ boolean betweenBW, boolean sporadicBW) {
+ super(
+ aName,
+ pDefault,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ primaryBW ? Werkstoff.default_null_Werkstoff : Materials._NULL,
+ secondaryBW ? Werkstoff.default_null_Werkstoff : Materials._NULL,
+ betweenBW ? Werkstoff.default_null_Werkstoff : Materials._NULL,
+ sporadicBW ? Werkstoff.default_null_Werkstoff : Materials._NULL);
+ mMinY = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math.max(
+ this.mMinY + 5,
+ GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mWeight = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "RandomWeight", pWeight));
+ mDensity = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "Density", pDensity));
+ mSize = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "Size", pSize)));
+ mPrimaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "OrePrimaryLayer", pPrimary));
+ mSecondaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "OreSecondaryLayer", pSecondary));
+ mBetweenMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "OreSporadiclyInbetween", pBetween));
+ mSporadicMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "OreSporaticlyAround", pSporadic));
+ bwOres = ((byte) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "BWGTlogic", bwOres));
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName, true);
+ _mDynWorldConfig.InitDynamicConfig();
+ StringBuilder ret = new StringBuilder();
+ for (Map.Entry<String, Boolean> key : _mDynWorldConfig.get_mDynWorldConfigMap()
+ .entrySet()
+ .stream()
+ .filter(Map.Entry::getValue)
+ .collect(Collectors.toSet()))
+ ret.append(
+ key.getKey()
+ .split("_")[1])
+ .append("; ");
+ name = ret.length() == 0 ? "" : ret.substring(0, ret.length() - 1);
+ if (mEnabled) {
+ sWeight += this.mWeight;
+ oreVeinWorldgenList.add(this);
+ }
+ }
+
+ /**
+ * Script Friendly Constructor, WONT WORK WITH NEI
+ *
+ * @param aName
+ * @param enabled
+ */
+ public BW_Worldgen_Ore_Layer_Space(String aName, boolean enabled) {
+ this(aName, enabled, 0, 0, 0, 0, 0, 0, 0, 0, 0, true, true, true, true);
+ }
+
+ public boolean isEnabledForDim(ModDimensionDef pDimensionDef) {
+ return _mDynWorldConfig.isEnabledInDim(pDimensionDef);
+ }
+
+ @Override
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ ModDimensionDef tMDD = GalacticGregRegistry.getDimensionTypeByChunkGenerator(aChunkGenerator);
+ if (tMDD == null) return false;
+ pDimensionDef = tMDD;
+ return super.executeWorldgen(
+ aWorld,
+ aRandom,
+ aBiome,
+ aDimensionType,
+ aChunkX,
+ aChunkZ,
+ aChunkGenerator,
+ aChunkProvider);
+ }
+
+ public boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) {
+ TileEntity te = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(te instanceof BW_MetaGeneratedOreTE) && !(te instanceof GT_TileEntity_Ores)) {
+ if (aMetaData == this.mSporadicMeta && (this.bwOres & 1) != 0
+ || aMetaData == this.mBetweenMeta && (this.bwOres & 2) != 0
+ || aMetaData == this.mPrimaryMeta && (this.bwOres & 8) != 0
+ || aMetaData == this.mSecondaryMeta && (this.bwOres & 4) != 0) {
+ boolean wasSet;
+ for (ModDBMDef e : pDimensionDef.getReplaceableBlocks()) {
+ wasSet = isSmallOre
+ ? BW_MetaGenerated_SmallOres.setOreBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir,
+ (Block) Block.blockRegistry.getObject(e.getBlockName()),
+ new int[] { e.getMeta() })
+ : BW_MetaGenerated_Ores.setOreBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir,
+ (Block) Block.blockRegistry.getObject(e.getBlockName()),
+ new int[] { e.getMeta() });
+ if (wasSet) return true;
+ }
+ return false;
+ } else {
+ return GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(
+ pDimensionDef,
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir);
+ }
+ } else {
+ return true;
+ }
+ }
+
+ @Override
+ public Block getDefaultBlockToReplace() {
+ return null;
+ }
+
+ @Override
+ public int[] getDefaultDamageToReplace() {
+ return null;
+ }
+
+ @Override
+ public String getDimName() {
+ return name;
+ }
+
+}
diff --git a/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_SmallOre_Space.java b/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_SmallOre_Space.java
new file mode 100644
index 0000000000..78f169e054
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/bartworks/BW_Worldgen_Ore_SmallOre_Space.java
@@ -0,0 +1,165 @@
+package bloodasp.galacticgreg.bartworks;
+
+import static bloodasp.galacticgreg.GalacticGreg.smallOreWorldgenList;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+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.oregen.BW_OreLayer;
+
+import bloodasp.galacticgreg.GT_TileEntity_Ores_Space;
+import bloodasp.galacticgreg.api.Enums;
+import bloodasp.galacticgreg.api.ModDBMDef;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.dynconfig.DynamicOreMixWorldConfig;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class BW_Worldgen_Ore_SmallOre_Space extends BW_OreLayer {
+
+ private ModDimensionDef pDimensionDef;
+ private DynamicOreMixWorldConfig _mDynWorldConfig;
+ private String name;
+
+ public BW_Worldgen_Ore_SmallOre_Space(String aName, boolean pDefault, int pMinY, int pMaxY, int pDensity,
+ int pPrimary, ISubTagContainer primaryBW) {
+ super(aName, pDefault, 0, 0, 0, 0, 0, primaryBW, Materials._NULL, Materials._NULL, Materials._NULL);
+ mMinY = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "MinHeight", pMinY));
+ mMaxY = ((short) Math.max(
+ this.mMinY + 1,
+ GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "MaxHeight", pMaxY)));
+ mDensity = ((short) Math.max(
+ 1,
+ GregTech_API.sWorldgenFile.get("worldgen.GaGregBartworks." + this.mWorldGenName, "Amount", pDensity)));
+ mPrimaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "Meta", pPrimary));
+ bwOres = ((byte) GregTech_API.sWorldgenFile
+ .get("worldgen.GaGregBartworks." + this.mWorldGenName, "BWGTlogic", bwOres));
+ _mDynWorldConfig = new DynamicOreMixWorldConfig(mWorldGenName, true);
+ _mDynWorldConfig.InitDynamicConfig();
+ StringBuilder ret = new StringBuilder();
+ for (Map.Entry<String, Boolean> key : _mDynWorldConfig.get_mDynWorldConfigMap()
+ .entrySet()
+ .stream()
+ .filter(Map.Entry::getValue)
+ .collect(Collectors.toSet()))
+ ret.append(
+ key.getKey()
+ .split("_")[1])
+ .append("; ");
+ name = ret.length() == 0 ? "" : ret.substring(0, ret.length() - 1);
+ if (mEnabled) {
+ smallOreWorldgenList.add(this);
+ }
+
+ }
+
+ /**
+ * Script Friendly Constructor, WONT WORK WITH NEI
+ *
+ * @param aName
+ * @param enabled
+ */
+ public BW_Worldgen_Ore_SmallOre_Space(String aName, boolean enabled) {
+ this(aName, enabled, 0, 0, 0, 0, enabled ? Werkstoff.default_null_Werkstoff : Materials._NULL);
+ }
+
+ public boolean isEnabledForDim(ModDimensionDef pDimensionDef) {
+ return _mDynWorldConfig.isEnabledInDim(pDimensionDef);
+ }
+
+ @Override
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ ModDimensionDef tMDD = GalacticGregRegistry.getDimensionTypeByChunkGenerator(aChunkGenerator);
+ if (tMDD == null) return false;
+ pDimensionDef = tMDD;
+ if (this.mPrimaryMeta > 0)
+ for (int i = 0, j = Math.max(1, this.mDensity / 2 + aRandom.nextInt(this.mDensity) / 2); i < j; i++) {
+ this.setOreBlock(
+ aWorld,
+ aChunkX + aRandom.nextInt(16),
+ this.mMinY + aRandom.nextInt(Math.max(1, this.mMaxY - this.mMinY)),
+ aChunkZ + aRandom.nextInt(16),
+ this.mPrimaryMeta,
+ true);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) {
+ TileEntity te = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(te instanceof BW_MetaGeneratedOreTE) && !(te instanceof GT_TileEntity_Ores)) {
+ if (aMetaData == this.mSporadicMeta && (this.bwOres & 1) != 0
+ || aMetaData == this.mBetweenMeta && (this.bwOres & 2) != 0
+ || aMetaData == this.mPrimaryMeta && (this.bwOres & 8) != 0
+ || aMetaData == this.mSecondaryMeta && (this.bwOres & 4) != 0) {
+ boolean wasSet;
+ for (ModDBMDef e : pDimensionDef.getReplaceableBlocks()) {
+ wasSet = isSmallOre
+ ? BW_MetaGenerated_SmallOres.setOreBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir,
+ (Block) Block.blockRegistry.getObject(e.getBlockName()),
+ new int[] { e.getMeta() })
+ : BW_MetaGenerated_Ores.setOreBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir,
+ (Block) Block.blockRegistry.getObject(e.getBlockName()),
+ new int[] { e.getMeta() });
+ if (wasSet) return true;
+ }
+ return false;
+ } else {
+ return GT_TileEntity_Ores_Space.setOuterSpaceOreBlock(
+ pDimensionDef,
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ pDimensionDef.getAirSetting() == Enums.AirReplaceRule.AllowReplaceAir);
+ }
+ } else {
+ return true;
+ }
+ }
+
+ @Override
+ public Block getDefaultBlockToReplace() {
+ return null;
+ }
+
+ @Override
+ public int[] getDefaultDamageToReplace() {
+ return null;
+ }
+
+ @Override
+ public String getDimName() {
+ return name;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/command/AEStorageCommand.java b/src/main/java/bloodasp/galacticgreg/command/AEStorageCommand.java
new file mode 100644
index 0000000000..6192603bcd
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/command/AEStorageCommand.java
@@ -0,0 +1,180 @@
+package bloodasp.galacticgreg.command;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+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.server.MinecraftServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import appeng.api.util.WorldCoord;
+import appeng.items.storage.ItemSpatialStorageCell;
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.auxiliary.PlayerChatHelper;
+import bloodasp.galacticgreg.schematics.SpaceSchematic;
+import bloodasp.galacticgreg.schematics.SpaceSchematicFactory;
+
+/**
+ * This command allows to export any structure that has been stored inside a spatial storage cell to a xml file that can
+ * later be enabled for spawning in dimensions.
+ */
+public class AEStorageCommand implements ICommand {
+
+ private List<String> aliases;
+
+ public AEStorageCommand() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("exportae");
+ }
+
+ @Override
+ public String getCommandName() {
+ return "exportae";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender pCommandSender) {
+ return "exportae <structure name>";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(ICommandSender pCommandSender, String[] pArgs) {
+ try {
+ if (pCommandSender instanceof EntityPlayer) {
+ if (pArgs.length < 1) return;
+
+ String tName = pArgs[0];
+
+ EntityPlayer tEP = (EntityPlayer) pCommandSender;
+ // Check if item in hand is a spatial storage cell
+ ItemStack tIS = tEP.inventory.getCurrentItem();
+ if (tIS.getItem() instanceof ItemSpatialStorageCell) {
+ ItemSpatialStorageCell tCell = (ItemSpatialStorageCell) tIS.getItem();
+ World tSpatialWorld = tCell.getWorld(tIS);
+ WorldCoord storedSize = tCell.getStoredSize(tIS);
+
+ // Check if SSC is filled
+ if (storedSize.x == 0 || storedSize.y == 0 || storedSize.z == 0) {
+ PlayerChatHelper.SendError(pCommandSender, "Error: This spatial storage is empty");
+ return;
+ }
+
+ // Export structure
+ GalacticGreg.Logger.info(
+ "Creating Structure from Spatial AE drive. Dimensions: X [%d] Y [%d] Z [%d]",
+ storedSize.x,
+ storedSize.y,
+ storedSize.z);
+ SpaceSchematic tSchematic = SpaceSchematicFactory.createSchematic(tName);
+ boolean tTEWarningSend = false;
+
+ // Loop all 3 dimensions
+ for (int lX = 1; lX <= storedSize.x; lX++) {
+ for (int lY = 65; lY < 65 + storedSize.y; lY++) {
+ for (int lZ = 1; lZ <= storedSize.z; lZ++) {
+
+ // Get the block
+ Block b = tSpatialWorld.getBlock(lX, lY, lZ);
+ // Get the meta
+ int bm = tSpatialWorld.getBlockMetadata(lX, lY, lZ);
+
+ // Search for the blocks name
+ String tBlockName = Block.blockRegistry.getNameForObject(b);
+
+ // Check if block is a tileentity
+ TileEntity bTE = tSpatialWorld.getTileEntity(lX, lY, lZ);
+
+ String tMsg = String.format("[X-%d][Y-%d][Z-%d] ", lX, lY, lZ);
+ String nbtComp = "";
+ // If block could be found...
+ if (b != null) {
+ tMsg += tBlockName;
+ // If block is a TileEntity
+ if (bTE != null) {
+ // Print a warning on the console
+ tMsg += " TE";
+ GalacticGreg.Logger.warn(
+ "Warning: Found TileEntity at X[%d] Y[%d] Z[%d]. NBT States are not exported!",
+ lX,
+ lY,
+ lZ);
+ if (!tTEWarningSend) {
+ // Send a warning ingame, once per export command
+ tTEWarningSend = true;
+ PlayerChatHelper
+ .SendWarn(pCommandSender, "TileEntity states are not exported!");
+ }
+
+ }
+
+ // If the block is not air, add it to the structure
+ if (b != Blocks.air) tSchematic
+ .addStructureInfo(SpaceSchematicFactory.createStructureInfo(lX, lY, lZ, b, bm));
+ }
+ }
+ }
+ }
+
+ // Save structure to disk
+ if (!GalacticGreg.SchematicHandler.SaveSpaceStructure(tSchematic)) {
+ // Something went wrong...
+ PlayerChatHelper.SendError(pCommandSender, "Something went wrong. Structure not saved");
+ } else {
+ // All good, xml exported. Notify player that he needs to edit the file
+ PlayerChatHelper.SendInfo(
+ pCommandSender,
+ "Structure has been exported to " + tSchematic.getName()
+ + ".xml. It contains "
+ + tSchematic.coordInfo()
+ .size()
+ + " Blocks");
+ PlayerChatHelper
+ .SendInfo(pCommandSender, "You have to edit the file before a reload will accept it!");
+ }
+ } else PlayerChatHelper
+ .SendError(pCommandSender, "Error: Item in your hand is not a spatial storage drive!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(ICommandSender pCommandSender) {
+ // Command is only enabled for actual players and only if they are OP-ed
+ if (pCommandSender instanceof EntityPlayerMP) {
+ EntityPlayerMP tEP = (EntityPlayerMP) pCommandSender;
+ return MinecraftServer.getServer()
+ .getConfigurationManager()
+ .func_152596_g(tEP.getGameProfile());
+ } else return false;
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List addTabCompletionOptions(ICommandSender p_71516_1_, String[] p_71516_2_) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_) {
+ return false;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/command/ProfilingCommand.java b/src/main/java/bloodasp/galacticgreg/command/ProfilingCommand.java
new file mode 100644
index 0000000000..be43da5a4c
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/command/ProfilingCommand.java
@@ -0,0 +1,99 @@
+package bloodasp.galacticgreg.command;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.ModContainer;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.relauncher.Side;
+
+/**
+ * Ingame command to get the average oregen time(s) for the active dimensions Doesn't need to be changed when adding new
+ * planets/mods
+ *
+ */
+public class ProfilingCommand implements ICommand {
+
+ private List<String> aliases;
+
+ public ProfilingCommand() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("ggregprofiler");
+ }
+
+ @Override
+ public String getCommandName() {
+ return "ggregprofiler";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender pCommandSender) {
+ return "ggregprofiler";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(ICommandSender pCommandSender, String[] pArgs) {
+ pCommandSender.addChatMessage(new ChatComponentText("Average OreGen times:"));
+
+ for (ModContainer mc : GalacticGregRegistry.getModContainers()) {
+ String tModName = mc.getModName();
+ for (ModDimensionDef mdd : mc.getDimensionList()) {
+ long tTime = GalacticGreg.Profiler.GetAverageTime(mdd);
+ String tInfo;
+ if (tTime == -1) tInfo = "N/A";
+ else tInfo = String.format("%d ms", tTime);
+ pCommandSender.addChatMessage(
+ new ChatComponentText(
+ String.format("%s (%s): %s", mdd.getDimIdentifier(), mdd.getDimensionName(), tInfo)));
+ }
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(ICommandSender pCommandSender) {
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide() == Side.SERVER
+ && !FMLCommonHandler.instance()
+ .getMinecraftServerInstance()
+ .isDedicatedServer())
+ return true;
+
+ if (pCommandSender instanceof EntityPlayerMP) {
+ EntityPlayerMP tEP = (EntityPlayerMP) pCommandSender;
+ return MinecraftServer.getServer()
+ .getConfigurationManager()
+ .func_152596_g(tEP.getGameProfile());
+ }
+ return false;
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List addTabCompletionOptions(ICommandSender p_71516_1_, String[] p_71516_2_) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_) {
+ return false;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicDimensionConfig.java b/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicDimensionConfig.java
new file mode 100644
index 0000000000..5c419c7c13
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicDimensionConfig.java
@@ -0,0 +1,168 @@
+package bloodasp.galacticgreg.dynconfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraftforge.common.ChestGenHooks;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.Enums.DimensionType;
+import bloodasp.galacticgreg.api.ModContainer;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+
+/**
+ * This dynamic config is different to the OreMix one. This is used/bound to the ModDimensionDef, and the
+ * OreMixWorldConfig is bound to the veins. Don't get confused!
+ *
+ */
+public class DynamicDimensionConfig {
+
+ public static class AsteroidConfig {
+
+ public int MinSize;
+ public int MaxSize;
+ public int Probability;
+ public int OreChance;
+ public int OrePrimaryOffset;
+ public int SpecialBlockChance;
+ public int SmallOreChance;
+ public boolean ObeyHeightLimits;
+ public int OreGenMaxY;
+ public int FloatingAsteroidMinY;
+ public boolean HiddenOres;
+ public int LootChestChance;
+ public int LootChestTable;
+ public int NumLootItems;
+ public boolean RandomizeNumLootItems;
+ }
+
+ private static Map<String, AsteroidConfig> _mDynamicAsteroidMap = new HashMap<>();
+
+ private static String getConfigKeyName(ModContainer pMC, ModDimensionDef pMDD) {
+ return String.format("galacticgreg.asteroids.%s.%s", pMC.getModName(), pMDD.getDimensionName());
+ }
+
+ private static String getConfigKeyName(ModContainer pMC, ModDimensionDef pMDD, String pSubCat) {
+ return String.format("%s.%s", getConfigKeyName(pMC, pMDD), pSubCat);
+ }
+
+ public static AsteroidConfig getAsteroidConfig(ModDimensionDef pDimDef) {
+ return _mDynamicAsteroidMap.getOrDefault(pDimDef.getDimIdentifier(), null);
+ }
+
+ public static boolean InitDynamicConfig() {
+ try {
+ for (ModContainer mc : GalacticGregRegistry.getModContainers()) {
+ if (!mc.getEnabled()) continue;
+
+ for (ModDimensionDef mdd : mc.getDimensionList()) {
+ DimensionType dt = mdd.getDimensionType();
+ if (dt == DimensionType.Asteroid || dt == DimensionType.AsteroidAndPlanet) {
+ String tDimIdentifier = mdd.getDimIdentifier();
+ if (_mDynamicAsteroidMap.containsKey(tDimIdentifier)) GalacticGreg.Logger.warn(
+ "Found 2 Dimensions with the same Identifier! This should never happen, and you should report this to me. Identifier in question: %s",
+ tDimIdentifier);
+ else {
+ AsteroidConfig aConf = new AsteroidConfig();
+ aConf.MinSize = GregTech_API.sWorldgenFile.get(getConfigKeyName(mc, mdd), "SizeMin", 5);
+ aConf.MaxSize = GregTech_API.sWorldgenFile.get(getConfigKeyName(mc, mdd), "SizeMax", 15);
+ aConf.Probability = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd), "Probability", 200);
+ aConf.SpecialBlockChance = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd), "SpecialBlockChance", 5);
+
+ aConf.OreChance = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "orespawn"), "BaseOreChance", 5);
+ aConf.OrePrimaryOffset = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "orespawn"), "PrimaryToRareOreOffset", 5);
+ aConf.SmallOreChance = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "orespawn"), "SmallOreChance", 10);
+ aConf.ObeyHeightLimits = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "orespawn"), "ObeyHeightLimits", false);
+ aConf.HiddenOres = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "orespawn"), "OresOnlyInsideAsteroids", false);
+
+ if (GalacticGreg.GalacticConfig.LootChestsEnabled) {
+ aConf.LootChestChance = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "loot"), "LootChestChance", 1);
+ aConf.LootChestTable = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "loot"), "LootChestTable", 3);
+ aConf.NumLootItems = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "loot"), "LootChestItemCount", 10);
+ aConf.RandomizeNumLootItems = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "loot"), "RandomizeLootItemCount", true);
+ } else {
+ aConf.LootChestChance = 0;
+ aConf.LootChestTable = 1;
+ aConf.NumLootItems = 0;
+ aConf.RandomizeNumLootItems = false;
+ }
+
+ if (dt == DimensionType.AsteroidAndPlanet) {
+ int tDefaultMaxY = mdd.getPreConfiguratedGroundOreMaxY();
+ int tDefaultMinY = mdd.getPreConfiguratedFloatingAsteroidMinY();
+ aConf.OreGenMaxY = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "floating"), "OreGenMaxY", tDefaultMaxY);
+ aConf.FloatingAsteroidMinY = GregTech_API.sWorldgenFile
+ .get(getConfigKeyName(mc, mdd, "floating"), "FloatingAsteroidMinY", tDefaultMinY);
+ }
+
+ if (aConf.MaxSize > 50) GalacticGreg.Logger.warn(
+ "Asteroid-MaxSize for dimID [%s] is larger than 50. This might cause memory-problems, as the maximum asteroid size will be larger than 50*50*50 blocks",
+ tDimIdentifier);
+ _mDynamicAsteroidMap.put(tDimIdentifier, aConf);
+ }
+ }
+ }
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * Convert numbers to actual loot-table entries
+ *
+ * @param pACfg
+ * @return
+ */
+ public static String getLootChestTable(AsteroidConfig pACfg) {
+ String tLootTable = ChestGenHooks.MINESHAFT_CORRIDOR;
+
+ switch (pACfg.LootChestTable) {
+ case 2:
+ tLootTable = ChestGenHooks.PYRAMID_DESERT_CHEST;
+ break;
+ case 3:
+ tLootTable = ChestGenHooks.PYRAMID_JUNGLE_CHEST;
+ break;
+ case 4:
+ tLootTable = ChestGenHooks.PYRAMID_JUNGLE_DISPENSER;
+ break;
+ case 5:
+ tLootTable = ChestGenHooks.STRONGHOLD_CORRIDOR;
+ break;
+ case 6:
+ tLootTable = ChestGenHooks.STRONGHOLD_LIBRARY;
+ break;
+ case 7:
+ tLootTable = ChestGenHooks.STRONGHOLD_CROSSING;
+ break;
+ case 8:
+ tLootTable = ChestGenHooks.VILLAGE_BLACKSMITH;
+ break;
+ case 9:
+ tLootTable = ChestGenHooks.BONUS_CHEST;
+ break;
+ case 10:
+ tLootTable = ChestGenHooks.DUNGEON_CHEST;
+ break;
+ }
+
+ return tLootTable;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicOreMixWorldConfig.java b/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicOreMixWorldConfig.java
new file mode 100644
index 0000000000..862bfd4e4e
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/dynconfig/DynamicOreMixWorldConfig.java
@@ -0,0 +1,93 @@
+package bloodasp.galacticgreg.dynconfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.ModContainer;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.registry.GalacticGregRegistry;
+import gregtech.api.GregTech_API;
+
+/**
+ * This is the dynamic config class for every ore-vein that will generate config values according to the dimension and
+ * mod name
+ */
+public class DynamicOreMixWorldConfig {
+
+ private String _mWorldGenName;
+
+ public Map<String, Boolean> get_mDynWorldConfigMap() {
+ return new HashMap<>(_mDynWorldConfigMap != null ? _mDynWorldConfigMap : new HashMap<>());
+ }
+
+ private Map<String, Boolean> _mDynWorldConfigMap;
+ private final String _mConfigName;
+
+ private String getConfigKeyName(ModContainer pMC, ModDimensionDef pMDD) {
+ return getConfigKeyName(pMC, pMDD, "");
+ }
+
+ private String getConfigKeyName(ModContainer pMC, ModDimensionDef pMDD, String pAdditionalName) {
+ String tRet = String.format("%s_%s", pMC.getModName(), pMDD.getDimensionName());
+ if (pAdditionalName.length() > 1) tRet = String.format("%s_%s", tRet, pAdditionalName);
+
+ return tRet;
+ }
+
+ /**
+ * Init a new dynamic config for a given world-generator
+ *
+ * @param pWorldGenName
+ */
+ public DynamicOreMixWorldConfig(String pWorldGenName) {
+ _mWorldGenName = pWorldGenName;
+ _mDynWorldConfigMap = new HashMap<>();
+ _mConfigName = String.format("worldgen.%s", _mWorldGenName);
+ }
+
+ public DynamicOreMixWorldConfig(String pWorldGenName, boolean bw) {
+ _mWorldGenName = pWorldGenName;
+ _mDynWorldConfigMap = new HashMap<>();
+ _mConfigName = String.format("worldgen.gagregbartworks.%s", _mWorldGenName);
+ }
+
+ /**
+ * Check if this OreGen is enabled for a given Dimension, represented by pMDD
+ *
+ * @param pMDD The dimension in question
+ * @return true or false if *this* oregen is enabled in the worldgen config
+ */
+ public boolean isEnabledInDim(ModDimensionDef pMDD) {
+ String tDimIdentifier = pMDD.getDimIdentifier();
+ return _mDynWorldConfigMap.getOrDefault(tDimIdentifier, false);
+ }
+
+ /**
+ * Initializes the dynamic oregen config. This must be called *AFTER* InitModContainers() has done its work
+ *
+ * @return true or false if the config init was successfull
+ */
+ public boolean InitDynamicConfig() {
+ try {
+ for (ModContainer mc : GalacticGregRegistry.getModContainers()) {
+ if (!mc.getEnabled()) continue;
+
+ for (ModDimensionDef mdd : mc.getDimensionList()) {
+ String tDimIdentifier = mdd.getDimIdentifier();
+ if (_mDynWorldConfigMap.containsKey(tDimIdentifier)) GalacticGreg.Logger.error(
+ "Found 2 Dimensions with the same Identifier: %s Dimension will not generate Ores",
+ tDimIdentifier);
+ else {
+ boolean tFlag = GregTech_API.sWorldgenFile.get(_mConfigName, getConfigKeyName(mc, mdd), false);
+ _mDynWorldConfigMap.put(tDimIdentifier, tFlag);
+ }
+ }
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/generators/GenEllipsoid.java b/src/main/java/bloodasp/galacticgreg/generators/GenEllipsoid.java
new file mode 100644
index 0000000000..09d08a9923
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/generators/GenEllipsoid.java
@@ -0,0 +1,126 @@
+package bloodasp.galacticgreg.generators;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.api.Enums.SpaceObjectType;
+import bloodasp.galacticgreg.api.Enums.TargetBlockPosition;
+import bloodasp.galacticgreg.api.ISpaceObjectGenerator;
+import bloodasp.galacticgreg.api.StructureInformation;
+
+/**
+ * Simple ellipsoid-generator. Based on the formular created by Chrysator. Thanks for the help!
+ *
+ * Generates a simple ellipsoid with dynamic rotation, random size-values, random noise for the surface, etc. Can
+ * probably be tweaked even more, but works for now...
+ */
+public class GenEllipsoid implements ISpaceObjectGenerator {
+
+ private Vec3 _mEllipsoidCenter;
+ private Random _mRandom;
+ private List<StructureInformation> _mStructure;
+
+ private double _mCoreDensity = 0.7D;
+ private double _mSineFactor = 0.05D;
+ private float _mRandomInfluence;
+ private float _mRandomAngleX;
+ private float _mRandomAngleY;
+ private float _mRandomAngleZ;
+
+ private int _mSizeA;
+ private int _mSizeB;
+ private int _mSizeC;
+
+ public GenEllipsoid() {
+ reset();
+ }
+
+ @Override
+ public SpaceObjectType getType() {
+ return SpaceObjectType.OreAsteroid;
+ }
+
+ @Override
+ public void randomize(int pSizeMin, int pSizeMax) {
+ _mRandom = new Random(System.currentTimeMillis());
+ _mRandomAngleX = (float) (_mRandom.nextFloat() * Math.PI);
+ _mRandomAngleY = (float) (_mRandom.nextFloat() * Math.PI);
+ _mRandomAngleZ = (float) (_mRandom.nextFloat() * Math.PI);
+
+ _mRandomInfluence = _mRandom.nextFloat();
+
+ _mSizeA = pSizeMin + _mRandom.nextInt(pSizeMax - pSizeMin) + 10;
+ _mSizeB = pSizeMin + _mRandom.nextInt(pSizeMax - pSizeMin) + 10;
+ _mSizeC = pSizeMin + _mRandom.nextInt(pSizeMax - pSizeMin) + 10;
+ }
+
+ @Override
+ public void setCenterPoint(int pX, int pY, int pZ) {
+ _mEllipsoidCenter = Vec3.createVectorHelper(pX, pY, pZ);
+ }
+
+ @Override
+ public void setCenterPoint(Vec3 pCenter) {
+ _mEllipsoidCenter = pCenter;
+ }
+
+ @Override
+ public Vec3 getCenterPoint() {
+ return _mEllipsoidCenter;
+ }
+
+ @Override
+ public List<StructureInformation> getStructure() {
+ return _mStructure;
+ }
+
+ @Override
+ public void calculate() {
+ int Xmin = (int) (_mEllipsoidCenter.xCoord - _mSizeA);
+ int Xmax = (int) (_mEllipsoidCenter.xCoord + _mSizeA);
+ int Ymin = (int) (_mEllipsoidCenter.yCoord - _mSizeB);
+ int Ymax = (int) (_mEllipsoidCenter.yCoord + _mSizeB);
+ int Zmin = (int) (_mEllipsoidCenter.zCoord - _mSizeC);
+ int Zmax = (int) (_mEllipsoidCenter.zCoord + _mSizeC);
+
+ for (int iX = Xmin; iX <= Xmax; iX++) {
+ for (int iY = Ymin; iY <= Ymax; iY++) {
+ for (int iZ = Zmin; iZ <= Zmax; iZ++) {
+ double tmpX = Math.pow(_mEllipsoidCenter.xCoord - iX, 2) / Math.pow(_mSizeA, 2);
+ double tmpY = Math.pow(_mEllipsoidCenter.yCoord - iY, 2) / Math.pow(_mSizeB, 2);
+ double tmpZ = Math.pow(_mEllipsoidCenter.zCoord - iZ, 2) / Math.pow(_mSizeC, 2);
+ double val = (tmpX + tmpY + tmpZ);
+
+ Vec3 tPoint = Vec3.createVectorHelper(iX, iY, iZ);
+ tPoint.rotateAroundX(_mRandomAngleX);
+ tPoint.rotateAroundY(_mRandomAngleY);
+ tPoint.rotateAroundZ(_mRandomAngleZ);
+
+ TargetBlockPosition tbp = TargetBlockPosition.Invalid;
+
+ if (val <= 0.01D) tbp = TargetBlockPosition.AsteroidInnerCore;
+
+ else if (val > 0.01D && val < _mCoreDensity) tbp = TargetBlockPosition.AsteroidCore;
+
+ else if (val >= _mCoreDensity && val <= (1.0D
+ - (_mSineFactor * MathHelper.sin((iZ + iX + iY - _mRandom.nextFloat() * _mRandomInfluence)))))
+ tbp = TargetBlockPosition.AsteroidShell;
+
+ if (tbp != TargetBlockPosition.Invalid)
+ _mStructure.add(new StructureInformation(Vec3.createVectorHelper(iX, iY, iZ), tbp));
+
+ }
+ }
+ }
+ }
+
+ @Override
+ public void reset() {
+ _mStructure = new ArrayList<>();
+ _mEllipsoidCenter = Vec3.createVectorHelper(0, 0, 0);
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/registry/GalacticGregRegistry.java b/src/main/java/bloodasp/galacticgreg/registry/GalacticGregRegistry.java
new file mode 100644
index 0000000000..b45353da6e
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/registry/GalacticGregRegistry.java
@@ -0,0 +1,181 @@
+package bloodasp.galacticgreg.registry;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.world.chunk.IChunkProvider;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.Enums.DimensionType;
+import bloodasp.galacticgreg.api.ModContainer;
+import bloodasp.galacticgreg.api.ModDimensionDef;
+import bloodasp.galacticgreg.dynconfig.DynamicDimensionConfig;
+import bloodasp.galacticgreg.generators.GenEllipsoid;
+import cpw.mods.fml.common.Loader;
+
+/**
+ * GalacticGregs registry
+ *
+ */
+public class GalacticGregRegistry {
+
+ private static final Map<String, ModContainer> _mModContainers = new HashMap<>();
+ public static final String DIM_UNKNOWN = "GGREG_DIMENSION_UNKNOWN";
+ private static boolean _mInitializationDone = false;
+
+ /**
+ * Register new ModContainer in the registry. Call this after you've populated it with Dimensions and Blocks Must be
+ * called from your own PreInit or Init event
+ *
+ * @param pModContainer
+ * @return
+ */
+ public static boolean registerModContainer(ModContainer pModContainer) {
+ if (_mInitializationDone) {
+ GalacticGreg.Logger.warn("Initialization is already done, you can't add more ModContainers!");
+ return false;
+ }
+
+ if (_mModContainers.containsKey(pModContainer.getModName())) {
+ GalacticGreg.Logger
+ .warn("There is already a mod registered with that name: [%s]", pModContainer.getModName());
+ return false;
+ } else {
+ GalacticGreg.Logger.info(
+ "Registered new mod to generate ores: [%s] Dimensions provided: [%d]",
+ pModContainer.getModName(),
+ pModContainer.getDimensionList()
+ .size());
+ _mModContainers.put(pModContainer.getModName(), pModContainer);
+ return true;
+ }
+ }
+
+ /**
+ * Lookup the registered dimensions and try to find the DimensionDefinition that has the ChunkProvider that we have
+ * here
+ *
+ * @param pChunkProvider
+ * @return
+ */
+ public static ModDimensionDef getDimensionTypeByChunkGenerator(IChunkProvider pChunkProvider) {
+ try {
+ if (!_mInitializationDone) return null;
+
+ String tFQCPN = pChunkProvider.toString()
+ .split("@")[0];
+ ModDimensionDef tReturnMDD = null;
+
+ for (ModContainer mc : _mModContainers.values()) {
+ for (ModDimensionDef mdd : mc.getDimensionList()) {
+ if (mdd.getChunkProviderName()
+ .equals(tFQCPN)) {
+ tReturnMDD = mdd;
+ break;
+ }
+ }
+ }
+
+ return tReturnMDD;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Get all registered modcontainers. Can only be done after the initialization process is done
+ *
+ * @return
+ */
+ public static Collection<ModContainer> getModContainers() {
+ if (!_mInitializationDone) return null;
+
+ return _mModContainers.values();
+ }
+
+ /**
+ * Initializes the Registry. Never do this in your code, GalacticGreg will crash if you do so
+ */
+ public static boolean InitRegistry() {
+ if (_mInitializationDone) // never run init twice!
+ return false;
+
+ InitModContainers();
+
+ DynamicDimensionConfig.InitDynamicConfig();
+ return true;
+ }
+
+ /**
+ * Parse modcontainers and search for loaded mods. Enable found mods for generation
+ */
+ private static void InitModContainers() {
+ for (ModContainer mc : _mModContainers.values()) {
+ if (!Loader.isModLoaded(mc.getModName()) && !mc.getModName()
+ .equalsIgnoreCase("vanilla")) {
+ GalacticGreg.Logger.warn(
+ "Ignoring ModRegistration for OreGen: [%s], because mod is not loaded. Did you misspell the name?",
+ mc.getModName());
+ mc.setEnabled(false);
+ } else {
+ GalacticGreg.Logger.info("Mod [%s] is now enabled for OreGen by GalacticGreg", mc.getModName());
+ mc.setEnabled(true);
+ for (ModDimensionDef md : mc.getDimensionList()) {
+ GalacticGreg.Logger.info(
+ "ModID: [%s] DimName: [%s] ValidBlocks: [%d] Identifier: [%s] Generators: [%d]",
+ mc.getModName(),
+ md.getDimensionName(),
+ md.getReplaceableBlocks()
+ .size(),
+ md.getDimIdentifier(),
+ md.getSpaceObjectGenerators()
+ .size());
+
+ // Register default generator if dimension is asteroid and no generator was added
+ if (md.getDimensionType() == DimensionType.AsteroidAndPlanet
+ || md.getDimensionType() == DimensionType.Asteroid) {
+ if (md.getSpaceObjectGenerators()
+ .size() == 0) {
+ GalacticGreg.Logger.debug("No generators found, adding build-in ellipsoid generator");
+ md.registerSpaceObjectGenerator(new GenEllipsoid());
+ }
+ GalacticGreg.Logger.info(
+ "Asteroid-Enabled dimension. Registered Generators: [%d]",
+ md.getSpaceObjectGenerators()
+ .size());
+ }
+
+ md.finalizeReplaceableBlocks(mc.getModName());
+ }
+ }
+ }
+ _mInitializationDone = true;
+ }
+
+ /**
+ * Returns ModContainer for given DimensionDefinition
+ *
+ * @param pDimensionDefinition
+ * @return
+ */
+ public static ModContainer getModContainerForDimension(ModDimensionDef pDimensionDefinition) {
+ if (!_mInitializationDone) return null;
+
+ try {
+ for (ModContainer mc : _mModContainers.values()) {
+ for (ModDimensionDef md : mc.getDimensionList()) {
+ if (pDimensionDefinition.getDimIdentifier()
+ .equals(md.getDimIdentifier())) {
+ return mc;
+ }
+ }
+ }
+ return null;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematic.java b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematic.java
new file mode 100644
index 0000000000..222d786cb4
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematic.java
@@ -0,0 +1,100 @@
+package bloodasp.galacticgreg.schematics;
+
+import java.util.ArrayList;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.api.StructureInformation;
+
+/**
+ * Class for XML Structure files. You only should edit/use this file/class if you want to add/fix stuff with
+ * GalacticGreg itself, and never if you're a mod developer and want to add support for GGreg to your mod. However, feel
+ * free to copy this code to your own mod to implement structures. If you have questions, find me on github and ask
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "SpaceSchematic")
+public class SpaceSchematic {
+
+ @XmlAttribute(name = "enabled")
+ protected boolean _mStructureEnabled;
+ @XmlAttribute(name = "centerX")
+ protected int _mCenterX;
+ @XmlAttribute(name = "centerY")
+ protected int _mCenterY;
+ @XmlAttribute(name = "centerZ")
+ protected int _mCenterZ;
+
+ @XmlElement(name = "StructureName")
+ protected String _mStructureName;
+
+ @XmlElement(name = "Rarity")
+ protected int _mRarity;
+
+ @XmlElementWrapper(name = "Coords")
+ @XmlElement(name = "block")
+ protected ArrayList<BaseStructureInfo> mStructureInfoList;
+
+ public boolean isEnabled() {
+ return _mStructureEnabled;
+ }
+
+ public Vec3 getStructureCenter() {
+ return Vec3.createVectorHelper(_mCenterX, _mCenterY, _mCenterZ);
+ }
+
+ public int getRarity() {
+ return _mRarity;
+ }
+
+ public String getName() {
+ return _mStructureName;
+ }
+
+ public ArrayList<BaseStructureInfo> coordInfo() {
+ if (mStructureInfoList == null) mStructureInfoList = new ArrayList<>();
+
+ return mStructureInfoList;
+ }
+
+ public void addStructureInfo(StructureInformation pStrucInfo) {
+ if (mStructureInfoList == null) mStructureInfoList = new ArrayList<>();
+ mStructureInfoList.add(new BaseStructureInfo(pStrucInfo));
+ }
+
+ public static class BaseStructureInfo {
+
+ @XmlAttribute(name = "X")
+ protected int posX;
+ @XmlAttribute(name = "Y")
+ protected int posY;
+ @XmlAttribute(name = "Z")
+ protected int posZ;
+ @XmlAttribute(name = "Block")
+ protected String blockName;
+ @XmlAttribute(name = "Meta")
+ protected int blockMeta;
+
+ public BaseStructureInfo(StructureInformation pSI) {
+ posX = pSI.getX();
+ posY = pSI.getY();
+ posZ = pSI.getZ();
+ blockName = Block.blockRegistry.getNameForObject(
+ pSI.getBlock()
+ .getBlock());
+ blockMeta = pSI.getBlock()
+ .getMeta();
+ }
+
+ public Vec3 getVec3Pos() {
+ return Vec3.createVectorHelper(posX, posY, posZ);
+ }
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicFactory.java b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicFactory.java
new file mode 100644
index 0000000000..5c76904a80
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicFactory.java
@@ -0,0 +1,33 @@
+package bloodasp.galacticgreg.schematics;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.api.Enums.AllowedBlockPosition;
+import bloodasp.galacticgreg.api.Enums.TargetBlockPosition;
+import bloodasp.galacticgreg.api.SpecialBlockComb;
+import bloodasp.galacticgreg.api.StructureInformation;
+
+/**
+ * Class for XML Structure files. You only should edit/use this file/class if you want to add/fix stuff with
+ * GalacticGreg itself, and never if you're a mod developer and want to add support for GGreg to your mod. However, feel
+ * free to copy this code to your own mod to implement structures. If you have questions, find me on github and ask
+ */
+public class SpaceSchematicFactory {
+
+ public static SpaceSchematic createSchematic(String pName) {
+ SpaceSchematic tSchem = new SpaceSchematic();
+ tSchem._mStructureName = pName;
+ tSchem._mRarity = 100;
+ tSchem._mStructureEnabled = false;
+
+ return tSchem;
+ }
+
+ public static StructureInformation createStructureInfo(int pX, int pY, int pZ, Block pBlock, int pMeta) {
+ return new StructureInformation(
+ Vec3.createVectorHelper(pX, pY, pZ),
+ TargetBlockPosition.Invalid,
+ new SpecialBlockComb(pBlock, pMeta, AllowedBlockPosition.AsteroidCoreAndShell));
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java
new file mode 100644
index 0000000000..3300f98b92
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java
@@ -0,0 +1,182 @@
+package bloodasp.galacticgreg.schematics;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.commons.io.FileUtils;
+
+import bloodasp.galacticgreg.GalacticGreg;
+
+/**
+ * Class for XML Structure files. You only should edit/use this file/class if you want to add/fix stuff with
+ * GalacticGreg itself, and never if you're a mod developer and want to add support for GGreg to your mod. However, feel
+ * free to copy this code to your own mod to implement structures. If you have questions, find me on github and ask
+ */
+public class SpaceSchematicHandler {
+
+ File _mConfigFolderName;
+ File _mSchematicsFolderName;
+ private List<SpaceSchematic> _mSpaceSchematics;
+
+ @SuppressWarnings("ResultOfMethodCallIgnored")
+ public SpaceSchematicHandler(File pConfigFolder) {
+ _mConfigFolderName = new File(String.format("%s/%s", pConfigFolder.toString(), GalacticGreg.NICE_MODID));
+ _mSchematicsFolderName = new File(String.format("%s/schematics", _mConfigFolderName));
+
+ _mSpaceSchematics = new ArrayList<>();
+
+ if (!_mSchematicsFolderName.exists()) _mSchematicsFolderName.mkdirs();
+ }
+
+ /**
+ * Get a random schematic to be placed.
+ *
+ * @return A schematic that can be spawned in space
+ */
+ public SpaceSchematic getRandomSpaceSchematic() {
+ int tRandomChance = GalacticGreg.GalacticRandom.nextInt(100);
+ List<Integer> tRandomIDs = new ArrayList<>();
+ SpaceSchematic tChoosenSchematic = null;
+
+ if (_mSpaceSchematics == null) return null;
+
+ if (_mSpaceSchematics.size() == 0) return null;
+
+ if (_mSpaceSchematics.size() == 1) {
+ tChoosenSchematic = _mSpaceSchematics.get(0);
+ if (tChoosenSchematic.getRarity() < tRandomChance) tChoosenSchematic = null;
+ } else {
+ for (int i = 0; i < _mSpaceSchematics.size(); i++) {
+ if (_mSpaceSchematics.get(i)
+ .getRarity() >= tRandomChance) tRandomIDs.add(i);
+ }
+ }
+
+ if (tRandomIDs.size() > 0) {
+ int tRnd = GalacticGreg.GalacticRandom.nextInt(tRandomIDs.size());
+ tChoosenSchematic = _mSpaceSchematics.get(tRandomIDs.get(tRnd));
+ }
+
+ return tChoosenSchematic;
+ }
+
+ /**
+ * Try to reload the schematics. Will not change the list of currently loaded schematics if any errors are detected,
+ * except if you force it to do so
+ *
+ * @return
+ */
+ public boolean reloadSchematics(boolean pForceReload) {
+ try {
+ Collection<File> structureFiles = FileUtils
+ .listFiles(_mSchematicsFolderName, new String[] { "xml" }, false);
+ List<SpaceSchematic> tNewSpaceSchematics = new ArrayList<>();
+ int tErrorsFound = 0;
+
+ if (structureFiles.isEmpty()) return true;
+
+ for (File tSchematic : structureFiles) {
+ try {
+ SpaceSchematic tSchematicObj = LoadSpaceSchematic(tSchematic);
+ if (tSchematicObj != null) tNewSpaceSchematics.add(tSchematicObj);
+ else {
+ GalacticGreg.Logger.warn("Could not load Schematic %s. Please check the syntax", tSchematic);
+ tErrorsFound++;
+ }
+ } catch (Exception e) {
+ GalacticGreg.Logger.error("Error while loading Schematic %s", tSchematic);
+ e.printStackTrace();
+ }
+
+ }
+
+ GalacticGreg.Logger.info("Successfully loaded %d Schematics", tNewSpaceSchematics.size());
+ boolean tDoReplace = true;
+
+ if (tErrorsFound > 0) {
+ GalacticGreg.Logger.warn("Found %d errors while loading, not all schematics will be available");
+ if (pForceReload)
+ GalacticGreg.Logger.info("Reload was forced, replacing currently active list with new one");
+ else {
+ GalacticGreg.Logger.warn("Nothing was replaced. Fix any errors and reload again");
+ tDoReplace = false;
+ }
+ }
+
+ if (tDoReplace) _mSpaceSchematics = tNewSpaceSchematics;
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * Saves the schematic to disk. The schematics name will be used as filename
+ *
+ * @param pSchematic
+ * @return
+ */
+ public boolean SaveSpaceStructure(SpaceSchematic pSchematic) {
+ try {
+ if (pSchematic.getName()
+ .length() < 1) return false;
+
+ JAXBContext tJaxbCtx = JAXBContext.newInstance(SpaceSchematic.class);
+ Marshaller jaxMarsh = tJaxbCtx.createMarshaller();
+ jaxMarsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ jaxMarsh.marshal(
+ pSchematic,
+ new FileOutputStream(String.format("%s/%s.xml", _mSchematicsFolderName, pSchematic.getName()), false));
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * Load a schematic from disk by the schematic-name itself, without .xml or path
+ *
+ * @param pSchematicName
+ * @return
+ */
+ public SpaceSchematic LoadSpaceSchematic(String pSchematicName) {
+ return LoadSpaceSchematic(new File(String.format("%s/%s.xml", _mSchematicsFolderName, pSchematicName)));
+ }
+
+ /**
+ * Load a schematic file from disk by providing the actual file-object
+ *
+ * @param pName
+ * @return
+ */
+ public SpaceSchematic LoadSpaceSchematic(File pName) {
+ SpaceSchematic tSchematic = null;
+
+ try {
+ JAXBContext tJaxbCtx = JAXBContext.newInstance(SpaceSchematic.class);
+ if (!pName.exists()) {
+ GalacticGreg.Logger.error("SchematicFile %s could not be found", pName);
+ return null;
+ }
+
+ Unmarshaller jaxUnmarsh = tJaxbCtx.createUnmarshaller();
+ tSchematic = (SpaceSchematic) jaxUnmarsh.unmarshal(pName);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return tSchematic;
+ }
+}
diff --git a/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicWrapper.java b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicWrapper.java
new file mode 100644
index 0000000000..406b66c0a1
--- /dev/null
+++ b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicWrapper.java
@@ -0,0 +1,104 @@
+package bloodasp.galacticgreg.schematics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.Vec3;
+
+import bloodasp.galacticgreg.GalacticGreg;
+import bloodasp.galacticgreg.api.BlockMetaComb;
+import bloodasp.galacticgreg.api.Enums.SpaceObjectType;
+import bloodasp.galacticgreg.api.Enums.TargetBlockPosition;
+import bloodasp.galacticgreg.api.ISpaceObjectGenerator;
+import bloodasp.galacticgreg.api.StructureInformation;
+import bloodasp.galacticgreg.schematics.SpaceSchematic.BaseStructureInfo;
+import cpw.mods.fml.common.registry.GameRegistry;
+
+/**
+ * Class for XML Structure files. You only should edit/use this file/class if you want to add/fix stuff with
+ * GalacticGreg itself, and never if you're a mod developer and want to add support for GGreg to your mod. However, feel
+ * free to copy this code to your own mod to implement structures. If you have questions, find me on github and ask
+ */
+public class SpaceSchematicWrapper implements ISpaceObjectGenerator {
+
+ private SpaceSchematic _mSchematic;
+ private Vec3 _mCenter = Vec3.createVectorHelper(0, 0, 0);
+ private List<StructureInformation> _mFinalizedStructure;
+
+ public SpaceSchematicWrapper(SpaceSchematic pSchematic) {
+ _mSchematic = pSchematic;
+ }
+
+ public boolean isCalculated() {
+ return _mFinalizedStructure != null && _mFinalizedStructure.size() > 0;
+ }
+
+ /**
+ * Recalculate the Structures position, center it around _mCenter
+ */
+ private void RecalculatePosition() {
+ _mFinalizedStructure = new ArrayList<>();
+
+ for (BaseStructureInfo bsi : _mSchematic.coordInfo()) {
+ try {
+ String tModID = bsi.blockName.split(":")[0];
+ String tBlockName = bsi.blockName.split(":")[1];
+
+ Block tBlock = GameRegistry.findBlock(tModID, tBlockName);
+ if (tBlock != null) {
+ BlockMetaComb bmc = new BlockMetaComb(tBlock, bsi.blockMeta);
+ Vec3 tCenteredPos = _mCenter.addVector(bsi.posX, bsi.posY, bsi.posZ);
+ StructureInformation tnewSI = new StructureInformation(
+ tCenteredPos,
+ TargetBlockPosition.StructureBlock,
+ bmc);
+ _mFinalizedStructure.add(tnewSI);
+ } else GalacticGreg.Logger
+ .warn("Block %s:%s could not be found. Schematic will be incomplete!", tModID, tBlockName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ GalacticGreg.Logger.error("Error while recalculating blocks position");
+ }
+ }
+ }
+
+ @Override
+ public Vec3 getCenterPoint() {
+ return _mCenter;
+ }
+
+ @Override
+ public void setCenterPoint(int pX, int pY, int pZ) {
+ _mCenter = Vec3.createVectorHelper(pX, pY, pZ);
+ }
+
+ @Override
+ public void setCenterPoint(Vec3 pCenter) {
+ _mCenter = pCenter;
+ }
+
+ @Override
+ public List<StructureInformation> getStructure() {
+ return _mFinalizedStructure;
+ }
+
+ @Override
+ public void calculate() {
+ RecalculatePosition();
+ }
+
+ @Override
+ public void randomize(int pSizeMin, int pSizeMax) {}
+
+ @Override
+ public SpaceObjectType getType() {
+ return SpaceObjectType.NonOreSchematic;
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+}
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
new file mode 100644
index 0000000000..68a88b39ce
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
@@ -0,0 +1,20 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2eee530a70
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
@@ -0,0 +1,197 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ba1308c427
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
@@ -0,0 +1,112 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6ab854c308
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
@@ -0,0 +1,126 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b53638a77a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
@@ -0,0 +1,325 @@
+/*
+ * 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
new file mode 100644
index 0000000000..eb4c2a0405
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
@@ -0,0 +1,211 @@
+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
new file mode 100644
index 0000000000..4a85029994
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
@@ -0,0 +1,29 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9d2e2d7829
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d74263115b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
@@ -0,0 +1,19 @@
+/*
+ * 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
new file mode 100644
index 0000000000..1f75115752
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
@@ -0,0 +1,23 @@
+/*
+ * 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
new file mode 100644
index 0000000000..698c28fbf7
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000000..88ae5bf5c0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b83ce7d128
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
@@ -0,0 +1,25 @@
+/*
+ * 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
new file mode 100644
index 0000000000..01c172382f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
@@ -0,0 +1,35 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2cd29281f4
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
@@ -0,0 +1,31 @@
+/*
+ * 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
new file mode 100644
index 0000000000..620e9d65af
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
@@ -0,0 +1,61 @@
+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
new file mode 100644
index 0000000000..4bef7a0cad
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
@@ -0,0 +1,17 @@
+/*
+ * 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
new file mode 100644
index 0000000000..dfcf94115a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
@@ -0,0 +1,76 @@
+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
new file mode 100644
index 0000000000..01cf2ecd32
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
@@ -0,0 +1,92 @@
+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
new file mode 100644
index 0000000000..281184893c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
@@ -0,0 +1,91 @@
+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
new file mode 100644
index 0000000000..d409d3ab26
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000000..a6cf4b180e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
@@ -0,0 +1,45 @@
+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
new file mode 100644
index 0000000000..725a0135a4
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
@@ -0,0 +1,54 @@
+/*
+ * 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
new file mode 100644
index 0000000000..54598f9478
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
@@ -0,0 +1,84 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f7fde1167d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
@@ -0,0 +1,82 @@
+/*
+ * 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
new file mode 100644
index 0000000000..38a5a70d27
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
@@ -0,0 +1,113 @@
+/*
+ * 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
new file mode 100644
index 0000000000..02835e39c2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
@@ -0,0 +1,227 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c104d09f3a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
@@ -0,0 +1,35 @@
+/*
+ * 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
new file mode 100644
index 0000000000..818b67d6fc
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
@@ -0,0 +1,239 @@
+/*
+ * 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
new file mode 100644
index 0000000000..969398df47
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
@@ -0,0 +1,53 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9f7fb64e4b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
@@ -0,0 +1,127 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8d3d457e06
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
@@ -0,0 +1,32 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5a42164597
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
@@ -0,0 +1,31 @@
+/*
+ * 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
new file mode 100644
index 0000000000..53be7436ce
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
@@ -0,0 +1,31 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e2bb68b290
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
@@ -0,0 +1,90 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6bf5fd3fe1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
@@ -0,0 +1,112 @@
+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
new file mode 100644
index 0000000000..4c27a2a3f9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
@@ -0,0 +1,137 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a082a44d31
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
@@ -0,0 +1,56 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7bb04e0c39
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
@@ -0,0 +1,159 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ce87e4a68a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
@@ -0,0 +1,111 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7a12074e02
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
@@ -0,0 +1,333 @@
+/*
+ * 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
new file mode 100644
index 0000000000..09df8f98f8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
@@ -0,0 +1,92 @@
+/*
+ * 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
new file mode 100644
index 0000000000..1a00d16d85
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
@@ -0,0 +1,135 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c60f63129a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
@@ -0,0 +1,188 @@
+/*
+ * 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
new file mode 100644
index 0000000000..4ef12dc30b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
@@ -0,0 +1,180 @@
+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
new file mode 100644
index 0000000000..fb8e163ad1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
@@ -0,0 +1,204 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0d1d9fd20b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
@@ -0,0 +1,44 @@
+/*
+ * 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
new file mode 100644
index 0000000000..852d8370ad
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
@@ -0,0 +1,164 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a5ad7625f9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
@@ -0,0 +1,93 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0434a5d974
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
@@ -0,0 +1,72 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7afe07beb0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000000..341044c498
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
@@ -0,0 +1,37 @@
+/*
+ * 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
new file mode 100644
index 0000000000..dcd7caee97
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
@@ -0,0 +1,62 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5b76d6a163
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
@@ -0,0 +1,38 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5b37a98e7e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
@@ -0,0 +1,46 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7c5a515b86
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
@@ -0,0 +1,334 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f512e778bc
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
@@ -0,0 +1,98 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0b589bf53a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
@@ -0,0 +1,79 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f58ae8d6e7
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
@@ -0,0 +1,165 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f0c746dd64
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
@@ -0,0 +1,238 @@
+/*
+ * 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
new file mode 100644
index 0000000000..37ecfc61d2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
@@ -0,0 +1,90 @@
+/*
+ * 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
new file mode 100644
index 0000000000..3a132dde22
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
@@ -0,0 +1,185 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6728a791e4
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
@@ -0,0 +1,143 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a4712dc36a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
@@ -0,0 +1,41 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cb5a65c13b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
@@ -0,0 +1,154 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e31e23d47c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
@@ -0,0 +1,35 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8d5b239a75
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6268342cce
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
@@ -0,0 +1,199 @@
+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
new file mode 100644
index 0000000000..88fab90aea
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
@@ -0,0 +1,128 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5bf9ff8185
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
@@ -0,0 +1,104 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8b86d4cd93
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
@@ -0,0 +1,107 @@
+/*
+ * 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
new file mode 100644
index 0000000000..28ad279e28
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
@@ -0,0 +1,23 @@
+/*
+ * 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
new file mode 100644
index 0000000000..abed08eb5e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
@@ -0,0 +1,194 @@
+/*
+ * 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
new file mode 100644
index 0000000000..1a7e49aaa3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
@@ -0,0 +1,213 @@
+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
new file mode 100644
index 0000000000..809e52e6d1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
@@ -0,0 +1,146 @@
+/*
+ * 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
new file mode 100644
index 0000000000..329d73023f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
@@ -0,0 +1,147 @@
+/*
+ * 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
new file mode 100644
index 0000000000..499686e6e0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
@@ -0,0 +1,453 @@
+/*
+ * 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
new file mode 100644
index 0000000000..020f89e703
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
@@ -0,0 +1,62 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d141fe8b65
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
@@ -0,0 +1,224 @@
+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
new file mode 100644
index 0000000000..c55561687b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
@@ -0,0 +1,60 @@
+/*
+ * 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
new file mode 100644
index 0000000000..615eed0c43
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
@@ -0,0 +1,35 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6f50650484
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
@@ -0,0 +1,583 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8f152c00c7
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
@@ -0,0 +1,294 @@
+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
new file mode 100644
index 0000000000..538195362a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
@@ -0,0 +1,85 @@
+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
new file mode 100644
index 0000000000..1793877df3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
@@ -0,0 +1,41 @@
+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
new file mode 100644
index 0000000000..e148376b01
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
@@ -0,0 +1,144 @@
+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
new file mode 100644
index 0000000000..f1d9ddd236
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
@@ -0,0 +1,84 @@
+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
new file mode 100644
index 0000000000..87aaf91f71
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
@@ -0,0 +1,29 @@
+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
new file mode 100644
index 0000000000..17a5d5b025
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
@@ -0,0 +1,462 @@
+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
new file mode 100644
index 0000000000..9502d4eff3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
@@ -0,0 +1,152 @@
+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
new file mode 100644
index 0000000000..9b304de837
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
@@ -0,0 +1,45 @@
+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
new file mode 100644
index 0000000000..1df03d10f2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000000..3d27c55038
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000000..4991370f44
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
@@ -0,0 +1,103 @@
+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
new file mode 100644
index 0000000000..bdeb24af9e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
@@ -0,0 +1,77 @@
+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
new file mode 100644
index 0000000000..59c84d0f7c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
@@ -0,0 +1,28 @@
+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
new file mode 100644
index 0000000000..d69b4278ef
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
@@ -0,0 +1,65 @@
+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
new file mode 100644
index 0000000000..4dbcc45708
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
@@ -0,0 +1,98 @@
+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
new file mode 100644
index 0000000000..c810c323d9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
@@ -0,0 +1,24 @@
+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
new file mode 100644
index 0000000000..b5e002ef29
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
@@ -0,0 +1,162 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c47b834157
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
@@ -0,0 +1,88 @@
+/*
+ * 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
new file mode 100644
index 0000000000..621cc3fe4f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000000..6b555014ed
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
@@ -0,0 +1,108 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c488273d73
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
@@ -0,0 +1,71 @@
+/*
+ * 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
new file mode 100644
index 0000000000..436413fa14
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
@@ -0,0 +1,99 @@
+/*
+ * 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
new file mode 100644
index 0000000000..091802683d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
@@ -0,0 +1,61 @@
+/*
+ * 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
new file mode 100644
index 0000000000..bb0c0cf319
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
@@ -0,0 +1,24 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5db8989d0c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000000..79bedfa1b8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
@@ -0,0 +1,126 @@
+/*
+ * 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
new file mode 100644
index 0000000000..faccfc4738
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
@@ -0,0 +1,374 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0dc888c663
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
@@ -0,0 +1,163 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2dcc69377e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a7d8ea9db8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
@@ -0,0 +1,836 @@
+/*
+ * 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
new file mode 100644
index 0000000000..1f85ea0167
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
@@ -0,0 +1,641 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f394089fb0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
@@ -0,0 +1,338 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cb2140d62b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
@@ -0,0 +1,550 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a5ed5a69b7
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
@@ -0,0 +1,614 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5a2c3ba382
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
@@ -0,0 +1,598 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b481429411
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
@@ -0,0 +1,365 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e7a2b090c9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
@@ -0,0 +1,413 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a1e1f1fd46
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
@@ -0,0 +1,641 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c8ea85d182
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
@@ -0,0 +1,428 @@
+/*
+ * 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
new file mode 100644
index 0000000000..4b11f8d500
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
@@ -0,0 +1,267 @@
+/*
+ * 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
new file mode 100644
index 0000000000..80bc644e9e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
@@ -0,0 +1,449 @@
+/*
+ * 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
new file mode 100644
index 0000000000..223ef65f77
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
@@ -0,0 +1,223 @@
+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
new file mode 100644
index 0000000000..40ec9f814b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
@@ -0,0 +1,459 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0a2464de5e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
@@ -0,0 +1,256 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c50e6cbd12
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
@@ -0,0 +1,157 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d2ef329066
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
@@ -0,0 +1,412 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e0903ce93c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
@@ -0,0 +1,62 @@
+/*
+ * 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
new file mode 100644
index 0000000000..76a9c1646e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
@@ -0,0 +1,136 @@
+/*
+ * 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
new file mode 100644
index 0000000000..4431015ca8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
@@ -0,0 +1,87 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8d5a756cb5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e9db8ac2d5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
@@ -0,0 +1,46 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6a66b5209f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
@@ -0,0 +1,499 @@
+/*
+ * 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
new file mode 100644
index 0000000000..46f20e441d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
@@ -0,0 +1,157 @@
+/*
+ * 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
new file mode 100644
index 0000000000..40233912e6
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
@@ -0,0 +1,71 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cddb16c6c8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
@@ -0,0 +1,72 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2b34250512
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
@@ -0,0 +1,250 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a6efebeb83
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
@@ -0,0 +1,97 @@
+/*
+ * 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
new file mode 100644
index 0000000000..3ea2f28cb9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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
new file mode 100644
index 0000000000..87ee19833d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
@@ -0,0 +1,194 @@
+/*
+ * 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
new file mode 100644
index 0000000000..41f28d033a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
@@ -0,0 +1,107 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6fb1650c1f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
@@ -0,0 +1,121 @@
+/*
+ * 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
new file mode 100644
index 0000000000..02dd3c8f58
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000000..af61e1a68a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ee5a0a1511
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
@@ -0,0 +1,144 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9b393dff0f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
@@ -0,0 +1,116 @@
+/*
+ * 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
new file mode 100644
index 0000000000..110b17321f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
@@ -0,0 +1,128 @@
+/*
+ * 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
new file mode 100644
index 0000000000..77d3c23fbc
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
@@ -0,0 +1,73 @@
+/*
+ * 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
new file mode 100644
index 0000000000..84a498070a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
@@ -0,0 +1,131 @@
+/*
+ * 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
new file mode 100644
index 0000000000..4c355284ae
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
@@ -0,0 +1,272 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2adb0d3d35
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
@@ -0,0 +1,134 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0778645cb5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
@@ -0,0 +1,76 @@
+/*
+ * 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
new file mode 100644
index 0000000000..4456a66535
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
@@ -0,0 +1,50 @@
+/*
+ * 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
new file mode 100644
index 0000000000..648f9a0027
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
@@ -0,0 +1,65 @@
+/*
+ * 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
new file mode 100644
index 0000000000..db53437858
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
@@ -0,0 +1,161 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6bd186a050
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000000..99eb6e7d7e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
@@ -0,0 +1,396 @@
+/*
+ * 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
new file mode 100644
index 0000000000..874ae202f1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
@@ -0,0 +1,76 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5d3886b9e9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
@@ -0,0 +1,368 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6db9c63134
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
@@ -0,0 +1,266 @@
+/*
+ * 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
new file mode 100644
index 0000000000..91dc709609
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
@@ -0,0 +1,213 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5b475dc069
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
@@ -0,0 +1,145 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ba08d083c2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
@@ -0,0 +1,1158 @@
+/*
+ * 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
new file mode 100644
index 0000000000..af8651dc6b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
@@ -0,0 +1,1265 @@
+/*
+ * 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
new file mode 100644
index 0000000000..197ada7f22
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
@@ -0,0 +1,2092 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c31013eb78
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
@@ -0,0 +1,96 @@
+/*
+ * 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
new file mode 100644
index 0000000000..3638536ca6
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
@@ -0,0 +1,671 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f07faa79a8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
@@ -0,0 +1,48 @@
+/*
+ * 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
new file mode 100644
index 0000000000..67de5d5f5b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
@@ -0,0 +1,77 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d409084406
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
@@ -0,0 +1,21 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a61bc55d59
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
@@ -0,0 +1,58 @@
+/*
+ * 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
new file mode 100644
index 0000000000..1262ab2499
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
@@ -0,0 +1,74 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9ec4030943
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2b86f46149
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
@@ -0,0 +1,332 @@
+/*
+ * 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
new file mode 100644
index 0000000000..91fe34e89f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
@@ -0,0 +1,296 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b33d0ddd20
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
@@ -0,0 +1,282 @@
+/*
+ * 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
new file mode 100644
index 0000000000..088c4bb55b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
@@ -0,0 +1,529 @@
+/*
+ * 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
new file mode 100644
index 0000000000..187456a3b4
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
@@ -0,0 +1,296 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d969ff056f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
@@ -0,0 +1,66 @@
+/*
+ * 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
new file mode 100644
index 0000000000..86cc6aa732
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
@@ -0,0 +1,377 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5975b7b898
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
@@ -0,0 +1,69 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8c9d3837c9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
@@ -0,0 +1,62 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2fbb086022
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
@@ -0,0 +1,62 @@
+/*
+ * 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
new file mode 100644
index 0000000000..88bfac24ee
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
@@ -0,0 +1,250 @@
+/*
+ * 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
new file mode 100644
index 0000000000..499477a846
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
@@ -0,0 +1,602 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c6eacb8ad2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5dafebb48e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
@@ -0,0 +1,173 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b2287b48b5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
@@ -0,0 +1,40 @@
+/*
+ * 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
new file mode 100644
index 0000000000..85f56cb7a9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
@@ -0,0 +1,43 @@
+/*
+ * 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
new file mode 100644
index 0000000000..683b55b333
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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
new file mode 100644
index 0000000000..3305741f27
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
@@ -0,0 +1,273 @@
+/*
+ * 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
new file mode 100644
index 0000000000..40c2302fb0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
@@ -0,0 +1,140 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6e0f0543e4
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
@@ -0,0 +1,213 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7454b0dd93
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
@@ -0,0 +1,220 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7d599b441a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
@@ -0,0 +1,49 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ef6b88cc5a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
@@ -0,0 +1,502 @@
+/*
+ * 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
new file mode 100644
index 0000000000..aec0972a67
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
@@ -0,0 +1,210 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2e384c8e0c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
@@ -0,0 +1,220 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b68f3fb437
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
@@ -0,0 +1,57 @@
+/*
+ * 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
new file mode 100644
index 0000000000..38982f35b3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
@@ -0,0 +1,803 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c4ff2f721c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
@@ -0,0 +1,253 @@
+/*
+ * 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
new file mode 100644
index 0000000000..22edd60170
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7a4c87f7d2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
@@ -0,0 +1,173 @@
+/*
+ * 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
new file mode 100644
index 0000000000..0d40d9deca
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000000..063a310db8
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 0000000000..f1d6eeedb3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9feb344fa0
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
@@ -0,0 +1,187 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cfd2c70d1d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
@@ -0,0 +1,146 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f8c33dd8e9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
@@ -0,0 +1,79 @@
+/*
+ * 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
new file mode 100644
index 0000000000..678f8facba
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
@@ -0,0 +1,50 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e8f4330ed3
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
@@ -0,0 +1,116 @@
+/*
+ * 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
new file mode 100644
index 0000000000..501b473d98
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
@@ -0,0 +1,309 @@
+/*
+ * 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
new file mode 100644
index 0000000000..753940f655
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
@@ -0,0 +1,172 @@
+/*
+ * 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
new file mode 100644
index 0000000000..ca318e17b9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
@@ -0,0 +1,396 @@
+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
new file mode 100644
index 0000000000..33173d19f2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
@@ -0,0 +1,56 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5490c4bdaf
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cd9bc1746e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
@@ -0,0 +1,81 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d0850b20c5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
@@ -0,0 +1,187 @@
+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
new file mode 100644
index 0000000000..b6216f3c42
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
@@ -0,0 +1,82 @@
+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
new file mode 100644
index 0000000000..4c1c82b9bf
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
@@ -0,0 +1,38 @@
+/*
+ * 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
new file mode 100644
index 0000000000..241f20c1f9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
@@ -0,0 +1,392 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f24105db17
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
@@ -0,0 +1,163 @@
+/*
+ * 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
new file mode 100644
index 0000000000..72b266917f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
@@ -0,0 +1,72 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d797e68d8a
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
@@ -0,0 +1,146 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6ead05ce96
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
@@ -0,0 +1,65 @@
+/*
+ * 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
new file mode 100644
index 0000000000..8d9d539524
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
@@ -0,0 +1,19 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b1264fb9af
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
@@ -0,0 +1,98 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b8fcdb9135
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
@@ -0,0 +1,285 @@
+/*
+ * 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
new file mode 100644
index 0000000000..adb3d42754
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
@@ -0,0 +1,104 @@
+/*
+ * 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
new file mode 100644
index 0000000000..da9bd49397
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
@@ -0,0 +1,304 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5f15bd6c09
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
@@ -0,0 +1,115 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5254da24f1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
@@ -0,0 +1,316 @@
+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
new file mode 100644
index 0000000000..972254e2d9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
@@ -0,0 +1,96 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c9cff6cd9e
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
@@ -0,0 +1,34 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b6fa575b5c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000000..fa6d2db382
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
@@ -0,0 +1,121 @@
+/*
+ * 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
new file mode 100644
index 0000000000..af9d9647af
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
@@ -0,0 +1,38 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5d9b9c3cc1
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
@@ -0,0 +1,37 @@
+/*
+ * 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
new file mode 100644
index 0000000000..61c52865cf
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
@@ -0,0 +1,37 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b477154d39
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
@@ -0,0 +1,186 @@
+/*
+ * 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
new file mode 100644
index 0000000000..d5368b3f0d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
@@ -0,0 +1,25 @@
+/*
+ * 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
new file mode 100644
index 0000000000..7a0c9a743c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
@@ -0,0 +1,155 @@
+/*
+ * 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
new file mode 100644
index 0000000000..18a8eadd2c
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
@@ -0,0 +1,108 @@
+/*
+ * 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
new file mode 100644
index 0000000000..38c014a467
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
@@ -0,0 +1,113 @@
+/*
+ * 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
new file mode 100644
index 0000000000..f7bdec79eb
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
@@ -0,0 +1,92 @@
+/*
+ * 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
new file mode 100644
index 0000000000..cc9b1dcc2d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
@@ -0,0 +1,97 @@
+/*
+ * 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
new file mode 100644
index 0000000000..fdfe3d7ee9
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
@@ -0,0 +1,203 @@
+/*
+ * 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
new file mode 100644
index 0000000000..a760c5e256
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
@@ -0,0 +1,93 @@
+/*
+ * 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
new file mode 100644
index 0000000000..e3a2065ed5
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
@@ -0,0 +1,121 @@
+/*
+ * 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
new file mode 100644
index 0000000000..c1d751739f
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
@@ -0,0 +1,156 @@
+/*
+ * 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
new file mode 100644
index 0000000000..b79ddb4a44
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
@@ -0,0 +1,177 @@
+/*
+ * 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
new file mode 100644
index 0000000000..5a9cd8048b
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
@@ -0,0 +1,98 @@
+/*
+ * 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
new file mode 100644
index 0000000000..6b6b6c3558
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
@@ -0,0 +1,82 @@
+/*
+ * 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
new file mode 100644
index 0000000000..38ad31688d
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
@@ -0,0 +1,163 @@
+/*
+ * 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
new file mode 100644
index 0000000000..2959bc2fb2
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
@@ -0,0 +1,82 @@
+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
new file mode 100644
index 0000000000..c52e440383
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
@@ -0,0 +1,84 @@
+/*
+ * 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
new file mode 100644
index 0000000000..79e606d536
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
@@ -0,0 +1,118 @@
+/*
+ * 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
new file mode 100644
index 0000000000..9492a6c077
--- /dev/null
+++ b/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
@@ -0,0 +1,166 @@
+/*
+ * 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/com/github/technus/tectech/Reference.java b/src/main/java/com/github/technus/tectech/Reference.java
new file mode 100644
index 0000000000..928a4a4e0f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/Reference.java
@@ -0,0 +1,15 @@
+package com.github.technus.tectech;
+
+import gregtech.api.enums.Mods;
+
+public final class Reference {
+
+ public static final String MODID = Mods.Names.TECTECH;
+ public static final String NAME = "TecTech - Tec Technology!";
+ public static final String VERSION = Tags.VERSION;
+ public static final String COLLECTIONNAME = "TecTech";
+ public static final String CLIENTSIDE = "com.github.technus.tectech.proxy.ClientProxy";
+ public static final String SERVERSIDE = "com.github.technus.tectech.proxy.CommonProxy";
+
+ private Reference() {}
+}
diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java
new file mode 100644
index 0000000000..593f5f9627
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/TecTech.java
@@ -0,0 +1,119 @@
+package com.github.technus.tectech;
+
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static gregtech.api.enums.Mods.COFHCore;
+
+import net.minecraftforge.common.MinecraftForge;
+
+import com.github.technus.tectech.loader.MainLoader;
+import com.github.technus.tectech.loader.TecTechConfig;
+import com.github.technus.tectech.loader.gui.CreativeTabTecTech;
+import com.github.technus.tectech.loader.thing.MuTeLoader;
+import com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData;
+import com.github.technus.tectech.proxy.CommonProxy;
+import com.github.technus.tectech.recipe.EyeOfHarmonyRecipeStorage;
+import com.github.technus.tectech.recipe.TecTechRecipeMaps;
+
+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.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import eu.usrv.yamcore.auxiliary.IngameErrorLog;
+import eu.usrv.yamcore.auxiliary.LogHelper;
+import gregtech.api.objects.XSTR;
+
+@Mod(
+ modid = Reference.MODID,
+ name = Reference.NAME,
+ version = Reference.VERSION,
+ dependencies = "required-after:Forge@[10.13.4.1614,);" + "required-after:YAMCore@[0.5.70,);"
+ + "required-after:structurelib;"
+ + "after:ComputerCraft;"
+ + "after:OpenComputers;"
+ + "required-after:gtneioreplugin;"
+ + "required-after:gregtech;"
+ + "after:dreamcraft;"
+ + "after:appliedenergistics2;"
+ + "after:CoFHCore;"
+ + "after:Thaumcraft;")
+public class TecTech {
+
+ @SidedProxy(clientSide = Reference.CLIENTSIDE, serverSide = Reference.SERVERSIDE)
+ public static CommonProxy proxy;
+
+ @Mod.Instance(Reference.MODID)
+ public static TecTech instance;
+
+ public static final XSTR RANDOM = XSTR.XSTR_INSTANCE;
+ public static final LogHelper LOGGER = new LogHelper(Reference.MODID);
+ public static CreativeTabTecTech creativeTabTecTech;
+
+ public static TecTechConfig configTecTech;
+
+ public static EnderWorldSavedData enderWorldSavedData;
+
+ /**
+ * For Loader.isModLoaded checks during the runtime
+ */
+ public static boolean hasCOFH = false;
+
+ public static final byte tectechTexturePage1 = 8;
+
+ @Mod.EventHandler
+ @SuppressWarnings("unused")
+ public void PreLoad(FMLPreInitializationEvent PreEvent) {
+ LOGGER.setDebugOutput(true);
+
+ configTecTech = new TecTechConfig(
+ PreEvent.getModConfigurationDirectory(),
+ Reference.COLLECTIONNAME,
+ Reference.MODID);
+
+ if (!configTecTech.LoadConfig()) {
+ LOGGER.error(Reference.MODID + " could not load its config file. Things are going to be weird!");
+ }
+
+ if (configTecTech.MOD_ADMIN_ERROR_LOGS) {
+ LOGGER.setDebugOutput(DEBUG_MODE);
+ LOGGER.debug("moduleAdminErrorLogs is enabled");
+ IngameErrorLog moduleAdminErrorLogs = new IngameErrorLog();
+ }
+
+ enderWorldSavedData = new EnderWorldSavedData();
+ FMLCommonHandler.instance()
+ .bus()
+ .register(enderWorldSavedData);
+ MinecraftForge.EVENT_BUS.register(enderWorldSavedData);
+
+ TecTechRecipeMaps.init();
+ MainLoader.preLoad();
+ new MuTeLoader().run();
+ }
+
+ @Mod.EventHandler
+ @SuppressWarnings("unused")
+ public void Load(FMLInitializationEvent event) {
+ hasCOFH = COFHCore.isModLoaded();
+
+ MainLoader.load();
+ MainLoader.addAfterGregTechPostLoadRunner();
+ }
+
+ @Mod.EventHandler
+ @SuppressWarnings("unused")
+ public void PostLoad(FMLPostInitializationEvent PostEvent) {
+ MainLoader.postLoad();
+ }
+
+ @Mod.EventHandler
+ @SuppressWarnings("unused")
+ public void onLoadCompleted(FMLLoadCompleteEvent event) {
+ eyeOfHarmonyRecipeStorage = new EyeOfHarmonyRecipeStorage();
+ }
+
+ public static EyeOfHarmonyRecipeStorage eyeOfHarmonyRecipeStorage = null;
+
+}
diff --git a/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java b/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java
new file mode 100644
index 0000000000..74e7a26839
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java
@@ -0,0 +1,307 @@
+package com.github.technus.tectech.compatibility.openComputers;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import org.apache.commons.compress.utils.IOUtils;
+
+import com.github.technus.avrClone.AvrCore;
+import com.github.technus.avrClone.instructions.ExecutionEvent;
+import com.github.technus.avrClone.instructions.InstructionRegistry;
+import com.github.technus.avrClone.instructions.exceptions.DebugEvent;
+import com.github.technus.avrClone.instructions.exceptions.DelayEvent;
+import com.github.technus.avrClone.memory.EepromMemory;
+import com.github.technus.avrClone.memory.RemovableMemory;
+import com.github.technus.avrClone.memory.program.ProgramMemory;
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.util.Converter;
+
+import li.cil.oc.Settings;
+import li.cil.oc.api.Driver;
+import li.cil.oc.api.driver.Item;
+import li.cil.oc.api.driver.item.Memory;
+import li.cil.oc.api.machine.Architecture;
+import li.cil.oc.api.machine.ExecutionResult;
+import li.cil.oc.api.machine.Machine;
+import li.cil.oc.api.machine.Signal;
+import li.cil.oc.common.SaveHandler;
+
+@Architecture.Name("AVR 32Bit Clone")
+@Architecture.NoMemoryRequirements
+public class AvrArchitecture implements Architecture {
+
+ private final Machine machine;
+ private AvrCore core;
+ private boolean debugRun;
+ private int delay;
+ private int[] tempData;
+ private int memSize;
+
+ public AvrArchitecture(Machine machine) {
+ this.machine = machine;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return core != null && core.checkValid();
+ }
+
+ @Override
+ public boolean recomputeMemory(Iterable<ItemStack> components) {
+ computeMemory(components);
+ return true;
+ }
+
+ private void computeMemory(Iterable<ItemStack> components) {
+ int memory = 0;
+ for (ItemStack component : components) {
+ Item driver = Driver.driverFor(component);
+ if (driver instanceof Memory memoryDriver) {
+ memory += memoryDriver.amount(component) * 256; // in integers
+ } // else if (driver instanceof DriverEEPROM$) {
+
+ // }
+ }
+ memory = Math.min(
+ Math.max(memory, 0),
+ Settings.get()
+ .maxTotalRam());
+ if (memory != memSize) {}
+ }
+
+ @Override
+ public boolean initialize() {
+ core = new AvrCore();
+
+ computeMemory(
+ this.machine.host()
+ .internalComponents());
+
+ if (isInitialized()) {
+ machine.beep(".");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void close() {
+ core = null;
+ tempData = null;
+ delay = 0;
+ }
+
+ @Override
+ public void runSynchronized() {
+ core.cycle();
+ }
+
+ @Override
+ public ExecutionResult runThreaded(boolean isSynchronizedReturn) {
+ if (core.awoken) {
+ delay = 0;
+ for (int load = 0; load < 512;) {
+ load += core.getInstruction()
+ .getCost(core);
+ ExecutionEvent executionEvent = core.cpuCycleForce();
+ if (executionEvent != null) {
+ if (executionEvent.throwable instanceof DelayEvent) {
+ delay = executionEvent.data[0];
+ break;
+ } else if (executionEvent.throwable instanceof DebugEvent) {
+ if (debugRun) {
+ // aBaseMetaTileEntity.setActive(false);
+ break;
+ }
+ }
+ }
+ }
+ } else if (delay > 0) {
+ delay--;
+ if (delay == 0) {
+ core.awoken = true;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void onSignal() {
+ Signal signal = machine.popSignal();
+
+ core.interruptsHandle();
+ }
+
+ @Override
+ public void onConnect() {
+ // init network components, in case init was called from load logic (pre first tick?)
+ }
+
+ @Override
+ public void load(NBTTagCompound avr) {
+ debugRun = avr.getBoolean("debugRun");
+ delay = avr.getInteger("delay");
+ core.active = avr.getBoolean("active");
+ core.awoken = (avr.getBoolean("awoken"));
+ core.programCounter = avr.getInteger("programCounter");
+ InstructionRegistry registry = InstructionRegistry.REGISTRIES.get(avr.getString("instructionRegistry"));
+ if (registry != null) {
+ byte[] instructions = SaveHandler.load(
+ avr,
+ this.machine.node()
+ .address() + "_instructionsMemory");
+ byte[] param0 = SaveHandler.load(
+ avr,
+ this.machine.node()
+ .address() + "_param0Memory");
+ byte[] param1 = SaveHandler.load(
+ avr,
+ this.machine.node()
+ .address() + "_param1Memory");
+ if (instructions != null && param0 != null
+ && param1 != null
+ && instructions.length > 0
+ && param0.length > 0
+ && param1.length > 0) {
+ int[] instr = null, par0 = null, par1 = null;
+ try {
+ GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(instructions));
+ instr = Converter.readInts(IOUtils.toByteArray(gzis));
+ IOUtils.closeQuietly(gzis);
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to decompress instructions memory from disk.");
+ e.printStackTrace();
+ }
+ try {
+ GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(param0));
+ par0 = Converter.readInts(IOUtils.toByteArray(gzis));
+ IOUtils.closeQuietly(gzis);
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to decompress param0 memory from disk.");
+ e.printStackTrace();
+ }
+ try {
+ GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(param1));
+ par1 = Converter.readInts(IOUtils.toByteArray(gzis));
+ IOUtils.closeQuietly(gzis);
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to decompress param1 memory from disk.");
+ e.printStackTrace();
+ }
+ if (instr != null && par0 != null
+ && par1 != null
+ && instr.length == par0.length
+ && instr.length == par1.length) {
+ core.setProgramMemory(new ProgramMemory(registry, avr.getBoolean("immersive"), instr, par0, par1));
+ }
+ }
+ }
+ if (avr.hasKey("eepromSize")) {
+ core.restoreEepromDefinition(EepromMemory.make(avr.getInteger("eepromSize")));
+ }
+ byte[] data = SaveHandler.load(
+ avr,
+ this.machine.node()
+ .address() + "_dataMemory");
+ if (data != null && data.length > 0) {
+ try {
+ GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(data));
+ tempData = Converter.readInts(IOUtils.toByteArray(gzis));
+ IOUtils.closeQuietly(gzis);
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to decompress data memory from disk.");
+ e.printStackTrace();
+ }
+ }
+ core.checkValid();
+ }
+
+ @Override
+ public void save(NBTTagCompound avr) {
+ avr.setBoolean("debugRun", debugRun);
+ avr.setInteger("delay", delay);
+ avr.setBoolean("active", core.active);
+ avr.setBoolean("awoken", core.awoken);
+ avr.setInteger("programCounter", core.programCounter);
+ ProgramMemory programMemory = core.getProgramMemory();
+ if (programMemory != null) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GZIPOutputStream gzos = new GZIPOutputStream(baos);
+ gzos.write(Converter.writeInts(programMemory.instructions));
+ gzos.close();
+ SaveHandler.scheduleSave(
+ machine.host(),
+ avr,
+ machine.node()
+ .address() + "_instructionsMemory",
+ baos.toByteArray());
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to compress instructions memory to disk");
+ e.printStackTrace();
+ }
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GZIPOutputStream gzos = new GZIPOutputStream(baos);
+ gzos.write(Converter.writeInts(programMemory.param0));
+ gzos.close();
+ SaveHandler.scheduleSave(
+ machine.host(),
+ avr,
+ machine.node()
+ .address() + "_param0Memory",
+ baos.toByteArray());
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to compress param0 memory to disk");
+ e.printStackTrace();
+ }
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GZIPOutputStream gzos = new GZIPOutputStream(baos);
+ gzos.write(Converter.writeInts(programMemory.param1));
+ gzos.close();
+ SaveHandler.scheduleSave(
+ machine.host(),
+ avr,
+ machine.node()
+ .address() + "_param1Memory",
+ baos.toByteArray());
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to compress param1 memory to disk");
+ e.printStackTrace();
+ }
+ avr.setBoolean("immersive", programMemory.immersiveOperands);
+ avr.setString("instructionRegistry", programMemory.registry.toString());
+ }
+ RemovableMemory<EepromMemory> eeprom = core.getEepromMemory();
+ if (eeprom != null) {
+ avr.setInteger(
+ "eepromSize",
+ eeprom.getDefinition()
+ .getSize());
+ }
+ if (core.dataMemory != null) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GZIPOutputStream gzos = new GZIPOutputStream(baos);
+ gzos.write(Converter.writeInts(core.dataMemory));
+ gzos.close();
+ SaveHandler.scheduleSave(
+ machine.host(),
+ avr,
+ machine.node()
+ .address() + "_dataMemory",
+ baos.toByteArray());
+ } catch (IOException e) {
+ TecTech.LOGGER.error("Failed to compress data memory to disk");
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/MainLoader.java b/src/main/java/com/github/technus/tectech/loader/MainLoader.java
new file mode 100644
index 0000000000..01d63392e5
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/MainLoader.java
@@ -0,0 +1,202 @@
+package com.github.technus.tectech.loader;
+
+import static com.github.technus.tectech.TecTech.LOGGER;
+import static com.github.technus.tectech.TecTech.configTecTech;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.TecTech.proxy;
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import java.util.HashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.loader.gui.CreativeTabTecTech;
+import com.github.technus.tectech.loader.recipe.BaseRecipeLoader;
+import com.github.technus.tectech.loader.thing.CoverLoader;
+import com.github.technus.tectech.loader.thing.MachineLoader;
+import com.github.technus.tectech.loader.thing.ThingsLoader;
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+import com.github.technus.tectech.thing.metaTileEntity.Textures;
+
+import cpw.mods.fml.common.ProgressManager;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+
+@SuppressWarnings("deprecation")
+public final class MainLoader {
+
+ public static DamageSource microwaving;
+
+ private MainLoader() {}
+
+ public static void preLoad() {
+ creativeTabTecTech = new CreativeTabTecTech("TecTech");
+
+ // set expanded texture arrays for tiers
+ try {
+ Textures.run();
+ } catch (Throwable t) {
+ LOGGER.error("Loading textures...", t);
+ }
+ }
+
+ public static void load() {
+ ProgressManager.ProgressBar progressBarLoad = ProgressManager.push("TecTech Loader", 6);
+
+ progressBarLoad.step("Regular Things");
+ new ThingsLoader().run();
+ LOGGER.info("Block/Item Init Done");
+
+ progressBarLoad.step("Machine Things");
+ new MachineLoader().run();
+ LOGGER.info("Machine Init Done");
+
+ progressBarLoad.step("Cover Things");
+ new CoverLoader().run();
+ LOGGER.info("Cover Init Done");
+
+ progressBarLoad.step("Add damage types");
+ microwaving = new DamageSource("microwaving").setDamageBypassesArmor();
+ LOGGER.info("Damage types addition Done");
+
+ progressBarLoad.step("Register Packet Dispatcher");
+ new NetworkDispatcher();
+ LOGGER.info("Packet Dispatcher registered");
+
+ progressBarLoad.step("Register GUI Handler");
+ proxy.registerRenderInfo();
+ LOGGER.info("GUI Handler registered");
+
+ ProgressManager.pop(progressBarLoad);
+ }
+
+ public static void postLoad() {
+ ProgressManager.ProgressBar progressBarPostLoad = ProgressManager.push("TecTech Post Loader", 4);
+
+ progressBarPostLoad.step("Dreamcraft Compatibility");
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ try {
+ Class<?> clazz = Class.forName("com.dreammaster.gthandler.casings.GT_Container_CasingsNH");
+ TT_Container_Casings.sBlockCasingsNH = (Block) clazz.getField("sBlockCasingsNH")
+ .get(null);
+
+ if (TT_Container_Casings.sBlockCasingsNH == null) {
+ throw new NullPointerException("sBlockCasingsNH Is not set at this time");
+ }
+ } catch (Exception e) {
+ throw new Error("Unable to get NH casings", e);
+ }
+ }
+
+ progressBarPostLoad.step("Recipes");
+ new BaseRecipeLoader().run();
+ TecTech.LOGGER.info("Recipe Init Done");
+
+ if (!configTecTech.DISABLE_BLOCK_HARDNESS_NERF) {
+ progressBarPostLoad.step("Nerf blocks blast resistance");
+ adjustTwilightBlockResistance();
+ TecTech.LOGGER.info("Blocks nerf done");
+ } else {
+ progressBarPostLoad.step("Do not nerf blocks blast resistance");
+ TecTech.LOGGER.info("Blocks were not nerfed");
+ }
+
+ // ProgressManager.pop(progressBarPostLoad);
+ }
+
+ public static void addAfterGregTechPostLoadRunner() {
+ GregTech_API.sAfterGTPostload.add(() -> {
+ if (TecTech.configTecTech.NERF_FUSION) {
+ FixBrokenFusionRecipes();
+ }
+ });
+ }
+
+ private static void FixBrokenFusionRecipes() {
+ HashMap<Fluid, Fluid> binds = new HashMap<>();
+ for (Materials material : Materials.values()) {
+ FluidStack p = material.getPlasma(1);
+ if (p != null) {
+ if (DEBUG_MODE) {
+ LOGGER.info("Found Plasma of " + material.mName);
+ }
+ if (material.mElement != null && (material.mElement.mProtons >= Materials.Iron.mElement.mProtons
+ || -material.mElement.mProtons >= Materials.Iron.mElement.mProtons
+ || material.mElement.mNeutrons >= Materials.Iron.mElement.mNeutrons
+ || -material.mElement.mNeutrons >= Materials.Iron.mElement.mNeutrons)) {
+ if (DEBUG_MODE) {
+ LOGGER.info("Attempting to bind " + material.mName);
+ }
+ if (material.getMolten(1) != null) {
+ binds.put(
+ p.getFluid(),
+ material.getMolten(1)
+ .getFluid());
+ } else if (material.getGas(1) != null) {
+ binds.put(
+ p.getFluid(),
+ material.getGas(1)
+ .getFluid());
+ } else if (material.getFluid(1) != null) {
+ binds.put(
+ p.getFluid(),
+ material.getFluid(1)
+ .getFluid());
+ } else {
+ binds.put(
+ p.getFluid(),
+ Materials.Iron.getMolten(1)
+ .getFluid());
+ }
+ }
+ }
+ }
+ for (GT_Recipe r : RecipeMaps.fusionRecipes.getAllRecipes()) {
+ Fluid fluid = binds.get(r.mFluidOutputs[0].getFluid());
+ if (fluid != null) {
+ if (DEBUG_MODE) {
+ LOGGER.info("Nerfing Recipe " + r.mFluidOutputs[0].getUnlocalizedName());
+ }
+ r.mFluidOutputs[0] = new FluidStack(fluid, r.mFluidOutputs[0].amount);
+ }
+ fluid = binds.get(r.mFluidInputs[0].getFluid());
+ if (fluid != null) {
+ if (DEBUG_MODE) {
+ LOGGER.info("Fixing plasma use in Recipe " + r.mFluidInputs[0].getUnlocalizedName());
+ }
+ r.mFluidInputs[0] = new FluidStack(fluid, r.mFluidInputs[0].amount);
+ }
+ fluid = binds.get(r.mFluidInputs[1].getFluid());
+ if (fluid != null) {
+ if (DEBUG_MODE) {
+ LOGGER.info("Fixing plasma use in Recipe " + r.mFluidInputs[1].getUnlocalizedName());
+ }
+ r.mFluidInputs[1] = new FluidStack(fluid, r.mFluidInputs[1].amount);
+ }
+ }
+ }
+
+ private static void safeSetResistance(Block block, float resistance) {
+ if (block != null) {
+ block.setResistance(resistance);
+ }
+ }
+
+ private static void adjustTwilightBlockResistance() {
+ if (TwilightForest.isModLoaded()) {
+ safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFShield"), 30);
+ safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFThorns"), 10);
+ safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFTowerTranslucent"), 30);
+ safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFDeadrock"), 5);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java b/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java
new file mode 100644
index 0000000000..c195364d91
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java
@@ -0,0 +1,25 @@
+package com.github.technus.tectech.loader;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage;
+import com.github.technus.tectech.mechanics.spark.RendererMessage;
+
+public class NetworkDispatcher extends eu.usrv.yamcore.network.PacketDispatcher {
+
+ public static NetworkDispatcher INSTANCE;
+
+ public NetworkDispatcher() {
+ super(MODID);
+ INSTANCE = this;
+ registerPackets();
+ }
+
+ @Override
+ public void registerPackets() {
+ registerMessage(PipeActivityMessage.ServerHandler.class, PipeActivityMessage.PipeActivityQuery.class);
+ registerMessage(PipeActivityMessage.ClientHandler.class, PipeActivityMessage.PipeActivityData.class);
+
+ registerMessage(RendererMessage.ClientHandler.class, RendererMessage.RendererData.class);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java b/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java
new file mode 100644
index 0000000000..cb27933eb7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java
@@ -0,0 +1,257 @@
+package com.github.technus.tectech.loader;
+
+import java.io.File;
+
+import eu.usrv.yamcore.config.ConfigManager;
+
+public class TecTechConfig extends ConfigManager {
+
+ public TecTechConfig(File pConfigBaseDirectory, String pModCollectionDirectory, String pModID) {
+ super(pConfigBaseDirectory, pModCollectionDirectory, pModID);
+ }
+
+ // final static to allow compiler to remove the debug code when this is false
+ public static boolean DEBUG_MODE = false;
+ public static boolean POWERLESS_MODE = false;
+ public boolean BOOM_ENABLE;
+ public boolean DISABLE_BLOCK_HARDNESS_NERF;
+ public boolean EASY_SCAN;
+ public boolean NERF_FUSION;
+ public boolean ENABLE_TURRET_EXPLOSIONS;
+ public float TURRET_DAMAGE_FACTOR;
+ public float TURRET_EXPLOSION_FACTOR;
+
+ public boolean MOD_ADMIN_ERROR_LOGS;
+
+ public boolean TESLA_MULTI_GAS_OUTPUT;
+ public float TESLA_MULTI_LOSS_FACTOR_OVERDRIVE;
+ public int TESLA_MULTI_LOSS_PER_BLOCK_T0;
+ public int TESLA_MULTI_LOSS_PER_BLOCK_T1;
+ public int TESLA_MULTI_LOSS_PER_BLOCK_T2;
+ public int TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM;
+ public int TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN;
+ public int TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON;
+ public int TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1;
+ public int TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2;
+ public int TESLA_MULTI_RANGE_COVER;
+ public int TESLA_MULTI_RANGE_TOWER;
+ public int TESLA_MULTI_RANGE_TRANSCEIVER;
+ public float TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE;
+ public int TESLA_SINGLE_LOSS_PER_BLOCK;
+ public int TESLA_SINGLE_RANGE;
+ public boolean TESLA_VISUAL_EFFECT;
+
+ /**
+ * This loading phases do not correspond to mod loading phases!
+ */
+ @Override
+ protected void PreInit() {
+
+ BOOM_ENABLE = true;
+ DISABLE_BLOCK_HARDNESS_NERF = false;
+ EASY_SCAN = false;
+ NERF_FUSION = false;
+ ENABLE_TURRET_EXPLOSIONS = true;
+ TURRET_DAMAGE_FACTOR = 10;
+ TURRET_EXPLOSION_FACTOR = 1;
+
+ MOD_ADMIN_ERROR_LOGS = false;
+
+ TESLA_MULTI_GAS_OUTPUT = false;
+ TESLA_MULTI_LOSS_FACTOR_OVERDRIVE = 0.25F;
+ TESLA_MULTI_LOSS_PER_BLOCK_T0 = 1;
+ TESLA_MULTI_LOSS_PER_BLOCK_T1 = 1;
+ TESLA_MULTI_LOSS_PER_BLOCK_T2 = 1;
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM = 100;
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN = 50;
+ TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON = 50;
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1 = 2;
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2 = 4;
+ TESLA_MULTI_RANGE_COVER = 16;
+ TESLA_MULTI_RANGE_TOWER = 32;
+ TESLA_MULTI_RANGE_TRANSCEIVER = 16;
+ TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE = 0.25F;
+ TESLA_SINGLE_LOSS_PER_BLOCK = 1;
+ TESLA_SINGLE_RANGE = 20;
+ TESLA_VISUAL_EFFECT = true;
+ }
+
+ /**
+ * This loading phases do not correspond to mod loading phases!
+ */
+ @Override
+ protected void Init() {
+ DEBUG_MODE = _mainConfig
+ .getBoolean("DebugMode", "debug", DEBUG_MODE, "Enables logging and other purely debug features");
+ POWERLESS_MODE = _mainConfig
+ .getBoolean("PowerlessMode", "debug", POWERLESS_MODE, "Enables 0EU/t multi block machinery");
+
+ BOOM_ENABLE = _mainConfig.getBoolean(
+ "BoomEnable",
+ "features",
+ BOOM_ENABLE,
+ "Set to false to disable explosions on everything bad that you can do");
+ DISABLE_BLOCK_HARDNESS_NERF = _mainConfig.getBoolean(
+ "DisableBlockHardnessNerf",
+ "features",
+ DISABLE_BLOCK_HARDNESS_NERF,
+ "Set to true to disable the block hardness nerf");
+ EASY_SCAN = _mainConfig.getBoolean(
+ "EasyScan",
+ "features",
+ EASY_SCAN,
+ "Enables tricorder to scan EM i/o hatches directly, too CHEEKY");
+ NERF_FUSION = _mainConfig.getBoolean(
+ "NerfFusion",
+ "features",
+ NERF_FUSION,
+ "Set to true to enable removal of plasmas heavier than Fe and other weird ones");
+ ENABLE_TURRET_EXPLOSIONS = _mainConfig.getBoolean(
+ "TurretBoomEnable",
+ "features",
+ ENABLE_TURRET_EXPLOSIONS,
+ "Set to false to disable explosions caused by EM turrets");
+ TURRET_DAMAGE_FACTOR = _mainConfig.getFloat(
+ "TurretDamageFactor",
+ "features",
+ TURRET_DAMAGE_FACTOR,
+ 0,
+ Short.MAX_VALUE,
+ "Damage is multiplied by this number");
+ TURRET_EXPLOSION_FACTOR = _mainConfig.getFloat(
+ "TurretExplosionFactor",
+ "features",
+ TURRET_EXPLOSION_FACTOR,
+ 0,
+ Short.MAX_VALUE,
+ "Explosion strength is multiplied by this number");
+
+ MOD_ADMIN_ERROR_LOGS = _mainConfig.getBoolean(
+ "AdminErrorLog",
+ "modules",
+ MOD_ADMIN_ERROR_LOGS,
+ "If set to true, every op/admin will receive all errors occurred during the startup phase as in game message on join");
+
+ TESLA_MULTI_GAS_OUTPUT = _mainConfig.getBoolean(
+ "TeslaMultiGasOutput",
+ "tesla_tweaks",
+ TESLA_MULTI_GAS_OUTPUT,
+ "Set to true to enable outputting plasmas as gasses from the tesla tower with a 1:1 ratio");
+ TESLA_MULTI_LOSS_FACTOR_OVERDRIVE = _mainConfig.getFloat(
+ "TeslaMultiLossFactorOverdrive",
+ "tesla_tweaks",
+ TESLA_MULTI_LOSS_FACTOR_OVERDRIVE,
+ 0,
+ 1,
+ "Additional Tesla Tower power loss per amp as a factor of the tier voltage");
+ TESLA_MULTI_LOSS_PER_BLOCK_T0 = _mainConfig.getInt(
+ "TeslaMultiLossPerBlockT0",
+ "tesla_tweaks",
+ TESLA_MULTI_LOSS_PER_BLOCK_T0,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower power transmission loss per block per amp using no plasmas");
+ TESLA_MULTI_LOSS_PER_BLOCK_T1 = _mainConfig.getInt(
+ "TeslaMultiLossPerBlockT1",
+ "tesla_tweaks",
+ TESLA_MULTI_LOSS_PER_BLOCK_T1,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower power transmission loss per block per amp using helium or nitrogen plasma");
+ TESLA_MULTI_LOSS_PER_BLOCK_T2 = _mainConfig.getInt(
+ "TeslaMultiLossPerBlockT2",
+ "tesla_tweaks",
+ TESLA_MULTI_LOSS_PER_BLOCK_T2,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower power transmission loss per block per amp using radon plasma");
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM = _mainConfig.getInt(
+ "TeslaMultiPlasmaPerSecondT1Helium",
+ "tesla_tweaks",
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower helium plasma consumed each second the tesla tower is active");
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN = _mainConfig.getInt(
+ "TeslaMultiPlasmaPerSecondT1Nitrogen",
+ "tesla_tweaks",
+ TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower nitrogen plasma consumed each second the tesla tower is active");
+ TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON = _mainConfig.getInt(
+ "TeslaMultiPlasmaPerSecondT2Radon",
+ "tesla_tweaks",
+ TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower radon plasma consumed each second the tesla tower is active");
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1 = _mainConfig.getInt(
+ "TeslaMultiRangeCoefficientPlasmaT1",
+ "tesla_tweaks",
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower T1 Plasmas Range Multiplier");
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2 = _mainConfig.getInt(
+ "TeslaMultiRangeCoefficientPlasmaT2",
+ "tesla_tweaks",
+ TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower T2 Plasmas Range Multiplier");
+ TESLA_MULTI_RANGE_COVER = _mainConfig.getInt(
+ "TeslaMultiRangeCover",
+ "tesla_tweaks",
+ TESLA_MULTI_RANGE_COVER,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower to Tesla Coil Rich Edition Cover max range");
+ TESLA_MULTI_RANGE_TOWER = _mainConfig.getInt(
+ "TeslaMultiRangeTower",
+ "tesla_tweaks",
+ TESLA_MULTI_RANGE_TOWER,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower to Tower max range");
+ TESLA_MULTI_RANGE_TRANSCEIVER = _mainConfig.getInt(
+ "TeslaMultiRangeTransceiver",
+ "tesla_tweaks",
+ TESLA_MULTI_RANGE_TRANSCEIVER,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Tower to Transceiver max range");
+ TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE = _mainConfig.getFloat(
+ "TeslaSingleLossFactorOverdrive",
+ "tesla_tweaks",
+ TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE,
+ 0,
+ 1,
+ "Additional Tesla Transceiver power loss per amp as a factor of the tier voltage");
+ TESLA_SINGLE_LOSS_PER_BLOCK = _mainConfig.getInt(
+ "TeslaSingleLossPerBlock",
+ "tesla_tweaks",
+ TESLA_SINGLE_LOSS_PER_BLOCK,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Transceiver power transmission loss per block per amp");
+ TESLA_SINGLE_RANGE = _mainConfig.getInt(
+ "TeslaSingleRange",
+ "tesla_tweaks",
+ TESLA_SINGLE_RANGE,
+ 0,
+ Integer.MAX_VALUE,
+ "Tesla Transceiver to max range");
+ TESLA_VISUAL_EFFECT = _mainConfig.getBoolean(
+ "EnableTeslaVisualEffect",
+ "tesla_tweaks",
+ TESLA_VISUAL_EFFECT,
+ "Set true to enable the cool visual effect when tesla tower running.");
+ }
+
+ /**
+ * This loading phases do not correspond to mod loading phases!
+ */
+ @Override
+ protected void PostInit() {}
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java b/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java
new file mode 100644
index 0000000000..56a125b8f4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java
@@ -0,0 +1,37 @@
+package com.github.technus.tectech.loader.gui;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import com.github.technus.tectech.thing.CustomItemList;
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+
+public class CreativeTabTecTech extends CreativeTabs {
+
+ public CreativeTabTecTech(String name) {
+ super(name);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public Item getTabIconItem() {
+ return Item.getItemFromBlock(TT_Container_Casings.sBlockCasingsTT); // High power casing
+ }
+
+ @Override
+ public void displayAllReleventItems(List<ItemStack> stuffToShow) {
+ for (CustomItemList item : CustomItemList.values()) {
+ if (item.hasBeenSet() && item.getBlock() == GregTech_API.sBlockMachines) {
+ stuffToShow.add(item.get(1));
+ }
+ }
+ super.displayAllReleventItems(stuffToShow);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java b/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java
new file mode 100644
index 0000000000..7467343599
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java
@@ -0,0 +1,3029 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer;
+import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getOrDefault;
+import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.thing.CustomItemList;
+import com.github.technus.tectech.thing.block.QuantumGlassBlock;
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+
+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;
+import gregtech.api.util.GT_Utility;
+
+public class Assembler implements Runnable {
+
+ @Override
+ public void run() {
+
+ cleanroomRecipes();
+
+ for (int i = 0; i <= 15; i++) {
+ RA.addAssemblerRecipe(
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(i + 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1) },
+ Materials.Aluminium.getMolten(864),
+ new ItemStack(StructureLibAPI.getBlockHint(), 1, i),
+ 32,
+ 120);
+ }
+
+ // Quantum Glass
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.eM_Containment.get(1), GT_ModHandler.getIC2Item("reinforcedGlass", 1L) },
+ getOrDefault("Trinium", Materials.Osmium).getMolten(576),
+ new ItemStack(QuantumGlassBlock.INSTANCE, 1),
+ 200,
+ 500000);
+
+ // recipe for assline data hatches
+ RA.addAssemblerRecipe(
+ ItemList.Hatch_DataAccess_EV.get(1),
+ CustomItemList.dataIn_Hatch.get(1),
+ CustomItemList.dataInAss_Hatch.get(1),
+ 2048,
+ 12000);
+ RA.addAssemblerRecipe(
+ ItemList.Hatch_DataAccess_EV.get(1),
+ CustomItemList.dataOut_Hatch.get(1),
+ CustomItemList.dataOutAss_Hatch.get(1),
+ 2048,
+ 12000);
+
+ // High Power Casing
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Iridium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NiobiumTitanium, 2) },
+ Materials.TungstenSteel.getMolten(576),
+ CustomItemList.eM_Power.get(1),
+ 100,
+ 30720);
+
+ // Computer Casing
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.eM_Power.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 8),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NiobiumTitanium, 2) },
+ Materials.Aluminium.getMolten(1296),
+ CustomItemList.eM_Computer_Casing.get(1),
+ 200,
+ 122880);
+ // Computer Vent Casing
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1),
+ ItemList.Electric_Motor_IV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Copper, 16),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireGt01, getOrDefault("SuperconductorIV", Materials.SuperconductorUHV), 1) },
+ Materials.SolderingAlloy.getMolten(1296),
+ CustomItemList.eM_Computer_Vent.get(1),
+ 100,
+ 1920);
+
+ // Molecular Casing
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.eM_Power.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Osmiridium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.foil, getOrDefault("Trinium", Materials.Osmium), 12),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 24),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.TungstenSteel, 24),
+ ItemList.Field_Generator_IV.get(1) },
+ Materials.Osmium.getMolten(1296),
+ CustomItemList.eM_Containment.get(1),
+ 800,
+ 500000);
+
+ // Tesla Base
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NickelZincFerrite, 1) },
+ null,
+ CustomItemList.tM_TeslaBase.get(1),
+ 50,
+ 16);
+
+ // Tesla Toroid
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Aluminium, 1) },
+ null,
+ CustomItemList.tM_TeslaToroid.get(1),
+ 50,
+ 16);
+
+ // Tesla Secondary Windings
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(8, 0),
+ getItemContainer("MicaInsulatorFoil").get(12) },
+ Materials.Silver.getMolten(144),
+ CustomItemList.tM_TeslaSecondary.get(1),
+ 200,
+ 120);
+
+ // Tesla Primary Coils T0
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.RedstoneAlloy, 8),
+ getItemContainer("MicaInsulatorFoil").get(8) },
+ Materials.RedAlloy.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_0.get(1),
+ 200,
+ 30);
+
+ // Tesla Primary Coils T1
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorMV, 8),
+ getItemContainer("MicaInsulatorFoil").get(12) },
+ Materials.Magnesium.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_1.get(1),
+ 200,
+ 120);
+
+ // Tesla Primary Coils T2
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorHV, 8),
+ getItemContainer("MicaInsulatorFoil").get(16) },
+ Materials.Barium.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_2.get(1),
+ 200,
+ 480);
+
+ // Tesla Primary Coils T3
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorEV, 8),
+ getItemContainer("MicaInsulatorFoil").get(20) },
+ Materials.Platinum.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_3.get(1),
+ 200,
+ 1920);
+
+ // Tesla Primary Coils T4
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorIV, 8),
+ getItemContainer("MicaInsulatorFoil").get(24) },
+ Materials.Vanadium.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_4.get(1),
+ 200,
+ 7680);
+
+ // Tesla Primary Coils T5
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorLuV, 8),
+ getItemContainer("MicaInsulatorFoil").get(28) },
+ Materials.Indium.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_5.get(1),
+ 200,
+ 30720);
+
+ // Tesla Primary Coils T6
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 8),
+ getItemContainer("MicaInsulatorFoil").get(32) },
+ Materials.Naquadah.getMolten(144),
+ CustomItemList.tM_TeslaPrimary_6.get(1),
+ 200,
+ 122880);
+
+ // Dynamo Hatches
+ {
+ // Dynamo Hatches 4A
+ {
+ // Dynamo EV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2) },
+ Materials.Silver.getMolten(144),
+ CustomItemList.eM_dynamoMulti4_EV.get(1),
+ 100,
+ 480);
+
+ // Dynamo IV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2) },
+ Materials.Silver.getMolten(144),
+ CustomItemList.eM_dynamoMulti4_IV.get(1),
+ 100,
+ 1920);
+
+ // Dynamo LuV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2) },
+ Materials.Silver.getMolten(288),
+ CustomItemList.eM_dynamoMulti4_LuV.get(1),
+ 100,
+ 7680);
+
+ // Dynamo ZPM 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2) },
+ Materials.Silver.getMolten(576),
+ CustomItemList.eM_dynamoMulti4_ZPM.get(1),
+ 100,
+ 30720);
+
+ // Dynamo UV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2) },
+ Materials.Silver.getMolten(1152),
+ CustomItemList.eM_dynamoMulti4_UV.get(1),
+ 100,
+ 122880);
+
+ // Dynamo UHV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Dynamo_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2) },
+ Materials.Silver.getMolten(2304),
+ CustomItemList.eM_dynamoMulti4_UHV.get(1),
+ 100,
+ 500000);
+
+ // Dynamo UEV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Dynamo_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2) },
+ Materials.Silver.getMolten(4608),
+ CustomItemList.eM_dynamoMulti4_UEV.get(1),
+ 100,
+ 2000000);
+
+ // Dynamo UIV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Dynamo_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_dynamoMulti4_UIV.get(1),
+ 100,
+ 8000000);
+
+ // Dynamo UMV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Dynamo_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_dynamoMulti4_UMV.get(1),
+ 100,
+ 32000000);
+
+ // Dynamo UXV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Dynamo_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1),
+ GT_OreDictUnificator.get("plateShirabon", 1L) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_dynamoMulti4_UXV.get(1),
+ 100,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Dynamo Hatches 16A
+ {
+ // Dynamo EV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_IV_EV.get(1), CustomItemList.eM_dynamoMulti4_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4) },
+ Materials.Electrum.getMolten(144),
+ CustomItemList.eM_dynamoMulti16_EV.get(1),
+ 200,
+ 480);
+
+ // Dynamo IV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), CustomItemList.eM_dynamoMulti4_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 4) },
+ Materials.Electrum.getMolten(144),
+ CustomItemList.eM_dynamoMulti16_IV.get(1),
+ 200,
+ 1920);
+
+ // Dynamo LuV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), CustomItemList.eM_dynamoMulti4_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 4) },
+ Materials.Electrum.getMolten(288),
+ CustomItemList.eM_dynamoMulti16_LuV.get(1),
+ 200,
+ 7680);
+
+ // Dynamo ZPM 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), CustomItemList.eM_dynamoMulti4_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4) },
+ Materials.Electrum.getMolten(576),
+ CustomItemList.eM_dynamoMulti16_ZPM.get(1),
+ 200,
+ 30720);
+
+ // Dynamo UV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), CustomItemList.eM_dynamoMulti4_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 4) },
+ Materials.Electrum.getMolten(1152),
+ CustomItemList.eM_dynamoMulti16_UV.get(1),
+ 200,
+ 122880);
+
+ // Dynamo UHV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1),
+ CustomItemList.eM_dynamoMulti4_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 4) },
+ Materials.Electrum.getMolten(2304),
+ CustomItemList.eM_dynamoMulti16_UHV.get(1),
+ 200,
+ 500000);
+
+ // Dynamo UEV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1),
+ CustomItemList.eM_dynamoMulti4_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 4) },
+ Materials.Electrum.getMolten(4608),
+ CustomItemList.eM_dynamoMulti16_UEV.get(1),
+ 200,
+ 2000000);
+
+ // Dynamo UIV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1),
+ CustomItemList.eM_dynamoMulti4_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 4) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_dynamoMulti16_UIV.get(1),
+ 200,
+ 8000000);
+
+ // Dynamo UMV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UXV_UMV").get(1),
+ CustomItemList.eM_dynamoMulti4_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_dynamoMulti16_UMV.get(1),
+ 200,
+ 32000000);
+
+ // Dynamo UXV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_MAX_UXV").get(1),
+ CustomItemList.eM_dynamoMulti4_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2),
+ GT_OreDictUnificator.get("plateShirabon", 2L) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_dynamoMulti16_UXV.get(1),
+ 200,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Dynamo Hatches 64A
+ {
+ // Dynamo EV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_IV_EV").get(1),
+ CustomItemList.eM_dynamoMulti16_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6) },
+ Materials.Tungsten.getMolten(144),
+ CustomItemList.eM_dynamoMulti64_EV.get(1),
+ 400,
+ 480);
+
+ // Dynamo IV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_LuV_IV").get(1),
+ CustomItemList.eM_dynamoMulti16_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6) },
+ Materials.Tungsten.getMolten(144),
+ CustomItemList.eM_dynamoMulti64_IV.get(1),
+ 400,
+ 1920);
+
+ // Dynamo LuV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1),
+ CustomItemList.eM_dynamoMulti16_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 6) },
+ Materials.Tungsten.getMolten(288),
+ CustomItemList.eM_dynamoMulti64_LuV.get(1),
+ 400,
+ 7680);
+
+ // Dynamo ZPM 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UV_ZPM").get(1),
+ CustomItemList.eM_dynamoMulti16_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6) },
+ Materials.Tungsten.getMolten(576),
+ CustomItemList.eM_dynamoMulti64_ZPM.get(1),
+ 400,
+ 30720);
+
+ // Dynamo UV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UHV_UV").get(1),
+ CustomItemList.eM_dynamoMulti16_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 6) },
+ Materials.Tungsten.getMolten(1152),
+ CustomItemList.eM_dynamoMulti64_UV.get(1),
+ 400,
+ 122880);
+
+ // Dynamo UHV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UEV_UHV").get(1),
+ CustomItemList.eM_dynamoMulti16_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6) },
+ Materials.Tungsten.getMolten(2304),
+ CustomItemList.eM_dynamoMulti64_UHV.get(1),
+ 400,
+ 2000000);
+
+ // Dynamo UEV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UIV_UEV").get(1),
+ CustomItemList.eM_dynamoMulti16_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 6) },
+ Materials.Tungsten.getMolten(4608),
+ CustomItemList.eM_dynamoMulti64_UEV.get(1),
+ 400,
+ 2000000);
+
+ // Dynamo UIV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UMV_UIV").get(1),
+ CustomItemList.eM_dynamoMulti16_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 6) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_dynamoMulti64_UIV.get(1),
+ 400,
+ 8000000);
+
+ // Dynamo UMV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UXV_UMV").get(1),
+ CustomItemList.eM_dynamoMulti16_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_dynamoMulti64_UMV.get(1),
+ 400,
+ 32000000);
+
+ // Dynamo UXV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_MAX_UXV").get(1),
+ CustomItemList.eM_dynamoMulti16_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 3),
+ GT_OreDictUnificator.get("plateShirabon", 3L) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_dynamoMulti64_UXV.get(1),
+ 400,
+ (int) TierEU.RECIPE_UMV);
+ }
+ }
+
+ // Energy Hatches
+ {
+ // Energy Hatches 4A
+ {
+ // Energy Hatch EV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2) },
+ Materials.Silver.getMolten(144),
+ CustomItemList.eM_energyMulti4_EV.get(1),
+ 100,
+ 480);
+
+ // Energy Hatch IV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2) },
+ Materials.Silver.getMolten(144),
+ CustomItemList.eM_energyMulti4_IV.get(1),
+ 100,
+ 1920);
+
+ // Energy Hatch LuV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2) },
+ Materials.Silver.getMolten(288),
+ CustomItemList.eM_energyMulti4_LuV.get(1),
+ 100,
+ 7680);
+
+ // Energy Hatch ZPM 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2) },
+ Materials.Silver.getMolten(576),
+ CustomItemList.eM_energyMulti4_ZPM.get(1),
+ 100,
+ 30720);
+
+ // Energy Hatch UV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2) },
+ Materials.Silver.getMolten(1152),
+ CustomItemList.eM_energyMulti4_UV.get(1),
+ 100,
+ 122880);
+
+ // Energy Hatch UHV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Energy_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2) },
+ Materials.Silver.getMolten(2304),
+ CustomItemList.eM_energyMulti4_UHV.get(1),
+ 100,
+ 500000);
+
+ // Energy Hatch UEV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Energy_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2) },
+ Materials.Silver.getMolten(4608),
+ CustomItemList.eM_energyMulti4_UEV.get(1),
+ 100,
+ 2000000);
+
+ // Energy Hatch UIV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Energy_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_energyMulti4_UIV.get(1),
+ 100,
+ 8000000);
+
+ // Energy Hatch UMV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Energy_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_energyMulti4_UMV.get(1),
+ 100,
+ 32000000);
+
+ // Energy Hatch UXV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hatch_Energy_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1),
+ GT_OreDictUnificator.get("plateShirabon", 1L) },
+ Materials.Silver.getMolten(9216),
+ CustomItemList.eM_energyMulti4_UXV.get(1),
+ 100,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Energy Hatches 16A
+ {
+ // Energy Hatch EV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_IV_EV.get(1), CustomItemList.eM_energyMulti4_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4) },
+ Materials.Electrum.getMolten(144),
+ CustomItemList.eM_energyMulti16_EV.get(1),
+ 200,
+ 480);
+
+ // Energy Hatch IV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), CustomItemList.eM_energyMulti4_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 4) },
+ Materials.Electrum.getMolten(144),
+ CustomItemList.eM_energyMulti16_IV.get(1),
+ 200,
+ 1920);
+
+ // Energy Hatch LuV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), CustomItemList.eM_energyMulti4_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 4) },
+ Materials.Electrum.getMolten(288),
+ CustomItemList.eM_energyMulti16_LuV.get(1),
+ 200,
+ 7680);
+
+ // Energy Hatch ZPM 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), CustomItemList.eM_energyMulti4_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4) },
+ Materials.Electrum.getMolten(576),
+ CustomItemList.eM_energyMulti16_ZPM.get(1),
+ 200,
+ 30720);
+
+ // Energy Hatch UV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), CustomItemList.eM_energyMulti4_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 4) },
+ Materials.Electrum.getMolten(1152),
+ CustomItemList.eM_energyMulti16_UV.get(1),
+ 200,
+ 122880);
+
+ // Energy Hatch UHV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1),
+ CustomItemList.eM_energyMulti4_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 4) },
+ Materials.Electrum.getMolten(2304),
+ CustomItemList.eM_energyMulti16_UHV.get(1),
+ 200,
+ 500000);
+
+ // Energy Hatch UEV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1),
+ CustomItemList.eM_energyMulti4_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 4) },
+ Materials.Electrum.getMolten(4608),
+ CustomItemList.eM_energyMulti16_UEV.get(1),
+ 200,
+ 2000000);
+
+ // Energy Hatch UIV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1),
+ CustomItemList.eM_energyMulti4_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 4) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_energyMulti16_UIV.get(1),
+ 200,
+ 8000000);
+
+ // Energy Hatch UMV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UXV_UMV").get(1),
+ CustomItemList.eM_energyMulti4_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_energyMulti16_UMV.get(1),
+ 200,
+ 32000000);
+
+ // Energy Hatch UXV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_MAX_UXV").get(1),
+ CustomItemList.eM_energyMulti4_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2),
+ GT_OreDictUnificator.get("plateShirabon", 2L) },
+ Materials.Electrum.getMolten(9216),
+ CustomItemList.eM_energyMulti16_UXV.get(1),
+ 200,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Energy Hatches 64A
+ {
+ // Energy Hatch EV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_IV_EV").get(1),
+ CustomItemList.eM_energyMulti16_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6) },
+ Materials.Tungsten.getMolten(144),
+ CustomItemList.eM_energyMulti64_EV.get(1),
+ 400,
+ 480);
+
+ // Energy Hatch IV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_LuV_IV").get(1),
+ CustomItemList.eM_energyMulti16_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Tungsten, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6) },
+ Materials.Tungsten.getMolten(144),
+ CustomItemList.eM_energyMulti64_IV.get(1),
+ 400,
+ 1920);
+
+ // Energy Hatch LuV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1),
+ CustomItemList.eM_energyMulti16_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.VanadiumGallium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 6) },
+ Materials.Tungsten.getMolten(288),
+ CustomItemList.eM_energyMulti64_LuV.get(1),
+ 400,
+ 7680);
+
+ // Energy Hatch ZPM 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UV_ZPM").get(1),
+ CustomItemList.eM_energyMulti16_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6) },
+ Materials.Tungsten.getMolten(576),
+ CustomItemList.eM_energyMulti64_ZPM.get(1),
+ 400,
+ 30720);
+
+ // Energy Hatch UV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UHV_UV").get(1),
+ CustomItemList.eM_energyMulti16_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 6) },
+ Materials.Tungsten.getMolten(1152),
+ CustomItemList.eM_energyMulti64_UV.get(1),
+ 400,
+ 122880);
+
+ // Energy Hatch UHV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UEV_UHV").get(1),
+ CustomItemList.eM_energyMulti16_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6) },
+ Materials.Tungsten.getMolten(2304),
+ CustomItemList.eM_energyMulti64_UHV.get(1),
+ 400,
+ 500000);
+
+ // Energy Hatch UEV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UIV_UEV").get(1),
+ CustomItemList.eM_energyMulti16_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Draconium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 6) },
+ Materials.Tungsten.getMolten(4608),
+ CustomItemList.eM_energyMulti64_UEV.get(1),
+ 400,
+ 2000000);
+
+ // Energy Hatch UIV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UMV_UIV").get(1),
+ CustomItemList.eM_energyMulti16_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NetherStar, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 6) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_energyMulti64_UIV.get(1),
+ 400,
+ 8000000);
+
+ // Energy Hatch UMV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_UXV_UMV").get(1),
+ CustomItemList.eM_energyMulti16_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Quantium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_energyMulti64_UMV.get(1),
+ 400,
+ 32000000);
+
+ // Energy Hatch UXV 64A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_MAX_UXV").get(1),
+ CustomItemList.eM_energyMulti16_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.BlackPlutonium, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 3),
+ GT_OreDictUnificator.get("plateShirabon", 3L) },
+ Materials.Tungsten.getMolten(9216),
+ CustomItemList.eM_energyMulti64_UXV.get(1),
+ 400,
+ (int) TierEU.RECIPE_UMV);
+
+ }
+ }
+
+ // Buck Converter IV-UIV
+ if (BartWorks.isModLoaded()) {
+ // Buck Converter IV
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 2) },
+ Materials.TungstenSteel.getMolten(288),
+ CustomItemList.Machine_BuckConverter_IV.get(1),
+ 100,
+ 7680);
+
+ // Buck Converter LuV
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NiobiumTitanium, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 3) },
+ new FluidStack(FluidRegistry.getFluid("molten.rhodium-plated palladium"), 288),
+ CustomItemList.Machine_BuckConverter_LuV.get(1),
+ 100,
+ 30720);
+
+ // Buck Converter ZPM
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 4) },
+ Materials.Iridium.getMolten(288),
+ CustomItemList.Machine_BuckConverter_ZPM.get(1),
+ 100,
+ 122880);
+
+ // Buck Converter UV
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 5) },
+ Materials.Osmium.getMolten(288),
+ CustomItemList.Machine_BuckConverter_UV.get(1),
+ 100,
+ 500000);
+
+ // Buck Converter UHV
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Infinite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.ElectrumFlux, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 4L, 5) },
+ Materials.Neutronium.getMolten(288),
+ CustomItemList.Machine_BuckConverter_UHV.get(1),
+ 100,
+ 2000000);
+
+ // Buck Converter UEV
+ GT_Values.RA
+ .addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1),
+ getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Bio, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 8L, 5) },
+ getOrDefault("Bedrockium", Materials.Neutronium).getMolten(288),
+ CustomItemList.Machine_BuckConverter_UEV.get(1),
+ 100,
+ 8000000);
+
+ // Buck Converter UIV
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1), getItemContainer("Display").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Optical, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 4),
+ getModItem(BartWorks.ID, "BW_GlasBlocks", 16L, 5) },
+ getOrDefault("BlackPlutonium", Materials.Neutronium).getMolten(288),
+ CustomItemList.Machine_BuckConverter_UIV.get(1),
+ 200,
+ 8000000);
+ }
+
+ // Laser Dynamo
+ {
+ // Laser Dynamo IV-UXV 256/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_IV.get(1),
+ ItemList.Electric_Pump_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_IV.get(1),
+ 1000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_LuV.get(1),
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_LuV.get(1),
+ 1000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_ZPM.get(1),
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_ZPM.get(1),
+ 1000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UV.get(1),
+ ItemList.Electric_Pump_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NaquadahAlloy, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UV.get(1),
+ 1000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UHV.get(1),
+ ItemList.Electric_Pump_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Bedrockium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UHV.get(1),
+ 1000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UEV.get(1),
+ ItemList.Electric_Pump_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Draconium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UEV.get(1),
+ 1000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UIV.get(1),
+ ItemList.Electric_Pump_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NetherStar, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UIV.get(1),
+ 1000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UMV.get(1),
+ ItemList.Electric_Pump_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Quantium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UMV.get(1),
+ 1000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UXV.get(1),
+ ItemList.Electric_Pump_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.BlackPlutonium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_dynamoTunnel1_UXV.get(1),
+ 1000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 1024/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_IV.get(2),
+ ItemList.Electric_Pump_IV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_IV.get(1),
+ 2000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_LuV.get(2),
+ ItemList.Electric_Pump_LuV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.VanadiumGallium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_LuV.get(1),
+ 2000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_ZPM.get(2),
+ ItemList.Electric_Pump_ZPM.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Naquadah, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_ZPM.get(1),
+ 2000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UV.get(2),
+ ItemList.Electric_Pump_UV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NaquadahAlloy, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UV.get(1),
+ 2000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UHV.get(2),
+ ItemList.Electric_Pump_UHV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Bedrockium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UHV.get(1),
+ 2000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UEV.get(2),
+ ItemList.Electric_Pump_UEV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Draconium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UEV.get(1),
+ 2000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UIV.get(2),
+ ItemList.Electric_Pump_UIV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NetherStar, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UIV.get(1),
+ 2000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UMV.get(2),
+ ItemList.Electric_Pump_UMV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Quantium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UMV.get(1),
+ 2000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UXV.get(2),
+ ItemList.Electric_Pump_UXV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.BlackPlutonium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_dynamoTunnel2_UXV.get(1),
+ 2000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 4096/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_IV.get(4),
+ ItemList.Electric_Pump_IV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_IV.get(1),
+ 4000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_LuV.get(4),
+ ItemList.Electric_Pump_LuV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_LuV.get(1),
+ 4000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_ZPM.get(4),
+ ItemList.Electric_Pump_ZPM.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_ZPM.get(1),
+ 4000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UV.get(4),
+ ItemList.Electric_Pump_UV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UV.get(1),
+ 4000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UHV.get(4),
+ ItemList.Electric_Pump_UHV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UHV.get(1),
+ 4000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UEV.get(4),
+ ItemList.Electric_Pump_UEV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UEV.get(1),
+ 4000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UIV.get(4),
+ ItemList.Electric_Pump_UIV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UIV.get(1),
+ 4000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UMV.get(4),
+ ItemList.Electric_Pump_UMV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UMV.get(1),
+ 4000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UXV.get(4),
+ ItemList.Electric_Pump_UXV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_dynamoTunnel3_UXV.get(1),
+ 4000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 16384/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_IV.get(8),
+ ItemList.Electric_Pump_IV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_IV.get(1),
+ 8000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_LuV.get(8),
+ ItemList.Electric_Pump_LuV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_LuV.get(1),
+ 8000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_ZPM.get(8),
+ ItemList.Electric_Pump_ZPM.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_ZPM.get(1),
+ 8000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UV.get(8),
+ ItemList.Electric_Pump_UV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UV.get(1),
+ 8000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UHV.get(8),
+ ItemList.Electric_Pump_UHV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UHV.get(1),
+ 8000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UEV.get(8),
+ ItemList.Electric_Pump_UEV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UEV.get(1),
+ 8000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UIV.get(8),
+ ItemList.Electric_Pump_UIV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UIV.get(1),
+ 8000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UMV.get(8),
+ ItemList.Electric_Pump_UMV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UMV.get(1),
+ 8000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UXV.get(8),
+ ItemList.Electric_Pump_UXV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_dynamoTunnel4_UXV.get(1),
+ 8000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 65536/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_IV.get(16),
+ ItemList.Electric_Pump_IV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_IV.get(1),
+ 16000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_LuV.get(16),
+ ItemList.Electric_Pump_LuV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_LuV.get(1),
+ 16000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_ZPM.get(16),
+ ItemList.Electric_Pump_ZPM.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_ZPM.get(1),
+ 16000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UV.get(16),
+ ItemList.Electric_Pump_UV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UV.get(1),
+ 16000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UHV.get(16),
+ ItemList.Electric_Pump_UHV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UHV.get(1),
+ 16000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UEV.get(16),
+ ItemList.Electric_Pump_UEV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UEV.get(1),
+ 16000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UIV.get(16),
+ ItemList.Electric_Pump_UIV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UIV.get(1),
+ 16000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UMV.get(16),
+ ItemList.Electric_Pump_UMV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UMV.get(1),
+ 16000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UXV.get(16),
+ ItemList.Electric_Pump_UXV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_dynamoTunnel5_UXV.get(1),
+ 16000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 262144/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_IV.get(32),
+ ItemList.Electric_Pump_IV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_IV.get(1),
+ 32000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_LuV.get(32),
+ ItemList.Electric_Pump_LuV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_LuV.get(1),
+ 32000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_ZPM.get(32),
+ ItemList.Electric_Pump_ZPM.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_ZPM.get(1),
+ 32000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UV.get(32),
+ ItemList.Electric_Pump_UV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UV.get(1),
+ 32000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UHV.get(32),
+ ItemList.Electric_Pump_UHV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UHV.get(1),
+ 32000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UEV.get(32),
+ ItemList.Electric_Pump_UEV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UEV.get(1),
+ 32000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UIV.get(32),
+ ItemList.Electric_Pump_UIV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UIV.get(1),
+ 32000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UMV.get(32),
+ ItemList.Electric_Pump_UMV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UMV.get(1),
+ 32000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UXV.get(32),
+ ItemList.Electric_Pump_UXV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_dynamoTunnel6_UXV.get(1),
+ 32000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Dynamo IV-UXV 1048576/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_IV.get(64),
+ ItemList.Electric_Pump_IV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_IV.get(1),
+ 64000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_LuV.get(64),
+ ItemList.Electric_Pump_LuV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.VanadiumGallium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_LuV.get(1),
+ 64000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_ZPM.get(64),
+ ItemList.Electric_Pump_ZPM.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_ZPM.get(1),
+ 64000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UV.get(64),
+ ItemList.Electric_Pump_UV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NaquadahAlloy, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UV.get(1),
+ 64000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UHV.get(64),
+ ItemList.Electric_Pump_UHV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UHV.get(1),
+ 64000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UEV.get(64),
+ ItemList.Electric_Pump_UEV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UEV.get(1),
+ 64000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UIV.get(64),
+ ItemList.Electric_Pump_UIV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NetherStar, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UIV.get(1),
+ 64000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UMV.get(64),
+ ItemList.Electric_Pump_UMV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Quantium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UMV.get(1),
+ 64000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UXV.get(64),
+ ItemList.Electric_Pump_UXV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.BlackPlutonium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_dynamoTunnel7_UXV.get(1),
+ 64000,
+ (int) TierEU.RECIPE_UXV);
+ }
+ }
+
+ // Laser Target
+ {
+ // Laser Target IV-UXV 256/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_IV.get(1),
+ ItemList.Electric_Pump_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_IV.get(1),
+ 1000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_LuV.get(1),
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_LuV.get(1),
+ 1000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_ZPM.get(1),
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_ZPM.get(1),
+ 1000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UV.get(1),
+ ItemList.Electric_Pump_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NaquadahAlloy, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UV.get(1),
+ 1000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UHV.get(1),
+ ItemList.Electric_Pump_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Bedrockium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UHV.get(1),
+ 1000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UEV.get(1),
+ ItemList.Electric_Pump_UEV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Draconium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UEV.get(1),
+ 1000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UIV.get(1),
+ ItemList.Electric_Pump_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NetherStar, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UIV.get(1),
+ 1000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UMV.get(1),
+ ItemList.Electric_Pump_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Quantium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UMV.get(1),
+ 1000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UXV.get(1),
+ ItemList.Electric_Pump_UXV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.BlackPlutonium, 2),
+ GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.eM_energyTunnel1_UXV.get(1),
+ 1000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 1024/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_IV.get(2),
+ ItemList.Electric_Pump_IV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_IV.get(1),
+ 2000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_LuV.get(2),
+ ItemList.Electric_Pump_LuV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.VanadiumGallium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_LuV.get(1),
+ 2000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_ZPM.get(2),
+ ItemList.Electric_Pump_ZPM.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Naquadah, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_ZPM.get(1),
+ 2000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UV.get(2),
+ ItemList.Electric_Pump_UV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NaquadahAlloy, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UV.get(1),
+ 2000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UHV.get(2),
+ ItemList.Electric_Pump_UHV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Bedrockium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UHV.get(1),
+ 2000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UEV.get(2),
+ ItemList.Electric_Pump_UEV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Draconium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UEV.get(1),
+ 2000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UIV.get(2),
+ ItemList.Electric_Pump_UIV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NetherStar, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UIV.get(1),
+ 2000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UMV.get(2),
+ ItemList.Electric_Pump_UMV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Quantium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UMV.get(1),
+ 2000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UXV.get(2),
+ ItemList.Electric_Pump_UXV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.BlackPlutonium, 4),
+ GT_Utility.getIntegratedCircuit(2) },
+ null,
+ CustomItemList.eM_energyTunnel2_UXV.get(1),
+ 2000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 4096/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_IV.get(4),
+ ItemList.Electric_Pump_IV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_IV.get(1),
+ 4000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_LuV.get(4),
+ ItemList.Electric_Pump_LuV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_LuV.get(1),
+ 4000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_ZPM.get(4),
+ ItemList.Electric_Pump_ZPM.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_ZPM.get(1),
+ 4000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UV.get(4),
+ ItemList.Electric_Pump_UV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UV.get(1),
+ 4000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UHV.get(4),
+ ItemList.Electric_Pump_UHV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UHV.get(1),
+ 4000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UEV.get(4),
+ ItemList.Electric_Pump_UEV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UEV.get(1),
+ 4000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UIV.get(4),
+ ItemList.Electric_Pump_UIV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UIV.get(1),
+ 4000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UMV.get(4),
+ ItemList.Electric_Pump_UMV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UMV.get(1),
+ 4000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UXV.get(4),
+ ItemList.Electric_Pump_UXV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 4),
+ GT_Utility.getIntegratedCircuit(3) },
+ null,
+ CustomItemList.eM_energyTunnel3_UXV.get(1),
+ 4000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 16384/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_IV.get(8),
+ ItemList.Electric_Pump_IV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_IV.get(1),
+ 8000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_LuV.get(8),
+ ItemList.Electric_Pump_LuV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_LuV.get(1),
+ 8000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_ZPM.get(8),
+ ItemList.Electric_Pump_ZPM.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_ZPM.get(1),
+ 8000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UV.get(8),
+ ItemList.Electric_Pump_UV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UV.get(1),
+ 8000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UHV.get(8),
+ ItemList.Electric_Pump_UHV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UHV.get(1),
+ 8000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UEV.get(8),
+ ItemList.Electric_Pump_UEV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UEV.get(1),
+ 8000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UIV.get(8),
+ ItemList.Electric_Pump_UIV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UIV.get(1),
+ 8000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UMV.get(8),
+ ItemList.Electric_Pump_UMV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UMV.get(1),
+ 8000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UXV.get(8),
+ ItemList.Electric_Pump_UXV.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 8),
+ GT_Utility.getIntegratedCircuit(4) },
+ null,
+ CustomItemList.eM_energyTunnel4_UXV.get(1),
+ 8000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 65536/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_IV.get(16),
+ ItemList.Electric_Pump_IV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_IV.get(1),
+ 16000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_LuV.get(16),
+ ItemList.Electric_Pump_LuV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_LuV.get(1),
+ 16000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_ZPM.get(16),
+ ItemList.Electric_Pump_ZPM.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_ZPM.get(1),
+ 16000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UV.get(16),
+ ItemList.Electric_Pump_UV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UV.get(1),
+ 16000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UHV.get(16),
+ ItemList.Electric_Pump_UHV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UHV.get(1),
+ 16000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UEV.get(16),
+ ItemList.Electric_Pump_UEV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UEV.get(1),
+ 16000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UIV.get(16),
+ ItemList.Electric_Pump_UIV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UIV.get(1),
+ 16000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UMV.get(16),
+ ItemList.Electric_Pump_UMV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UMV.get(1),
+ 16000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UXV.get(16),
+ ItemList.Electric_Pump_UXV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 8),
+ GT_Utility.getIntegratedCircuit(5) },
+ null,
+ CustomItemList.eM_energyTunnel5_UXV.get(1),
+ 16000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 262144/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_IV.get(32),
+ ItemList.Electric_Pump_IV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_IV.get(1),
+ 32000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_LuV.get(32),
+ ItemList.Electric_Pump_LuV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_LuV.get(1),
+ 32000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_ZPM.get(32),
+ ItemList.Electric_Pump_ZPM.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_ZPM.get(1),
+ 32000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UV.get(32),
+ ItemList.Electric_Pump_UV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UV.get(1),
+ 32000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UHV.get(32),
+ ItemList.Electric_Pump_UHV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UHV.get(1),
+ 32000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UEV.get(32),
+ ItemList.Electric_Pump_UEV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UEV.get(1),
+ 32000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UIV.get(32),
+ ItemList.Electric_Pump_UIV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UIV.get(1),
+ 32000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UMV.get(32),
+ ItemList.Electric_Pump_UMV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UMV.get(1),
+ 32000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UXV.get(32),
+ ItemList.Electric_Pump_UXV.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 16),
+ GT_Utility.getIntegratedCircuit(6) },
+ null,
+ CustomItemList.eM_energyTunnel6_UXV.get(1),
+ 32000,
+ (int) TierEU.RECIPE_UXV);
+ }
+
+ // Laser Target IV-UXV 1048576/t
+ {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_IV.get(64),
+ ItemList.Electric_Pump_IV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_IV.get(1),
+ 64000,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_LuV.get(64),
+ ItemList.Electric_Pump_LuV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.VanadiumGallium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_LuV.get(1),
+ 64000,
+ 30720);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_ZPM.get(64),
+ ItemList.Electric_Pump_ZPM.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_ZPM.get(1),
+ 64000,
+ 122880);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UV.get(64),
+ ItemList.Electric_Pump_UV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NaquadahAlloy, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UV.get(1),
+ 64000,
+ 500000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UHV.get(64),
+ ItemList.Electric_Pump_UHV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UHV.get(1),
+ 64000,
+ 2000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UEV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UEV.get(64),
+ ItemList.Electric_Pump_UEV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UEV.get(1),
+ 64000,
+ 8000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UIV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UIV.get(64),
+ ItemList.Electric_Pump_UIV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NetherStar, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UIV.get(1),
+ 64000,
+ 32000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UMV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UMV.get(64),
+ ItemList.Electric_Pump_UMV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Quantium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UMV.get(1),
+ 64000,
+ 128000000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("Hull_UXV").get(1),
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UXV.get(64),
+ ItemList.Electric_Pump_UXV.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.BlackPlutonium, 16),
+ GT_Utility.getIntegratedCircuit(7) },
+ null,
+ CustomItemList.eM_energyTunnel7_UXV.get(1),
+ 64000,
+ (int) TierEU.RECIPE_UXV);
+ }
+ }
+
+ // Tesla Capacitor
+ {
+ // LV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 8), },
+ Materials.Epoxid.getMolten(72),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 0),
+ 320,
+ 30);
+ // MV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 6),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 12),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 12), },
+ Materials.Epoxid.getMolten(144),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 1),
+ 320,
+ 120);
+ // HV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 8),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 16),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 16), },
+ Materials.Epoxid.getMolten(216),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 2),
+ 320,
+ 480);
+ // EV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 10),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 20),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 20), },
+ Materials.Epoxid.getMolten(288),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 3),
+ 320,
+ 1920);
+ // IV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 12),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 24),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 24), },
+ Materials.Epoxid.getMolten(360),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 4),
+ 320,
+ 7680);
+ // LuV Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.HSSG, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 14),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 28),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 28), },
+ Materials.Epoxid.getMolten(432),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 5),
+ 320,
+ 30720);
+ // ZPM Tesla Capacitor
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 16),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 32),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 32), },
+ Materials.Epoxid.getMolten(504),
+ CustomItemList.teslaCapacitor.getWithDamage(1, 6),
+ 320,
+ 122880);
+ }
+
+ // Tesla Cover
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.Lead.getMolten(288),
+ CustomItemList.teslaCover.getWithDamage(1, 0),
+ 320,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.Tin.getMolten(144),
+ CustomItemList.teslaCover.getWithDamage(1, 0),
+ 320,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.SolderingAlloy.getMolten(72),
+ CustomItemList.teslaCover.getWithDamage(1, 0),
+ 320,
+ 480);
+ // Ultimate Tesla Cover
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.Lead.getMolten(288),
+ CustomItemList.teslaCover.getWithDamage(1, 1),
+ 320,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.Tin.getMolten(144),
+ CustomItemList.teslaCover.getWithDamage(1, 1),
+ 320,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), },
+ Materials.SolderingAlloy.getMolten(72),
+ CustomItemList.teslaCover.getWithDamage(1, 1),
+ 320,
+ 7680);
+
+ // Ender Fluid Link Cover
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 4),
+ ItemList.Sensor_LuV.get(1), ItemList.Emitter_LuV.get(1), ItemList.Electric_Pump_LuV.get(1), },
+ getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome).getMolten(288),
+ CustomItemList.enderLinkFluidCover.getWithDamage(1, 0),
+ 320,
+ 30720);
+
+ // Power Pass Upgrade Cover
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1), GT_Utility.getIntegratedCircuit(1) },
+ null,
+ CustomItemList.powerPassUpgradeCover.getWithDamage(1, 0),
+ 320,
+ 30720);
+
+ // Tesla Winding Components
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 32),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NickelZincFerrite, 8), },
+ Materials.Epoxid.getMolten(288),
+ CustomItemList.teslaComponent.getWithDamage(1, 0),
+ 320,
+ 30);
+
+ // Tesla Winding Components Ultimate (ADD BLOOD VARIANT)
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 4),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NickelZincFerrite, 8), },
+ Materials.Epoxid.getMolten(576),
+ CustomItemList.teslaComponent.getWithDamage(1, 1),
+ 320,
+ 7680);
+
+ // Tesla Transceiver LV 1A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_1by1_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_1by1_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_1by1_LV.get(1),
+ 400,
+ 30);
+ // Tesla Transceiver MV 1A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_1by1_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_1by1_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_1by1_MV.get(1),
+ 400,
+ 120);
+ // Tesla Transceiver HV 1A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_1by1_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_1by1_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_1by1_HV.get(1),
+ 400,
+ 480);
+ // Tesla Transceiver EV 1A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_1by1_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_1by1_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_1by1_EV.get(1),
+ 400,
+ 1920);
+ // Tesla Transceiver IV 1A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_1by1_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_1by1_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_1by1_IV.get(1),
+ 400,
+ 7680);
+ // Tesla Transceiver LV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_2by2_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_2by2_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_2by2_LV.get(1),
+ 400,
+ 30);
+ // Tesla Transceiver MV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_2by2_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_2by2_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_2by2_MV.get(1),
+ 400,
+ 120);
+ // Tesla Transceiver HV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_2by2_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_2by2_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_2by2_HV.get(1),
+ 400,
+ 480);
+ // Tesla Transceiver EV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_2by2_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_2by2_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_2by2_EV.get(1),
+ 400,
+ 1920);
+ // Tesla Transceiver IV 4A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_2by2_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_2by2_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_2by2_IV.get(1),
+ 400,
+ 7680);
+ // Tesla Transceiver LV 9A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_3by3_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_3by3_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_3by3_LV.get(1),
+ 400,
+ 30);
+ // Tesla Transceiver MV 9A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_3by3_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_3by3_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_3by3_MV.get(1),
+ 400,
+ 120);
+ // Tesla Transceiver HV 9A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_3by3_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_3by3_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_3by3_HV.get(1),
+ 400,
+ 480);
+ // Tesla Transceiver EV 9A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_3by3_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_3by3_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_3by3_EV.get(1),
+ 400,
+ 1920);
+ // Tesla Transceiver IV 9A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_3by3_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_3by3_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_3by3_IV.get(1),
+ 400,
+ 7680);
+ // Tesla Transceiver LV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_4by4_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_4by4_LV.get(1),
+ 400,
+ 30);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_4by4_LV.get(1),
+ 400,
+ 30);
+ // Tesla Transceiver MV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_4by4_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_4by4_MV.get(1),
+ 400,
+ 120);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_4by4_MV.get(1),
+ 400,
+ 120);
+ // Tesla Transceiver HV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_4by4_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_4by4_HV.get(1),
+ 400,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_4by4_HV.get(1),
+ 400,
+ 480);
+ // Tesla Transceiver EV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_4by4_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_4by4_EV.get(1),
+ 400,
+ 1920);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_4by4_EV.get(1),
+ 400,
+ 1920);
+ // Tesla Transceiver IV 16A
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Lead.getMolten(576),
+ CustomItemList.Machine_TeslaCoil_4by4_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.Tin.getMolten(288),
+ CustomItemList.Machine_TeslaCoil_4by4_IV.get(1),
+ 400,
+ 7680);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) },
+ Materials.SolderingAlloy.getMolten(144),
+ CustomItemList.Machine_TeslaCoil_4by4_IV.get(1),
+ 400,
+ 7680);
+
+ // Tesla Tower
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_ModHandler.getIC2Item("teslaCoil", 1), CustomItemList.tM_TeslaSecondary.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 4),
+ ItemList.Upgrade_Overclocker.get(4), },
+ Materials.Silver.getMolten(576),
+ CustomItemList.Machine_Multi_TeslaCoil.get(1),
+ 800,
+ 480);
+
+ // Microwave Grinder
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Machine_HV_Microwave.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.AnnealedCopper, 16),
+ ItemList.Upgrade_Overclocker.get(4), },
+ Materials.Copper.getMolten(576),
+ CustomItemList.Machine_Multi_Microwave.get(1),
+ 800,
+ 480);
+
+ // Active Transformer
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1),
+ getItemContainer("HighEnergyFlowCircuit").get(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireGt01, getOrDefault("SuperconductorLuV", Materials.SuperconductorUHV), 16),
+ ItemList.valueOf("Circuit_Chip_UHPIC")
+ .get(2), },
+ Materials.TungstenSteel.getMolten(576),
+ CustomItemList.Machine_Multi_Transformer.get(1),
+ 400,
+ 30720);
+
+ // Network Switch
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 64), CustomItemList.DATApipe.get(4), },
+ Materials.Iridium.getMolten(1296),
+ CustomItemList.Machine_Multi_Switch.get(1),
+ 800,
+ 122880);
+
+ }
+
+ public void cleanroomRecipes() {
+ // Data
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { ItemList.Circuit_Parts_GlassFiber.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silver, 8) },
+ Materials.Polytetrafluoroethylene.getMolten(144),
+ CustomItemList.DATApipe.get(1),
+ 200,
+ 30720);
+
+ // Data Casing
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.DATApipe.get(1), ItemList.Casing_LuV.get(1) },
+ null,
+ CustomItemList.DATApipeBlock.get(1),
+ 20,
+ 30720);
+
+ // Laser
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.DATApipe.get(1), GT_ModHandler.getIC2Item("reinforcedGlass", 1L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Osmiridium, 2) },
+ null,
+ CustomItemList.LASERpipe.get(1),
+ 100,
+ 500000);
+
+ // Laser Casing
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.LASERpipe.get(1), ItemList.Casing_LuV.get(1) },
+ null,
+ CustomItemList.LASERpipeBlock.get(1),
+ 20,
+ 30720);
+
+ // Advanced Computer Casing
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 64),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireGt02, getOrDefault("SuperconductorLuV", Materials.SuperconductorUHV), 4) },
+ Materials.Iridium.getMolten(1296),
+ CustomItemList.eM_Computer_Bus.get(1),
+ 200,
+ 122880);
+
+ // Data Input
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), ItemList.Hatch_Input_Bus_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1), CustomItemList.DATApipe.get(2) },
+ Materials.Iridium.getMolten(1296),
+ CustomItemList.dataIn_Hatch.get(1),
+ 200,
+ 122880);
+
+ // Data Output
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), ItemList.Hatch_Output_Bus_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1), CustomItemList.DATApipe.get(2) },
+ Materials.Iridium.getMolten(1296),
+ CustomItemList.dataOut_Hatch.get(1),
+ 200,
+ 122880);
+
+ // Rack
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Bus.get(1), ItemList.Hatch_Input_Bus_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), CustomItemList.DATApipe.get(4) },
+ Materials.Iridium.getMolten(1296),
+ CustomItemList.rack_Hatch.get(1),
+ 800,
+ 122880);
+
+ // Uncertainty
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1), CustomItemList.DATApipe.get(16),
+ ItemList.Cover_Screen.get(1), new ItemStack(Blocks.stone_button, 16),
+ GT_Utility.getIntegratedCircuit(4), },
+ Materials.Iridium.getMolten(2592),
+ CustomItemList.Uncertainty_Hatch.get(1),
+ 1200,
+ 122880);
+
+ // Uncertainty X
+ addAssemblerRecipeWithCleanroom(
+ new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Bio, 1), CustomItemList.DATApipe.get(32),
+ ItemList.Cover_Screen.get(1), new ItemStack(Blocks.stone_button, 16),
+ GT_Utility.getIntegratedCircuit(5), },
+ Materials.Iridium.getMolten(2592),
+ CustomItemList.UncertaintyX_Hatch.get(1),
+ 1200,
+ 122880);
+
+ // Capacitor Hatch
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_Bus_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Gold, 4), },
+ Materials.Silver.getMolten(576),
+ CustomItemList.capacitor_Hatch.get(1),
+ 800,
+ 480);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Output_Bus_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Gold, 4), },
+ Materials.Silver.getMolten(576),
+ CustomItemList.capacitor_Hatch.get(1),
+ 800,
+ 480);
+
+ }
+
+ private void addAssemblerRecipeWithCleanroom(ItemStack[] items, FluidStack fluid, ItemStack output, int time,
+ int eut) {
+ GT_Values.RA.addAssemblerRecipe(items, fluid, output, time, eut, true);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java b/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java
new file mode 100644
index 0000000000..cd8ea21b51
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java
@@ -0,0 +1,128 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer;
+import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getOrDefault;
+import static gregtech.api.enums.GT_Values.RA;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+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 AssemblyLine implements Runnable {
+
+ @Override
+ public void run() {
+ // Data Bank
+ RA.addAssemblylineRecipe(
+ ItemList.Hatch_DataAccess_EV.get(1),
+ 20000,
+ new Object[] { CustomItemList.Machine_Multi_Switch.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 }, ItemList.Tool_DataOrb.get(1),
+ ItemList.Cover_Screen.get(1), },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000),
+ Materials.Hydrogen.getGas(1000), },
+ CustomItemList.Machine_Multi_DataBank.get(1),
+ 12000,
+ 14000);
+
+ // Hollow Casing
+ GT_Values.RA.addAssemblylineRecipe(
+ CustomItemList.eM_Containment.get(1),
+ 7500,
+ new ItemStack[] { CustomItemList.eM_Containment.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Europium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.Plutonium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Lead, 8),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Uranium, 16),
+ GT_OreDictUnificator.get(OrePrefixes.screw, getOrDefault("Quantium", Materials.Europium), 16), },
+ new FluidStack[] { getOrDefault("Trinium", Materials.Osmium).getMolten(1296),
+ Materials.Osmium.getMolten(1296), new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000),
+ Materials.Argon.getGas(1000), },
+ CustomItemList.eM_Hollow.get(2),
+ 200,
+ 200000);
+
+ // EM Coil
+ GT_Values.RA.addAssemblylineRecipe(
+ CustomItemList.eM_Hollow.get(1),
+ 7500,
+ new ItemStack[] { CustomItemList.eM_Hollow.get(1), ItemList.Casing_Fusion_Coil.get(2),
+ ItemList.Casing_Coil_NaquadahAlloy.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Europium, 64), },
+ new FluidStack[] { Materials.Glass.getMolten(2304), Materials.Silicone.getMolten(1872),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000),
+ getOrDefault("Trinium", Materials.Osmium).getMolten(1296), },
+ CustomItemList.eM_Coil.get(4),
+ 800,
+ 200000);
+
+ // Object Holder
+ GT_Values.RA.addAssemblylineRecipe(
+ ItemList.Hatch_Input_Bus_ZPM.get(1),
+ 10000,
+ new Object[] { ItemList.Hatch_Input_Bus_ZPM.get(1), CustomItemList.eM_Computer_Bus.get(1),
+ ItemList.Emitter_ZPM.get(8), ItemList.Robot_Arm_ZPM.get(1), ItemList.Electric_Motor_ZPM.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.Naquadah, 2) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Naquadah, 16) },
+ CustomItemList.DATApipe.get(2), },
+ new FluidStack[] { Materials.UUMatter.getFluid(500), Materials.Iridium.getMolten(1296),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 1000) },
+ CustomItemList.holder_Hatch.get(1),
+ 1200,
+ 100000);
+
+ // Quantum Computer
+ GT_Values.RA.addAssemblylineRecipe(
+ ItemList.Tool_DataOrb.get(1),
+ 20000,
+ new Object[] { CustomItemList.Machine_Multi_Switch.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2 }, ItemList.Tool_DataOrb.get(1),
+ ItemList.Cover_Screen.get(1),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 8) },
+ CustomItemList.DATApipe.get(8), },
+ new FluidStack[] { Materials.UUMatter.getFluid(1000), Materials.Iridium.getMolten(1296),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), Materials.Hydrogen.getGas(1000), },
+ CustomItemList.Machine_Multi_Computer.get(1),
+ 12000,
+ 100000);
+
+ // Research Station
+ GT_Values.RA.addAssemblylineRecipe(
+ getItemContainer("ScannerZPM").get(1),
+ 80000,
+ new Object[] { CustomItemList.Machine_Multi_Switch.get(1), ItemList.Sensor_ZPM.get(8),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 },
+ ItemList.Field_Generator_ZPM.get(1), ItemList.Electric_Motor_ZPM.get(2),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.Naquadah, 4) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Naquadah, 32) },
+ CustomItemList.DATApipe.get(16), },
+ new FluidStack[] { Materials.UUMatter.getFluid(1000), Materials.Iridium.getMolten(1296),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), Materials.Osmium.getMolten(1296), },
+ CustomItemList.Machine_Multi_Research.get(1),
+ 12000,
+ 100000);
+
+ // Multi Infuser
+ GT_Values.RA.addAssemblylineRecipe(
+ CustomItemList.Machine_Multi_Transformer.get(1),
+ 7500,
+ new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1), CustomItemList.eM_Coil.get(8),
+ CustomItemList.eM_Power.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.NeodymiumMagnetic, 16), },
+ new FluidStack[] { Materials.Electrum.getMolten(2592), Materials.Europium.getMolten(1872),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), },
+ CustomItemList.Machine_Multi_Infuser.get(1),
+ 8000,
+ 200000);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java b/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java
new file mode 100644
index 0000000000..3c75b38465
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java
@@ -0,0 +1,49 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static com.github.technus.tectech.TecTech.LOGGER;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.IItemContainer;
+
+/**
+ * Created by danie_000 on 16.11.2016.
+ */
+public class BaseRecipeLoader {
+
+ @SuppressWarnings("rawtypes")
+ private static Class CUSTOM_ITEM_LIST;
+
+ static {
+ try {
+ CUSTOM_ITEM_LIST = Class.forName("com.dreammaster.gthandler.CustomItemList");
+ } catch (Exception e) {
+ LOGGER.error("NHCoreMod not present. Disabling all the recipes");
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static IItemContainer getItemContainer(String name) {
+ // must never be called before the try catch block is ran
+ return (IItemContainer) Enum.valueOf(CUSTOM_ITEM_LIST, name);
+ }
+
+ public static Materials getOrDefault(String name, Materials def) {
+ Materials mat = Materials.get(name);
+ return mat == Materials._NULL || mat == null ? def : mat;
+ }
+
+ public void run() {
+ // todo: Move those recipes in NHCore
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ new Assembler().run();
+ new AssemblyLine().run();
+ new CircuitAssembler().run();
+ new Crafting().run();
+ new Extractor().run();
+ new ResearchStationAssemblyLine().run();
+ } else {
+ new Godforge().run();
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java b/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java
new file mode 100644
index 0000000000..ff6f4694ce
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java
@@ -0,0 +1,46 @@
+package com.github.technus.tectech.loader.recipe;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+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 CircuitAssembler implements Runnable {
+
+ @Override
+ public void run() {
+ Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ // Optical Processor
+ GT_Values.RA.addCircuitAssemblerRecipe(
+ new ItemStack[] { ItemList.Optically_Perfected_CPU.get(1L), ItemList.Optically_Compatible_Memory.get(2L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(16L),
+ CustomItemList.DATApipe.get(4L),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.EnrichedHolmium, 16) },
+ new FluidStack(solderUEV, 288),
+ ItemList.Circuit_OpticalProcessor.get(1L),
+ 20 * 20,
+ 614400,
+ true);
+
+ // Parametrizer Memory Card
+ GT_Values.RA.addCircuitAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, 4), },
+ Materials.Plastic.getMolten(72),
+ CustomItemList.parametrizerMemory.get(1),
+ 200,
+ 480,
+ true);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java b/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java
new file mode 100644
index 0000000000..73afec47ff
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java
@@ -0,0 +1,57 @@
+package com.github.technus.tectech.loader.recipe;
+
+import net.minecraft.item.ItemStack;
+
+import com.github.technus.tectech.thing.CustomItemList;
+import com.github.technus.tectech.thing.item.EuMeterGT;
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+
+public class Crafting implements Runnable {
+
+ @Override
+ public void run() {
+
+ // Front Rotation Tool
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getModItem(StructureLibAPI.MOD_ID, "item.structurelib.frontRotationTool", 1L, 0),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "fPR", " RP", "S h", 'P', OrePrefixes.plate.get(Materials.Cobalt), 'R',
+ OrePrefixes.stick.get(Materials.Cobalt), 'S', OrePrefixes.stick.get(Materials.Wood), });
+
+ // GT EU reader
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(EuMeterGT.INSTANCE, 1),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PGW", "SCW", "BRN", 'P', OrePrefixes.plateDouble.get(Materials.Steel), 'G',
+ OrePrefixes.plate.get(Materials.Glass), 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'S',
+ OrePrefixes.stick.get(Materials.Brass), 'C', ItemList.Casing_Coil_Cupronickel.get(1), 'B', Dyes.dyeBlue,
+ 'R', Dyes.dyeRed, 'N', Dyes.dyeBlack, });
+
+ // Owner detector
+ GT_ModHandler.addCraftingRecipe(
+ CustomItemList.Machine_OwnerDetector.get(1),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PPP", "GEG", "PPP", 'P', OrePrefixes.plate.get(Materials.IronMagnetic), 'G',
+ OrePrefixes.plate.get(Materials.Glass), 'E', OrePrefixes.gem.get(Materials.EnderPearl) });
+
+ // Tesla Base
+ GT_ModHandler.addCraftingRecipe(
+ CustomItemList.tM_TeslaBase.get(1),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.plate.get(Materials.NickelZincFerrite), 'F',
+ OrePrefixes.frameGt.get(Materials.NickelZincFerrite) });
+
+ // Tesla Toroid
+ GT_ModHandler.addCraftingRecipe(
+ CustomItemList.tM_TeslaToroid.get(1),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.foil.get(Materials.Aluminium), 'F',
+ OrePrefixes.frameGt.get(Materials.Aluminium) });
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java b/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java
new file mode 100644
index 0000000000..4ec2b55122
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java
@@ -0,0 +1,57 @@
+package com.github.technus.tectech.loader.recipe;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class Extractor implements Runnable {
+
+ @Override
+ public void run() {
+ // LV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 0),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 4),
+ 300,
+ 2);
+ // MV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 1),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 6),
+ 300,
+ 2);
+ // HV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 2),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 8),
+ 300,
+ 2);
+ // EV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 3),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 10),
+ 300,
+ 2);
+ // IV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 4),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 12),
+ 300,
+ 2);
+ // LuV Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 5),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 14),
+ 300,
+ 2);
+ // ZPM Tesla Capacitor
+ GT_Values.RA.addExtractorRecipe(
+ CustomItemList.teslaCapacitor.getWithDamage(1, 6),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 16),
+ 300,
+ 2);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java
new file mode 100644
index 0000000000..4df4e4f209
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java
@@ -0,0 +1,563 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.material.ELEMENT;
+
+public class Godforge implements Runnable {
+
+ public static final ArrayList<Materials> plasmaGTMaterialList = new ArrayList<>();
+ public static final ArrayList<Integer> plasmaGTWeightList = new ArrayList<>();
+ public static final HashMap<ItemStack, Integer> exoticModulePlasmaItemMap = new HashMap<>();
+ public static final HashMap<FluidStack, Integer> exoticModulePlasmaFluidMap = new HashMap<>();
+ public static final HashMap<ItemStack, Integer> exoticModuleMagmatterItemMap = new HashMap<>();
+ public static final List<ItemStack> quarkGluonFluidItemsForNEI = new ArrayList<>();
+ public static final List<ItemStack> quarkGluonItemsForNEI = new ArrayList<>();
+ public static final List<ItemStack> magmatterTimeFluidItemsForNEI = new ArrayList<>();
+ public static final List<ItemStack> magmatterSpaceFluidItemsForNEI = new ArrayList<>();
+ public static final List<ItemStack> magmatterItemsForNEI = new ArrayList<>();
+
+ @Override
+ public void run() {
+
+ if (GTPlusPlus.isModLoaded()) {
+ // Solid to plasma recipes
+ {
+ // Fusion tier 1-3
+ {
+ // Single step
+ ItemStack[] solids_t0_1step = { Materials.Aluminium.getDust(1), Materials.Iron.getDust(1),
+ Materials.Calcium.getDust(1), Materials.Sulfur.getDust(1), Materials.Zinc.getDust(1),
+ Materials.Niobium.getDust(1), Materials.Tin.getDust(1), Materials.Titanium.getDust(1),
+ Materials.Nickel.getDust(1), Materials.Silver.getDust(1), Materials.Americium.getDust(1),
+ Materials.Antimony.getDust(1), Materials.Ardite.getDust(1), Materials.Arsenic.getDust(1),
+ Materials.Barium.getDust(1), Materials.Beryllium.getDust(1), Materials.Caesium.getDust(1),
+ Materials.Cadmium.getDust(1), Materials.Carbon.getDust(1), Materials.Cerium.getDust(1),
+ Materials.Cobalt.getDust(1), Materials.Copper.getDust(1), Materials.Desh.getDust(1),
+ Materials.Dysprosium.getDust(1), Materials.Erbium.getDust(1), Materials.Europium.getDust(1),
+ Materials.Gadolinium.getDust(1), Materials.Gallium.getDust(1), Materials.Gold.getDust(1),
+ Materials.Holmium.getDust(1), Materials.Indium.getDust(1), Materials.Lanthanum.getDust(1),
+ Materials.Lithium.getDust(1), Materials.Lutetium.getDust(1), Materials.Magnesium.getDust(1),
+ Materials.Manganese.getDust(1), Materials.MeteoricIron.getDust(1),
+ Materials.Molybdenum.getDust(1), Materials.Neodymium.getDust(1),
+ Materials.Oriharukon.getDust(1), Materials.Palladium.getDust(1),
+ Materials.Phosphorus.getDust(1), Materials.Potassium.getDust(1),
+ Materials.Praseodymium.getDust(1), Materials.Promethium.getDust(1),
+ Materials.Rubidium.getDust(1), Materials.Samarium.getDust(1), Materials.Silicon.getDust(1),
+ Materials.Sodium.getDust(1), Materials.Strontium.getDust(1), Materials.Tantalum.getDust(1),
+ Materials.Tellurium.getDust(1), Materials.Terbium.getDust(1), Materials.Thulium.getDust(1),
+ Materials.Tungsten.getDust(1), Materials.Uranium.getDust(1), Materials.Uranium235.getDust(1),
+ Materials.Vanadium.getDust(1), Materials.Ytterbium.getDust(1), Materials.Yttrium.getDust(1),
+ ELEMENT.getInstance().ZIRCONIUM.getDust(1), ELEMENT.getInstance().THORIUM232.getDust(1),
+ ELEMENT.getInstance().GERMANIUM.getDust(1), ELEMENT.getInstance().THALLIUM.getDust(1),
+ ELEMENT.getInstance().RUTHENIUM.getDust(1), ELEMENT.getInstance().RHENIUM.getDust(1),
+ ELEMENT.getInstance().RHODIUM.getDust(1), ELEMENT.getInstance().IODINE.getDust(1),
+ ELEMENT.getInstance().HAFNIUM.getDust(1), ELEMENT.getInstance().CURIUM.getDust(1) };
+ FluidStack[] solid_plasmas_t0_1step = { Materials.Aluminium.getPlasma(144),
+ Materials.Iron.getPlasma(144), Materials.Calcium.getPlasma(144),
+ Materials.Sulfur.getPlasma(144), Materials.Zinc.getPlasma(144),
+ Materials.Niobium.getPlasma(144), Materials.Tin.getPlasma(144),
+ Materials.Titanium.getPlasma(144), Materials.Nickel.getPlasma(144),
+ Materials.Silver.getPlasma(144), Materials.Americium.getPlasma(144),
+ Materials.Antimony.getPlasma(144), Materials.Ardite.getPlasma(144),
+ Materials.Arsenic.getPlasma(144), Materials.Barium.getPlasma(144),
+ Materials.Beryllium.getPlasma(144), Materials.Caesium.getPlasma(144),
+ Materials.Cadmium.getPlasma(144), Materials.Carbon.getPlasma(144),
+ Materials.Cerium.getPlasma(144), Materials.Cobalt.getPlasma(144),
+ Materials.Copper.getPlasma(144), Materials.Desh.getPlasma(144),
+ Materials.Dysprosium.getPlasma(144), Materials.Erbium.getPlasma(144),
+ Materials.Europium.getPlasma(144), Materials.Gadolinium.getPlasma(144),
+ Materials.Gallium.getPlasma(144), Materials.Gold.getPlasma(144),
+ Materials.Holmium.getPlasma(144), Materials.Indium.getPlasma(144),
+ Materials.Lanthanum.getPlasma(144), Materials.Lithium.getPlasma(144),
+ Materials.Lutetium.getPlasma(144), Materials.Magnesium.getPlasma(144),
+ Materials.Manganese.getPlasma(144), Materials.MeteoricIron.getPlasma(144),
+ Materials.Molybdenum.getPlasma(144), Materials.Neodymium.getPlasma(144),
+ Materials.Oriharukon.getPlasma(144), Materials.Palladium.getPlasma(144),
+ Materials.Phosphorus.getPlasma(144), Materials.Potassium.getPlasma(144),
+ Materials.Praseodymium.getPlasma(144), Materials.Promethium.getPlasma(144),
+ Materials.Rubidium.getPlasma(144), Materials.Samarium.getPlasma(144),
+ Materials.Silicon.getPlasma(144), Materials.Sodium.getPlasma(144),
+ Materials.Strontium.getPlasma(144), Materials.Tantalum.getPlasma(144),
+ Materials.Tellurium.getPlasma(144), Materials.Terbium.getPlasma(144),
+ Materials.Thulium.getPlasma(144), Materials.Tungsten.getPlasma(144),
+ Materials.Uranium.getPlasma(144), Materials.Uranium235.getPlasma(144),
+ Materials.Vanadium.getPlasma(144), Materials.Ytterbium.getPlasma(144),
+ Materials.Yttrium.getPlasma(144),
+ new FluidStack(ELEMENT.getInstance().ZIRCONIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().THORIUM232.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().GERMANIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().THALLIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().RUTHENIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().RHENIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().RHODIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().IODINE.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().HAFNIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().CURIUM.getPlasma(), 144) };
+
+ for (int i = 0; i < solids_t0_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t0_1step[i] },
+ new FluidStack[] { solid_plasmas_t0_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 0);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t0_xstep = { Materials.Force.getDust(1), Materials.Bismuth.getDust(1),
+ ELEMENT.STANDALONE.ADVANCED_NITINOL.getDust(1), Materials.Boron.getDust(1),
+ ELEMENT.STANDALONE.ASTRAL_TITANIUM.getDust(1), ELEMENT.STANDALONE.RUNITE.getDust(1),
+ ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getDust(1), Materials.Iridium.getDust(1),
+ Materials.Naquadah.getDust(1), Materials.Osmium.getDust(1), Materials.Platinum.getDust(1),
+ Materials.Plutonium.getDust(1), ELEMENT.getInstance().CALIFORNIUM.getDust(1),
+ Materials.Chrome.getDust(1) };
+ FluidStack[] solid_plasmas_t0_xstep = { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 144),
+ Materials.Bismuth.getPlasma(144),
+ new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144),
+ Materials.Boron.getPlasma(144),
+ new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 144),
+ Materials.Iridium.getPlasma(144), Materials.Naquadah.getPlasma(144),
+ Materials.Osmium.getPlasma(144), Materials.Platinum.getPlasma(144),
+ Materials.Plutonium.getPlasma(144),
+ new FluidStack(ELEMENT.getInstance().CALIFORNIUM.getPlasma(), 144),
+ Materials.Chrome.getPlasma(144), };
+
+ for (int i = 0; i < solids_t0_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t0_xstep[i] },
+ new FluidStack[] { solid_plasmas_t0_xstep[i] },
+ 3 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 0);
+ }
+ }
+ // Fusion tier 4-5
+ {
+ // Single step
+ ItemStack[] solids_t1_1step = { Materials.Lead.getDust(1), Materials.Plutonium241.getDust(1),
+ Materials.Thorium.getDust(1) };
+ FluidStack[] solid_plasmas_t1_1step = { Materials.Lead.getPlasma(144),
+ Materials.Plutonium241.getPlasma(144), Materials.Thorium.getPlasma(144) };
+
+ for (int i = 0; i < solids_t1_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t1_1step[i] },
+ new FluidStack[] { solid_plasmas_t1_1step[i] },
+ 5 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 1);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t1_xstep = { ELEMENT.getInstance().NEPTUNIUM.getDust(1),
+ ELEMENT.getInstance().FERMIUM.getDust(1) };
+ FluidStack[] solid_plasmas_t1_xstep = {
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 144) };
+
+ for (int i = 0; i < solids_t1_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t1_xstep[i] },
+ new FluidStack[] { solid_plasmas_t1_xstep[i] },
+ 7 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 1);
+ }
+ }
+ // Exotic Plasmas
+ {
+ // Single step
+ ItemStack[] solids_t2_1step = { ELEMENT.STANDALONE.RHUGNOR.getDust(1),
+ ELEMENT.STANDALONE.DRAGON_METAL.getDust(1), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getDust(1),
+ Materials.CosmicNeutronium.getDust(1), Materials.Draconium.getDust(1),
+ Materials.DraconiumAwakened.getDust(1), Materials.Ichorium.getDust(1) };
+ FluidStack[] solid_plasmas_t2_1step = { new FluidStack(ELEMENT.STANDALONE.RHUGNOR.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.DRAGON_METAL.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlasma(), 144),
+ Materials.CosmicNeutronium.getPlasma(144), Materials.Draconium.getPlasma(144),
+ Materials.DraconiumAwakened.getPlasma(144), Materials.Ichorium.getPlasma(144) };
+
+ for (int i = 0; i < solids_t2_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t2_1step[i] },
+ new FluidStack[] { solid_plasmas_t2_1step[i] },
+ 15 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 2);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t2_xstep = { ELEMENT.STANDALONE.HYPOGEN.getDust(1),
+ Materials.Tritanium.getDust(1), Materials.Flerovium.getDust(1),
+ Materials.Neutronium.getDust(1), };
+ FluidStack[] solid_plasmas_t2_xstep = { new FluidStack(ELEMENT.STANDALONE.HYPOGEN.getPlasma(), 144),
+ Materials.Tritanium.getPlasma(144), Materials.Flerovium.getPlasma(144),
+ Materials.Neutronium.getPlasma(144), };
+
+ for (int i = 0; i < solids_t2_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t2_xstep[i] },
+ new FluidStack[] { solid_plasmas_t2_xstep[i] },
+ 25 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 2);
+ }
+
+ }
+
+ }
+
+ // Fluid to plasma recipes
+ {
+ // Fusion tier 1-3
+ {
+ // Single step
+ FluidStack[] fluids_t0_1step = { Materials.Helium.getGas(1000), Materials.Nitrogen.getGas(1000),
+ Materials.Argon.getGas(1000), Materials.Chlorine.getGas(1000), Materials.Deuterium.getGas(1000),
+ Materials.Fluorine.getGas(1000), Materials.Hydrogen.getGas(1000), Materials.Radon.getGas(1000),
+ Materials.Tritium.getGas(1000), Materials.Mercury.getFluid(1000) };
+ FluidStack[] fluid_plasmas_t0_1step = { Materials.Helium.getPlasma(1000),
+ Materials.Nitrogen.getPlasma(1000), Materials.Argon.getPlasma(1000),
+ Materials.Chlorine.getPlasma(1000), Materials.Deuterium.getPlasma(1000),
+ Materials.Fluorine.getPlasma(1000), Materials.Hydrogen.getPlasma(1000),
+ Materials.Radon.getPlasma(1000), Materials.Tritium.getPlasma(1000),
+ Materials.Mercury.getPlasma(1000) };
+
+ for (int i = 0; i < fluids_t0_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new FluidStack[] { fluids_t0_1step[i] },
+ new FluidStack[] { fluid_plasmas_t0_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 0);
+ }
+
+ // Multi-step
+ FluidStack[] fluids_t0_xstep = { ELEMENT.getInstance().NEON.getFluidStack(1000),
+ Materials.Oxygen.getGas(1000), ELEMENT.getInstance().KRYPTON.getFluidStack(1000),
+ ELEMENT.getInstance().XENON.getFluidStack(1000) };
+ FluidStack[] fluid_plasmas_t0_xstep = {
+ new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000), Materials.Oxygen.getPlasma(1000),
+ new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 1000),
+ new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 1000) };
+
+ for (int i = 0; i < fluids_t0_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new FluidStack[] { fluids_t0_xstep[i] },
+ new FluidStack[] { fluid_plasmas_t0_xstep[i] },
+ 3 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 0);
+ }
+ }
+ // Fusion tier 4-5
+ {
+ // Single step
+ // None yet
+
+ // Multi-step
+ // None yet
+ }
+ // Exotic
+ {
+ // None yet
+ }
+ }
+
+ // Exotic module fake recipes
+ {
+ TT_recipeAdder.addFOGExoticFakeRecipe(
+ new ItemStack[] { Materials.Iron.getDust(1) },
+ new FluidStack[] { Materials.Iron.getMolten(1) },
+ new FluidStack[] { MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000) },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 1);
+
+ TT_recipeAdder.addFOGExoticFakeRecipe(
+ new ItemStack[] { Materials.Iron.getDust(1) },
+ new FluidStack[] { Materials.Iron.getMolten(1), Materials.Bismuth.getMolten(1) },
+ new FluidStack[] { MaterialsUEVplus.MagMatter.getMolten(144) },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 1);
+ }
+ }
+
+ // Exotic module plasma material maps
+ // GT materials
+ plasmaGTMaterialList.addAll(
+ Arrays.asList(
+ Materials.Aluminium,
+ Materials.Americium,
+ Materials.Antimony,
+ Materials.Ardite,
+ Materials.Argon,
+ Materials.Arsenic,
+ Materials.Barium,
+ Materials.Beryllium,
+ Materials.Bismuth,
+ Materials.Boron,
+ Materials.Caesium,
+ Materials.Calcium,
+ Materials.Cadmium,
+ Materials.Carbon,
+ Materials.Cerium,
+ Materials.Chlorine,
+ Materials.Chrome,
+ Materials.Cobalt,
+ Materials.Copper,
+ Materials.Desh,
+ Materials.Deuterium,
+ Materials.Dysprosium,
+ Materials.Erbium,
+ Materials.Europium,
+ Materials.Fluorine,
+ Materials.Gadolinium,
+ Materials.Gallium,
+ Materials.Gold,
+ Materials.Helium,
+ Materials.Holmium,
+ Materials.Hydrogen,
+ Materials.Indium,
+ Materials.Iridium,
+ Materials.Iron,
+ Materials.Lanthanum,
+ Materials.Lead,
+ Materials.Lithium,
+ Materials.Lutetium,
+ Materials.Magnesium,
+ Materials.Manganese,
+ Materials.MeteoricIron,
+ Materials.Molybdenum,
+ Materials.Naquadah,
+ Materials.Neodymium,
+ Materials.Nickel,
+ Materials.Niobium,
+ Materials.Nitrogen,
+ Materials.Oriharukon,
+ Materials.Osmium,
+ Materials.Oxygen,
+ Materials.Palladium,
+ Materials.Phosphorus,
+ Materials.Platinum,
+ Materials.Plutonium,
+ Materials.Plutonium241,
+ Materials.Potassium,
+ Materials.Praseodymium,
+ Materials.Promethium,
+ Materials.Radon,
+ Materials.Rubidium,
+ Materials.Samarium,
+ Materials.Silicon,
+ Materials.Silver,
+ Materials.Sodium,
+ Materials.Strontium,
+ Materials.Sulfur,
+ Materials.Tantalum,
+ Materials.Tellurium,
+ Materials.Terbium,
+ Materials.Thorium,
+ Materials.Thulium,
+ Materials.Tin,
+ Materials.Titanium,
+ Materials.Tritium,
+ Materials.Tungsten,
+ Materials.Uranium235,
+ Materials.Uranium,
+ Materials.Vanadium,
+ Materials.Ytterbium,
+ Materials.Yttrium,
+ Materials.Zinc));
+
+ plasmaGTWeightList.addAll(
+ Arrays.asList(
+ 6000 /* Aluminium */,
+ 10000 /* Americium */,
+ 6000 /* Antimony */,
+ 6000 /* Ardite */,
+ 6000 /* Argon */,
+ 6000 /* Arsenic */,
+ 6000 /* Barium */,
+ 6000 /* Beryllium */,
+ 8000 /* Bismuth */,
+ 8000 /* Boron */,
+ 6000 /* Caesium */,
+ 10000 /* Calcium */,
+ 6000 /* Cadmium */,
+ 6000 /* Carbon */,
+ 6000 /* Cerium */,
+ 6000 /* Chlorine */,
+ 6000 /* Chrome */,
+ 6000 /* Cobalt */,
+ 6000 /* Copper */,
+ 6000 /* Desh */,
+ 6000 /* Deuterium */,
+ 2000 /* Dysprosium */,
+ 2000 /* Erbium */,
+ 6000 /* Europium */,
+ 6000 /* Fluorine */,
+ 2000 /* Gadolinium */,
+ 6000 /* Gallium */,
+ 6000 /* Gold */,
+ 10000 /* Helium */,
+ 6000 /* Holmium */,
+ 10000 /* Hydrogen */,
+ 6000 /* Indium */,
+ 6000 /* Iridium */,
+ 10000 /* Iron */,
+ 6000 /* Lanthanum */,
+ 500 /* Lead */,
+ 6000 /* Lithium */,
+ 6000 /* Lutetium */,
+ 6000 /* Magnesium */,
+ 6000 /* Manganese */,
+ 6000 /* Meteoric Iron */,
+ 6000 /* Molybdenum */,
+ 6000 /* Naquadah */,
+ 6000 /* Neodymium */,
+ 10000 /* Nickel */,
+ 10000 /* Niobium */,
+ 10000 /* Nitrogen */,
+ 6000 /* Oriharukon */,
+ 6000 /* Osmium */,
+ 8000 /* Oxygen */,
+ 6000 /* Palladium */,
+ 6000 /* Phosphorus */,
+ 6000 /* Platinum */,
+ 6000 /* Plutonium 239 */,
+ 500 /* Plutonium 241 */,
+ 6000 /* Potassium */,
+ 6000 /* Praseodymium */,
+ 2000 /* Promethium */,
+ 10000 /* Radon */,
+ 2000 /* Rubidium */,
+ 6000 /* Samarium */,
+ 6000 /* Raw Silicon */,
+ 10000 /* Silver */,
+ 6000 /* Sodium */,
+ 2000 /* Strontium */,
+ 10000 /* Sulfur */,
+ 6000 /* Tantalum */,
+ 2000 /* Tellurium */,
+ 1000 /* Terbium */,
+ 500 /* Thorium */,
+ 6000 /* Thulium */,
+ 10000 /* Tin */,
+ 10000 /* Titanium */,
+ 6000 /* Tritium */,
+ 6000 /* Tungsten */,
+ 6000 /* Uranium 235 */,
+ 6000 /* Uranium 238 */,
+ 6000 /* Vanadium */,
+ 2000 /* Ytterbium */,
+ 6000 /* Yttrium */,
+ 6000 /* Zinc */));
+
+ // GT++ materials
+ if (GTPlusPlus.isModLoaded()) {
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().ZIRCONIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THORIUM232.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().GERMANIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THALLIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RUTHENIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHENIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHODIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().IODINE.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ADVANCED_NITINOL.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.FORCE.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().HAFNIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().CALIFORNIUM.getTinyDust(1), 1000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.RUNITE.getTinyDust(1), 8000);
+
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().XENON.getFluid(), 1), 8000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().KRYPTON.getFluid(), 1), 8000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEON.getFluid(), 1), 8000);
+ // These are here because they cant be solidified
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().CURIUM.getFluid(), 1), 10000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getFluid(), 1), 800);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().FERMIUM.getFluid(), 1), 800);
+ }
+ // Mercury is weird, it has neither dust nor gas, so it needs to be added separately
+ exoticModulePlasmaFluidMap.put(Materials.Mercury.getFluid(1), 6000);
+
+ // Loop for adding all GT plasma materials
+ for (int i = 0; i < plasmaGTMaterialList.size(); i++) {
+ if (plasmaGTMaterialList.get(i)
+ .getDustTiny(1) != null) {
+ exoticModulePlasmaItemMap.put(
+ plasmaGTMaterialList.get(i)
+ .getDustTiny(1),
+ plasmaGTWeightList.get(i));
+ } else {
+ exoticModulePlasmaFluidMap.put(
+ plasmaGTMaterialList.get(i)
+ .getGas(1),
+ plasmaGTWeightList.get(i));
+ }
+ }
+
+ // Magmatter map
+ // GT materials
+ exoticModuleMagmatterItemMap.put(Materials.CosmicNeutronium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Draconium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.DraconiumAwakened.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Ichorium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Neutronium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Flerovium.getDustTiny(1), 100000);
+
+ // GT++ materials
+ if (GTPlusPlus.isModLoaded()) {
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getTinyDust(1), 100000);
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.HYPOGEN.getTinyDust(1), 100000);
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.RHUGNOR.getTinyDust(1), 100000);
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getTinyDust(1), 100000);
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.DRAGON_METAL.getTinyDust(1), 100000);
+ }
+
+ // For NEI
+ for (FluidStack fluid : exoticModulePlasmaFluidMap.keySet()) {
+ fluid.amount = getRandomIntInRange(1, 64);
+ quarkGluonFluidItemsForNEI.add(GT_Utility.getFluidDisplayStack(fluid, true));
+ }
+ for (ItemStack item : exoticModulePlasmaItemMap.keySet()) {
+ item.stackSize = getRandomIntInRange(1, 64);
+ quarkGluonItemsForNEI.add(item);
+ }
+ for (int i = 0; i < 21; i++) {
+ magmatterTimeFluidItemsForNEI.add(
+ GT_Utility.getFluidDisplayStack(MaterialsUEVplus.Time.getMolten(getRandomIntInRange(1, 50)), true));
+ magmatterSpaceFluidItemsForNEI.add(
+ GT_Utility.getFluidDisplayStack(MaterialsUEVplus.Space.getMolten(getRandomIntInRange(51, 100)), true));
+ }
+ magmatterItemsForNEI.addAll(exoticModuleMagmatterItemMap.keySet());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java b/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java
new file mode 100644
index 0000000000..63885b5b7d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java
@@ -0,0 +1,3272 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer;
+import static com.google.common.math.LongMath.pow;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.enums.Mods.AvaritiaAddons;
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.BloodMagic;
+import static gregtech.api.enums.Mods.DraconicEvolution;
+import static gregtech.api.enums.Mods.EternalSingularity;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.GTNHIntergalactic;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GTPlusPlusEverglades;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.GraviSuite;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.KekzTech;
+import static gregtech.api.enums.Mods.KubaTech;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.SGCraft;
+import static gregtech.api.enums.Mods.SuperSolarPanels;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.TinkersGregworks;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+import com.github.technus.tectech.thing.CustomItemList;
+import com.rwtema.extrautils.ExtraUtils;
+
+import fox.spiteful.avaritia.compat.ticon.Tonkers;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsBotania;
+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 gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import tconstruct.tools.TinkerTools;
+import vexatos.tgregworks.reference.PartTypes;
+import vexatos.tgregworks.util.TGregUtils;
+
+public class ResearchStationAssemblyLine implements Runnable {
+
+ @Override
+ public void run() {
+ itemPartsUHVAsslineRecipes();
+ itemPartsUEVAsslineRecipes();
+ itemPartsUIVAsslineRecipes();
+ itemPartsUMVAsslineRecipes();
+ itemPartsUXVAsslineRecipes();
+ addWirelessEnergyRecipes();
+
+ if (TinkersGregworks.isModLoaded() && GoodGenerator.isModLoaded() // Shirabon
+ && Avaritia.isModLoaded() // Infinity, Cosmic Neutronium
+ && ExtraUtilities.isModLoaded() // Bedrockium
+ ) {
+ addEOHRecipes();
+ }
+
+ Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ // Infinite Oil Rig
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.OilDrill4.get(1),
+ 16777216,
+ 2048,
+ 2000000,
+ 4,
+ new Object[] { ItemList.OilDrill4.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 4),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L }, ItemList.Electric_Motor_UHV.get(4),
+ ItemList.Electric_Pump_UHV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Neutronium, 4), ItemList.Sensor_UHV.get(3),
+ ItemList.Field_Generator_UHV.get(3),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 12) },
+ new FluidStack[] { new FluidStack(solderUEV, 1296), Materials.Neutronium.getMolten(576) },
+ ItemList.OilDrillInfinite.get(1),
+ 6000,
+ 2000000);
+
+ // Infinity Coil
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Coil_AwakenedDraconium.get(1),
+ 16_777_216,
+ 2048,
+ 8_000_000,
+ 1,
+ new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L },
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Infinity, 8),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Infinity, 8),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 32, 0) },
+ new FluidStack[] { Materials.DraconiumAwakened.getMolten(576), },
+ ItemList.Casing_Coil_Infinity.get(1),
+ 60 * 20,
+ 8_000_000);
+
+ if (GTPlusPlus.isModLoaded()) {
+ // Hypogen Coil
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Coil_Infinity.get(1),
+ 16_777_216 * 2,
+ 2048 * 2,
+ 32_000_000,
+ 1,
+ new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ GT_OreDictUnificator.get("wireGt02Hypogen", 8L),
+ getModItem(GTPlusPlus.ID, "itemScrewHypogen", 8, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), },
+ new FluidStack[] { Materials.Infinity.getMolten(576), },
+ ItemList.Casing_Coil_Hypogen.get(1),
+ 60 * 20,
+ 8000000 * 4);
+
+ // Eternal coil
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Coil_Hypogen.get(1),
+ 16_777_216 * 4,
+ 8_192,
+ 128_000_000,
+ 1,
+ new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, MaterialsUEVplus.SpaceTime, 8),
+ GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.SpaceTime, 8),
+ getModItem(EternalSingularity.ID, "eternal_singularity", 1L),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0),
+ getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("molten.hypogen"), 576), },
+ ItemList.Casing_Coil_Eternal.get(1),
+ 60 * 20,
+ 8_000_000 * 16);
+ }
+
+ // UHV-UMV Energy Hatch & Dynamo
+ {
+ // Energy Hatches
+ {
+ // Energy Hatch UHV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Hatch_Energy_UV.get(1L),
+ 24000,
+ 16,
+ 50000,
+ 2,
+ new Object[] { ItemList.Hull_MAX.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2L),
+ ItemList.Circuit_Chip_QPIC.get(2L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L }, ItemList.UHV_Coil.get(2L),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ ItemList.Electric_Pump_UHV.get(1L) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000),
+ new FluidStack(solderIndalloy, 40 * 144) },
+ ItemList.Hatch_Energy_MAX.get(1L),
+ 1000,
+ 2000000);
+
+ // Energy Hatch UEV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Hatch_Energy_MAX.get(1L),
+ 48000,
+ 32,
+ 100000,
+ 4,
+ new Object[] { getItemContainer("Hull_UEV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 2L),
+ ItemList.Circuit_Chip_QPIC.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L },
+ ItemList.UHV_Coil.get(4L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UEV.get(1L) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000),
+ new FluidStack(solderUEV, 20 * 144), Materials.UUMatter.getFluid(8000L) },
+ getItemContainer("Hatch_Energy_UEV").get(1L),
+ 1000,
+ 8000000);
+
+ // Energy Hatch UIV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Energy_UEV").get(1L),
+ 96_000,
+ 64,
+ 200_000,
+ 8,
+ new Object[] { getItemContainer("Hull_UIV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUIV, 2L),
+ ItemList.Circuit_Chip_QPIC.get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, ItemList.UHV_Coil.get(8L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UIV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(16_000L), new FluidStack(solderUEV, 20 * 144),
+ Materials.UUMatter.getFluid(16_000L) },
+ getItemContainer("Hatch_Energy_UIV").get(1L),
+ 1000,
+ 32_000_000);
+
+ // Energy Hatch UMV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Energy_UIV").get(1L),
+ 192000,
+ 128,
+ 400000,
+ 16,
+ new Object[] { getItemContainer("Hull_UMV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUMV, 2L),
+ ItemList.Circuit_Chip_QPIC.get(4L), getItemContainer("PikoCircuit").get(2),
+ ItemList.UHV_Coil.get(16L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UMV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(32_000L), new FluidStack(solderUEV, 40 * 144),
+ Materials.UUMatter.getFluid(32000L) },
+ getItemContainer("Hatch_Energy_UMV").get(1L),
+ 1000,
+ 128_000_000);
+
+ // Energy Hatch UXV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Energy_UMV").get(1L),
+ 384000,
+ 256,
+ 800000,
+ 32,
+ new Object[] { getItemContainer("Hull_UXV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUMV, 4L),
+ ItemList.Circuit_Chip_QPIC.get(16L), getItemContainer("QuantumCircuit").get(2),
+ ItemList.UHV_Coil.get(32L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Electric_Pump_UXV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(64_000L), new FluidStack(solderUEV, 80 * 144),
+ Materials.UUMatter.getFluid(64000L) },
+ getItemContainer("Hatch_Energy_UXV").get(1L),
+ 1000,
+ 512_000_000);
+ }
+
+ // Dynamo Hatch
+ {
+ // Dynamo Hatch UHV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Hatch_Dynamo_UV.get(1L),
+ 48000,
+ 32,
+ 100000,
+ 4,
+ new Object[] { ItemList.Hull_MAX.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Longasssuperconductornameforuhvwire, 8L),
+ ItemList.Circuit_Chip_QPIC.get(2L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L }, ItemList.UHV_Coil.get(2L),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_2.get(1L) },
+ ItemList.Electric_Pump_UHV.get(1L) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000),
+ new FluidStack(solderIndalloy, 40 * 144) },
+ ItemList.Hatch_Dynamo_MAX.get(1L),
+ 1000,
+ 2000000);
+
+ // Dynamo Hatch UEV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Hatch_Dynamo_MAX.get(1L),
+ 96000,
+ 64,
+ 200000,
+ 8,
+ new Object[] { getItemContainer("Hull_UEV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUEVBase, 8L),
+ ItemList.Circuit_Chip_QPIC.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L },
+ ItemList.UHV_Coil.get(4L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UEV.get(1L) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000),
+ new FluidStack(solderUEV, 20 * 144), Materials.UUMatter.getFluid(8000L) },
+ getItemContainer("Hatch_Dynamo_UEV").get(1L),
+ 1000,
+ 8000000);
+
+ // Dynamo Hatch UIV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Dynamo_UEV").get(1L),
+ 192_000,
+ 128,
+ 400_000,
+ 16,
+ new Object[] { getItemContainer("Hull_UIV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUIVBase, 8L),
+ ItemList.Circuit_Chip_QPIC.get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, ItemList.UHV_Coil.get(8L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UIV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(16_000L), new FluidStack(solderUEV, 20 * 144),
+ Materials.UUMatter.getFluid(16_000L) },
+ getItemContainer("Hatch_Dynamo_UIV").get(1L),
+ 1000,
+ 32_000_000);
+
+ // Dynamo Hatch UMV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Dynamo_UIV").get(1L),
+ 384000,
+ 256,
+ 800000,
+ 32,
+ new Object[] { getItemContainer("Hull_UMV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUMVBase, 8L),
+ ItemList.Circuit_Chip_QPIC.get(4L), getItemContainer("PikoCircuit").get(2),
+ ItemList.UHV_Coil.get(16L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Electric_Pump_UMV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(32_000L), new FluidStack(solderUEV, 40 * 144),
+ Materials.UUMatter.getFluid(32000L) },
+ getItemContainer("Hatch_Dynamo_UMV").get(1L),
+ 1000,
+ 128_000_000);
+
+ // Dynamo Hatch UXV
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("Hatch_Dynamo_UMV").get(1L),
+ 384000,
+ 256,
+ 800000,
+ 32,
+ new Object[] { getItemContainer("Hull_UXV").get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUMVBase, 16L),
+ ItemList.Circuit_Chip_QPIC.get(16L), getItemContainer("QuantumCircuit").get(2),
+ ItemList.UHV_Coil.get(32L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Electric_Pump_UXV.get(1L) },
+ new FluidStack[] { Materials.SuperCoolant.getFluid(64_000L), new FluidStack(solderUEV, 80 * 144),
+ Materials.UUMatter.getFluid(64000L) },
+ getItemContainer("Hatch_Dynamo_UXV").get(1L),
+ 1000,
+ 512_000_000);
+ }
+ }
+
+ // UHV Circuit Wetwaremainframe
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_Wetwaresupercomputer.get(1L),
+ 24000,
+ 64,
+ 50000,
+ 4,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 2),
+ ItemList.Circuit_Wetwaresupercomputer.get(2L),
+ new ItemStack[] { ItemList.Circuit_Parts_InductorASMD.get(16L),
+ ItemList.Circuit_Parts_InductorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(16L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(16L),
+ ItemList.Circuit_Parts_ResistorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(16L),
+ ItemList.Circuit_Parts_TransistorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(4L) },
+ ItemList.Circuit_Chip_Ram.get(48L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 2L) },
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, },
+ new FluidStack[] { new FluidStack(solderIndalloy, 2880),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 10000), Materials.Radon.getGas(2500L), },
+ ItemList.Circuit_Wetwaremainframe.get(1L),
+ 2000,
+ 300000);
+
+ // Bioware SuperComputer
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_Biowarecomputer.get(1L),
+ 48000,
+ 128,
+ 500000,
+ 8,
+ new Object[] { ItemList.Circuit_Board_Bio_Ultra.get(2L), ItemList.Circuit_Biowarecomputer.get(2L),
+ new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(16L),
+ ItemList.Circuit_Parts_TransistorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(16L),
+ ItemList.Circuit_Parts_ResistorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(16L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(4L) },
+ new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(4L) },
+ ItemList.Circuit_Chip_NOR.get(32L), ItemList.Circuit_Chip_Ram.get(64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.NiobiumTitanium, 32L),
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, },
+ new FluidStack[] { new FluidStack(solderUEV, 1440), Materials.BioMediumSterilized.getFluid(1440L),
+ Materials.SuperCoolant.getFluid(10_000L), },
+ ItemList.Circuit_Biowaresupercomputer.get(1L),
+ 4000,
+ 500000);
+
+ // Bio Mainframe
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_Biowaresupercomputer.get(1L),
+ 96000,
+ 256,
+ 1000000,
+ 16,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 4L),
+ ItemList.Circuit_Biowaresupercomputer.get(2L),
+ new ItemStack[] { ItemList.Circuit_Parts_InductorASMD.get(24L),
+ ItemList.Circuit_Parts_InductorXSMD.get(6L) },
+ new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(24L),
+ ItemList.Circuit_Parts_TransistorXSMD.get(6L) },
+ new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(24L),
+ ItemList.Circuit_Parts_ResistorXSMD.get(6L) },
+ new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(24L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(6L) },
+ new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(24L), ItemList.Circuit_Parts_DiodeXSMD.get(6L) },
+ ItemList.Circuit_Chip_Ram.get(64L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 8L) },
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64) },
+ new FluidStack[] { new FluidStack(solderUEV, 2880), Materials.BioMediumSterilized.getFluid(2880L),
+ Materials.SuperCoolant.getFluid(20_000L), },
+ ItemList.Circuit_Biomainframe.get(1L),
+ 6000,
+ 2000000);
+
+ // Optical Assembly
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_OpticalProcessor.get(1L),
+ 192_000,
+ 256,
+ 2_000_000,
+ 16,
+ new Object[] { ItemList.Circuit_Board_Optical.get(1L), ItemList.Circuit_OpticalProcessor.get(2L),
+ ItemList.Circuit_Parts_InductorXSMD.get(16L), ItemList.Circuit_Parts_CapacitorXSMD.get(20L),
+ ItemList.Circuit_Parts_ResistorXSMD.get(20L), ItemList.Circuit_Chip_NOR.get(32L),
+ ItemList.Circuit_Chip_Ram.get(64L),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedwireFine", 24L, 10101), // Fine
+ // Lumiium
+ // Wire
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, },
+ new FluidStack[] { new FluidStack(solderUEV, 1440), Materials.Radon.getPlasma(1440L),
+ Materials.SuperCoolant.getFluid(10_000L), new FluidStack(FluidRegistry.getFluid("oganesson"), 500) },
+ ItemList.Circuit_OpticalAssembly.get(1L),
+ 20 * 20,
+ 2_000_000);
+
+ // Optical Computer
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_OpticalAssembly.get(1L),
+ 384_000,
+ 512,
+ 4_000_000,
+ 32,
+ new Object[] { ItemList.Circuit_Board_Optical.get(2L), ItemList.Circuit_OpticalAssembly.get(2L),
+ ItemList.Circuit_Parts_TransistorXSMD.get(24L), ItemList.Circuit_Parts_ResistorXSMD.get(24L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(24L), ItemList.Circuit_Parts_DiodeXSMD.get(24L),
+ ItemList.Circuit_Chip_NOR.get(64L), ItemList.Circuit_Chip_SoC2.get(32L),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedwireFine", 32L, 10101), // Fine
+ // Lumiium
+ // Wire
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64), },
+ new FluidStack[] { new FluidStack(solderUEV, 1440 * 2), Materials.Radon.getPlasma(1440L * 2),
+ Materials.SuperCoolant.getFluid(10_000L * 2),
+ new FluidStack(FluidRegistry.getFluid("oganesson"), 500 * 2) },
+ ItemList.Circuit_OpticalComputer.get(1L),
+ 200 * 20,
+ 2_000_000);
+
+ // Optical Mainframe
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_OpticalComputer.get(1L),
+ 768_000,
+ 1024,
+ 8_000_000,
+ 64,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 8),
+ ItemList.Circuit_OpticalComputer.get(2L), ItemList.Circuit_Parts_InductorXSMD.get(32L),
+ ItemList.Circuit_Parts_TransistorXSMD.get(32L), ItemList.Circuit_Parts_ResistorXSMD.get(32L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(32L), ItemList.Circuit_Parts_DiodeXSMD.get(32L),
+ ItemList.Circuit_Chip_SoC2.get(64L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 16L) },
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L },
+ new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64) },
+ new FluidStack[] { new FluidStack(solderUEV, 1440 * 4), Materials.Radon.getPlasma(1440L * 4),
+ Materials.SuperCoolant.getFluid(10_000L * 4),
+ new FluidStack(FluidRegistry.getFluid("oganesson"), 500 * 4) },
+ ItemList.Circuit_OpticalMainframe.get(1L),
+ 300 * 20,
+ 8_000_000);
+
+ // Piko Circuit
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Circuit_OpticalMainframe.get(1L),
+ 384000,
+ 1024,
+ 4000000,
+ 64,
+ new Object[] { ItemList.Circuit_Board_Optical.get(1L), getItemContainer("PicoWafer").get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L },
+ ItemList.Circuit_Parts_TransistorXSMD.get(48L), ItemList.Circuit_Parts_ResistorXSMD.get(48L),
+ ItemList.Circuit_Parts_CapacitorXSMD.get(48L), ItemList.Circuit_Parts_DiodeXSMD.get(48L),
+ ItemList.Circuit_Chip_PPIC.get(64L), GT_OreDictUnificator.get("foilRadoxPoly", 16L),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.TranscendentMetal, 32),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Neutronium, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 64) },
+ new FluidStack[] { new FluidStack(solderUEV, 3744), Materials.UUMatter.getFluid(8000L),
+ Materials.Osmium.getMolten(1152L) },
+ getItemContainer("PikoCircuit").get(1L),
+ 10000,
+ 128_000_000);
+
+ // Quantum Circuit
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("PikoCircuit").get(1L),
+ 720000,
+ 2048,
+ 8000000,
+ 128,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 16),
+ getItemContainer("PikoCircuit").get(2L), ItemList.Circuit_Parts_CapacitorXSMD.get(64L),
+ ItemList.Circuit_Parts_DiodeXSMD.get(64L), ItemList.Circuit_Parts_TransistorXSMD.get(64L),
+ ItemList.Circuit_Parts_ResistorXSMD.get(64L), ItemList.Circuit_Chip_QPIC.get(64L),
+ GT_OreDictUnificator.get("foilShirabon", 64),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Indium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 8),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 16) },
+ new FluidStack[] { new FluidStack(solderUEV, 3744), Materials.UUMatter.getFluid(24000L),
+ Materials.Osmium.getMolten(2304L) },
+ getItemContainer("QuantumCircuit").get(1L),
+ 20000,
+ (int) TierEU.RECIPE_UMV);
+
+ // Transcendent Plasma Mixer - TPM.
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.eM_energyTunnel7_UV.get(1),
+ 32_000_000,
+ 4096,
+ (int) TierEU.RECIPE_UIV,
+ 1,
+ new Object[] { CustomItemList.eM_energyTunnel7_UV.get(32),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 32L }, ItemList.Electric_Pump_UIV.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 64),
+
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, MaterialsUEVplus.TranscendentMetal, 16),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 64),
+ GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.TranscendentMetal, 64),
+ ItemList.EnergisedTesseract.get(32),
+
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), },
+ new FluidStack[] { MaterialsUEVplus.ExcitedDTCC.getFluid(2_048_000),
+ MaterialsUEVplus.ExcitedDTPC.getFluid(2_048_000), MaterialsUEVplus.ExcitedDTRC.getFluid(2_048_000),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(2_048_000), },
+ ItemList.Machine_Multi_TranscendentPlasmaMixer.get(1),
+ 5 * MINUTES,
+ (int) TierEU.RECIPE_UIV);
+
+ // Stargate Recipes
+ if (EternalSingularity.isModLoaded() && SGCraft.isModLoaded()) {
+
+ final int baseStargateTime = 125_000 * 20;
+
+ // Stargate shield foil
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L),
+ (int) TierEU.RECIPE_MAX,
+ 32768,
+ (int) TierEU.RECIPE_UXV,
+ 64,
+ new ItemStack[] { ItemList.Casing_Dim_Bridge.get(64),
+ CustomItemList.StabilisationFieldGeneratorTier8.get(64),
+ GT_OreDictUnificator.get("blockShirabon", 64L), GT_OreDictUnificator.get("blockShirabon", 64L),
+ GT_OreDictUnificator.get(OrePrefixes.block, MaterialsUEVplus.SpaceTime, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Quantum, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.Universium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get("plateDenseShirabon", 8L), ItemList.Sensor_UXV.get(16L),
+ ItemList.Emitter_UXV.get(16L), getModItem(EternalSingularity.ID, "eternal_singularity", 16L),
+ MaterialsUEVplus.Universium.getNanite(16), MaterialsUEVplus.BlackDwarfMatter.getNanite(16),
+ MaterialsUEVplus.WhiteDwarfMatter.getNanite(16) },
+ new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L),
+ MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L),
+ Materials.SuperconductorUMVBase.getMolten(4 * 36864L),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) },
+ getItemContainer("StargateShieldingFoil").get(1L),
+ baseStargateTime,
+ (int) TierEU.RECIPE_UMV);
+
+ // Stargate chevron
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getItemContainer("StargateShieldingFoil").get(1L),
+ (int) TierEU.RECIPE_MAX,
+ 32_768,
+ (int) TierEU.RECIPE_UXV,
+ 64,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.block, MaterialsUEVplus.TranscendentMetal, 64L),
+ GT_OreDictUnificator.get("blockShirabon", 64), CustomItemList.EOH_Reinforced_Spatial_Casing.get(64),
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(64),
+
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 16L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Ruby, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Jasper, 16L),
+
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Opal, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Sapphire, 16L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plateDense, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator.get("plateDenseShirabon", 8),
+
+ ItemList.Electric_Motor_UXV.get(64L), ItemList.Electric_Piston_UXV.get(64L),
+ ItemList.Field_Generator_UXV.get(16L), getItemContainer("QuantumCircuit").get(1L)
+ .splitStack(32) },
+ new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L),
+ MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L),
+ MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(36864L),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) },
+ getItemContainer("StargateChevron").get(1L),
+ baseStargateTime,
+ (int) TierEU.RECIPE_UMV);
+
+ // Stargate Frame Part
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L),
+ (int) TierEU.RECIPE_MAX,
+ 32_768,
+ 500_000_000,
+ 64,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 64L),
+
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Osmiridium, 64L),
+ GT_OreDictUnificator.get("stickLongShirabon", 64),
+ getModItem(BartWorks.ID, "gt.bwMetaGeneratedstickLong", 64L, 39),
+ getModItem(GTPlusPlus.ID, "itemRodLongQuantum", 64L),
+
+ getModItem(GTPlusPlus.ID, "itemRodLongHypogen", 64L),
+ getModItem(GTPlusPlus.ID, "itemRodLongCelestialTungsten", 64L),
+ getModItem(BartWorks.ID, "gt.bwMetaGeneratedstickLong", 64L, 10106),
+ getModItem(GTPlusPlus.ID, "itemRodLongAstralTitanium", 64L),
+
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SuperconductorUMVBase, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.Universium, 64L),
+ getModItem(GTPlusPlus.ID, "itemRodLongAbyssalAlloy", 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 64L), },
+ new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L),
+ MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L), MaterialsUEVplus.Universium.getMolten(4 * 36864L),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) },
+ getItemContainer("StargateFramePart").get(1L),
+ baseStargateTime,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Dimensionally Transcendent Plasma Forge (DTPF)
+ if (EternalSingularity.isModLoaded()) {
+
+ // DTPF Controller.
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Dim_Bridge.get(1),
+ 32_000_000,
+ 4096,
+ 32_000_000,
+ 1,
+ new Object[] { ItemList.Casing_Dim_Bridge.get(4),
+ getModItem(GregTech.ID, "gt.blockmachines", 16L, 12730),
+ getItemContainer("Hatch_Energy_UEV").get(4L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUEV, 6),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 20L },
+ ItemList.Field_Generator_UEV.get(4), getModItem(EternalSingularity.ID, "eternal_singularity", 4L),
+ getModItem(GTPlusPlus.ID, "MU-metaitem.01", 1L, 32105),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 64L),
+ ItemList.Electric_Pump_UEV.get(4), ItemList.ZPM3.get(1),
+ getModItem(IndustrialCraft2.ID, "blockMachine2", 1, 0) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 128000),
+ new FluidStack(solderUEV, 36864 * 2),
+ new FluidStack(FluidRegistry.getFluid("molten.californium"), 36864),
+ Materials.NaquadahEnriched.getMolten(36864L) },
+ ItemList.Machine_Multi_PlasmaForge.get(1),
+ 5 * MINUTES,
+ (int) TierEU.RECIPE_UIV);
+
+ // Dimensional bridge.
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Dim_Injector.get(1),
+ 8_000_000,
+ 4096,
+ 32_000_000,
+ 1,
+ new Object[] { ItemList.Casing_Dim_Trans.get(1), ItemList.MicroTransmitter_UV.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2L },
+ getModItem(Avaritia.ID, "Singularity", 2L, 0),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 6),
+ getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 2, 0), ItemList.Field_Generator_UHV.get(1L) },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 8000),
+ new FluidStack(solderUEV, 1152 * 8), Materials.NaquadahEnriched.getMolten(1296L) },
+ ItemList.Casing_Dim_Bridge.get(1),
+ 240 * 20,
+ 32_000_000);
+
+ // Dimensional injection casing.
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Dim_Trans.get(1),
+ 2_000_000,
+ 2048,
+ 32_000_000,
+ 1,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Ledox, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.CallistoIce, 1),
+ ItemList.Reactor_Coolant_Sp_6.get(1L), getModItem(GTPlusPlus.ID, "itemScrewLaurenium", 12, 0),
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 2L },
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 2),
+ ItemList.Super_Chest_IV.get(1), ItemList.Super_Tank_IV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 1, 0), },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 1000),
+ new FluidStack(solderUEV, 576), Materials.NaquadahEnriched.getMolten(288L) },
+ ItemList.Casing_Dim_Injector.get(1),
+ 20 * 20,
+ 32_000_000);
+
+ // Dimensionally Transcendent Casing.
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(Avaritia.ID, "Singularity", 1L, 0),
+ 2_000_000,
+ 2048,
+ 32_000_000,
+ 1,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 6),
+ getModItem(GTPlusPlus.ID, "itemScrewLaurenium", 12, 0), ItemList.Reactor_Coolant_Sp_6.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 1), },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 500),
+ new FluidStack(solderUEV, 288), Materials.NaquadahEnriched.getMolten(144L) },
+ ItemList.Casing_Dim_Trans.get(1),
+ 20 * 20,
+ 32_000_000);
+ }
+
+ // Deep Dark Portal
+ if (BartWorks.isModLoaded()) {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(NewHorizonsCoreMod.ID, "item.HeavyDutyPlateTier8", 1, 0),
+ 16_777_216,
+ 2048,
+ 2_000_000,
+ 64,
+ new Object[] { getModItem(ExtraUtilities.ID, "cobblestone_compressed", 1, 7),
+ getModItem(IndustrialCraft2.ID, "blockMachine2", 1, 0),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Infinity, 4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32, 0), ItemList.Robot_Arm_UMV.get(4),
+ ItemList.Emitter_UMV.get(4), ItemList.Sensor_UMV.get(4), },
+ new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 50000),
+ Materials.Infinity.getMolten(144L * 512), Materials.Cheese.getMolten(232000L), },
+ ItemList.Block_BedrockiumCompressed.get(1),
+ 10000,
+ 5000000);
+ }
+
+ // Batteries
+ {
+
+ // Ultimate Battery
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Energy_Cluster.get(1L),
+ 12000,
+ 16,
+ 100000,
+ 3,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tritanium, 64L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, ItemList.Energy_Cluster.get(8L),
+ ItemList.Field_Generator_UV.get(2), ItemList.Circuit_Wafer_HPIC.get(64),
+ ItemList.Circuit_Wafer_HPIC.get(64), ItemList.Circuit_Parts_DiodeASMD.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 32), },
+ new FluidStack[] { new FluidStack(solderIndalloy, 2880),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000) },
+ ItemList.ZPM2.get(1),
+ 3000,
+ 400000);
+
+ // Really Ultimate Battery
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.ZPM2.get(1L),
+ 24000,
+ 64,
+ 200000,
+ 6,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 32L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, ItemList.ZPM2.get(8),
+ ItemList.Field_Generator_UHV.get(4), ItemList.Circuit_Wafer_UHPIC.get(64),
+ ItemList.Circuit_Wafer_UHPIC.get(64), ItemList.Circuit_Wafer_SoC2.get(32),
+ ItemList.Circuit_Parts_DiodeASMD.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorUHV, 64), },
+ new FluidStack[] { new FluidStack(solderUEV, 4608), Materials.Naquadria.getMolten(9216),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000) },
+ ItemList.ZPM3.get(1),
+ 4000,
+ 1600000);
+
+ // Extremely Ultimate Battery
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.ZPM3.get(1L),
+ 1_200_000,
+ 128,
+ 8_000_000,
+ 16,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.InfinityCatalyst, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.InfinityCatalyst, 32L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, ItemList.ZPM3.get(8),
+ ItemList.Field_Generator_UEV.get(4), ItemList.Circuit_Wafer_PPIC.get(64),
+ ItemList.Circuit_Wafer_PPIC.get(64), ItemList.Circuit_Wafer_SoC2.get(64),
+ ItemList.Circuit_Parts_DiodeXSMD.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 64), },
+ new FluidStack[] { new FluidStack(solderUEV, 9216), Materials.Quantium.getMolten(18_432),
+ Materials.Naquadria.getMolten(9_216 * 2), Materials.SuperCoolant.getFluid(64_000) },
+ ItemList.ZPM4.get(1),
+ 250 * 20,
+ 6_400_000);
+
+ if (GTPlusPlusEverglades.isModLoaded()) {
+ // Insanely Ultimate Battery
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.ZPM4.get(1),
+ 24_000_000,
+ 1_280,
+ 32_000_000,
+ 32,
+ new Object[] { ELEMENT.STANDALONE.HYPOGEN.getPlateDouble(32),
+ ELEMENT.STANDALONE.HYPOGEN.getPlateDouble(32),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, ItemList.ZPM4.get(8L),
+ ItemList.Field_Generator_UIV.get(4), ItemList.Circuit_Wafer_QPIC.get(64),
+ ItemList.Circuit_Wafer_QPIC.get(64),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RawPicoWafer", 64),
+ ItemList.Circuit_Parts_DiodeXSMD.get(64), ItemList.Circuit_Parts_InductorXSMD.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUIV, 64) },
+ new FluidStack[] { new FluidStack(solderUEV, 18_432),
+ ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(18_432),
+ Materials.Quantium.getMolten(18_432), Materials.SuperCoolant.getFluid(128_000) },
+ ItemList.ZPM5.get(1),
+ 300 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ // Mega Ultimate Battery
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.ZPM5.get(1L),
+ 480_000_000,
+ 12_288,
+ 128_000_000,
+ 64,
+ new Object[] { ELEMENT.STANDALONE.DRAGON_METAL.getPlateDouble(32),
+ ELEMENT.STANDALONE.DRAGON_METAL.getPlateDouble(32),
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, ItemList.ZPM5.get(8L),
+ ItemList.Field_Generator_UMV.get(4), ItemList.Circuit_Wafer_QPIC.get(64),
+ ItemList.Circuit_Wafer_QPIC.get(64),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 64),
+ ItemList.Circuit_Parts_DiodeXSMD.get(64), ItemList.Circuit_Parts_InductorXSMD.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 64) },
+ new FluidStack[] { new FluidStack(solderUEV, 36_864),
+ ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(36_864),
+ ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(36_864),
+ Materials.SuperCoolant.getFluid(256_000) },
+ ItemList.ZPM6.get(1),
+ 350 * 20,
+ (int) TierEU.RECIPE_UMV);
+ }
+ }
+
+ if (GTPlusPlus.isModLoaded()) {
+ // MK4 Computer
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.Compressed_Fusion_Reactor.get(1),
+ 320000,
+ 512,
+ 2000000,
+ 1,
+ new Object[] { GregtechItemList.Casing_Fusion_Internal.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L },
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 4),
+ ItemList.Field_Generator_UHV.get(2), ItemList.Circuit_Wafer_QPIC.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 32) },
+ new FluidStack[] { Materials.UUMatter.getFluid(50000), ALLOY.CINOBITE.getFluidStack(9216),
+ ALLOY.OCTIRON.getFluidStack(9216), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(9216), },
+ GregtechItemList.FusionComputer_UV2.get(1),
+ 6000,
+ 2000000);
+
+ // MK4 Coils
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Fusion_Coil.get(1L),
+ 160000,
+ 512,
+ 2000000,
+ 1,
+ new Object[] { ItemList.Energy_LapotronicOrb2.get(16L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 16L },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8), ItemList.Emitter_UHV.get(1),
+ ItemList.Sensor_UHV.get(1), ItemList.Casing_Fusion_Coil.get(1L), },
+ new FluidStack[] { Materials.UUMatter.getFluid(8000L), ALLOY.CINOBITE.getFluidStack(2304),
+ ALLOY.OCTIRON.getFluidStack(2304), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(2304), },
+ GregtechItemList.Casing_Fusion_Internal.get(1),
+ 1200,
+ 2000000);
+
+ // MK4 Casing
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_Fusion2.get(1L),
+ 80000,
+ 512,
+ 2000000,
+ 1,
+ new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Data), 16L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.TungstenCarbide, 8),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
+ ItemList.Electric_Motor_UHV.get(2), ItemList.Electric_Piston_UHV.get(1),
+ ItemList.Casing_Fusion2.get(1L), },
+ new FluidStack[] { Materials.UUMatter.getFluid(1000L), ALLOY.CINOBITE.getFluidStack(576),
+ ALLOY.OCTIRON.getFluidStack(576), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(576), },
+ GregtechItemList.Casing_Fusion_External.get(1),
+ 300,
+ 2000000);
+
+ // MK5 Computer
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.FusionComputer_UV2.get(1),
+ 2560000,
+ 4096,
+ (int) TierEU.RECIPE_UEV,
+ 8,
+ new Object[] { GregtechItemList.Casing_Fusion_Internal2.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L },
+ GT_OreDictUnificator.get("plateDenseMetastableOganesson", 4), ItemList.Field_Generator_UEV.get(2),
+ getItemContainer("PicoWafer").get(64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 32) },
+ new FluidStack[] { ELEMENT.getInstance().CURIUM.getFluidStack(9216),
+ ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(9216), ALLOY.ABYSSAL.getFluidStack(9216),
+ ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(9216) },
+ GregtechItemList.FusionComputer_UV3.get(1),
+ 6000,
+ (int) TierEU.RECIPE_UEV);
+
+ // MK5 Coils
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.Casing_Fusion_Internal.get(1),
+ 2560000,
+ 4096,
+ (int) TierEU.RECIPE_UEV,
+ 8,
+ new Object[] { ItemList.Energy_Module.get(16),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 16L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 8L },
+ ELEMENT.STANDALONE.RHUGNOR.getPlate(8), ItemList.Emitter_UEV.get(1), ItemList.Sensor_UEV.get(1),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2) },
+ new FluidStack[] { ELEMENT.getInstance().NEPTUNIUM.getFluidStack(2304),
+ ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(2304), ALLOY.ABYSSAL.getFluidStack(2304),
+ ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(2304) },
+ GregtechItemList.Casing_Fusion_Internal2.get(1),
+ 1200,
+ (int) TierEU.RECIPE_UEV);
+
+ // MK5 Casing
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.Casing_Fusion_External.get(1L),
+ 2560000,
+ 4096,
+ (int) TierEU.RECIPE_UEV,
+ 8,
+ new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Elite), 16L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.NaquadahAlloy, 8),
+ ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlate(8), ItemList.Electric_Motor_UEV.get(2),
+ ItemList.Electric_Piston_UEV.get(1), GregtechItemList.Casing_Fusion_External.get(1L) },
+ new FluidStack[] { ELEMENT.getInstance().FERMIUM.getFluidStack(1152),
+ ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(1152), ALLOY.ABYSSAL.getFluidStack(1152),
+ ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(1152) },
+ GregtechItemList.Casing_Fusion_External2.get(1),
+ 300,
+ (int) TierEU.RECIPE_UEV);
+ }
+
+ if (BloodMagic.isModLoaded() && KubaTech.isModLoaded() && DraconicEvolution.isModLoaded()) {
+ // Draconic Evolution Fusion Crafter Controller
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(KubaTech.ID, "defc.casing", 1, 8),
+ 16_777_216,
+ 1024,
+ 2_000_000,
+ 8,
+ new Object[] { getModItem(GregTech.ID, "gt.blockmachines", 1, 10783),
+ getModItem(KubaTech.ID, "defc.casing", 1, 8),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsBotania.GaiaSpirit, 1L),
+ ItemList.Casing_Coil_AwakenedDraconium.get(8L), ItemList.Electric_Motor_UHV.get(8L),
+ ItemList.Robot_Arm_UHV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4 },
+ ItemList.Gravistar.get(4, new Object() {}), getModItem(Thaumcraft.ID, "ItemEldritchObject", 1, 3),
+ getModItem(BloodMagic.ID, "bloodMagicBaseItems", 8, 29),
+ getModItem(BloodMagic.ID, "bloodMagicBaseItems", 8, 28), },
+ new FluidStack[] { new FluidStack(solderIndalloy, 2880), Materials.Void.getMolten(2880L),
+ Materials.DraconiumAwakened.getMolten(1440), },
+ getModItem(GregTech.ID, "gt.blockmachines", 1, 5001),
+ 1500,
+ 8_000_000);
+ // DE Schematics Cores Tier 1
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(KubaTech.ID, "defc.casing", 1, 9),
+ 5_000_000,
+ 512,
+ 1_000_000,
+ 4,
+ new Object[] { getModItem(DraconicEvolution.ID, "draconicCore", 1, 0),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Draconium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Ichorium, 1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 }, },
+ new FluidStack[] { Materials.Sunnarium.getMolten(14400L), Materials.Void.getMolten(28800L), },
+ getModItem(KubaTech.ID, "kubaitems", 1, 38),
+ 6000,
+ 500_000);
+
+ // DE Schematics Cores Tier 2
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(DraconicEvolution.ID, "draconicCore", 1, 0),
+ 10_000_000,
+ 1024,
+ 4_000_000,
+ 8,
+ new Object[] { getModItem(DraconicEvolution.ID, "draconicCore", 4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Draconium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1 }, },
+ new FluidStack[] { Materials.Neutronium.getMolten(14400L), Materials.Void.getMolten(57600L), },
+ getModItem(KubaTech.ID, "kubaitems", 1, 39),
+ 12000,
+ 2_000_000);
+
+ // DE Schematics Cores Tier 3
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(DraconicEvolution.ID, "wyvernCore", 1, 0),
+ 20_000_000,
+ 2048,
+ 16_000_000,
+ 16,
+ new Object[] { getModItem(DraconicEvolution.ID, "wyvernCore", 4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.DraconiumAwakened, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L } },
+ new FluidStack[] { Materials.Infinity.getMolten(14400L), Materials.Void.getMolten(115200L), },
+ getModItem(KubaTech.ID, "kubaitems", 1, 40),
+ 24000,
+ 8_000_000);
+
+ // DE Schematics Cores Tier 4
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ getModItem(DraconicEvolution.ID, "awakenedCore", 1, 0),
+ 40_000_000,
+ 4096,
+ 64_000_000,
+ 64,
+ new Object[] { getModItem(DraconicEvolution.ID, "awakenedCore", 8, 0),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.DraconiumAwakened, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, },
+ new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(14400L), Materials.Void.getMolten(230400L), },
+ getModItem(KubaTech.ID, "kubaitems", 1, 41),
+ 36000,
+ 32_000_000);
+ }
+
+ // Debug maintenance hatch
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Hatch_AutoMaintenance.get(1L),
+ 2764800,
+ 128,
+ 500000,
+ 6,
+ new Object[] { ItemList.Hatch_AutoMaintenance.get(1L), ItemList.Robot_Arm_UV.get(1L),
+ ItemList.Electric_Pump_UV.get(1L), ItemList.Conveyor_Module_UV.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L },
+ ItemList.Energy_LapotronicOrb2.get(1L), ItemList.Duct_Tape.get(64L), ItemList.Duct_Tape.get(64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64L), },
+ new FluidStack[] { Materials.Lubricant.getFluid(256000), new FluidStack(solderIndalloy, 1296), },
+ CustomItemList.hatch_CreativeMaintenance.get(1),
+ 6000,
+ 500000);
+
+ if (GTPlusPlus.isModLoaded()) {
+ // Debug uncertainty resolver
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.UncertaintyX_Hatch.get(1L),
+ 72_000_000,
+ 5_120,
+ 16_000_000,
+ 6,
+ new Object[] { CustomItemList.eM_Computer_Bus.get(1), CustomItemList.hatch_CreativeMaintenance.get(1),
+ ItemList.Field_Generator_UIV.get(1L), GregtechItemList.Laser_Lens_Special.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 2 }, CustomItemList.DATApipe.get(64),
+ CustomItemList.DATApipe.get(64), ItemList.Cover_Screen.get(1) },
+ new FluidStack[] { Materials.Iridium.getMolten(INGOTS * 100), new FluidStack(solderUEV, 2592),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 20000),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 20000) },
+ CustomItemList.hatch_CreativeUncertainty.get(1),
+ 200 * 20,
+ (int) TierEU.RECIPE_UIV);
+ }
+ }
+
+ private void itemPartsUHVAsslineRecipes() {
+
+ // ----------------------------------------------------------------------
+ // ------------------------- Set up information -------------------------
+ // ----------------------------------------------------------------------
+
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ int total_computation = 24000;
+ int comp_per_second = 32;
+ int research_eu_per_tick = 500_000;
+ int research_amperage = 1;
+
+ FluidStack fluid_0 = Materials.Naquadria.getMolten(2592);
+ FluidStack fluid_1 = new FluidStack(solderIndalloy, 2592);
+ FluidStack fluid_2 = Materials.Lubricant.getFluid(4000);
+
+ int crafting_time_in_ticks = 1000;
+ int crafting_eu_per_tick = 500_000;
+
+ // -------------------------------------------------------------
+
+ // ------------------------- UHV Motor -------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Motor_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SamariumMagnetic, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Motor_UHV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // --------------------- UHV Electric Pump ---------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Pump_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UHV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Neutronium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.CosmicNeutronium, 16L),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 32L },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.CosmicNeutronium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Pump_UHV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ----------------------- UHV Conveyor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Conveyor_Module_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UHV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 40L } },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Conveyor_Module_UHV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UHV Robot Arm --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Robot_Arm_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CosmicNeutronium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.CosmicNeutronium, 6L),
+ ItemList.Electric_Motor_UHV.get(2L), ItemList.Electric_Piston_UHV.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 6L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Robot_Arm_UHV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UHV Electric Piston --------------------
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Piston_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { ItemList.Electric_Motor_UHV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.CosmicNeutronium, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CosmicNeutronium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.CosmicNeutronium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 4L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Piston_UHV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UHV Emitter ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Emitter_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L),
+ ItemList.Electric_Motor_UHV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.CosmicNeutronium, 8L), ItemList.Gravistar.get(8L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Emitter_UHV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UHV Sensor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Sensor_UV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L),
+ ItemList.Electric_Motor_UHV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 8L), ItemList.Gravistar.get(8L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Sensor_UHV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ // ------------------------ UHV Field Generator ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Field_Generator_UV.get(1),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 6L), ItemList.Gravistar.get(4L),
+ ItemList.Emitter_UHV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 8L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Field_Generator_UHV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+ }
+
+ private void itemPartsUEVAsslineRecipes() {
+
+ // ----------------------------------------------------------------------
+ // ------------------------- Set up information -------------------------
+ // ----------------------------------------------------------------------
+
+ Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ int total_computation = 48_000;
+ int comp_per_second = 64;
+ int research_eu_per_tick = 2_000_000;
+ int research_amperage = 1;
+
+ FluidStack fluid_0 = Materials.Quantium.getMolten(2592);
+ FluidStack fluid_1 = new FluidStack(mutated_living_solder, 2592);
+ FluidStack fluid_2 = Materials.Lubricant.getFluid(4000);
+
+ int crafting_time_in_ticks = 1000;
+ int crafting_eu_per_tick = 2_000_000;
+
+ // -------------------------------------------------------------
+
+ // ------------------------- UEV Motor -------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Motor_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Motor_UEV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // --------------------- UEV Electric Pump ---------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Pump_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UEV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NetherStar, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Infinity, 16L),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Pump_UEV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ----------------------- UEV Conveyor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Conveyor_Module_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UEV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L },
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Conveyor_Module_UEV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UEV Robot Arm --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Robot_Arm_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Infinity, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Infinity, 6L),
+ ItemList.Electric_Motor_UEV.get(2L), ItemList.Electric_Piston_UEV.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 6L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Robot_Arm_UEV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UEV Electric Piston --------------------
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Piston_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { ItemList.Electric_Motor_UEV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Infinity, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Infinity, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Infinity, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 4L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Piston_UEV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UEV Emitter ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Emitter_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L),
+ ItemList.Electric_Motor_UEV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Infinity, 16L), ItemList.Gravistar.get(16L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Emitter_UEV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UEV Sensor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Sensor_UHV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L),
+ ItemList.Electric_Motor_UEV.get(1), GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 8L),
+ ItemList.Gravistar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Sensor_UEV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ // ------------------------ UEV Field Generator ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Field_Generator_UHV.get(1),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 6L), ItemList.Gravistar.get(8L),
+ ItemList.Emitter_UEV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 8L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Field_Generator_UEV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+ }
+
+ private void itemPartsUIVAsslineRecipes() {
+
+ // ----------------------------------------------------------------------
+ // ------------------------- Set up information -------------------------
+ // ----------------------------------------------------------------------
+
+ Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+ Fluid celestialTungsten = FluidRegistry.getFluid("molten.celestialtungsten");
+
+ int total_computation = 96_000;
+ int comp_per_second = 128;
+ int research_eu_per_tick = 8_000_000;
+ int research_amperage = 1;
+
+ FluidStack fluid_0 = celestialTungsten != null ? new FluidStack(celestialTungsten, 576) : null;
+ FluidStack fluid_1 = new FluidStack(mutated_living_solder, 2592);
+ FluidStack fluid_2 = Materials.Lubricant.getFluid(4000);
+
+ int crafting_time_in_ticks = 1000;
+ int crafting_eu_per_tick = 8_000_000;
+
+ // -------------------------------------------------------------
+
+ // ------------------------- UIV Motor -------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Motor_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Motor_UIV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // --------------------- UIV Electric Pump ---------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Pump_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UIV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.DraconiumAwakened, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.TranscendentMetal, 16L),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.TranscendentMetal, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Pump_UIV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ----------------------- UIV Conveyor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Conveyor_Module_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UIV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L },
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Conveyor_Module_UIV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UIV Robot Arm --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Robot_Arm_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.TranscendentMetal, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 6L),
+ ItemList.Electric_Motor_UIV.get(2L), ItemList.Electric_Piston_UIV.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 6L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Robot_Arm_UIV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UIV Electric Piston --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Piston_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { ItemList.Electric_Motor_UIV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.TranscendentMetal, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.TranscendentMetal, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 4L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Electric_Piston_UIV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UIV Emitter ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Emitter_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L),
+ ItemList.Electric_Motor_UIV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.TranscendentMetal, 16L),
+ ItemList.Gravistar.get(32L), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L },
+ getModItem(GTPlusPlus.ID, "itemFoilArceusAlloy2B", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilLafiumCompound", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilCinobiteA243", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilPikyonium64B", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Emitter_UIV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UIV Sensor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Sensor_UEV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L),
+ ItemList.Electric_Motor_UIV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 8L),
+ ItemList.Gravistar.get(32), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L },
+ getModItem(GTPlusPlus.ID, "itemFoilArceusAlloy2B", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilLafiumCompound", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilCinobiteA243", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilPikyonium64B", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 7L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Sensor_UIV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ // ------------------------ UIV Field Generator ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Field_Generator_UEV.get(1),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 6L),
+ ItemList.Gravistar.get(16L), ItemList.Emitter_UIV.get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 8L) },
+ new FluidStack[] { fluid_0, fluid_1 },
+ ItemList.Field_Generator_UIV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ }
+
+ private void itemPartsUMVAsslineRecipes() {
+
+ // ----------------------------------------------------------------------
+ // ------------------------- Set up information -------------------------
+ // ----------------------------------------------------------------------
+
+ Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+ Fluid hypogen = FluidRegistry.getFluid("molten.hypogen");
+ Fluid celestialTungsten = FluidRegistry.getFluid("molten.celestialtungsten");
+
+ int total_computation = 192_000;
+ int comp_per_second = 256;
+ int research_eu_per_tick = 32_000_000;
+ int research_amperage = 1;
+
+ FluidStack fluid_0 = hypogen != null ? new FluidStack(hypogen, 576) : null;
+ FluidStack fluid_1 = celestialTungsten != null ? new FluidStack(celestialTungsten, 576) : null;
+ FluidStack fluid_2 = new FluidStack(mutated_living_solder, 2592);
+ FluidStack fluid_3 = Materials.Lubricant.getFluid(4000);
+
+ int crafting_time_in_ticks = 1000;
+ int crafting_eu_per_tick = 32_000_000;
+
+ // -------------------------------------------------------------
+
+ // ------------------------- UMV Motor -------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Motor_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 32L),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 },
+ ItemList.Electric_Motor_UMV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // --------------------- UMV Electric Pump ---------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Pump_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UMV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Infinity, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.SpaceTime, 16L),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.SpaceTime, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 },
+ ItemList.Electric_Pump_UMV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ----------------------- UMV Conveyor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Conveyor_Module_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { ItemList.Electric_Motor_UMV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L },
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 },
+ ItemList.Conveyor_Module_UMV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UMV Robot Arm --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Robot_Arm_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, 6L),
+ ItemList.Electric_Motor_UMV.get(2L), ItemList.Electric_Piston_UMV.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 2L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 6L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 },
+ ItemList.Robot_Arm_UMV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UMV Electric Piston --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Piston_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new ItemStack[] { ItemList.Electric_Motor_UMV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 4L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 },
+ ItemList.Electric_Piston_UMV.get(1),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UMV Emitter ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Emitter_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L),
+ ItemList.Electric_Motor_UMV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.SpaceTime, 16L),
+ ItemList.Gravistar.get(64), new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L },
+ getModItem(GTPlusPlus.ID, "itemFoilCelestialTungsten", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilQuantum", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilAstralTitanium", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilTitansteel", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Emitter_UMV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UMV Sensor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Sensor_UIV.get(1L),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L),
+ ItemList.Electric_Motor_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 8L), ItemList.Gravistar.get(64),
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L },
+ getModItem(GTPlusPlus.ID, "itemFoilCelestialTungsten", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilQuantum", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilAstralTitanium", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFoilTitansteel", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 7L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Sensor_UMV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ // ------------------------ UMV Field Generator ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Field_Generator_UIV.get(1),
+ total_computation,
+ comp_per_second,
+ research_eu_per_tick,
+ research_amperage,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6L),
+ ItemList.Gravistar.get(32L), ItemList.Emitter_UMV.get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4 },
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 8L) },
+ new FluidStack[] { fluid_0, fluid_1, fluid_2 },
+ ItemList.Field_Generator_UMV.get(1L),
+ crafting_time_in_ticks,
+ crafting_eu_per_tick);
+
+ // ---------------------------------------------------------------------
+
+ }
+
+ private void itemPartsUXVAsslineRecipes() {
+
+ // ----------------------------------------------------------------------
+ // ------------------------- Set up information -------------------------
+ // ----------------------------------------------------------------------
+
+ Fluid mutatedLivingSolder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ FluidStack moltenMHDCSM_576 = MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(576);
+ FluidStack moltenSpaceTime_576 = MaterialsUEVplus.SpaceTime.getMolten(576);
+ FluidStack moltenUniversium_576 = MaterialsUEVplus.Universium.getMolten(576);
+ FluidStack lubricantFluid_8000 = Materials.Lubricant.getFluid(8000);
+ FluidStack solderingAlloy_14_400 = new FluidStack(mutatedLivingSolder, 14_400);
+
+ int totalComputation = 384_000;
+ int compPerSecond = 512;
+ int researchEuPerTick = 64_000_000;
+ int researchAmperage = 2;
+
+ int craftingTimeInTicks = 1000;
+ int craftingEuPerTick = (int) TierEU.RECIPE_UMV;
+
+ // -------------------------------------------------------------
+
+ // ------------------------- UXV Motor -------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Motor_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new ItemStack[] { ItemList.EnergisedTesseract.get(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 32L),
+
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L),
+
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L),
+
+ GT_OreDictUnificator.get("wireFineShirabon", 64L), GT_OreDictUnificator.get("wireFineShirabon", 64L),
+
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L),
+ Materials.Neutronium.getNanite(4) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 },
+ ItemList.Electric_Motor_UXV.get(1L),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // --------------------- UXV Electric Pump ---------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Pump_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] { ItemList.Electric_Motor_UXV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.screw, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsKevlar.Kevlar, 64L),
+ GT_OreDictUnificator.get("ringRadoxPoly", 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.rotor, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L),
+ GT_OreDictUnificator.get("rotorShirabon", 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L),
+ Materials.Neutronium.getNanite(4) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 },
+ ItemList.Electric_Pump_UXV.get(1),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // ----------------------- UXV Conveyor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Conveyor_Module_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] { ItemList.Electric_Motor_UXV.get(2L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L),
+ MaterialsKevlar.Kevlar.getPlates(64), MaterialsKevlar.Kevlar.getPlates(16),
+ GT_OreDictUnificator.get("plateRadoxPoly", 64L), GT_OreDictUnificator.get("plateRadoxPoly", 16L),
+ Materials.Neutronium.getNanite(4) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 },
+ ItemList.Conveyor_Module_UXV.get(1),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UXV Robot Arm --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Robot_Arm_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] {
+ GT_OreDictUnificator
+ .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.gear, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L),
+ GT_OreDictUnificator.get("gearGtShirabon", 2L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.gearGtSmall, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L),
+ GT_OreDictUnificator.get("gearGtSmallShirabon", 6L), ItemList.Electric_Motor_UXV.get(2L),
+ ItemList.Electric_Piston_UXV.get(1L), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 2L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L },
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 8L },
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 6L),
+ Materials.Neutronium.getNanite(8) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 },
+ ItemList.Robot_Arm_UXV.get(1L),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // -------------------- UXV Electric Piston --------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Electric_Piston_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new ItemStack[] { ItemList.Electric_Motor_UXV.get(1L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.stick, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.gear, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L),
+ GT_OreDictUnificator.get("gearGtShirabon", 2L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.gearGtSmall, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L),
+ GT_OreDictUnificator.get("gearGtSmallShirabon", 4L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 4L),
+ Materials.Neutronium.getNanite(4) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 },
+ ItemList.Electric_Piston_UXV.get(1),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UXV Emitter ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Emitter_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] {
+ GT_OreDictUnificator
+ .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L),
+ ItemList.Electric_Motor_UXV.get(1L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.stick, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L),
+ ItemList.NuclearStar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L },
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64),
+ GT_OreDictUnificator.get("foilShirabon", 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.SpaceTime, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.Universium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 7L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 7L),
+ Materials.Neutronium.getNanite(8)
+
+ },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 },
+ ItemList.Emitter_UXV.get(1L),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // -------------------------------------------------------------
+
+ // ------------------------ UXV Sensor ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Sensor_UMV.get(1L),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] {
+ GT_OreDictUnificator
+ .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L),
+ ItemList.Electric_Motor_UXV.get(1L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L),
+ ItemList.NuclearStar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L },
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64),
+ GT_OreDictUnificator.get("foilShirabon", 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.SpaceTime, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.Universium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 7L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 7L),
+ Materials.Neutronium.getNanite(8) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 },
+ ItemList.Sensor_UXV.get(1L),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // ---------------------------------------------------------------------
+
+ // ------------------------ UXV Field Generator ------------------------
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Field_Generator_UMV.get(1),
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] {
+ GT_OreDictUnificator
+ .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L),
+ ItemList.NuclearStar.get(64L), ItemList.Emitter_UXV.get(4L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 8 },
+
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator
+ .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L),
+ GT_OreDictUnificator.get("wireFineShirabon", 64L), GT_OreDictUnificator.get("wireFineShirabon", 64L),
+
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 8L),
+ Materials.Neutronium.getNanite(12) },
+ new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 },
+ ItemList.Field_Generator_UXV.get(1L),
+ craftingTimeInTicks,
+ craftingEuPerTick);
+
+ // ---------------------------------------------------------------------
+
+ }
+
+ private void addEOHRecipes() {
+ Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+ ItemStack largeShirabonPlate = TGregUtils.newItemStack(Materials.get("Shirabon"), PartTypes.LargePlate, 1);
+ ItemStack largeInfinityPlate = new ItemStack(TinkerTools.largePlate, 1, Tonkers.infinityMetalId);
+ ItemStack largeBedrockiumPlate = new ItemStack(TinkerTools.largePlate, 1, ExtraUtils.tcon_bedrock_material_id);
+ ItemStack largeCosmicNeutroniumPlate = new ItemStack(TinkerTools.largePlate, 1, Tonkers.neutroniumId);
+
+ final FluidStack[] specialFluid = new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(1_440),
+ MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440),
+ MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440),
+ MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440),
+ MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440) };
+
+ final ItemStack[] plateList = new ItemStack[] {
+ // Dense Shirabon plate.
+ GT_OreDictUnificator.get("boltShirabon", 2),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 2),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 8),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 32),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 2),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 8),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 32),
+ GT_OreDictUnificator
+ .get(OrePrefixes.bolt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2),
+ GT_OreDictUnificator
+ .get(OrePrefixes.bolt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8) };
+
+ // EOH Controller Recipe.
+ {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Machine_Multi_PlasmaForge.get(1),
+ 512_000_000, // total comp
+ 2 * 16_384, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ 64, // amperage
+ new Object[] {
+ // Space elevator controller.
+ getModItem(GregTech.ID, "gt.blockmachines", 16, 14003), ItemList.Machine_Multi_PlasmaForge.get(4),
+
+ CustomItemList.EOH_Infinite_Energy_Casing.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier0.get(1),
+
+ CustomItemList.Machine_Multi_Computer.get(64),
+ // Ultimate Time Anomaly.
+ getModItem(GregTech.ID, "gt.blockmachines", 64, 11107), ItemList.Quantum_Chest_IV.get(64),
+ // Void miner III.
+ getModItem(GregTech.ID, "gt.blockmachines", 64, 12739),
+
+ ItemList.Field_Generator_UMV.get(16), ItemList.Robot_Arm_UMV.get(16), ItemList.ZPM4.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 64) },
+ new FluidStack[] { MaterialsUEVplus.Time.getMolten(144_000), MaterialsUEVplus.Space.getMolten(144_000),
+ FluidUtils.getFluidStack("molten.metastable oganesson", 144 * 256 * 4),
+ FluidUtils.getFluidStack("molten.shirabon", 144 * 256 * 4), },
+ CustomItemList.Machine_Multi_EyeOfHarmony.get(1),
+ 400 * MINUTES,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // EOH Spatial Individual Casing
+ {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ // Dyson Swarm Module Deployment Unit Base Casing
+ getModItem(GalaxySpace.ID, "dysonswarmparts", 1, 2),
+ 256_000_000, // total comp
+ 16_384, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ 32, // amperage
+ new Object[] {
+ // Space elevator blocks.
+ getModItem(GTNHIntergalactic.ID, "gt.blockcasingsSE", 64, 0),
+ // Cosmic neutronium block.
+ getModItem(Avaritia.ID, "Resource_Block", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Neutronium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Neutronium, 48), largeBedrockiumPlate,
+ largeCosmicNeutroniumPlate, largeShirabonPlate, largeInfinityPlate,
+ // UV Solar panel
+ getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0), ItemList.Quantum_Chest_IV.get(1),
+ // Gravitation Engine
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), ItemList.EnergisedTesseract.get(1) },
+
+ new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 4),
+ Materials.CosmicNeutronium.getMolten(144 * 256 * 4), new FluidStack(solderUEV, 144 * 256 * 2),
+ MaterialsUEVplus.Space.getMolten(1_440) },
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(4),
+ 10_000,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // EOH Spacetime Compression
+ {
+ // ME Digital singularity.
+ final ItemStack ME_Singularity = getModItem(
+ "appliedenergistics2",
+ "item.ItemExtremeStorageCell.Singularity",
+ 1);
+ final ItemStack baseCasing = CustomItemList.EOH_Reinforced_Spatial_Casing.get(1);
+
+ int baseCompPerSec = 16_384;
+
+ int set;
+ int tier;
+ int absoluteTier;
+
+ // T0 - Shirabon
+ // T1 - White Dwarf Matter
+ // T2 - White Dwarf Matter
+ // T3 - White Dwarf Matter
+ // T4 - Black Dwarf Matter
+ // T5 - Black Dwarf Matter
+ // T6 - Black Dwarf Matter
+ // T7 - Black Dwarf Matter
+ // T8 - MHDCSM.
+
+ {
+ tier = 1;
+ set = 1;
+
+ absoluteTier = 0;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T7 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Cosmic fabric manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity,
+ plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 1;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T7 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Cosmic fabric manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity, ME_Singularity,
+ plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 2;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T7 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Cosmic fabric manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity, ME_Singularity,
+ ME_Singularity, plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ {
+ tier = 1;
+ set = 2;
+ absoluteTier = 3;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T8 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Infinity infused manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity,
+ ME_Singularity, ME_Singularity, plateList[absoluteTier],
+ getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 4;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T8 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Infinity infused manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity,
+ ME_Singularity, ME_Singularity, ME_Singularity, plateList[absoluteTier],
+ getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 5;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T8 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Infinity infused manipulator
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity,
+ ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, plateList[absoluteTier],
+ getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ {
+ tier = 1;
+ set = 3;
+ absoluteTier = 6;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T9 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Spacetime continuum ripper
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity,
+ ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity,
+ plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 7;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T9 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Spacetime continuum ripper
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity,
+ ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity,
+ ME_Singularity, plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ tier++;
+ absoluteTier = 8;
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1),
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing,
+ // T9 Yotta cell.
+ getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)),
+ // quantum tank V (max tier)
+ ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)),
+ // Inf chest
+ getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1),
+ // Spacetime continuum ripper
+ getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity,
+ ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity,
+ ME_Singularity, ME_Singularity, plateList[absoluteTier],
+ getItemContainer("QuantumCircuit").get(set) },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], },
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1),
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+ }
+ }
+
+ // EOH Time Dilation Field Generators.
+ {
+ final ItemStack baseCasing = CustomItemList.EOH_Reinforced_Temporal_Casing.get(1);
+
+ int baseCompPerSec = 16_384;
+
+ // T0 - Shirabon
+ // T1 - White Dwarf Matter
+ // T2 - White Dwarf Matter
+ // T3 - White Dwarf Matter
+ // T4 - Black Dwarf Matter
+ // T5 - Black Dwarf Matter
+ // T6 - Black Dwarf Matter
+ // T7 - Black Dwarf Matter
+ // T8 - MHDCSM.
+
+ final ItemStack[] fusionReactors = new ItemStack[] { ItemList.FusionComputer_ZPMV.get(1),
+ ItemList.FusionComputer_ZPMV.get(2), ItemList.FusionComputer_ZPMV.get(3),
+ ItemList.FusionComputer_UV.get(1), ItemList.FusionComputer_UV.get(2), ItemList.FusionComputer_UV.get(3),
+ // MK4 Fusion Computer.
+ getModItem(GregTech.ID, "gt.blockmachines", 1, 965),
+ getModItem(GregTech.ID, "gt.blockmachines", 2, 965),
+ getModItem(GregTech.ID, "gt.blockmachines", 3, 965) };
+
+ final ItemStack[] fusionCoils = new ItemStack[] { getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 1),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 1),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 1),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 2),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 2),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 3),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 3),
+ getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 3) };
+
+ final ItemStack[] researchStuff = new ItemStack[] { baseCasing,
+ CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier1.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier2.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier3.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier4.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier5.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier6.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier7.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(1) };
+
+ // Spectral Components
+ // Cycling should fix issues with conflicting recipes for T1-T2, T4-T5 & T7-T8
+ final ItemStack[] spectralComponents = new ItemStack[] {
+ // Red Spectral Component
+ getModItem(SuperSolarPanels.ID, "redcomponent", 64),
+ // Green Spectral Component
+ getModItem(SuperSolarPanels.ID, "greencomponent", 64),
+ // Blue Spectral Component
+ getModItem(SuperSolarPanels.ID, "bluecomponent", 64) };
+
+ for (int absoluteTier = 0; absoluteTier < 9; absoluteTier++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ researchStuff[absoluteTier],
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] { baseCasing, fusionReactors[absoluteTier], fusionCoils[absoluteTier],
+ // UV Solar panel
+ getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", absoluteTier + 1, 0),
+
+ getItemContainer("QuantumCircuit").get(absoluteTier + 1),
+ // Red Spectral Component
+ spectralComponents[absoluteTier % spectralComponents.length],
+ // Green Spectral Component
+ spectralComponents[(absoluteTier + 1) % spectralComponents.length],
+ // Blue Spectral Component
+ spectralComponents[(absoluteTier + 2) % spectralComponents.length],
+
+ plateList[absoluteTier],
+ // Dyson Swarm Module Deployment Unit Base Casing
+ getModItem(GalaxySpace.ID, "dysonswarmparts", (absoluteTier + 1) * 4, 2),
+ // Dyson Swarm Energy Receiver Dish Block
+ getModItem(GalaxySpace.ID, "dysonswarmparts", (absoluteTier + 1) * 4, 1),
+ // Ultimate Time Anomaly.
+ getModItem(GregTech.ID, "gt.blockmachines", (absoluteTier + 1) * 4, 11107),
+
+ ItemList.Energy_Module.get(absoluteTier + 1), GT_OreDictUnificator
+ .get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, (absoluteTier + 1) * 4),
+
+ },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Time.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] },
+ researchStuff[absoluteTier + 1],
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ }
+
+ // EOH Stabilisation Field Generators.
+ {
+ final ItemStack baseCasing = CustomItemList.EOH_Infinite_Energy_Casing.get(1);
+
+ int baseCompPerSec = 16_384;
+
+ // T0 - Shirabon
+ // T1 - White Dwarf Matter
+ // T2 - White Dwarf Matter
+ // T3 - White Dwarf Matter
+ // T4 - Black Dwarf Matter
+ // T5 - Black Dwarf Matter
+ // T6 - Black Dwarf Matter
+ // T7 - Black Dwarf Matter
+ // T8 - MHDCSM.
+
+ final ItemStack[] researchStuff = new ItemStack[] { baseCasing,
+ CustomItemList.StabilisationFieldGeneratorTier0.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier1.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier2.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier3.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier4.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier5.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier6.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier7.get(1),
+ CustomItemList.StabilisationFieldGeneratorTier8.get(1) };
+
+ final ItemStack[] timeCasings = new ItemStack[] { CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier1.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier2.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier3.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier4.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier5.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier6.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier7.get(1),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(1) };
+
+ final ItemStack[] spatialCasings = new ItemStack[] {
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1) };
+
+ for (int absoluteTier = 0; absoluteTier < 9; absoluteTier++) {
+
+ // spotless:off
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ researchStuff[absoluteTier],
+ (absoluteTier + 1) * 48_000_000, // total comp
+ (absoluteTier + 1) * baseCompPerSec, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ (absoluteTier + 1) * 8, // amperage
+ new Object[] {
+ timeCasings[absoluteTier],
+ spatialCasings[absoluteTier],
+ baseCasing,
+ // Dyson Swarm Module.
+ getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 4 * (absoluteTier + 1), 0),
+
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 4 * (absoluteTier + 1)),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 4 * (absoluteTier + 1)),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUEVBase, 4 * (absoluteTier + 1)),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Longasssuperconductornameforuhvwire, 4 * (absoluteTier + 1)),
+
+ // Gravitation Engine
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3),
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3),
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3),
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3),
+
+ plateList[absoluteTier],
+ getItemContainer("QuantumCircuit").get(2 * (absoluteTier + 1)),
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, MaterialsUEVplus.SpaceTime, absoluteTier + 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, absoluteTier + 1)
+
+
+ },
+ new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))),
+ MaterialsUEVplus.Time.getMolten(1_440 * (absoluteTier + 1)),
+ MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)),
+ specialFluid[absoluteTier] },
+ researchStuff[absoluteTier + 1],
+ (absoluteTier + 1) * 4_000 * 20,
+ (int) TierEU.RECIPE_UMV);
+ // spotless:on
+ }
+
+ }
+
+ // EOH Reinforced Temporal casings
+ {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ // Ultimate Time Anomaly.
+ getModItem(GregTech.ID, "gt.blockmachines", 1, 11107),
+ 256_000_000, // total comp
+ 16_384, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ 32, // amperage
+ new Object[] {
+ // Space elevator blocks.
+ getModItem(GTNHIntergalactic.ID, "gt.blockcasingsSE", 64, 0),
+ // Cosmic neutronium block.
+ getModItem(Avaritia.ID, "Resource_Block", 64, 0),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Neutronium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Neutronium, 48),
+ // Large Bedrockium Plate
+ largeBedrockiumPlate, largeCosmicNeutroniumPlate, largeShirabonPlate, largeInfinityPlate,
+ // UV Solar panel
+ getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0),
+ // Ultimate Time Anomaly.
+ getModItem(GregTech.ID, "gt.blockmachines", 4, 11107),
+ // Gravitation Engine.
+ getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), ItemList.EnergisedTesseract.get(1) },
+
+ new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 4),
+ Materials.CosmicNeutronium.getMolten(144 * 256 * 4), new FluidStack(solderUEV, 144 * 256 * 2),
+ MaterialsUEVplus.Time.getMolten(1_440) },
+ CustomItemList.EOH_Reinforced_Temporal_Casing.get(4),
+ 10_000,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // EOH Infinite Spacetime Energy Boundary Casing
+ {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 1),
+ 256_000_000, // total comp
+ 16_384, // comp/s
+ (int) TierEU.RECIPE_MAX, // eu/t
+ 32, // amperage
+ new Object[] { getModItem(GregTech.ID, "gt.blockmachines", 1, 13106),
+ // UV Solar panel
+ getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0),
+ // UHV Capacitor block
+ getModItem(KekzTech.ID, "kekztech_lapotronicenergyunit_block", 1, 5),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 4),
+
+ CustomItemList.Machine_Multi_Transformer.get(16), ItemList.Wireless_Hatch_Energy_UMV.get(4),
+ CustomItemList.eM_energyTunnel5_UMV.get(1),
+ // High Energy Flow Circuit.
+ getModItem(NewHorizonsCoreMod.ID, "item.HighEnergyFlowCircuit", 64, 0),
+
+ // Metastable Oganesson Plate.
+ GT_OreDictUnificator.get("plateMetastableOganesson", 6),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlueTopaz, 6),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CallistoIce, 6),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Ledox, 6),
+
+ // Metastable Oganesson Screw.
+ GT_OreDictUnificator.get("screwMetastableOganesson", 6),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.BlueTopaz, 6),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.CallistoIce, 6),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Ledox, 6), },
+
+ new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 16),
+ Materials.CosmicNeutronium.getMolten(144 * 256 * 16), new FluidStack(solderUEV, 144 * 256 * 8),
+ MaterialsUEVplus.SpaceTime.getMolten(16_000) },
+ CustomItemList.EOH_Infinite_Energy_Casing.get(1),
+ 10_000,
+ (int) TierEU.RECIPE_UMV);
+ }
+
+ // Astral Array Fabricator
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1),
+ 480_000_000,
+ 32_768,
+ (int) TierEU.RECIPE_MAX,
+ 64,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 8),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 8),
+ ItemList.EnergisedTesseract.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.Eternity, 16),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(10),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(40),
+ CustomItemList.StabilisationFieldGeneratorTier8.get(48),
+ CustomItemList.EOH_Infinite_Energy_Casing.get(32),
+ CustomItemList.EOH_Reinforced_Temporal_Casing.get(64),
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), ItemList.Field_Generator_UMV.get(16) },
+ new FluidStack[] { MaterialsUEVplus.Space.getMolten(32_768L * 64),
+ MaterialsUEVplus.Eternity.getMolten(16_384L * 64), MaterialsUEVplus.ExcitedDTSC.getFluid(8_192L * 64) },
+ CustomItemList.astralArrayFabricator.get(1),
+ 300 * SECONDS,
+ (int) TierEU.RECIPE_UXV);
+
+ }
+
+ private void addWirelessEnergyRecipes() {
+
+ Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null
+ ? FluidRegistry.getFluid("molten.mutatedlivingsolder")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ int recipeDurationTicks = 20 * 20;
+ int recipeEuPerTick = 128_000_000;
+
+ int researchEuPerTick = 128_000_000;
+ int researchAmperage = 4;
+ int compPerSecond = 2000;
+ int totalComputation = 500_000;
+
+ ItemStack[] energyHatches = { ItemList.Hatch_Energy_ULV.get(1), ItemList.Hatch_Energy_LV.get(1),
+ ItemList.Hatch_Energy_MV.get(1), ItemList.Hatch_Energy_HV.get(1), ItemList.Hatch_Energy_EV.get(1),
+ ItemList.Hatch_Energy_IV.get(1), ItemList.Hatch_Energy_LuV.get(1), ItemList.Hatch_Energy_ZPM.get(1),
+ ItemList.Hatch_Energy_UV.get(1), ItemList.Hatch_Energy_MAX.get(1),
+ getItemContainer("Hatch_Energy_UEV").get(1L), getItemContainer("Hatch_Energy_UIV").get(1L),
+ getItemContainer("Hatch_Energy_UMV").get(1L), getItemContainer("Hatch_Energy_UXV").get(1L) };
+
+ ItemStack[] energyHatches_4A = { CustomItemList.eM_energyMulti4_EV.get(1),
+ CustomItemList.eM_energyMulti4_IV.get(1), CustomItemList.eM_energyMulti4_LuV.get(1),
+ CustomItemList.eM_energyMulti4_ZPM.get(1), CustomItemList.eM_energyMulti4_UV.get(1),
+ CustomItemList.eM_energyMulti4_UHV.get(1), CustomItemList.eM_energyMulti4_UEV.get(1),
+ CustomItemList.eM_energyMulti4_UIV.get(1), CustomItemList.eM_energyMulti4_UMV.get(1),
+ CustomItemList.eM_energyMulti4_UXV.get(1) };
+
+ ItemStack[] energyHatches_16A = { CustomItemList.eM_energyMulti16_EV.get(1),
+ CustomItemList.eM_energyMulti16_IV.get(1), CustomItemList.eM_energyMulti16_LuV.get(1),
+ CustomItemList.eM_energyMulti16_ZPM.get(1), CustomItemList.eM_energyMulti16_UV.get(1),
+ CustomItemList.eM_energyMulti16_UHV.get(1), CustomItemList.eM_energyMulti16_UEV.get(1),
+ CustomItemList.eM_energyMulti16_UIV.get(1), CustomItemList.eM_energyMulti16_UMV.get(1),
+ CustomItemList.eM_energyMulti16_UXV.get(1) };
+
+ ItemStack[] energyHatches_64A = { CustomItemList.eM_energyMulti64_EV.get(1),
+ CustomItemList.eM_energyMulti64_IV.get(1), CustomItemList.eM_energyMulti64_LuV.get(1),
+ CustomItemList.eM_energyMulti64_ZPM.get(1), CustomItemList.eM_energyMulti64_UV.get(1),
+ CustomItemList.eM_energyMulti64_UHV.get(1), CustomItemList.eM_energyMulti64_UEV.get(1),
+ CustomItemList.eM_energyMulti64_UIV.get(1), CustomItemList.eM_energyMulti64_UMV.get(1),
+ CustomItemList.eM_energyMulti64_UXV.get(1) };
+
+ ItemStack[] laserTargets_UXV = { CustomItemList.eM_energyTunnel1_UXV.get(1),
+ CustomItemList.eM_energyTunnel2_UXV.get(1), CustomItemList.eM_energyTunnel3_UXV.get(1),
+ CustomItemList.eM_energyTunnel4_UXV.get(1), CustomItemList.eM_energyTunnel5_UXV.get(1),
+ CustomItemList.eM_energyTunnel6_UXV.get(1), CustomItemList.eM_energyTunnel7_UXV.get(1) };
+
+ ItemStack[] dynamoHatches = { ItemList.Hatch_Dynamo_ULV.get(1), ItemList.Hatch_Dynamo_LV.get(1),
+ ItemList.Hatch_Dynamo_MV.get(1), ItemList.Hatch_Dynamo_HV.get(1), ItemList.Hatch_Dynamo_EV.get(1),
+ ItemList.Hatch_Dynamo_IV.get(1), ItemList.Hatch_Dynamo_LuV.get(1), ItemList.Hatch_Dynamo_ZPM.get(1),
+ ItemList.Hatch_Dynamo_UV.get(1), ItemList.Hatch_Dynamo_MAX.get(1),
+ getItemContainer("Hatch_Dynamo_UEV").get(1L), getItemContainer("Hatch_Dynamo_UIV").get(1L),
+ getItemContainer("Hatch_Dynamo_UMV").get(1L), getItemContainer("Hatch_Dynamo_UXV").get(1L) };
+
+ Object[] circuitsTierPlusTwo = { new Object[] { OrePrefixes.circuit.get(Materials.Good), 1L }, // MV
+ new Object[] { OrePrefixes.circuit.get(Materials.Advanced), 1L }, // HV
+ new Object[] { OrePrefixes.circuit.get(Materials.Data), 1L }, // EV
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 1L }, // IV
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 1L }, // LuV
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1L }, // ZPM
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1L }, // UV
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, // UHV
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, // UEV
+ new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, // UIV
+ new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1L }, // UMV
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1L }, // UXV
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L }, // MAX (Technically not MAX, can be
+ // changed once MAX circuits become
+ // craftable)
+ new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 16L } // MAX (Technically not MAX, can be
+ // changed once MAX circuits become
+ // craftable)
+ };
+
+ ItemStack[] wirelessHatches = { ItemList.Wireless_Hatch_Energy_ULV.get(1),
+ ItemList.Wireless_Hatch_Energy_LV.get(1), ItemList.Wireless_Hatch_Energy_MV.get(1),
+ ItemList.Wireless_Hatch_Energy_HV.get(1), ItemList.Wireless_Hatch_Energy_EV.get(1),
+ ItemList.Wireless_Hatch_Energy_IV.get(1), ItemList.Wireless_Hatch_Energy_LuV.get(1),
+ ItemList.Wireless_Hatch_Energy_ZPM.get(1), ItemList.Wireless_Hatch_Energy_UV.get(1),
+ ItemList.Wireless_Hatch_Energy_UHV.get(1), ItemList.Wireless_Hatch_Energy_UEV.get(1),
+ ItemList.Wireless_Hatch_Energy_UIV.get(1), ItemList.Wireless_Hatch_Energy_UMV.get(1),
+ ItemList.Wireless_Hatch_Energy_UXV.get(1) };
+
+ ItemStack[] wirelessHatches_4A = { CustomItemList.eM_energyWirelessMulti4_EV.get(1),
+ CustomItemList.eM_energyWirelessMulti4_IV.get(1), CustomItemList.eM_energyWirelessMulti4_LuV.get(1),
+ CustomItemList.eM_energyWirelessMulti4_ZPM.get(1), CustomItemList.eM_energyWirelessMulti4_UV.get(1),
+ CustomItemList.eM_energyWirelessMulti4_UHV.get(1), CustomItemList.eM_energyWirelessMulti4_UEV.get(1),
+ CustomItemList.eM_energyWirelessMulti4_UIV.get(1), CustomItemList.eM_energyWirelessMulti4_UMV.get(1),
+ CustomItemList.eM_energyWirelessMulti4_UXV.get(1) };
+
+ ItemStack[] wirelessHatches_16A = { CustomItemList.eM_energyWirelessMulti16_EV.get(1),
+ CustomItemList.eM_energyWirelessMulti16_IV.get(1), CustomItemList.eM_energyWirelessMulti16_LuV.get(1),
+ CustomItemList.eM_energyWirelessMulti16_ZPM.get(1), CustomItemList.eM_energyWirelessMulti16_UV.get(1),
+ CustomItemList.eM_energyWirelessMulti16_UHV.get(1), CustomItemList.eM_energyWirelessMulti16_UEV.get(1),
+ CustomItemList.eM_energyWirelessMulti16_UIV.get(1), CustomItemList.eM_energyWirelessMulti16_UMV.get(1),
+ CustomItemList.eM_energyWirelessMulti16_UXV.get(1) };
+
+ ItemStack[] wirelessHatches_64A = { CustomItemList.eM_energyWirelessMulti64_EV.get(1),
+ CustomItemList.eM_energyWirelessMulti64_IV.get(1), CustomItemList.eM_energyWirelessMulti64_LuV.get(1),
+ CustomItemList.eM_energyWirelessMulti64_ZPM.get(1), CustomItemList.eM_energyWirelessMulti64_UV.get(1),
+ CustomItemList.eM_energyWirelessMulti64_UHV.get(1), CustomItemList.eM_energyWirelessMulti64_UEV.get(1),
+ CustomItemList.eM_energyWirelessMulti64_UIV.get(1), CustomItemList.eM_energyWirelessMulti64_UMV.get(1),
+ CustomItemList.eM_energyWirelessMulti64_UXV.get(1) };
+
+ ItemStack[] wirelessLasers = { CustomItemList.eM_energyWirelessTunnel1_UXV.get(1),
+ CustomItemList.eM_energyWirelessTunnel2_UXV.get(1), CustomItemList.eM_energyWirelessTunnel3_UXV.get(1),
+ CustomItemList.eM_energyWirelessTunnel4_UXV.get(1), CustomItemList.eM_energyWirelessTunnel5_UXV.get(1),
+ CustomItemList.eM_energyWirelessTunnel6_UXV.get(1), CustomItemList.eM_energyWirelessTunnel7_UXV.get(1) };
+
+ ItemStack[] wirelessDynamos = { ItemList.Wireless_Dynamo_Energy_ULV.get(1),
+ ItemList.Wireless_Dynamo_Energy_LV.get(1), ItemList.Wireless_Dynamo_Energy_MV.get(1),
+ ItemList.Wireless_Dynamo_Energy_HV.get(1), ItemList.Wireless_Dynamo_Energy_EV.get(1),
+ ItemList.Wireless_Dynamo_Energy_IV.get(1), ItemList.Wireless_Dynamo_Energy_LuV.get(1),
+ ItemList.Wireless_Dynamo_Energy_ZPM.get(1), ItemList.Wireless_Dynamo_Energy_UV.get(1),
+ ItemList.Wireless_Dynamo_Energy_UHV.get(1), ItemList.Wireless_Dynamo_Energy_UEV.get(1),
+ ItemList.Wireless_Dynamo_Energy_UIV.get(1), ItemList.Wireless_Dynamo_Energy_UMV.get(1),
+ ItemList.Wireless_Dynamo_Energy_UXV.get(1) };
+
+ // ------------------------ Wireless EU hatches ------------------------
+
+ for (int i = 0; i < wirelessHatches.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ (i == 0) ? ItemList.Tesseract.get(1) : wirelessHatches[i - 1],
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] { energyHatches[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1),
+ ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1),
+ CustomItemList.eM_Power.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 1), circuitsTierPlusTwo[i],
+ ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1296), MaterialsUEVplus.ExcitedDTEC.getFluid(500L) },
+ wirelessHatches[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+
+ // ------------------------ 4A Wireless EU hatches ------------------------
+
+ for (int i = 0; i < wirelessHatches_4A.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ energyHatches_4A[i],
+ totalComputation * 4,
+ compPerSecond * 4,
+ researchEuPerTick,
+ researchAmperage * 2,
+ new Object[] { energyHatches_4A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 1),
+ ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1),
+ CustomItemList.eM_Power.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 4),
+ GT_OreDictUnificator.get("plateTripleShirabon", 4L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Flerovium, 4),
+ circuitsTierPlusTwo[i + 4], ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1_296 * 4),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 4) },
+ wirelessHatches_4A[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+
+ // ------------------------ 16A Wireless EU hatches ------------------------
+
+ for (int i = 0; i < wirelessHatches_16A.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ energyHatches_16A[i],
+ totalComputation * 16,
+ compPerSecond * 16,
+ researchEuPerTick,
+ researchAmperage * 4,
+ new Object[] { energyHatches_16A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2),
+ ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1),
+ CustomItemList.eM_Power.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 16),
+ GT_OreDictUnificator.get("plateTripleShirabon", 16L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.TranscendentMetal, 4),
+ circuitsTierPlusTwo[i + 4], ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1_296 * 16),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 16) },
+ wirelessHatches_16A[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+
+ // ------------------------ 64A Wireless EU hatches ------------------------
+
+ for (int i = 0; i < wirelessHatches_64A.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ energyHatches_64A[i],
+ totalComputation * 64,
+ compPerSecond * 64,
+ researchEuPerTick,
+ researchAmperage * 8,
+ new Object[] { energyHatches_64A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 3),
+ ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1),
+ CustomItemList.eM_Power.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 64),
+ GT_OreDictUnificator.get("plateTripleShirabon", 64L),
+ GT_OreDictUnificator.get("plateDenseMetastableOganesson", 4), circuitsTierPlusTwo[i + 4],
+ ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1_296 * 64),
+ MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 64) },
+ wirelessHatches_64A[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+
+ // ------------------------ Wireless UXV Lasers ------------------------
+
+ for (int i = 0; i < wirelessLasers.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ laserTargets_UXV[i],
+ totalComputation * 64,
+ compPerSecond * 64,
+ researchEuPerTick * 4,
+ researchAmperage * 16,
+ new Object[] { laserTargets_UXV[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 4),
+ // Dyson Swarm Module Deployment Unit Superconducting Magnet
+ getModItem(GalaxySpace.ID, "dysonswarmparts", 1, 4),
+ CustomItemList.Machine_Multi_Transformer.get(1), CustomItemList.eM_Power.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, MaterialsUEVplus.SpaceTime, 64),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.Eternity, 32),
+ GT_OreDictUnificator
+ .get(OrePrefixes.plateDense, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Quantum, 16L),
+ ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1_296 * 64 * 4),
+ MaterialsUEVplus.ExcitedDTSC.getFluid(500L * 64) },
+ wirelessLasers[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+
+ // ------------------------ Wireless EU dynamos ------------------------
+
+ for (int i = 0; i < wirelessHatches.length; i++) {
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ (i == 0) ? ItemList.EnergisedTesseract.get(1) : wirelessDynamos[i - 1],
+ totalComputation,
+ compPerSecond,
+ researchEuPerTick,
+ researchAmperage,
+ new Object[] { dynamoHatches[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1),
+ ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1),
+ CustomItemList.eM_Power.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 1), circuitsTierPlusTwo[i],
+ ItemList.EnergisedTesseract.get(1) },
+ new FluidStack[] { new FluidStack(solderUEV, 1296), MaterialsUEVplus.ExcitedDTEC.getFluid(500L) },
+ wirelessDynamos[i],
+ recipeDurationTicks,
+ recipeEuPerTick);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java
new file mode 100644
index 0000000000..e410eec6b4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java
@@ -0,0 +1,48 @@
+package com.github.technus.tectech.loader.thing;
+
+import net.minecraft.item.ItemStack;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.cover.GT_Cover_TM_EnderFluidLink;
+import com.github.technus.tectech.thing.cover.GT_Cover_TM_PowerPassUpgrade;
+import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil;
+import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil_Ultimate;
+import com.github.technus.tectech.thing.item.EnderFluidLinkCover;
+import com.github.technus.tectech.thing.item.PowerPassUpgradeCover;
+import com.github.technus.tectech.thing.item.TeslaCoilCover;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.objects.GT_RenderedTexture;
+
+public class CoverLoader implements Runnable {
+
+ public void run() {
+ final IIconContainer TESLA_OVERLAY = new Textures.BlockIcons.CustomIcon("iconsets/TESLA_OVERLAY");
+ final IIconContainer TESLA_OVERLAY_ULTIMATE = new Textures.BlockIcons.CustomIcon(
+ "iconsets/TESLA_OVERLAY_ULTIMATE");
+ final IIconContainer ENDERFLUIDLINK_OVERLAY = new Textures.BlockIcons.CustomIcon(
+ "iconsets/ENDERFLUIDLINK_OVERLAY");
+ final IIconContainer POWERPASSUPGRADE_OVERLAY = new Textures.BlockIcons.CustomIcon(
+ "iconsets/POWERPASSUPGRADE_OVERLAY");
+
+ GregTech_API.registerCover(
+ new ItemStack(TeslaCoilCover.INSTANCE, 1, 0),
+ new GT_RenderedTexture(TESLA_OVERLAY),
+ new GT_Cover_TM_TeslaCoil());
+ GregTech_API.registerCover(
+ new ItemStack(TeslaCoilCover.INSTANCE, 1, 1),
+ new GT_RenderedTexture(TESLA_OVERLAY_ULTIMATE),
+ new GT_Cover_TM_TeslaCoil_Ultimate());
+ GregTech_API.registerCover(
+ new ItemStack(EnderFluidLinkCover.INSTANCE, 1, 0),
+ new GT_RenderedTexture(ENDERFLUIDLINK_OVERLAY),
+ new GT_Cover_TM_EnderFluidLink());
+ GregTech_API.registerCover(
+ new ItemStack(PowerPassUpgradeCover.INSTANCE, 1, 0),
+ new GT_RenderedTexture(POWERPASSUPGRADE_OVERLAY),
+ new GT_Cover_TM_PowerPassUpgrade());
+ TecTech.LOGGER.info("Cover functionality registered");
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java
new file mode 100644
index 0000000000..13681d2637
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java
@@ -0,0 +1,2101 @@
+package com.github.technus.tectech.loader.thing;
+
+import static com.github.technus.tectech.thing.CustomItemList.DATApipe;
+import static com.github.technus.tectech.thing.CustomItemList.DATApipeBlock;
+import static com.github.technus.tectech.thing.CustomItemList.LASERpipe;
+import static com.github.technus.tectech.thing.CustomItemList.LASERpipeBlock;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_IV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugGenny;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugPollutor;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugWriter;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Computer;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_DataBank;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_EyeOfHarmony;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_ForgeOfGods;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Infuser;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Microwave;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_MoltenModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_PlasmaModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_QuarkGluonPlasmaModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Research;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_SmeltingModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Switch;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_TeslaCoil;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Transformer;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_OwnerDetector;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_EV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_HV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_IV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_LV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_MV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_EV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_HV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_IV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_LV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_MV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_EV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_HV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_IV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_LV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_MV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_EV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_HV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_LV;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_MV;
+import static com.github.technus.tectech.thing.CustomItemList.ParametrizerTXT_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.ParametrizerX_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.Parametrizer_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.UncertaintyX_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.Uncertainty_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.UnusedStuff;
+import static com.github.technus.tectech.thing.CustomItemList.capacitor_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.dataInAss_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.dataIn_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.dataOutAss_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.dataOut_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel9001;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel9001;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_MAX;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_MAX;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_EV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_IV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_LuV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_MAX;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UEV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UHV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UIV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UMV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_ZPM;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel1_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel2_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel3_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel4_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel5_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel6_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel7_UXV;
+import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeData;
+import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeMaintenance;
+import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeUncertainty;
+import static com.github.technus.tectech.thing.CustomItemList.holder_Hatch;
+import static com.github.technus.tectech.thing.CustomItemList.rack_Hatch;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Capacitor;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeMaintenance;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeUncertainty;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoTunnel;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Holder;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputDataItems;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputDataItems;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_ParamText;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Rack;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Uncertainty;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_WirelessMulti;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_EyeOfHarmony;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_computer;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_dataBank;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_infuser;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_research;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_switch;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_transformer;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_microwave;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_teslaCoil;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Data;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Energy;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_BuckConverter;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugPollutor;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugPowerGenerator;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugStructureWriter;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_OwnerDetector;
+import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_TeslaCoil;
+
+/**
+ * Created by danie_000 on 16.11.2016.
+ */
+public class MachineLoader implements Runnable {
+
+ @Override
+ public void run() {
+
+ // ===================================================================================================
+ // Multi AMP Power INPUTS
+ // ===================================================================================================
+ eM_energyMulti4_EV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15109, "hatch.energymulti04.tier.04", "EV 4A Energy Hatch", 4, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_EV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15119, "hatch.energymulti16.tier.04", "EV 16A Energy Hatch", 4, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_EV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15129, "hatch.energymulti64.tier.04", "EV 64A Energy Hatch", 4, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15100, "hatch.energymulti04.tier.05", "IV 4A Energy Hatch", 5, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15110, "hatch.energymulti16.tier.05", "IV 16A Energy Hatch", 5, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15120, "hatch.energymulti64.tier.05", "IV 64A Energy Hatch", 5, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15101, "hatch.energymulti04.tier.06", "LuV 4A Energy Hatch", 6, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15111, "hatch.energymulti16.tier.06", "LuV 16A Energy Hatch", 6, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15121, "hatch.energymulti64.tier.06", "LuV 64A Energy Hatch", 6, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15102, "hatch.energymulti04.tier.07", "ZPM 4A Energy Hatch", 7, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15112, "hatch.energymulti16.tier.07", "ZPM 16A Energy Hatch", 7, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15122, "hatch.energymulti64.tier.07", "ZPM 64A Energy Hatch", 7, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15103, "hatch.energymulti04.tier.08", "UV 4A Energy Hatch", 8, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15113, "hatch.energymulti16.tier.08", "UV 16A Energy Hatch", 8, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15123, "hatch.energymulti64.tier.08", "UV 64A Energy Hatch", 8, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15104, "hatch.energymulti04.tier.09", "UHV 4A Energy Hatch", 9, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15114, "hatch.energymulti16.tier.09", "UHV 16A Energy Hatch", 9, 16)
+ .getStackForm(1L));
+ eM_energyMulti64_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15124, "hatch.energymulti64.tier.09", "UHV 64A Energy Hatch", 9, 64)
+ .getStackForm(1L));
+
+ eM_energyMulti4_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15105, "hatch.energymulti04.tier.10", "UEV 4A Energy Hatch", 10, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15115,
+ "hatch.energymulti16.tier.10",
+ "UEV 16A Energy Hatch",
+ 10,
+ 16).getStackForm(1L));
+ eM_energyMulti64_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15125,
+ "hatch.energymulti64.tier.10",
+ "UEV 64A Energy Hatch",
+ 10,
+ 64).getStackForm(1L));
+
+ eM_energyMulti4_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15106, "hatch.energymulti04.tier.11", "UIV 4A Energy Hatch", 11, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15116,
+ "hatch.energymulti16.tier.11",
+ "UIV 16A Energy Hatch",
+ 11,
+ 16).getStackForm(1L));
+ eM_energyMulti64_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15126,
+ "hatch.energymulti64.tier.11",
+ "UIV 64A Energy Hatch",
+ 11,
+ 64).getStackForm(1L));
+
+ eM_energyMulti4_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15107, "hatch.energymulti04.tier.12", "UMV 4A Energy Hatch", 12, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15117,
+ "hatch.energymulti16.tier.12",
+ "UMV 16A Energy Hatch",
+ 12,
+ 16).getStackForm(1L));
+ eM_energyMulti64_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15127,
+ "hatch.energymulti64.tier.12",
+ "UMV 64A Energy Hatch",
+ 12,
+ 64).getStackForm(1L));
+
+ eM_energyMulti4_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(15108, "hatch.energymulti04.tier.13", "UXV 4A Energy Hatch", 13, 4)
+ .getStackForm(1L));
+ eM_energyMulti16_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15118,
+ "hatch.energymulti16.tier.13",
+ "UXV 16A Energy Hatch",
+ 13,
+ 16).getStackForm(1L));
+ eM_energyMulti64_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyMulti(
+ 15128,
+ "hatch.energymulti64.tier.13",
+ "UXV 64A Energy Hatch",
+ 13,
+ 64).getStackForm(1L));
+ // ===================================================================================================
+ // Multi AMP Wireless INPUTS
+ // ===================================================================================================
+ eM_energyWirelessMulti4_EV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15065,
+ "hatch.energywirelessmulti04.tier.04",
+ "EV 4A Wireless Energy Hatch",
+ 4,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_EV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15066,
+ "hatch.energywirelessmulti16.tier.04",
+ "EV 16A Wireless Energy Hatch",
+ 4,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_EV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15067,
+ "hatch.energywirelessmulti64.tier.04",
+ "EV 64A Wireless Energy Hatch",
+ 4,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_IV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15068,
+ "hatch.energywirelessmulti04.tier.05",
+ "IV 4A Wireless Energy Hatch",
+ 5,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_IV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15069,
+ "hatch.energywirelessmulti16.tier.05",
+ "IV 16A Wireless Energy Hatch",
+ 5,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_IV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15070,
+ "hatch.energywirelessmulti64.tier.05",
+ "IV 64A Wireless Energy Hatch",
+ 5,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_LuV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15071,
+ "hatch.energywirelessmulti04.tier.06",
+ "LuV 4A Wireless Energy Hatch",
+ 6,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_LuV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15072,
+ "hatch.energywirelessmulti16.tier.06",
+ "LuV 16A Wireless Energy Hatch",
+ 6,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_LuV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15073,
+ "hatch.energywirelessmulti64.tier.06",
+ "LuV 64A Wireless Energy Hatch",
+ 6,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_ZPM.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15074,
+ "hatch.energywirelessmulti04.tier.07",
+ "ZPM 4A Wireless Energy Hatch",
+ 7,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_ZPM.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15075,
+ "hatch.energywirelessmulti16.tier.07",
+ "ZPM 16A Wireless Energy Hatch",
+ 7,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_ZPM.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15076,
+ "hatch.energywirelessmulti64.tier.07",
+ "ZPM 64A Wireless Energy Hatch",
+ 7,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15077,
+ "hatch.energywirelessmulti04.tier.08",
+ "UV 4A Wireless Energy Hatch",
+ 8,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15078,
+ "hatch.energywirelessmulti16.tier.08",
+ "UV 16A Wireless Energy Hatch",
+ 8,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15079,
+ "hatch.energywirelessmulti64.tier.08",
+ "UV 64A Wireless Energy Hatch",
+ 8,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UHV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15080,
+ "hatch.energywirelessmulti04.tier.09",
+ "UHV 4A Wireless Energy Hatch",
+ 9,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UHV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15081,
+ "hatch.energywirelessmulti16.tier.09",
+ "UHV 16A Wireless Energy Hatch",
+ 9,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UHV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15082,
+ "hatch.energywirelessmulti64.tier.09",
+ "UHV 64A Wireless Energy Hatch",
+ 9,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UEV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15083,
+ "hatch.energywirelessmulti04.tier.10",
+ "UEV 4A Wireless Energy Hatch",
+ 10,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UEV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15084,
+ "hatch.energywirelessmulti16.tier.10",
+ "UEV 16A Wireless Energy Hatch",
+ 10,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UEV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15085,
+ "hatch.energywirelessmulti64.tier.10",
+ "UEV 64A Wireless Energy Hatch",
+ 10,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UIV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15086,
+ "hatch.energywirelessmulti04.tier.11",
+ "UIV 4A Wireless Energy Hatch",
+ 11,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UIV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15087,
+ "hatch.energywirelessmulti16.tier.11",
+ "UIV 16A Wireless Energy Hatch",
+ 11,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UIV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15088,
+ "hatch.energywirelessmulti64.tier.11",
+ "UIV 64A Wireless Energy Hatch",
+ 11,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UMV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15089,
+ "hatch.energywirelessmulti04.tier.12",
+ "UMV 4A Wireless Energy Hatch",
+ 12,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UMV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15090,
+ "hatch.energywirelessmulti16.tier.12",
+ "UMV 16A Wireless Energy Hatch",
+ 12,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UMV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15091,
+ "hatch.energywirelessmulti64.tier.12",
+ "UMV 64A Wireless Energy Hatch",
+ 12,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15092,
+ "hatch.energywirelessmulti04.tier.13",
+ "UXV 4A Wireless Energy Hatch",
+ 13,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15093,
+ "hatch.energywirelessmulti16.tier.13",
+ "UXV 16A Wireless Energy Hatch",
+ 13,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15094,
+ "hatch.energywirelessmulti64.tier.13",
+ "UXV 64A Wireless Energy Hatch",
+ 13,
+ 64).getStackForm(1L));
+ eM_energyWirelessMulti4_MAX.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15095,
+ "hatch.energywirelessmulti04.tier.14",
+ "MAX 4A Wireless Energy Hatch",
+ 14,
+ 4).getStackForm(1L));
+ eM_energyWirelessMulti16_MAX.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15096,
+ "hatch.energywirelessmulti16.tier.14",
+ "MAX 16A Wireless Energy Hatch",
+ 14,
+ 16).getStackForm(1L));
+ eM_energyWirelessMulti64_MAX.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15097,
+ "hatch.energywirelessmulti64.tier.14",
+ "MAX 64A Wireless Energy Hatch",
+ 14,
+ 64).getStackForm(1L));
+
+ eM_energyWirelessTunnel1_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15500,
+ "hatch.energywirelesstunnel1.tier.13",
+ "UXV 256A Wireless Energy Hatch",
+ 13,
+ 256).getStackForm(1L));
+ eM_energyWirelessTunnel2_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15501,
+ "hatch.energywirelesstunnel2.tier.13",
+ "UXV 1,024A Wireless Energy Hatch",
+ 13,
+ 1024).getStackForm(1L));
+ eM_energyWirelessTunnel3_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15502,
+ "hatch.energywirelesstunnel3.tier.13",
+ "UXV 4,096A Wireless Energy Hatch",
+ 13,
+ 4096).getStackForm(1L));
+ eM_energyWirelessTunnel4_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15503,
+ "hatch.energywirelesstunnel4.tier.13",
+ "UXV 16,384A Wireless Energy Hatch",
+ 13,
+ 16384).getStackForm(1L));
+ eM_energyWirelessTunnel5_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15504,
+ "hatch.energywirelesstunnel5.tier.13",
+ "UXV 65,536A Wireless Energy Hatch",
+ 13,
+ 65536).getStackForm(1L));
+ eM_energyWirelessTunnel6_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15505,
+ "hatch.energywirelesstunnel6.tier.13",
+ "UXV 262,144A Wireless Energy Hatch",
+ 13,
+ 262144).getStackForm(1L));
+ eM_energyWirelessTunnel7_UXV.set(
+ new GT_MetaTileEntity_Hatch_WirelessMulti(
+ 15506,
+ "hatch.energywirelesstunnel7.tier.13",
+ "UXV 1,048,576A Wireless Energy Hatch",
+ 13,
+ 1048576).getStackForm(1L));
+ // ===================================================================================================
+ // Multi AMP Laser INPUTS
+ // ===================================================================================================
+
+ eM_energyTunnel1_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15130,
+ "hatch.energytunnel1.tier.05",
+ "IV 256A/t Laser Target Hatch",
+ 5,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15140,
+ "hatch.energytunnel2.tier.05",
+ "IV 1,024A/t Laser Target Hatch",
+ 5,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15150,
+ "hatch.energytunnel3.tier.05",
+ "IV 4,096A/t Laser Target Hatch",
+ 5,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15160,
+ "hatch.energytunnel4.tier.05",
+ "IV 16,384A/t Laser Target Hatch",
+ 5,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15170,
+ "hatch.energytunnel5.tier.05",
+ "IV 65,536A/t Laser Target Hatch",
+ 5,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15180,
+ "hatch.energytunnel6.tier.05",
+ "IV 262,144A/t Laser Target Hatch",
+ 5,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_IV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15190,
+ "hatch.energytunnel7.tier.05",
+ "IV 1,048,576A/t Laser Target Hatch",
+ 5,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15131,
+ "hatch.energytunnel1.tier.06",
+ "LuV 256A/t Laser Target Hatch",
+ 6,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15141,
+ "hatch.energytunnel2.tier.06",
+ "LuV 1,024A/t Laser Target Hatch",
+ 6,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15151,
+ "hatch.energytunnel3.tier.06",
+ "LuV 4,096A/t Laser Target Hatch",
+ 6,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15161,
+ "hatch.energytunnel4.tier.06",
+ "LuV 16,384A/t Laser Target Hatch",
+ 6,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15171,
+ "hatch.energytunnel5.tier.06",
+ "LuV 65,536A/t Laser Target Hatch",
+ 6,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15181,
+ "hatch.energytunnel6.tier.06",
+ "LuV 262,144A/t Laser Target Hatch",
+ 6,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_LuV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15191,
+ "hatch.energytunnel7.tier.06",
+ "LuV 1,048,576A/t Laser Target Hatch",
+ 6,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15132,
+ "hatch.energytunnel1.tier.07",
+ "ZPM 256A/t Laser Target Hatch",
+ 7,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15142,
+ "hatch.energytunnel2.tier.07",
+ "ZPM 1,024A/t Laser Target Hatch",
+ 7,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15152,
+ "hatch.energytunnel3.tier.07",
+ "ZPM 4,096A/t Laser Target Hatch",
+ 7,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15162,
+ "hatch.energytunnel4.tier.07",
+ "ZPM 16,384A/t Laser Target Hatch",
+ 7,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15172,
+ "hatch.energytunnel5.tier.07",
+ "ZPM 65,536A/t Laser Target Hatch",
+ 7,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15182,
+ "hatch.energytunnel6.tier.07",
+ "ZPM 262,144A/t Laser Target Hatch",
+ 7,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_ZPM.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15192,
+ "hatch.energytunnel7.tier.07",
+ "ZPM 1,048,576A/t Laser Target Hatch",
+ 7,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15133,
+ "hatch.energytunnel1.tier.08",
+ "UV 256A/t Laser Target Hatch",
+ 8,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15143,
+ "hatch.energytunnel2.tier.08",
+ "UV 1,024A/t Laser Target Hatch",
+ 8,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15153,
+ "hatch.energytunnel3.tier.08",
+ "UV 4,096A/t Laser Target Hatch",
+ 8,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15163,
+ "hatch.energytunnel4.tier.08",
+ "UV 16,384A/t Laser Target Hatch",
+ 8,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15173,
+ "hatch.energytunnel5.tier.08",
+ "UV 65,536A/t Laser Target Hatch",
+ 8,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15183,
+ "hatch.energytunnel6.tier.08",
+ "UV 262,144A/t Laser Target Hatch",
+ 8,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15193,
+ "hatch.energytunnel7.tier.08",
+ "UV 1,048,576A/t Laser Target Hatch",
+ 8,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15134,
+ "hatch.energytunnel1.tier.09",
+ "UHV 256A/t Laser Target Hatch",
+ 9,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15144,
+ "hatch.energytunnel2.tier.09",
+ "UHV 1,024A/t Laser Target Hatch",
+ 9,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15154,
+ "hatch.energytunnel3.tier.09",
+ "UHV 4,096A/t Laser Target Hatch",
+ 9,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15164,
+ "hatch.energytunnel4.tier.09",
+ "UHV 16,384A/t Laser Target Hatch",
+ 9,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15174,
+ "hatch.energytunnel5.tier.09",
+ "UHV 65,536A/t Laser Target Hatch",
+ 9,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15184,
+ "hatch.energytunnel6.tier.09",
+ "UHV 262,144A/t Laser Target Hatch",
+ 9,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UHV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15194,
+ "hatch.energytunnel7.tier.09",
+ "UHV 1,048,576A/t Laser Target Hatch",
+ 9,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15135,
+ "hatch.energytunnel1.tier.10",
+ "UEV 256A/t Laser Target Hatch",
+ 10,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15145,
+ "hatch.energytunnel2.tier.10",
+ "UEV 1,024A/t Laser Target Hatch",
+ 10,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15155,
+ "hatch.energytunnel3.tier.10",
+ "UEV 4,096A/t Laser Target Hatch",
+ 10,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15165,
+ "hatch.energytunnel4.tier.10",
+ "UEV 16,384A/t Laser Target Hatch",
+ 10,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15175,
+ "hatch.energytunnel5.tier.10",
+ "UEV 65,536A/t Laser Target Hatch",
+ 10,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15185,
+ "hatch.energytunnel6.tier.10",
+ "UEV 262,144A/t Laser Target Hatch",
+ 10,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UEV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15195,
+ "hatch.energytunnel7.tier.10",
+ "UEV 1,048,576A/t Laser Target Hatch",
+ 10,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15136,
+ "hatch.energytunnel1.tier.11",
+ "UIV 256A/t Laser Target Hatch",
+ 11,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15146,
+ "hatch.energytunnel2.tier.11",
+ "UIV 1,024A/t Laser Target Hatch",
+ 11,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15156,
+ "hatch.energytunnel3.tier.11",
+ "UIV 4,096A/t Laser Target Hatch",
+ 11,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15166,
+ "hatch.energytunnel4.tier.11",
+ "UIV 16,384A/t Laser Target Hatch",
+ 11,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15176,
+ "hatch.energytunnel5.tier.11",
+ "UIV 65,536A/t Laser Target Hatch",
+ 11,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15186,
+ "hatch.energytunnel6.tier.11",
+ "UIV 262,144A/t Laser Target Hatch",
+ 11,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UIV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15196,
+ "hatch.energytunnel7.tier.11",
+ "UIV 1,048,576A/t Laser Target Hatch",
+ 11,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15137,
+ "hatch.energytunnel1.tier.12",
+ "UMV 256A/t Laser Target Hatch",
+ 12,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15147,
+ "hatch.energytunnel2.tier.12",
+ "UMV 1,024A/t Laser Target Hatch",
+ 12,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15157,
+ "hatch.energytunnel3.tier.12",
+ "UMV 4,096A/t Laser Target Hatch",
+ 12,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15167,
+ "hatch.energytunnel4.tier.12",
+ "UMV 16,384A/t Laser Target Hatch",
+ 12,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15177,
+ "hatch.energytunnel5.tier.12",
+ "UMV 65,536A/t Laser Target Hatch",
+ 12,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15187,
+ "hatch.energytunnel6.tier.12",
+ "UMV 262,144A/t Laser Target Hatch",
+ 12,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UMV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15197,
+ "hatch.energytunnel7.tier.12",
+ "UMV 1,048,576A/t Laser Target Hatch",
+ 12,
+ 1048576).getStackForm(1L));
+
+ eM_energyTunnel1_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15138,
+ "hatch.energytunnel1.tier.13",
+ "UXV 256A/t Laser Target Hatch",
+ 13,
+ 256).getStackForm(1L));
+ eM_energyTunnel2_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15148,
+ "hatch.energytunnel2.tier.13",
+ "UXV 1,024A/t Laser Target Hatch",
+ 13,
+ 1024).getStackForm(1L));
+ eM_energyTunnel3_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15158,
+ "hatch.energytunnel3.tier.13",
+ "UXV 4,096A/t Laser Target Hatch",
+ 13,
+ 4096).getStackForm(1L));
+ eM_energyTunnel4_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15168,
+ "hatch.energytunnel4.tier.13",
+ "UXV 16,384A/t Laser Target Hatch",
+ 13,
+ 16384).getStackForm(1L));
+ eM_energyTunnel5_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15178,
+ "hatch.energytunnel5.tier.13",
+ "UXV 65,536A/t Laser Target Hatch",
+ 13,
+ 65536).getStackForm(1L));
+ eM_energyTunnel6_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15188,
+ "hatch.energytunnel6.tier.13",
+ "UXV 262,144A/t Laser Target Hatch",
+ 13,
+ 262144).getStackForm(1L));
+ eM_energyTunnel7_UXV.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15198,
+ "hatch.energytunnel7.tier.13",
+ "UXV 1,048,576A/t Laser Target Hatch",
+ 13,
+ 1048576).getStackForm(1L));
+ eM_energyTunnel9001.set(
+ new GT_MetaTileEntity_Hatch_EnergyTunnel(
+ 15199,
+ "hatch.energytunnel.tier.14",
+ "Legendary Laser Target Hatch",
+ 13,
+ (int) V[13]).getStackForm(1L));
+
+ // ===================================================================================================
+ // Multi AMP Power OUTPUTS
+ // ===================================================================================================
+ eM_dynamoMulti4_EV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15209, "hatch.dynamomulti04.tier.04", "EV 4A Dynamo Hatch", 4, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_EV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15219, "hatch.dynamomulti16.tier.04", "EV 16A Dynamo Hatch", 4, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_EV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15229, "hatch.dynamomulti64.tier.04", "EV 64A Dynamo Hatch", 4, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15200, "hatch.dynamomulti04.tier.05", "IV 4A Dynamo Hatch", 5, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15210, "hatch.dynamomulti16.tier.05", "IV 16A Dynamo Hatch", 5, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15220, "hatch.dynamomulti64.tier.05", "IV 64A Dynamo Hatch", 5, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15201, "hatch.dynamomulti04.tier.06", "LuV 4A Dynamo Hatch", 6, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15211, "hatch.dynamomulti16.tier.06", "LuV 16A Dynamo Hatch", 6, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15221, "hatch.dynamomulti64.tier.06", "LuV 64A Dynamo Hatch", 6, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15202, "hatch.dynamomulti04.tier.07", "ZPM 4A Dynamo Hatch", 7, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15212, "hatch.dynamomulti16.tier.07", "ZPM 16A Dynamo Hatch", 7, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15222, "hatch.dynamomulti64.tier.07", "ZPM 64A Dynamo Hatch", 7, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15203, "hatch.dynamomulti04.tier.08", "UV 4A Dynamo Hatch", 8, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15213, "hatch.dynamomulti16.tier.08", "UV 16A Dynamo Hatch", 8, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15223, "hatch.dynamomulti64.tier.08", "UV 64A Dynamo Hatch", 8, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15204, "hatch.dynamomulti04.tier.09", "UHV 4A Dynamo Hatch", 9, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15214, "hatch.dynamomulti16.tier.09", "UHV 16A Dynamo Hatch", 9, 16)
+ .getStackForm(1L));
+ eM_dynamoMulti64_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15224, "hatch.dynamomulti64.tier.09", "UHV 64A Dynamo Hatch", 9, 64)
+ .getStackForm(1L));
+
+ eM_dynamoMulti4_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15205, "hatch.dynamomulti04.tier.10", "UEV 4A Dynamo Hatch", 10, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15215,
+ "hatch.dynamomulti16.tier.10",
+ "UEV 16A Dynamo Hatch",
+ 10,
+ 16).getStackForm(1L));
+ eM_dynamoMulti64_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15225,
+ "hatch.dynamomulti64.tier.10",
+ "UEV 64A Dynamo Hatch",
+ 10,
+ 64).getStackForm(1L));
+
+ eM_dynamoMulti4_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15206, "hatch.dynamomulti04.tier.11", "UIV 4A Dynamo Hatch", 11, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15216,
+ "hatch.dynamomulti16.tier.11",
+ "UIV 16A Dynamo Hatch",
+ 11,
+ 16).getStackForm(1L));
+ eM_dynamoMulti64_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15226,
+ "hatch.dynamomulti64.tier.11",
+ "UIV 64A Dynamo Hatch",
+ 11,
+ 64).getStackForm(1L));
+
+ eM_dynamoMulti4_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15207, "hatch.dynamomulti04.tier.12", "UMV 4A Dynamo Hatch", 12, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15217,
+ "hatch.dynamomulti16.tier.12",
+ "UMV 16A Dynamo Hatch",
+ 12,
+ 16).getStackForm(1L));
+ eM_dynamoMulti64_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15227,
+ "hatch.dynamomulti64.tier.12",
+ "UMV 64A Dynamo Hatch",
+ 12,
+ 64).getStackForm(1L));
+
+ eM_dynamoMulti4_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(15208, "hatch.dynamomulti04.tier.13", "UXV 4A Dynamo Hatch", 13, 4)
+ .getStackForm(1L));
+ eM_dynamoMulti16_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15218,
+ "hatch.dynamomulti16.tier.13",
+ "UXV 16A Dynamo Hatch",
+ 13,
+ 16).getStackForm(1L));
+ eM_dynamoMulti64_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoMulti(
+ 15228,
+ "hatch.dynamomulti64.tier.13",
+ "UXV 64A Dynamo Hatch",
+ 13,
+ 64).getStackForm(1L));
+
+ // ===================================================================================================
+ // Multi AMP Laser OUTPUTS
+ // ===================================================================================================
+
+ eM_dynamoTunnel1_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15230,
+ "hatch.dynamotunnel1.tier.05",
+ "IV 256A/t Laser Source Hatch",
+ 5,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15240,
+ "hatch.dynamotunnel2.tier.05",
+ "IV 1,024A/t Laser Source Hatch",
+ 5,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15250,
+ "hatch.dynamotunnel3.tier.05",
+ "IV 4,096A/t Laser Source Hatch",
+ 5,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15260,
+ "hatch.dynamotunnel4.tier.05",
+ "IV 16,384A/t Laser Source Hatch",
+ 5,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15270,
+ "hatch.dynamotunnel5.tier.05",
+ "IV 65,536A/t Laser Source Hatch",
+ 5,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15280,
+ "hatch.dynamotunnel6.tier.05",
+ "IV 262,144A/t Laser Source Hatch",
+ 5,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15290,
+ "hatch.dynamotunnel7.tier.05",
+ "IV 1,048,576A/t Laser Source Hatch",
+ 5,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15231,
+ "hatch.dynamotunnel1.tier.06",
+ "LuV 256A/t Laser Source Hatch",
+ 6,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15241,
+ "hatch.dynamotunnel2.tier.06",
+ "LuV 1,024A/t Laser Source Hatch",
+ 6,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15251,
+ "hatch.dynamotunnel3.tier.06",
+ "LuV 4,096A/t Laser Source Hatch",
+ 6,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15261,
+ "hatch.dynamotunnel4.tier.06",
+ "LuV 16,384A/t Laser Source Hatch",
+ 6,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15271,
+ "hatch.dynamotunnel5.tier.06",
+ "LuV 65,536A/t Laser Source Hatch",
+ 6,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15281,
+ "hatch.dynamotunnel6.tier.06",
+ "LuV 262,144A/t Laser Source Hatch",
+ 6,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15291,
+ "hatch.dynamotunnel7.tier.06",
+ "LuV 1,048,576A/t Laser Source Hatch",
+ 6,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15232,
+ "hatch.dynamotunnel1.tier.07",
+ "ZPM 256A/t Laser Source Hatch",
+ 7,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15242,
+ "hatch.dynamotunnel2.tier.07",
+ "ZPM 1,024A/t Laser Source Hatch",
+ 7,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15252,
+ "hatch.dynamotunnel3.tier.07",
+ "ZPM 4,096A/t Laser Source Hatch",
+ 7,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15262,
+ "hatch.dynamotunnel4.tier.07",
+ "ZPM 16,384A/t Laser Source Hatch",
+ 7,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15272,
+ "hatch.dynamotunnel5.tier.07",
+ "ZPM 65,536A/t Laser Source Hatch",
+ 7,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15282,
+ "hatch.dynamotunnel6.tier.07",
+ "ZPM 262,144A/t Laser Source Hatch",
+ 7,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15292,
+ "hatch.dynamotunnel7.tier.07",
+ "ZPM 1,048,576A/t Laser Source Hatch",
+ 7,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15233,
+ "hatch.dynamotunnel1.tier.08",
+ "UV 256A/t Laser Source Hatch",
+ 8,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15243,
+ "hatch.dynamotunnel2.tier.08",
+ "UV 1,024A/t Laser Source Hatch",
+ 8,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15253,
+ "hatch.dynamotunnel3.tier.08",
+ "UV 4,096A/t Laser Source Hatch",
+ 8,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15263,
+ "hatch.dynamotunnel4.tier.08",
+ "UV 16,384A/t Laser Source Hatch",
+ 8,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15273,
+ "hatch.dynamotunnel5.tier.08",
+ "UV 65,536A/t Laser Source Hatch",
+ 8,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15283,
+ "hatch.dynamotunnel6.tier.08",
+ "UV 262,144A/t Laser Source Hatch",
+ 8,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15293,
+ "hatch.dynamotunnel7.tier.08",
+ "UV 1,048,576A/t Laser Source Hatch",
+ 8,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15234,
+ "hatch.dynamotunnel1.tier.09",
+ "UHV 256A/t Laser Source Hatch",
+ 9,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15244,
+ "hatch.dynamotunnel2.tier.09",
+ "UHV 1,024A/t Laser Source Hatch",
+ 9,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15254,
+ "hatch.dynamotunnel3.tier.09",
+ "UHV 4,096A/t Laser Source Hatch",
+ 9,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15264,
+ "hatch.dynamotunnel4.tier.09",
+ "UHV 16,384A/t Laser Source Hatch",
+ 9,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15274,
+ "hatch.dynamotunnel5.tier.09",
+ "UHV 65,536A/t Laser Source Hatch",
+ 9,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15284,
+ "hatch.dynamotunnel6.tier.09",
+ "UHV 262,144A/t Laser Source Hatch",
+ 9,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UHV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15294,
+ "hatch.dynamotunnel7.tier.09",
+ "UHV 1,048,576A/t Laser Source Hatch",
+ 9,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15235,
+ "hatch.dynamotunnel1.tier.10",
+ "UEV 256A/t Laser Source Hatch",
+ 10,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15245,
+ "hatch.dynamotunnel2.tier.10",
+ "UEV 1,024A/t Laser Source Hatch",
+ 10,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15255,
+ "hatch.dynamotunnel3.tier.10",
+ "UEV 4,096A/t Laser Source Hatch",
+ 10,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15265,
+ "hatch.dynamotunnel4.tier.10",
+ "UEV 16,384A/t Laser Source Hatch",
+ 10,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15275,
+ "hatch.dynamotunnel5.tier.10",
+ "UEV 65,536A/t Laser Source Hatch",
+ 10,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15285,
+ "hatch.dynamotunnel6.tier.10",
+ "UEV 262,144A/t Laser Source Hatch",
+ 10,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UEV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15295,
+ "hatch.dynamotunnel7.tier.10",
+ "UEV 1,048,576A/t Laser Source Hatch",
+ 10,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15236,
+ "hatch.dynamotunnel1.tier.11",
+ "UIV 256A/t Laser Source Hatch",
+ 11,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15246,
+ "hatch.dynamotunnel2.tier.11",
+ "UIV 1,024A/t Laser Source Hatch",
+ 11,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15256,
+ "hatch.dynamotunnel3.tier.11",
+ "UIV 4,096A/t Laser Source Hatch",
+ 11,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15266,
+ "hatch.dynamotunnel4.tier.11",
+ "UIV 16,384A/t Laser Source Hatch",
+ 11,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15276,
+ "hatch.dynamotunnel5.tier.11",
+ "UIV 65,536A/t Laser Source Hatch",
+ 11,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15286,
+ "hatch.dynamotunnel6.tier.11",
+ "UIV 262,144A/t Laser Source Hatch",
+ 11,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UIV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15296,
+ "hatch.dynamotunnel7.tier.11",
+ "UIV 1,048,576A/t Laser Source Hatch",
+ 11,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15237,
+ "hatch.dynamotunnel1.tier.12",
+ "UMV 256A/t Laser Source Hatch",
+ 12,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15247,
+ "hatch.dynamotunnel2.tier.12",
+ "UMV 1,024A/t Laser Source Hatch",
+ 12,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15257,
+ "hatch.dynamotunnel3.tier.12",
+ "UMV 4,096A/t Laser Source Hatch",
+ 12,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15267,
+ "hatch.dynamotunnel4.tier.12",
+ "UMV 16,384A/t Laser Source Hatch",
+ 12,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15277,
+ "hatch.dynamotunnel5.tier.12",
+ "UMV 65,536A/t Laser Source Hatch",
+ 12,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15287,
+ "hatch.dynamotunnel6.tier.12",
+ "UMV 262,144A/t Laser Source Hatch",
+ 12,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UMV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15297,
+ "hatch.dynamotunnel7.tier.12",
+ "UMV 1,048,576A/t Laser Source Hatch",
+ 12,
+ 1048576).getStackForm(1L));
+
+ eM_dynamoTunnel1_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15238,
+ "hatch.dynamotunnel1.tier.13",
+ "UXV 256A/t Laser Source Hatch",
+ 13,
+ 256).getStackForm(1L));
+ eM_dynamoTunnel2_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15248,
+ "hatch.dynamotunnel2.tier.13",
+ "UXV 1,024A/t Laser Source Hatch",
+ 13,
+ 1024).getStackForm(1L));
+ eM_dynamoTunnel3_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15258,
+ "hatch.dynamotunnel3.tier.13",
+ "UXV 4,096A/t Laser Source Hatch",
+ 13,
+ 4096).getStackForm(1L));
+ eM_dynamoTunnel4_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15268,
+ "hatch.dynamotunnel4.tier.13",
+ "UXV 16,384A/t Laser Source Hatch",
+ 13,
+ 16384).getStackForm(1L));
+ eM_dynamoTunnel5_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15278,
+ "hatch.dynamotunnel5.tier.13",
+ "UXV 65,536A/t Laser Source Hatch",
+ 13,
+ 65536).getStackForm(1L));
+ eM_dynamoTunnel6_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15288,
+ "hatch.dynamotunnel6.tier.13",
+ "UXV 262,144A/t Laser Source Hatch",
+ 13,
+ 262144).getStackForm(1L));
+ eM_dynamoTunnel7_UXV.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15298,
+ "hatch.dynamotunnel7.tier.13",
+ "UXV 1,048,576A/t Laser Source Hatch",
+ 13,
+ 1048576).getStackForm(1L));
+ eM_dynamoTunnel9001.set(
+ new GT_MetaTileEntity_Hatch_DynamoTunnel(
+ 15299,
+ "hatch.dynamotunnel.tier.14",
+ "Legendary Laser Source Hatch",
+ 13,
+ (int) V[13]).getStackForm(1L));
+
+ // ===================================================================================================
+ // MULTIBLOCKS
+ // ===================================================================================================
+
+ Machine_Multi_Transformer.set(
+ new GT_MetaTileEntity_EM_transformer(15300, "multimachine.em.transformer", "Active Transformer")
+ .getStackForm(1L));
+ Machine_Multi_Microwave.set(
+ new GT_MetaTileEntity_TM_microwave(15312, "multimachine.tm.microwave", "Microwave Grinder")
+ .getStackForm(1L));
+ Machine_Multi_TeslaCoil.set(
+ new GT_MetaTileEntity_TM_teslaCoil(15314, "multimachine.tm.teslaCoil", "Tesla Tower").getStackForm(1L));
+
+ Machine_Multi_Switch.set(
+ new GT_MetaTileEntity_EM_switch(15310, "multimachine.em.switch", "Network Switch With QoS")
+ .getStackForm(1L));
+ Machine_Multi_Computer.set(
+ new GT_MetaTileEntity_EM_computer(15311, "multimachine.em.computer", "Quantum Computer").getStackForm(1L));
+
+ Machine_Multi_DataBank
+ .set(new GT_MetaTileEntity_EM_dataBank(15313, "multimachine.em.databank", "Data Bank").getStackForm(1L));
+
+ Machine_Multi_Research.set(
+ new GT_MetaTileEntity_EM_research(15331, "multimachine.em.research", "Research station").getStackForm(1L));
+
+ Machine_Multi_Infuser
+ .set(new GT_MetaTileEntity_EM_infuser(15350, "multimachine.em.infuser", "Energy Infuser").getStackForm(1));
+
+ Machine_Multi_EyeOfHarmony.set(
+ new GT_MetaTileEntity_EM_EyeOfHarmony(15410, "multimachine.em.eye_of_harmony", "Eye of Harmony")
+ .getStackForm(1L));
+ if (!NewHorizonsCoreMod.isModLoaded()) {
+ Machine_Multi_ForgeOfGods.set(
+ new GT_MetaTileEntity_EM_ForgeOfGods(15411, "multimachine.em.forge_of_gods", "Forge of the Gods")
+ .getStackForm(1L));
+ Machine_Multi_SmeltingModule.set(
+ new GT_MetaTileEntity_EM_SmeltingModule(
+ 15412,
+ "multimachine.em.smelting_module",
+ "Helioflare Power Forge").getStackForm(1L));
+ Machine_Multi_MoltenModule.set(
+ new GT_MetaTileEntity_EM_MoltenModule(15413, "multimachine.em.molten_module", "Helioflux Melting Core")
+ .getStackForm(1L));
+ Machine_Multi_PlasmaModule.set(
+ new GT_MetaTileEntity_EM_PlasmaModule(
+ 15414,
+ "multimachine.em.plasma_module",
+ "Heliothermal Plasma Fabricator").getStackForm(1L));
+ Machine_Multi_QuarkGluonPlasmaModule.set(
+ new GT_MetaTileEntity_EM_ExoticModule(15415, "multimachine.em.exotic_module", "Heliofusion Exoticizer")
+ .getStackForm(1L));
+ }
+
+ // ===================================================================================================
+ // Hatches
+ // ===================================================================================================
+
+ Parametrizer_Hatch
+ .set(new GT_MetaTileEntity_Hatch_Param(15420, "hatch.param.tier.05", "Parametrizer", 5).getStackForm(1L)); // TODO
+ // refactor
+ // aName
+ // to
+ // hatch.param.tier.04
+ // and
+ // aTier
+ // to
+ // 4,
+ // check
+ // recipe
+ // for
+ // NH
+ ParametrizerX_Hatch
+ .set(new GT_MetaTileEntity_Hatch_Param(15421, "hatch.param.tier.07", "Parametrizer X", 7).getStackForm(1L));
+ ParametrizerTXT_Hatch.set(
+ new GT_MetaTileEntity_Hatch_ParamText(15422, "hatch.param.tier.10", "Parametrizer tXt", 10)
+ .getStackForm(1L)); // TODO check recipe for NH
+
+ Uncertainty_Hatch.set(
+ new GT_MetaTileEntity_Hatch_Uncertainty(15430, "hatch.certain.tier.07", "Uncertainty Resolver", 7)
+ .getStackForm(1L));
+ UncertaintyX_Hatch.set(
+ new GT_MetaTileEntity_Hatch_Uncertainty(15431, "hatch.certain.tier.10", "Uncertainty Resolver X", 10)
+ .getStackForm(1L));
+
+ dataIn_Hatch.set(
+ new GT_MetaTileEntity_Hatch_InputData(15440, "hatch.datain.tier.07", "Optical Slave Connector", 7)
+ .getStackForm(1L));
+ dataOut_Hatch.set(
+ new GT_MetaTileEntity_Hatch_OutputData(15441, "hatch.dataout.tier.07", "Optical Master Connector", 7)
+ .getStackForm(1L));
+ dataInAss_Hatch.set(
+ new GT_MetaTileEntity_Hatch_InputDataItems(
+ 15442,
+ "hatch.datainass.tier.07",
+ "Assembly line Slave Connector",
+ 7).getStackForm(1L));
+ dataOutAss_Hatch.set(
+ new GT_MetaTileEntity_Hatch_OutputDataItems(
+ 15443,
+ "hatch.dataoutass.tier.07",
+ "Data Bank Master Connector",
+ 7).getStackForm(1L));
+
+ rack_Hatch
+ .set(new GT_MetaTileEntity_Hatch_Rack(15450, "hatch.rack.tier.08", "Computer Rack", 8).getStackForm(1L));
+ holder_Hatch.set(
+ new GT_MetaTileEntity_Hatch_Holder(15451, "hatch.holder.tier.09", "Object Holder", 8).getStackForm(1L));
+
+ capacitor_Hatch.set(
+ new GT_MetaTileEntity_Hatch_Capacitor(15452, "hatch.capacitor.tier.03", "Capacitor Hatch", 3)
+ .getStackForm(1L));
+
+ // ===================================================================================================
+ // Pipes
+ // ===================================================================================================
+
+ LASERpipe
+ .set(new GT_MetaTileEntity_Pipe_Energy(15465, "pipe.energystream", "Laser Vacuum Pipe").getStackForm(1L));
+ DATApipe.set(new GT_MetaTileEntity_Pipe_Data(15470, "pipe.datastream", "Optical Fiber Cable").getStackForm(1L));
+
+ LASERpipeBlock.set(
+ new GT_MetaTileEntity_PipeBlock_Energy(15472, "pipe.energystream.block", "Laser Vacuum Pipe Casing")
+ .getStackForm(1L));
+ DATApipeBlock.set(
+ new GT_MetaTileEntity_PipeBlock_Data(15473, "pipe.datastream.block", "Optical Fiber Cable Casing")
+ .getStackForm(1L));
+
+ // ===================================================================================================
+ // Single Blocks
+ // ===================================================================================================
+
+ Machine_OwnerDetector.set(
+ new GT_MetaTileEntity_OwnerDetector(15480, "machine.tt.ownerdetector", "Owner detector", 3)
+ .getStackForm(1L));
+
+ // ===================================================================================================
+ // Buck Converters
+ // ===================================================================================================
+
+ Machine_BuckConverter_IV.set(
+ new GT_MetaTileEntity_BuckConverter(15485, "machine.tt.buck.05", "Insane Buck Converter", 5)
+ .getStackForm(1L));
+ Machine_BuckConverter_LuV.set(
+ new GT_MetaTileEntity_BuckConverter(15486, "machine.tt.buck.06", "Ludicrous Buck Converter", 6)
+ .getStackForm(1L));
+ Machine_BuckConverter_ZPM.set(
+ new GT_MetaTileEntity_BuckConverter(15487, "machine.tt.buck.07", "ZPM Voltage Buck Converter", 7)
+ .getStackForm(1L));
+ Machine_BuckConverter_UV.set(
+ new GT_MetaTileEntity_BuckConverter(15488, "machine.tt.buck.08", "Ultimate Power Buck Converter", 8)
+ .getStackForm(1L));
+ Machine_BuckConverter_UHV.set(
+ new GT_MetaTileEntity_BuckConverter(15489, "machine.tt.buck.09", "Highly Ultimate Buck Converter", 9)
+ .getStackForm(1L));
+ Machine_BuckConverter_UEV.set(
+ new GT_MetaTileEntity_BuckConverter(15490, "machine.tt.buck.10", "Extremely Ultimate Buck Converter", 10)
+ .getStackForm(1L));
+ Machine_BuckConverter_UIV.set(
+ new GT_MetaTileEntity_BuckConverter(15491, "machine.tt.buck.11", "Insanely Ultimate Buck Converter", 11)
+ .getStackForm(1L));
+ Machine_BuckConverter_UMV.set(
+ new GT_MetaTileEntity_BuckConverter(15492, "machine.tt.buck.12", "Mega Ultimate Buck Converter", 12)
+ .getStackForm(1L));
+ Machine_BuckConverter_UXV.set(
+ new GT_MetaTileEntity_BuckConverter(
+ 15493,
+ "machine.tt.buck.13",
+ "Extended Mega Ultimate Buck Converter",
+ 13).getStackForm(1L));
+
+ // ===================================================================================================
+ // Tesla Transceiver
+ // ===================================================================================================
+
+ Machine_TeslaCoil_1by1_LV.set(
+ new GT_MetaTileEntity_TeslaCoil(16000, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 1)
+ .getStackForm(1L));
+ Machine_TeslaCoil_1by1_MV.set(
+ new GT_MetaTileEntity_TeslaCoil(16001, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 1)
+ .getStackForm(1L));
+ Machine_TeslaCoil_1by1_HV.set(
+ new GT_MetaTileEntity_TeslaCoil(16002, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 1)
+ .getStackForm(1L));
+ Machine_TeslaCoil_1by1_EV.set(
+ new GT_MetaTileEntity_TeslaCoil(16003, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 1)
+ .getStackForm(1L));
+ Machine_TeslaCoil_1by1_IV.set(
+ new GT_MetaTileEntity_TeslaCoil(16004, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 1)
+ .getStackForm(1L));
+
+ Machine_TeslaCoil_2by2_LV.set(
+ new GT_MetaTileEntity_TeslaCoil(16005, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 4)
+ .getStackForm(1L));
+ Machine_TeslaCoil_2by2_MV.set(
+ new GT_MetaTileEntity_TeslaCoil(16006, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 4)
+ .getStackForm(1L));
+ Machine_TeslaCoil_2by2_HV.set(
+ new GT_MetaTileEntity_TeslaCoil(16007, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 4)
+ .getStackForm(1L));
+ Machine_TeslaCoil_2by2_EV.set(
+ new GT_MetaTileEntity_TeslaCoil(16008, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 4)
+ .getStackForm(1L));
+ Machine_TeslaCoil_2by2_IV.set(
+ new GT_MetaTileEntity_TeslaCoil(16009, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 4)
+ .getStackForm(1L));
+
+ Machine_TeslaCoil_3by3_LV.set(
+ new GT_MetaTileEntity_TeslaCoil(16010, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 9)
+ .getStackForm(1L));
+ Machine_TeslaCoil_3by3_MV.set(
+ new GT_MetaTileEntity_TeslaCoil(16011, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 9)
+ .getStackForm(1L));
+ Machine_TeslaCoil_3by3_HV.set(
+ new GT_MetaTileEntity_TeslaCoil(16012, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 9)
+ .getStackForm(1L));
+ Machine_TeslaCoil_3by3_EV.set(
+ new GT_MetaTileEntity_TeslaCoil(16013, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 9)
+ .getStackForm(1L));
+ Machine_TeslaCoil_3by3_IV.set(
+ new GT_MetaTileEntity_TeslaCoil(16014, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 9)
+ .getStackForm(1L));
+
+ Machine_TeslaCoil_4by4_LV.set(
+ new GT_MetaTileEntity_TeslaCoil(16015, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 16)
+ .getStackForm(1L));
+ Machine_TeslaCoil_4by4_MV.set(
+ new GT_MetaTileEntity_TeslaCoil(16016, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 16)
+ .getStackForm(1L));
+ Machine_TeslaCoil_4by4_HV.set(
+ new GT_MetaTileEntity_TeslaCoil(16017, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 16)
+ .getStackForm(1L));
+ Machine_TeslaCoil_4by4_EV.set(
+ new GT_MetaTileEntity_TeslaCoil(16018, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 16)
+ .getStackForm(1L));
+ Machine_TeslaCoil_4by4_IV.set(
+ new GT_MetaTileEntity_TeslaCoil(16019, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 16)
+ .getStackForm(1L));
+
+ // ===================================================================================================
+ // Debug Stuff
+ // ===================================================================================================
+ Machine_DebugPollutor.set(
+ new GT_MetaTileEntity_DebugPollutor(15495, "debug.tt.pollutor", "Debug Pollution Generator", 14)
+ .getStackForm(1));
+ hatch_CreativeData.set(
+ new GT_MetaTileEntity_Hatch_CreativeData(15496, "debug.tt.data", "Debug Data Hatch", 14).getStackForm(1));
+ hatch_CreativeMaintenance.set(
+ new GT_MetaTileEntity_Hatch_CreativeMaintenance(
+ 15497,
+ "debug.tt.maintenance",
+ "Auto-Taping Maintenance Hatch",
+ 14).getStackForm(1L));
+ Machine_DebugGenny.set(
+ new GT_MetaTileEntity_DebugPowerGenerator(15498, "debug.tt.genny", "Debug Power Generator", 14)
+ .getStackForm(1L));
+ Machine_DebugWriter.set(
+ new GT_MetaTileEntity_DebugStructureWriter(15499, "debug.tt.writer", "Debug Structure Writer", 14)
+ .getStackForm(1L));
+ UnusedStuff.set(new ItemStack(Blocks.air));
+ hatch_CreativeUncertainty.set(
+ new GT_MetaTileEntity_Hatch_CreativeUncertainty(15510, "debug.tt.certain", "Uncertainty Resolution", 14)
+ .getStackForm(1));
+
+ // ===================================================================================================
+ // MetaTE init
+ // ===================================================================================================
+
+ GT_MetaTileEntity_Hatch_Rack.run();
+
+ GT_MetaTileEntity_Hatch_Capacitor.run();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java
new file mode 100644
index 0000000000..15ab723e42
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java
@@ -0,0 +1,21 @@
+package com.github.technus.tectech.loader.thing;
+
+import com.github.technus.tectech.TecTech;
+
+public class MuTeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ TecTech.LOGGER.info("TecTech: Registering MultiTileEntities");
+ registerMachines();
+ registerCasings();
+ }
+
+ private static void registerMachines() {
+
+ }
+
+ private static void registerCasings() {
+
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
new file mode 100644
index 0000000000..11e4415080
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
@@ -0,0 +1,99 @@
+package com.github.technus.tectech.loader.thing;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.tectechTexturePage1;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.block.GodforgeGlassBlock;
+import com.github.technus.tectech.thing.block.QuantumGlassBlock;
+import com.github.technus.tectech.thing.block.ReactorSimBlock;
+import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
+import com.github.technus.tectech.thing.casing.GT_Block_CasingsBA0;
+import com.github.technus.tectech.thing.casing.GT_Block_CasingsTT;
+import com.github.technus.tectech.thing.casing.GodforgeCasings;
+import com.github.technus.tectech.thing.casing.SpacetimeCompressionFieldCasing;
+import com.github.technus.tectech.thing.casing.StabilisationFieldCasing;
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+import com.github.technus.tectech.thing.casing.TimeAccelerationFieldCasing;
+import com.github.technus.tectech.thing.item.AstralArrayFabricator;
+import com.github.technus.tectech.thing.item.EnderFluidLinkCover;
+import com.github.technus.tectech.thing.item.EuMeterGT;
+import com.github.technus.tectech.thing.item.ParametrizerMemoryCard;
+import com.github.technus.tectech.thing.item.PowerPassUpgradeCover;
+import com.github.technus.tectech.thing.item.TeslaCoilCapacitor;
+import com.github.technus.tectech.thing.item.TeslaCoilComponent;
+import com.github.technus.tectech.thing.item.TeslaCoilCover;
+import com.github.technus.tectech.thing.item.TeslaStaff;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * Created by danie_000 on 16.11.2016.
+ */
+public class ThingsLoader implements Runnable {
+
+ @Override
+ public void run() {
+
+ GameRegistry.registerTileEntity(TileEyeOfHarmony.class, MODID + ":EyeOfHarmonyRenderBlock");
+ GameRegistry.registerTileEntity(TileForgeOfGods.class, MODID + ":ForgeOfGodsRenderBlock");
+
+ if (Textures.BlockIcons.casingTexturePages[tectechTexturePage1] == null) {
+ Textures.BlockIcons.casingTexturePages[tectechTexturePage1] = new ITexture[128];
+ }
+
+ if (Textures.BlockIcons.casingTexturePages[7] == null) {
+ Textures.BlockIcons.casingTexturePages[7] = new ITexture[128];
+ }
+
+ TecTech.LOGGER.info("Added texture page if was null");
+
+ TT_Container_Casings.sBlockCasingsTT = new GT_Block_CasingsTT();
+ TecTech.LOGGER.info("Elemental Casing registered");
+ TT_Container_Casings.sBlockCasingsBA0 = new GT_Block_CasingsBA0();
+ TecTech.LOGGER.info("Nikolai's Casing registered");
+
+ TT_Container_Casings.SpacetimeCompressionFieldGenerators = new SpacetimeCompressionFieldCasing();
+ TecTech.LOGGER.info("Spacetime Compression Field Casings registered.");
+
+ TT_Container_Casings.TimeAccelerationFieldGenerator = new TimeAccelerationFieldCasing();
+ TecTech.LOGGER.info("Time Acceleration Field Casings registered.");
+
+ TT_Container_Casings.StabilisationFieldGenerators = new StabilisationFieldCasing();
+
+ if (!NewHorizonsCoreMod.isModLoaded()) {
+
+ TT_Container_Casings.GodforgeCasings = new GodforgeCasings();
+ TecTech.LOGGER.info("Godforge blocks registered.");
+
+ GodforgeGlassBlock.run();
+ TecTech.LOGGER.info("Godforge Glass registered");
+
+ }
+
+ QuantumGlassBlock.run();
+ TecTech.LOGGER.info("Quantum Glass registered");
+
+ ReactorSimBlock.run();
+ TecTech.LOGGER.info("Reactor Simulator registered");
+
+ ParametrizerMemoryCard.run();
+ EuMeterGT.run();
+ TeslaStaff.run();
+ TeslaCoilCover.run();
+ TeslaCoilCapacitor.run();
+ EnderFluidLinkCover.run();
+ PowerPassUpgradeCover.run();
+ TecTech.LOGGER.info("Useful Items registered");
+
+ TeslaCoilComponent.run();
+ AstralArrayFabricator.run();
+ TecTech.LOGGER.info("Crafting Components registered");
+
+ TecTech.LOGGER.info("Debug Items registered");
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java
new file mode 100644
index 0000000000..01ef4560ee
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java
@@ -0,0 +1,104 @@
+package com.github.technus.tectech.mechanics.dataTransport;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+/**
+ * Created by Tec on 05.04.2017.
+ */
+public abstract class DataPacket<T> {
+
+ private static final byte MAX_HISTORY = 64;
+ private final Set<Vec3Impl> trace = new LinkedHashSet<>();
+
+ protected T content;
+
+ protected DataPacket(T content) {
+ this.content = content;
+ }
+
+ protected DataPacket(NBTTagCompound nbt) {
+ content = contentFromNBT(nbt.getCompoundTag("qContent"));
+ for (int i = 0; i < nbt.getByte("qHistory"); i++) {
+ trace.add(new Vec3Impl(nbt.getInteger("qX" + i), nbt.getInteger("qY" + i), nbt.getInteger("qZ" + i)));
+ }
+ }
+
+ public final NBTTagCompound toNbt() {
+ NBTTagCompound nbt = new NBTTagCompound();
+ NBTTagCompound contentTag = contentToNBT();
+ if (contentTag != null) {
+ nbt.setTag("qContent", contentTag);
+ }
+ nbt.setByte("qHistory", (byte) trace.size());
+ int i = 0;
+ for (Vec3Impl v : trace) {
+ nbt.setInteger("qX" + i, v.get0());
+ nbt.setInteger("qY" + i, v.get1());
+ nbt.setInteger("qZ" + i, v.get2());
+ i++;
+ }
+ return nbt;
+ }
+
+ protected abstract NBTTagCompound contentToNBT();
+
+ protected abstract T contentFromNBT(NBTTagCompound nbt);
+
+ protected abstract T unifyContentWith(T content);
+
+ public final boolean contains(Vec3Impl v) {
+ return trace.contains(v);
+ }
+
+ public final boolean check() {
+ return trace.size() <= MAX_HISTORY;
+ }
+
+ public abstract boolean extraCheck();
+
+ protected final DataPacket<T> unifyTrace(Vec3Impl... positions) {
+ Collections.addAll(trace, positions);
+ return (check() && extraCheck()) ? this : null;
+ }
+
+ protected final DataPacket<T> unifyTrace(DataPacket<T> p) {
+ if (p == null) return this;
+ trace.addAll(p.trace);
+ return (check() && extraCheck()) ? this : null;
+ }
+
+ protected final DataPacket<T> unifyWith(DataPacket<T> p) {
+ if (p == null) return this;
+ trace.addAll(p.trace);
+ if (check() && extraCheck()) {
+ content = unifyContentWith(p.content);
+ return this;
+ }
+ return null;
+ }
+
+ public final T contentIfNotInTrace(Vec3Impl pos) {
+ if (trace.contains(pos)) {
+ return null;
+ }
+ return getContent();
+ }
+
+ public T getContent() {
+ return content;
+ }
+
+ public String getContentString() {
+ return content.toString();
+ }
+
+ public final int getTraceSize() {
+ return trace.size();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java
new file mode 100644
index 0000000000..e6e24b9ac7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java
@@ -0,0 +1,62 @@
+package com.github.technus.tectech.mechanics.dataTransport;
+
+import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+public class InventoryDataPacket extends DataPacket<ItemStack[]> {
+
+ public InventoryDataPacket(ItemStack[] content) {
+ super(content);
+ }
+
+ public InventoryDataPacket(NBTTagCompound compound) {
+ super(compound);
+ }
+
+ @Override
+ protected ItemStack[] contentFromNBT(NBTTagCompound nbt) {
+ int count = nbt.getInteger("count");
+ if (count > 0) {
+ ArrayList<ItemStack> stacks = new ArrayList<>();
+ for (int i = 0; i < count; i++) {
+ ItemStack stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Integer.toString(i)));
+ if (stack != null) {
+ stacks.add(stack);
+ }
+ }
+ return stacks.size() > 0 ? stacks.toArray(nullItem) : null;
+ }
+ return null;
+ }
+
+ @Override
+ protected NBTTagCompound contentToNBT() {
+ NBTTagCompound compound = new NBTTagCompound();
+ if (content != null && content.length > 0) {
+ compound.setInteger("count", content.length);
+ for (int i = 0; i < content.length; i++) {
+ compound.setTag(Integer.toString(i), content[i].writeToNBT(new NBTTagCompound()));
+ }
+ }
+ return compound;
+ }
+
+ @Override
+ public boolean extraCheck() {
+ return true;
+ }
+
+ @Override
+ protected ItemStack[] unifyContentWith(ItemStack[] content) {
+ throw new NoSuchMethodError("Unavailable to unify item stack data packet");
+ }
+
+ @Override
+ public String getContentString() {
+ return "Stack Count: " + (content == null ? 0 : content.length);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java
new file mode 100644
index 0000000000..8dff99a42d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java
@@ -0,0 +1,50 @@
+package com.github.technus.tectech.mechanics.dataTransport;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+public class QuantumDataPacket extends DataPacket<Long> {
+
+ public QuantumDataPacket(Long content) {
+ super(content);
+ }
+
+ public QuantumDataPacket(NBTTagCompound compound) {
+ super(compound);
+ }
+
+ @Override
+ protected Long contentFromNBT(NBTTagCompound nbt) {
+ return nbt.getLong("computation");
+ }
+
+ @Override
+ protected NBTTagCompound contentToNBT() {
+ NBTTagCompound compound = new NBTTagCompound();
+ compound.setLong("computation", content);
+ return compound;
+ }
+
+ @Override
+ public boolean extraCheck() {
+ return true;
+ }
+
+ @Override
+ protected Long unifyContentWith(Long content) {
+ return this.content + content;
+ }
+
+ public QuantumDataPacket unifyTraceWith(Vec3Impl... positions) {
+ return (QuantumDataPacket) super.unifyTrace(positions);
+ }
+
+ public QuantumDataPacket unifyTraceWith(QuantumDataPacket p) {
+ return (QuantumDataPacket) super.unifyTrace(p);
+ }
+
+ public QuantumDataPacket unifyPacketWith(QuantumDataPacket p) {
+ return (QuantumDataPacket) super.unifyWith(p);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java
new file mode 100644
index 0000000000..2499ecf596
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java
@@ -0,0 +1,134 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+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.github.technus.tectech.TecTech;
+
+public class EnderFluidContainer implements IFluidHandler, Serializable {
+
+ private static final long serialVersionUID = 2L;
+ private static final int SERIALIZE_TYPE_WITH_NBT = 0;
+ private static final int SERIALIZE_TYPE_WITHOUT_NBT = 1;
+ private static final int SERIALIZE_TYPE_NULL = 2;
+
+ private static final int CAPACITY = 64000;
+ private transient FluidStack fluidStack;
+
+ public EnderFluidContainer() {}
+
+ private FluidStack getFluidStack() {
+ return fluidStack;
+ }
+
+ private void setFluidStack(FluidStack fluidStack) {
+ this.fluidStack = fluidStack;
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack fluidStackIn, boolean doFill) {
+ int filledFluid = 0;
+ FluidStack fluidStackStored = getFluidStack();
+ if (fluidStackIn != null) {
+ if (fluidStackStored == null) {
+ fluidStackStored = fluidStackIn.copy();
+ fluidStackStored.amount = 0;
+ }
+ if (fluidStackStored.amount < CAPACITY && fluidStackIn.isFluidEqual(fluidStackStored)) {
+ filledFluid = Math.min(CAPACITY - fluidStackStored.amount, fluidStackIn.amount);
+ if (doFill) {
+ fluidStackStored.amount += filledFluid;
+ setFluidStack(fluidStackStored);
+ }
+ }
+ }
+ return filledFluid;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack fluidStack, boolean doDrain) {
+ FluidStack fluidStackOutput = null;
+ if (fluidStack != null && fluidStack.isFluidEqual(getFluidStack())) {
+ fluidStackOutput = drain(side, fluidStack.amount, doDrain);
+ }
+ return fluidStackOutput;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int amount, boolean doDrain) {
+ FluidStack fluidStackOutput = null;
+ FluidStack fluidStackStored = getFluidStack();
+ if (fluidStackStored != null && fluidStackStored.amount > 0) {
+ int drainedFluid = Math.min(fluidStackStored.amount, amount);
+ fluidStackOutput = fluidStackStored.copy();
+ fluidStackOutput.amount = drainedFluid;
+ if (doDrain) {
+ fluidStackStored.amount -= drainedFluid;
+ if (fluidStackStored.amount == 0) {
+ fluidStackStored = null;
+ }
+ setFluidStack(fluidStackStored);
+ }
+ }
+ return fluidStackOutput;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection forgeDirection, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection forgeDirection, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection forgeDirection) {
+ return new FluidTankInfo[] { new FluidTankInfo(getFluidStack(), CAPACITY) };
+ }
+
+ private void writeObject(ObjectOutputStream out) throws IOException {
+ if (fluidStack != null) {
+ out.writeByte(fluidStack.tag != null ? SERIALIZE_TYPE_WITH_NBT : SERIALIZE_TYPE_WITHOUT_NBT);
+ if (fluidStack.tag != null) CompressedStreamTools.write(fluidStack.tag, out);
+ out.writeUTF(
+ fluidStack.getFluid()
+ .getName());
+ out.writeInt(fluidStack.amount);
+ } else {
+ out.writeByte(SERIALIZE_TYPE_NULL);
+ }
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ byte type = in.readByte();
+ NBTTagCompound tag = null;
+ switch (type) {
+ case SERIALIZE_TYPE_WITH_NBT:
+ tag = CompressedStreamTools.read(new DataInputStream(in));
+ case SERIALIZE_TYPE_WITHOUT_NBT:
+ fluidStack = FluidRegistry.getFluidStack(in.readUTF(), in.readInt());
+ break;
+ case SERIALIZE_TYPE_NULL:
+ fluidStack = null;
+ break;
+ default:
+ TecTech.LOGGER.error("Something very wrong... got a fluid container with state " + type);
+ fluidStack = null;
+ }
+ if (fluidStack != null) fluidStack.tag = tag;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java
new file mode 100644
index 0000000000..e700c54b17
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java
@@ -0,0 +1,39 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import com.google.common.base.Objects;
+
+public class EnderLinkTag implements Serializable {
+
+ private static final long serialVersionUID = 6884008436570077863L;
+ private final String frequency;
+ private final UUID player;
+
+ public EnderLinkTag(String frequency, UUID player) {
+ this.frequency = frequency;
+ this.player = player;
+ }
+
+ public String getFrequency() {
+ return frequency;
+ }
+
+ public UUID getUUID() {
+ return player;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EnderLinkTag that = (EnderLinkTag) o;
+ return Objects.equal(frequency, that.frequency) && Objects.equal(player, that.player);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(frequency, player);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java
new file mode 100644
index 0000000000..574f9c2b36
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java
@@ -0,0 +1,47 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import java.io.Serializable;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.base.Objects;
+
+public class EnderLinkTank implements Serializable {
+
+ private static final long serialVersionUID = 1030297456736434221L;
+ private final int X;
+ private final int Y;
+ private final int Z;
+ private final int D;
+
+ public EnderLinkTank(IFluidHandler fluidHandler) {
+ TileEntity tile = (TileEntity) fluidHandler;
+ X = tile.xCoord;
+ Y = tile.yCoord;
+ Z = tile.zCoord;
+ D = tile.getWorldObj().provider.dimensionId;
+ }
+
+ public IFluidHandler getFluidHandler() {
+ IFluidHandler fluidHandler = null;
+ TileEntity tile = DimensionManager.getWorld(D)
+ .getTileEntity(X, Y, Z);
+ if (tile instanceof IFluidHandler) fluidHandler = (IFluidHandler) tile;
+ return fluidHandler;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EnderLinkTank that = (EnderLinkTank) o;
+ return X == that.X && Y == that.Y && Z == that.Z && D == that.D;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(X, Y, Z, D);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java
new file mode 100644
index 0000000000..125ce33304
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java
@@ -0,0 +1,145 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+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.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.storage.MapStorage;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+
+public class EnderWorldSavedData extends WorldSavedData {
+
+ private static EnderWorldSavedData INSTANCE;
+
+ private static final String DATA_NAME = MODID + "_EnderWorldSavedData";
+ private static final String ENDER_LIQUID_TAG_LINK = DATA_NAME + "_EnderLiquidTagLink";
+ private static final String ENDER_LIQUID_TANK_LINK = DATA_NAME + "_EnderLiquidTankLink";
+ private static final EnderLinkTag DEFAULT_LINK_TAG = new EnderLinkTag("", null);
+
+ private Map<EnderLinkTag, EnderFluidContainer> EnderLiquidTagLink = new HashMap<>();
+ private Map<EnderLinkTank, EnderLinkTag> EnderLiquidTankLink = new HashMap<>();
+
+ public EnderWorldSavedData() {
+ super(DATA_NAME);
+ }
+
+ public EnderWorldSavedData(String s) {
+ super(s);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void readFromNBT(NBTTagCompound nbtTagCompound) {
+ try {
+ byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TAG_LINK);
+ InputStream is = new ByteArrayInputStream(ba);
+ ObjectInputStream ois = new ObjectInputStream(is);
+ Object data = ois.readObject();
+ EnderLiquidTagLink = (Map<EnderLinkTag, EnderFluidContainer>) data;
+ } catch (IOException | ClassNotFoundException ignored) {
+ System.out.println("ENDER_LIQUID_TAG_LINK LOAD FAILED");
+ System.out.println(ignored);
+ }
+
+ try {
+ byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TANK_LINK);
+ InputStream is = new ByteArrayInputStream(ba);
+ ObjectInputStream ois = new ObjectInputStream(is);
+ Object data = ois.readObject();
+ EnderLiquidTankLink = (Map<EnderLinkTank, EnderLinkTag>) data;
+ } catch (IOException | ClassNotFoundException ignored) {
+ System.out.println("ENDER_LIQUID_TANK_LINK LOAD FAILED");
+ System.out.println(ignored);
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbtTagCompound) {
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(EnderLiquidTagLink);
+ oos.flush();
+ byte[] data = bos.toByteArray();
+ nbtTagCompound.setByteArray(ENDER_LIQUID_TAG_LINK, data);
+ } catch (IOException ignored) {
+ System.out.println("ENDER_LIQUID_TAG_LINK SAVE FAILED");
+ System.out.println(ignored);
+ }
+
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(EnderLiquidTankLink);
+ oos.flush();
+ byte[] data = bos.toByteArray();
+ nbtTagCompound.setByteArray(ENDER_LIQUID_TANK_LINK, data);
+ } catch (IOException ignored) {
+ System.out.println("ENDER_LIQUID_TANK_LINK SAVE FAILED");
+ System.out.println(ignored);
+ }
+ }
+
+ private static void loadInstance() {
+ if (INSTANCE == null) {
+ MapStorage storage = DimensionManager.getWorld(0).mapStorage;
+ INSTANCE = (EnderWorldSavedData) storage.loadData(EnderWorldSavedData.class, DATA_NAME);
+ if (INSTANCE == null) {
+ INSTANCE = new EnderWorldSavedData();
+ storage.setData(DATA_NAME, INSTANCE);
+ }
+ }
+ INSTANCE.markDirty();
+ }
+
+ private static Map<EnderLinkTag, EnderFluidContainer> getEnderLiquidLink() {
+ loadInstance();
+ return INSTANCE.EnderLiquidTagLink;
+ }
+
+ private static Map<EnderLinkTank, EnderLinkTag> getEnderLiquidTankLink() {
+ loadInstance();
+ return INSTANCE.EnderLiquidTankLink;
+ }
+
+ public static EnderFluidContainer getEnderFluidContainer(EnderLinkTag tag) {
+ if (!getEnderLiquidLink().containsKey(tag)) {
+ getEnderLiquidLink().put(tag, new EnderFluidContainer());
+ }
+ return getEnderLiquidLink().get(tag);
+ }
+
+ public static EnderLinkTag getEnderLinkTag(IFluidHandler handler) {
+ EnderLinkTank tank = new EnderLinkTank(handler);
+ if (!getEnderLiquidTankLink().containsKey(tank)) {
+ getEnderLiquidTankLink().put(tank, DEFAULT_LINK_TAG);
+ }
+ return getEnderLiquidTankLink().get(tank);
+ }
+
+ public static void bindEnderLinkTag(IFluidHandler handler, EnderLinkTag tag) {
+ EnderLinkTank tank = new EnderLinkTank(handler);
+ getEnderLiquidTankLink().remove(tank);
+ getEnderLiquidTankLink().put(tank, tag);
+ }
+
+ @SubscribeEvent
+ public void onWorldUnload(WorldEvent.Unload event) {
+ if (event.world.provider.dimensionId == 0) {
+ INSTANCE = null;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java b/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java
new file mode 100644
index 0000000000..c1ec11ffc4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java
@@ -0,0 +1,12 @@
+package com.github.technus.tectech.mechanics.pipe;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+
+public interface IActivePipe extends IMetaTileEntity {
+
+ void setActive(boolean active);
+
+ boolean getActive();
+
+ void markUsed();
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java b/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java
new file mode 100644
index 0000000000..cc5f72d12e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java
@@ -0,0 +1,17 @@
+package com.github.technus.tectech.mechanics.pipe;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * Created by Tec on 26.02.2017.
+ */
+public interface IConnectsToDataPipe {
+
+ boolean canConnectData(ForgeDirection side);
+
+ IConnectsToDataPipe getNext(IConnectsToDataPipe source);
+
+ boolean isDataInputFacing(ForgeDirection side);
+
+ byte getColorization();
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java b/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java
new file mode 100644
index 0000000000..e9047d22f0
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java
@@ -0,0 +1,11 @@
+package com.github.technus.tectech.mechanics.pipe;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * Created by Tec on 26.02.2017.
+ */
+public interface IConnectsToEnergyTunnel {
+
+ boolean canConnect(ForgeDirection side);
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java b/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java
new file mode 100644
index 0000000000..549397afa0
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java
@@ -0,0 +1,136 @@
+package com.github.technus.tectech.mechanics.pipe;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import cpw.mods.fml.common.network.ByteBufUtils;
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import eu.usrv.yamcore.network.client.AbstractClientMessageHandler;
+import eu.usrv.yamcore.network.server.AbstractServerMessageHandler;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import io.netty.buffer.ByteBuf;
+
+public class PipeActivityMessage implements IMessage {
+
+ int mPosX;
+ int mPosY;
+ int mPosZ;
+ int mPosD;
+ int mActive;
+
+ public PipeActivityMessage() {}
+
+ private PipeActivityMessage(IActivePipe metaTile) {
+ IGregTechTileEntity base = metaTile.getBaseMetaTileEntity();
+ mPosX = base.getXCoord();
+ mPosY = base.getYCoord();
+ mPosZ = base.getZCoord();
+ mPosD = base.getWorld().provider.dimensionId;
+ mActive = metaTile.getActive() ? 1 : 0;
+ }
+
+ private PipeActivityMessage(World world, int x, int y, int z, boolean active) {
+ mPosX = x;
+ mPosY = y;
+ mPosZ = z;
+ mPosD = world.provider.dimensionId;
+ mActive = active ? 1 : 0;
+ }
+
+ @Override
+ public void fromBytes(ByteBuf pBuffer) {
+ NBTTagCompound tTag = ByteBufUtils.readTag(pBuffer);
+ mPosX = tTag.getInteger("posx");
+ mPosY = tTag.getInteger("posy");
+ mPosZ = tTag.getInteger("posz");
+ mPosD = tTag.getInteger("posd");
+ mActive = tTag.getInteger("active");
+ }
+
+ @Override
+ public void toBytes(ByteBuf pBuffer) {
+ NBTTagCompound tFXTag = new NBTTagCompound();
+ tFXTag.setInteger("posx", mPosX);
+ tFXTag.setInteger("posy", mPosY);
+ tFXTag.setInteger("posz", mPosZ);
+ tFXTag.setInteger("posd", mPosD);
+ tFXTag.setInteger("active", mActive);
+
+ ByteBufUtils.writeTag(pBuffer, tFXTag);
+ }
+
+ public static class PipeActivityQuery extends PipeActivityMessage {
+
+ public PipeActivityQuery() {}
+
+ public PipeActivityQuery(IActivePipe metaTile) {
+ super(metaTile);
+ }
+
+ public PipeActivityQuery(World world, int x, int y, int z, boolean active) {
+ super(world, x, y, z, active);
+ }
+ }
+
+ public static class PipeActivityData extends PipeActivityMessage {
+
+ public PipeActivityData() {}
+
+ private PipeActivityData(PipeActivityQuery query) {
+ mPosX = query.mPosX;
+ mPosY = query.mPosY;
+ mPosZ = query.mPosZ;
+ mPosD = query.mPosD;
+ mActive = query.mActive;
+ }
+
+ public PipeActivityData(IActivePipe metaTile) {
+ super(metaTile);
+ }
+
+ public PipeActivityData(World world, int x, int y, int z, boolean active) {
+ super(world, x, y, z, active);
+ }
+ }
+
+ public static class ClientHandler extends AbstractClientMessageHandler<PipeActivityData> {
+
+ @Override
+ public IMessage handleClientMessage(EntityPlayer pPlayer, PipeActivityData pMessage, MessageContext pCtx) {
+ if (pPlayer.worldObj.provider.dimensionId == pMessage.mPosD) {
+ TileEntity te = pPlayer.worldObj.getTileEntity(pMessage.mPosX, pMessage.mPosY, pMessage.mPosZ);
+ if (te instanceof IGregTechTileEntity) {
+ IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity();
+ if (meta instanceof IActivePipe) {
+ ((IActivePipe) meta).setActive(pMessage.mActive == 1);
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class ServerHandler extends AbstractServerMessageHandler<PipeActivityQuery> {
+
+ @Override
+ public IMessage handleServerMessage(EntityPlayer pPlayer, PipeActivityQuery pMessage, MessageContext pCtx) {
+ World world = DimensionManager.getWorld(pMessage.mPosD);
+ if (world != null) {
+ TileEntity te = world.getTileEntity(pMessage.mPosX, pMessage.mPosY, pMessage.mPosZ);
+ if (te instanceof IGregTechTileEntity) {
+ IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity();
+ if (meta instanceof IActivePipe) {
+ pMessage.mActive = ((IActivePipe) meta).getActive() ? 1 : 0;
+ return new PipeActivityData(pMessage);
+ }
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java b/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java
new file mode 100644
index 0000000000..d13e8bfb7f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java
@@ -0,0 +1,149 @@
+package com.github.technus.tectech.mechanics.spark;
+
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+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.io.ObjectStreamClass;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Random;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.world.World;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.MarkerManager;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import eu.usrv.yamcore.network.client.AbstractClientMessageHandler;
+import io.netty.buffer.ByteBuf;
+import thaumcraft.client.fx.bolt.FXLightningBolt;
+
+// TODO Re-work how sparks are distributed
+public class RendererMessage implements IMessage {
+
+ HashSet<ThaumSpark> sparkList;
+
+ public RendererMessage() {}
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void fromBytes(ByteBuf pBuffer) {
+ if (FMLCommonHandler.instance()
+ .getSide()
+ .isServer()) return;
+ try {
+ // I'd love to know why I need to offset by one byte for this to work
+ byte[] boop = pBuffer.array();
+ boop = Arrays.copyOfRange(boop, 1, boop.length);
+ InputStream is = new ByteArrayInputStream(boop);
+ ObjectInputStream ois = new ValidatingObjectInputStream(is);
+ Object data = ois.readObject();
+ sparkList = (HashSet<ThaumSpark>) data;
+ } catch (IOException | ClassNotFoundException ignored) {}
+ }
+
+ @Override
+ public void toBytes(ByteBuf pBuffer) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(sparkList);
+ oos.flush();
+ InputStream is = new ByteArrayInputStream(baos.toByteArray());
+ pBuffer.writeBytes(is, baos.toByteArray().length);
+ } catch (IOException ignore) {}
+ }
+
+ public static class RendererData extends RendererMessage {
+
+ public RendererData() {}
+
+ public RendererData(HashSet<ThaumSpark> eSparkList) {
+ sparkList = eSparkList;
+ }
+ }
+
+ public static class ClientHandler extends AbstractClientMessageHandler<RendererData> {
+
+ @Override
+ public IMessage handleClientMessage(EntityPlayer pPlayer, RendererData pMessage, MessageContext pCtx) {
+ // disgusting
+ Random localRand = Minecraft.getMinecraft().theWorld.rand;
+ int[] zapsToUse = new int[4];
+ for (int i = 0; i < 3; i++) {
+ zapsToUse[i] = localRand.nextInt(pMessage.sparkList.size());
+ }
+ int i = 0;
+ for (ThaumSpark sp : pMessage.sparkList) {
+ for (int j : zapsToUse) {
+ if (i == j) {
+ thaumLightning(sp.x, sp.y, sp.z, sp.xR, sp.yR, sp.zR, sp.wID);
+ }
+ }
+ i++;
+ }
+ pMessage.sparkList.clear();
+ return null;
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ private static void thaumLightning(int tX, int tY, int tZ, int tXN, int tYN, int tZN, int wID) {
+ // This is enough to check for thaum, since it only ever matters for client side effects (Tested not to crash)
+ if (Thaumcraft.isModLoaded()) {
+ World world = Minecraft.getMinecraft().theWorld;
+ if (world.provider.dimensionId == wID) {
+ FXLightningBolt bolt = new FXLightningBolt(
+ world,
+ tX + 0.5F,
+ tY + 0.5F,
+ tZ + 0.5F,
+ tX + tXN + 0.5F,
+ tY + tYN + 0.5F,
+ tZ + tZN + 0.5F,
+ world.rand.nextLong(),
+ 6,
+ 0.5F,
+ 8);
+ bolt.defaultFractal();
+ bolt.setType(2);
+ bolt.setWidth(0.125F);
+ bolt.finalizeBolt();
+ }
+ }
+ }
+
+ private static class ValidatingObjectInputStream extends ObjectInputStream {
+
+ private static final Logger logger = LogManager.getLogger();
+ private static final Marker securityMarker = MarkerManager.getMarker("SuspiciousPackets");
+
+ private ValidatingObjectInputStream(InputStream in) throws IOException {
+ super(in);
+ }
+
+ @Override
+ protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
+ String name = desc.getName();
+ if (!name.equals("java.util.HashSet")
+ && !name.equals("com.github.technus.tectech.mechanics.spark.ThaumSpark")) {
+ logger.warn(securityMarker, "Received packet containing disallowed class: " + name);
+ throw new RuntimeException();
+ }
+ return super.resolveClass(desc);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java b/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java
new file mode 100644
index 0000000000..8265c2a81b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java
@@ -0,0 +1,57 @@
+package com.github.technus.tectech.mechanics.spark;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+public class ThaumSpark implements Serializable {
+
+ // This works regardless of if TC is loaded
+ private static final long serialVersionUID = -7037856938316679566L;
+ public int x, y, z, wID;
+ public byte xR, yR, zR;
+
+ public ThaumSpark(int x, int y, int z, byte xR, byte yR, byte zR, int wID) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+
+ this.xR = xR;
+ this.yR = yR;
+ this.zR = zR;
+
+ this.wID = wID;
+ }
+
+ public ThaumSpark(Vec3Impl origin, Vec3Impl target, int wID) {
+ this.x = origin.get0();
+ this.y = origin.get1();
+ this.z = origin.get2();
+
+ Vec3Impl offset = target.sub(origin);
+ this.xR = (byte) offset.get0();
+ this.yR = (byte) offset.get1();
+ this.zR = (byte) offset.get2();
+
+ this.wID = wID;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ThaumSpark that = (ThaumSpark) o;
+ return x == that.x && y == that.y
+ && z == that.z
+ && wID == that.wID
+ && xR == that.xR
+ && yR == that.yR
+ && zR == that.zR;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(x, y, z, wID, xR, yR, zR);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java b/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java
new file mode 100644
index 0000000000..cabacc075b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java
@@ -0,0 +1,169 @@
+package com.github.technus.tectech.mechanics.tesla;
+
+import static java.lang.Math.sqrt;
+
+import java.util.HashSet;
+import java.util.Map;
+
+import com.github.technus.tectech.mechanics.spark.ThaumSpark;
+import com.google.common.collect.Multimap;
+
+public interface ITeslaConnectable extends ITeslaConnectableSimple {
+
+ // Map with all Teslas in the same dimension and the distance to them //TODO Range
+ Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap();
+
+ // ThaumCraft lighting coordinate pairs, so we can send them in bursts and save on lag
+ HashSet<ThaumSpark> getSparkList();
+
+ // -128 to -1 disables capability
+ // 0 means any source or target
+ // 1 to 127 must match on source and target or source/target must be 0
+ byte getTeslaTransmissionCapability();
+
+ // Transmission Range is typically 16+ in blocks
+ int getTeslaTransmissionRange();
+
+ boolean isOverdriveEnabled();
+
+ int getTeslaEnergyLossPerBlock();
+
+ float getTeslaOverdriveLossCoefficient();
+
+ long getTeslaOutputVoltage();
+
+ long getTeslaOutputCurrent();
+
+ boolean teslaDrainEnergy(long teslaVoltageDrained);
+
+ class TeslaUtil {
+
+ private static final HashSet<ITeslaConnectableSimple> teslaSimpleNodeSet = new HashSet<>(); // Targets for power
+ // transmission
+ private static final HashSet<ITeslaConnectable> teslaNodeSet = new HashSet<>(); // Sources of power transmission
+
+ public static void teslaSimpleNodeSetAdd(ITeslaConnectableSimple target) {
+ if (!teslaSimpleNodeSet.contains(target)) {
+ teslaSimpleNodeSet.add(target);
+ teslaNodeSet.forEach(origin -> addTargetToTeslaOrigin(target, origin));
+ }
+ }
+
+ public static void teslaSimpleNodeSetRemove(ITeslaConnectableSimple target) {
+ teslaSimpleNodeSet.remove(target);
+ if (target instanceof ITeslaConnectable) teslaNodeSet.remove(target);
+ teslaNodeSet.forEach(origin -> removeTargetFromTeslaOrigin(target, origin));
+ }
+
+ private static void addTargetToTeslaOrigin(ITeslaConnectableSimple target, ITeslaConnectable origin) {
+ if (origin.equals(target) || !origin.getTeslaDimension()
+ .equals(target.getTeslaDimension())) {
+ // Skip if looking at myself and skip if not in the same dimension
+ // TODO, INTERDIM?
+ return;
+ } else if (origin.getTeslaTransmissionCapability() != 0 && origin.getTeslaReceptionCapability() != 0
+ && origin.getTeslaTransmissionCapability() != origin.getTeslaReceptionCapability()) {
+ // Skip if incompatible
+ return;
+ }
+ // Range calc
+ int distance = (int) sqrt(
+ origin.getTeslaPosition()
+ .distanceSq(target.getTeslaPosition()));
+ if (distance > origin.getTeslaTransmissionRange() * target.getTeslaReceptionCoefficient()) {
+ // Skip if the range is too vast
+ return;
+ }
+ origin.getTeslaNodeMap()
+ .put(distance, target);
+ }
+
+ private static void removeTargetFromTeslaOrigin(ITeslaConnectableSimple target, ITeslaConnectable origin) {
+ // Range calc TODO Remove duplicate?
+ int distance = (int) sqrt(
+ origin.getTeslaPosition()
+ .distanceSq(target.getTeslaPosition()));
+ origin.getTeslaNodeMap()
+ .remove(distance, target);
+ }
+
+ public static void generateTeslaNodeMap(ITeslaConnectable origin) {
+ origin.getTeslaNodeMap()
+ .clear();
+ for (ITeslaConnectableSimple target : teslaSimpleNodeSet) {
+ // Sanity checks
+ if (target == null) {
+ // The Tesla Covers do not remove themselves from the list and this is the code that does
+ teslaSimpleNodeSet.remove(null);
+ continue;
+ }
+ addTargetToTeslaOrigin(target, origin);
+ }
+ teslaNodeSet.add(origin);
+ }
+
+ public static long powerTeslaNodeMap(ITeslaConnectable origin) {
+ long remainingAmperes = origin.getTeslaOutputCurrent();
+ boolean canSendPower = !origin.isTeslaReadyToReceive() && remainingAmperes > 0;
+
+ if (canSendPower) {
+ for (Map.Entry<Integer, ITeslaConnectableSimple> Rx : origin.getTeslaNodeMap()
+ .entries()) {
+ // Do we still have power left to send kind of check
+ if (origin.getTeslaStoredEnergy()
+ < (origin.isOverdriveEnabled() ? origin.getTeslaOutputVoltage() * 2
+ : origin.getTeslaOutputVoltage()))
+ break;
+ // Explicit words for the important fields
+ ITeslaConnectableSimple target = Rx.getValue();
+ int distance = Rx.getKey();
+ // Can our target receive energy?
+ if (!target.isTeslaReadyToReceive()) continue;
+
+ // Calculate the voltage output
+ long outputVoltageInjectable;
+ long outputVoltageConsumption;
+ if (origin.isOverdriveEnabled()) {
+ outputVoltageInjectable = origin.getTeslaOutputVoltage();
+ outputVoltageConsumption = origin.getTeslaOutputVoltage()
+ + ((long) distance * origin.getTeslaEnergyLossPerBlock())
+ + (long) Math
+ .round(origin.getTeslaOutputVoltage() * origin.getTeslaOverdriveLossCoefficient());
+ } else {
+ outputVoltageInjectable = origin.getTeslaOutputVoltage()
+ - ((long) distance * origin.getTeslaEnergyLossPerBlock());
+ outputVoltageConsumption = origin.getTeslaOutputVoltage();
+ }
+
+ // Break out of the loop if the cost is too high
+ // Since the next target will have an even higher cost, just quit now.
+ if (origin.getTeslaStoredEnergy() < outputVoltageConsumption) break;
+
+ // Now shove in as many packets as will fit~
+ while (canSendPower) {
+ if (target.teslaInjectEnergy(outputVoltageInjectable)) {
+ origin.teslaDrainEnergy(outputVoltageConsumption);
+ origin.getSparkList()
+ .add(
+ new ThaumSpark(
+ origin.getTeslaPosition(),
+ target.getTeslaPosition(),
+ origin.getTeslaDimension()));
+ remainingAmperes--;
+ // Update the can send power flag each time we send power
+ canSendPower = (origin.getTeslaStoredEnergy() < outputVoltageConsumption
+ || remainingAmperes > 0);
+ } else {
+ // Breaks out when I can't send anymore power
+ break;
+ }
+ }
+
+ // Break out if we can't send power anymore
+ if (!canSendPower) break;
+ }
+ }
+ return origin.getTeslaOutputCurrent() - remainingAmperes;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java b/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java
new file mode 100644
index 0000000000..a43b313d28
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java
@@ -0,0 +1,24 @@
+package com.github.technus.tectech.mechanics.tesla;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+public interface ITeslaConnectableSimple {
+
+ // -128 to -1 disables capability
+ // 0 means any source or target
+ // 1 to 127 must match on source and target or source/target must be 0
+ byte getTeslaReceptionCapability();
+
+ // Reception Coefficient is a range extension, typical is 1
+ float getTeslaReceptionCoefficient();
+
+ boolean isTeslaReadyToReceive();
+
+ long getTeslaStoredEnergy();
+
+ boolean teslaInjectEnergy(long teslaVoltageInjected);
+
+ Vec3Impl getTeslaPosition();
+
+ Integer getTeslaDimension();
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java b/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java
new file mode 100644
index 0000000000..95a0fdb3f6
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java
@@ -0,0 +1,81 @@
+package com.github.technus.tectech.mechanics.tesla;
+
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.base.Objects;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class TeslaCoverConnection implements ITeslaConnectableSimple {
+
+ private final IGregTechTileEntity IGT;
+ private final Vec3Impl pos;
+ private final byte teslaReceptionCapability;
+
+ public TeslaCoverConnection(IGregTechTileEntity IGT, byte teslaReceptionCapability) {
+ this.IGT = IGT;
+ this.pos = new Vec3Impl(IGT.getXCoord(), IGT.getYCoord(), IGT.getZCoord());
+
+ this.teslaReceptionCapability = teslaReceptionCapability;
+ }
+
+ @Override
+ public byte getTeslaReceptionCapability() {
+ return teslaReceptionCapability;
+ }
+
+ @Override
+ public float getTeslaReceptionCoefficient() {
+ return 1;
+ }
+
+ @Override
+ public boolean isTeslaReadyToReceive() {
+ return true;
+ }
+
+ @Override
+ public long getTeslaStoredEnergy() {
+ return IGT.getStoredEU();
+ }
+
+ @Override
+ public Vec3Impl getTeslaPosition() {
+ return pos;
+ }
+
+ @Override
+ public Integer getTeslaDimension() {
+ return IGT.getWorld().provider.dimensionId;
+ }
+
+ @Override
+ public boolean teslaInjectEnergy(long teslaVoltageInjected) {
+ // Same as in the microwave transmitters, this does not account for amp limits
+ boolean output = false;
+
+ if (!IGT.isDead()) {
+ output = IGT.injectEnergyUnits(ForgeDirection.UP, teslaVoltageInjected, 1L) > 0L;
+ } else {
+ teslaSimpleNodeSetRemove(this);
+ }
+
+ return output;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TeslaCoverConnection that = (TeslaCoverConnection) o;
+ return Objects.equal(IGT, that.IGT);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(IGT);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java
new file mode 100644
index 0000000000..da5f46e002
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java
@@ -0,0 +1,182 @@
+package com.github.technus.tectech.proxy;
+
+import static com.github.technus.tectech.TecTech.RANDOM;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiNewChat;
+import net.minecraft.client.particle.EntityFX;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.world.World;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.rendering.EOH.EOH_ItemRenderer;
+import com.github.technus.tectech.rendering.EOH.EOH_TESR;
+import com.github.technus.tectech.thing.block.GodforgeGlassBlock;
+import com.github.technus.tectech.thing.block.GodforgeGlassRender;
+import com.github.technus.tectech.thing.block.QuantumGlassBlock;
+import com.github.technus.tectech.thing.block.QuantumGlassRender;
+import com.github.technus.tectech.thing.block.RenderForgeOfGods;
+import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
+import com.github.technus.tectech.thing.item.RenderForgeOfGodsItem;
+import com.gtnewhorizon.structurelib.entity.fx.WeightlessParticleFX;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.client.registry.ClientRegistry;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class ClientProxy extends CommonProxy {
+
+ @Override
+ public void registerRenderInfo() {
+ QuantumGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId();
+ RenderingRegistry.registerBlockHandler(QuantumGlassBlock.renderID, new QuantumGlassRender());
+ GodforgeGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId();
+ RenderingRegistry.registerBlockHandler(GodforgeGlassBlock.renderID, new GodforgeGlassRender());
+
+ MinecraftForgeClient
+ .registerItemRenderer(Item.getItemFromBlock(eyeOfHarmonyRenderBlock), new EOH_ItemRenderer());
+ MinecraftForgeClient
+ .registerItemRenderer(Item.getItemFromBlock(forgeOfGodsRenderBlock), new RenderForgeOfGodsItem());
+
+ ClientRegistry.bindTileEntitySpecialRenderer(TileEyeOfHarmony.class, new EOH_TESR());
+ ClientRegistry.bindTileEntitySpecialRenderer(TileForgeOfGods.class, new RenderForgeOfGods());
+ }
+
+ @Override
+ public void em_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) { // CUTE!
+ float xPos = facing.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F;
+ float yPos = facing.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F;
+ float zPos = facing.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F;
+
+ EntityFX particle = new WeightlessParticleFX(
+ aMuffler.getWorld(),
+ xPos + RANDOM.nextFloat() * 0.5F,
+ yPos + RANDOM.nextFloat() * 0.5F,
+ zPos + RANDOM.nextFloat() * 0.5F,
+ 0,
+ 0,
+ 0);
+ particle.setRBGColorF(0, 0.6F * RANDOM.nextFloat(), 0.8f);
+ Minecraft.getMinecraft().effectRenderer.addEffect(particle);
+ }
+
+ @Override
+ public void pollutor_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) {
+ float xPos = facing.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F;
+ float yPos = facing.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F;
+ float zPos = facing.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F;
+
+ float ySpd = facing.offsetY * 0.1F + 0.2F + 0.1F * (float) RANDOM.nextGaussian();
+ float xSpd;
+ float zSpd;
+
+ if (facing.offsetY == -1) {
+ float temp = RANDOM.nextFloat() * 2 * (float) Math.PI;
+ xSpd = (float) Math.sin(temp) * 0.1F * (float) RANDOM.nextGaussian();
+ zSpd = (float) Math.cos(temp) * 0.1F * (float) RANDOM.nextGaussian();
+ } else {
+ xSpd = facing.offsetX * (0.1F + 0.2F * (float) RANDOM.nextGaussian());
+ zSpd = facing.offsetZ * (0.1F + 0.2F * (float) RANDOM.nextGaussian());
+ }
+ aMuffler.getWorld()
+ .spawnParticle(
+ "largesmoke",
+ xPos + RANDOM.nextFloat() * 0.5F,
+ yPos + RANDOM.nextFloat() * 0.5F,
+ zPos + RANDOM.nextFloat() * 0.5F,
+ xSpd,
+ ySpd,
+ zSpd);
+ aMuffler.getWorld()
+ .spawnParticle(
+ "largesmoke",
+ xPos + RANDOM.nextFloat() * 0.5F,
+ yPos + RANDOM.nextFloat() * 0.5F,
+ zPos + RANDOM.nextFloat() * 0.5F,
+ xSpd,
+ ySpd,
+ zSpd);
+ aMuffler.getWorld()
+ .spawnParticle(
+ "largesmoke",
+ xPos + RANDOM.nextFloat() * 0.5F,
+ yPos + RANDOM.nextFloat() * 0.5F,
+ zPos + RANDOM.nextFloat() * 0.5F,
+ xSpd,
+ ySpd,
+ zSpd);
+ }
+
+ @Override
+ public void em_particle(World w, double x, double y, double z) { // CUTE!
+ EntityFX particle = new WeightlessParticleFX(
+ w,
+ x + RANDOM.nextFloat() * 0.5F,
+ y + RANDOM.nextFloat() * 0.5F,
+ z + RANDOM.nextFloat() * 0.5F,
+ 0,
+ 0,
+ 0);
+ particle.setRBGColorF(0, 0.6F * RANDOM.nextFloat(), 0.8f);
+ Minecraft.getMinecraft().effectRenderer.addEffect(particle);
+ }
+
+ @Override
+ public void pollutor_particle(World w, double x, double y, double z) {
+ w.spawnParticle(
+ "largesmoke",
+ x + RANDOM.nextFloat() * 0.5F,
+ y + RANDOM.nextFloat() * 0.5F,
+ z + RANDOM.nextFloat() * 0.5F,
+ 0,
+ 0,
+ 0);
+ }
+
+ @Override
+ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
+ return null;
+ }
+
+ @Override
+ public World getClientWorld() {
+ return FMLClientHandler.instance()
+ .getClient().theWorld;
+ }
+
+ @Override
+ public void printInchat(String... strings) {
+ GuiNewChat chat = Minecraft.getMinecraft().ingameGUI.getChatGUI();
+ for (String s : strings) {
+ chat.printChatMessage(new ChatComponentText(s));
+ }
+ }
+
+ @Override
+ public void playSound(IGregTechTileEntity base, String name) {
+ base.getWorld()
+ .playSoundEffect(base.getXCoord(), base.getYCoord(), base.getZCoord(), Reference.MODID + ':' + name, 1, 1);
+ }
+
+ @Override
+ public void renderAABB(World w, AxisAlignedBB box) {
+ em_particle(w, box.minX, box.minY, box.minZ);
+ em_particle(w, box.minX, box.minY, box.maxZ);
+ em_particle(w, box.minX, box.maxY, box.maxZ);
+ em_particle(w, box.minX, box.maxY, box.minZ);
+ em_particle(w, box.maxX, box.maxY, box.minZ);
+ em_particle(w, box.maxX, box.maxY, box.maxZ);
+ em_particle(w, box.maxX, box.minY, box.maxZ);
+ em_particle(w, box.maxX, box.minY, box.minZ);
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java b/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java
new file mode 100644
index 0000000000..0c160ffb54
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java
@@ -0,0 +1,94 @@
+package com.github.technus.tectech.proxy;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.network.IGuiHandler;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class CommonProxy implements IGuiHandler {
+
+ public void registerRenderInfo() {}
+
+ public void em_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) {} // CUTE!
+
+ public void pollutor_particle(IGregTechTileEntity aPollutor, ForgeDirection facing) {} // CUTE!
+
+ public void em_particle(World w, double x, double y, double z) {}
+
+ public void pollutor_particle(World w, double x, double y, double z) {}
+
+ public void renderAABB(World w, AxisAlignedBB box) {}
+
+ @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) {
+ return null;
+ }
+
+ public World getClientWorld() {
+ return null;
+ }
+
+ public void broadcast(String str) {
+ MinecraftServer.getServer()
+ .getConfigurationManager()
+ .sendChatMsg(new ChatComponentText(str));
+ }
+
+ public void printInchat(String... strings) {}
+
+ public void playSound(IGregTechTileEntity base, String name) {}
+
+ public String getUUID(String name) {
+ for (WorldServer worldServer : MinecraftServer.getServer().worldServers) {
+ for (Object o : worldServer.playerEntities) {
+ if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile()
+ .getName()
+ .equals(name)) {
+ return ((EntityPlayer) o).getGameProfile()
+ .getId()
+ .toString();
+ }
+ }
+ }
+ return null;
+ }
+
+ public boolean isOnlineName(String name) {
+ for (WorldServer worldServer : MinecraftServer.getServer().worldServers) {
+ for (Object o : worldServer.playerEntities) {
+ if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile()
+ .getName()
+ .equals(name)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean isOnlineUUID(String uuid) {
+ for (WorldServer worldServer : MinecraftServer.getServer().worldServers) {
+ for (Object o : worldServer.playerEntities) {
+ if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile()
+ .getId()
+ .toString()
+ .equals(uuid)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java
new file mode 100644
index 0000000000..48b48f37e9
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java
@@ -0,0 +1,206 @@
+package com.github.technus.tectech.recipe;
+
+import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES;
+import static com.google.common.math.LongMath.pow;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static java.lang.Math.min;
+import static net.minecraft.util.EnumChatFormatting.BOLD;
+import static net.minecraft.util.EnumChatFormatting.DARK_RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import appeng.util.ReadableNumberConverter;
+import codechicken.nei.PositionedStack;
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gregtech.nei.RecipeDisplayInfo;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class EyeOfHarmonyFrontend extends RecipeMapFrontend {
+
+ private static final int xDirMaxCount = 9;
+ private static final int itemRows = 9, fluidRows = 2;
+ public static final int maxItemInputs = 1, maxItemOutputs = xDirMaxCount * itemRows, maxFluidInputs = 0,
+ maxFluidOutputs = xDirMaxCount * fluidRows;
+ private static final int yOrigin = 8;
+ private static final long TRILLION = pow(10, 12);
+
+ public EyeOfHarmonyFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(
+ uiPropertiesBuilder.logoPos(new Pos2d(8, yOrigin)),
+ neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 117 + (itemRows + fluidRows - 4) * 18))
+ .neiSpecialInfoFormatter(new EyeOfHarmonySpecialValueFormatter()));
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 79, yOrigin, 1, 1);
+ }
+
+ public static final int maxItemsToRender = 80;
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(min(itemOutputCount, maxItemsToRender + 1), 7, yOrigin + 36, xDirMaxCount, 12);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 0, 0, 0, 0);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 7, yOrigin + 13 * 17 - 7 - 16, xDirMaxCount, 3);
+ }
+
+ @Override
+ public List<String> handleNEIItemTooltip(ItemStack stack, List<String> currentTip,
+ GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe);
+ EyeOfHarmonyRecipe currentRecipe = (EyeOfHarmonyRecipe) neiCachedRecipe.mRecipe.mSpecialItems;
+
+ // Draw tooltip on planet item.
+ if (stack.isItemEqual(currentRecipe.getRecipeTriggerItem())) {
+ currentTip.add(
+ EnumChatFormatting.GRAY + translateToLocalFormatted(
+ "tt.nei.eoh.total_items",
+ formatNumbers(currentRecipe.getSumOfItems())));
+ return currentTip;
+ }
+
+ // Draw tooltip on other items.
+ double percentage = currentRecipe.getItemStackToProbabilityMap()
+ .getOrDefault(stack, -1.0);
+
+ if (percentage != -1.0) {
+ currentTip.add(EnumChatFormatting.GRAY + translateToLocalFormatted("tt.nei.eoh.solid_mass", percentage));
+ currentTip.add(
+ EnumChatFormatting.GRAY + translateToLocalFormatted(
+ "tt.nei.eoh.item_count",
+ formatNumbers(
+ currentRecipe.getItemStackToTrueStackSizeMap()
+ .get(stack))));
+ }
+
+ return currentTip;
+ }
+
+ @Override
+ public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ EyeOfHarmonyRecipe EOHRecipe = (EyeOfHarmonyRecipe) neiCachedRecipe.mRecipe.mSpecialItems;
+ for (PositionedStack stack : neiCachedRecipe.mInputs) {
+ if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ if (stack.item.isItemEqual(EOHRecipe.getRecipeTriggerItem())) {
+ drawNEIOverlayText(translateToLocal("NC"), stack);
+ }
+ }
+ }
+ for (PositionedStack stack : neiCachedRecipe.mOutputs) {
+ if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ if (EOHRecipe.getItemStackToTrueStackSizeMap()
+ .containsKey(stack.item)) {
+ long stackSize = EOHRecipe.getItemStackToTrueStackSizeMap()
+ .get(stack.item);
+ String displayString;
+ if (stackSize > 9999) {
+ displayString = ReadableNumberConverter.INSTANCE.toWideReadableForm(stackSize);
+ } else {
+ displayString = String.valueOf(stackSize);
+ }
+
+ drawNEIOverlayText(displayString, stack, 0xffffff, 0.5f, true, Alignment.BottomRight);
+ }
+ }
+ }
+ }
+
+ private static class EyeOfHarmonySpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ EyeOfHarmonyRecipe recipe = (EyeOfHarmonyRecipe) recipeInfo.recipe.mSpecialItems;
+ List<String> result = new ArrayList<>();
+
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.Hydrogen.In", "Hydrogen") + ": "
+ + formatNumbers(recipe.getHydrogenRequirement())
+ + " L");
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.Helium.In", "Helium") + ": "
+ + formatNumbers(recipe.getHydrogenRequirement())
+ + " L");
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.SpacetimeTier", "Spacetime Tier") + ": "
+ + EOH_TIER_FANCY_NAMES[(int) recipe.getSpacetimeCasingTierRequired()]);
+
+ if (recipe.getEUOutput() < TRILLION) {
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.Out", "EU Output") + ": "
+ + formatNumbers(recipe.getEUOutput())
+ + " EU");
+ } else {
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.Out", "EU Output") + ": "
+ + ReadableNumberConverter.INSTANCE.toWideReadableForm(recipe.getEUOutput())
+ + " EU");
+ }
+
+ if (recipe.getEUOutput() < TRILLION) {
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.In", "EU Input") + ": "
+ + formatNumbers(recipe.getEUStartCost())
+ + " EU");
+ } else {
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.In", "EU Input") + ": "
+ + ReadableNumberConverter.INSTANCE.toWideReadableForm(recipe.getEUStartCost())
+ + " EU");
+ }
+
+ result.add(
+ GT_LanguageManager.addStringLocalization("EOH.Recipe.BaseRecipeChance", "Base Recipe Chance") + ": "
+ + formatNumbers(100 * recipe.getBaseRecipeSuccessChance())
+ + "%");
+ result.add(
+ GT_LanguageManager
+ .addStringLocalization("EOH.Recipe.RecipeEnergyEfficiency", "Recipe Energy Efficiency") + ": "
+ + formatNumbers(100 * recipe.getRecipeEnergyEfficiency())
+ + "%");
+
+ if (recipe.getOutputItems()
+ .size() > maxItemsToRender) {
+ result.add(
+ "" + DARK_RED
+ + BOLD
+ + GT_LanguageManager.addStringLocalization("EOH.Recipe.Warning.0", "Warning")
+ + RESET
+ + ": "
+ + GT_LanguageManager.addStringLocalization("EOH.Recipe.Warning.1", "Not all items displayed."));
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java
new file mode 100644
index 0000000000..cc7de26fb6
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java
@@ -0,0 +1,499 @@
+package com.github.technus.tectech.recipe;
+
+import static com.github.technus.tectech.recipe.EyeOfHarmonyRecipeStorage.BILLION;
+import static com.google.common.math.IntMath.pow;
+import static gregtech.api.GregTech_API.getUnificatedOreDictStack;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_Utility.getPlasmaFuelValueInEUPerLiterFromMaterial;
+import static java.lang.Math.min;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.github.technus.tectech.util.FluidStackLong;
+import com.github.technus.tectech.util.ItemStackLong;
+
+import gnu.trove.map.TMap;
+import gnu.trove.map.hash.TCustomHashMap;
+import gnu.trove.strategy.HashingStrategy;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import pers.gwyog.gtneioreplugin.plugin.block.BlockDimensionDisplay;
+import pers.gwyog.gtneioreplugin.util.GT5OreLayerHelper;
+import pers.gwyog.gtneioreplugin.util.GT5OreSmallHelper;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class EyeOfHarmonyRecipe {
+
+ static final FluidStackLong[] SPECIAL_FLUIDS = new FluidStackLong[] {
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(18_432), 18_432),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(18_432), 18_432),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(18_432), 18_432) };
+
+ HashingStrategy<ItemStack> itemStackHashingStrategy = new HashingStrategy<>() {
+
+ private static final long serialVersionUID = -3966004160368229212L;
+
+ @Override
+ public int computeHashCode(ItemStack stack) {
+ // Not really sure how this works or if it is "unique enough".
+ int result = stack.getItem()
+ .hashCode();
+ result = 31 * result + stack.getItemDamage();
+ return result;
+ }
+
+ @Override
+ public boolean equals(ItemStack item1, ItemStack item2) {
+ return item1.getUnlocalizedName()
+ .equals(item2.getUnlocalizedName());
+ }
+ };
+
+ private final TMap<ItemStack, Double> itemStackToProbabilityMap = new TCustomHashMap<>(itemStackHashingStrategy);
+ private final TMap<ItemStack, Long> itemStackToTrueStackSizeMap = new TCustomHashMap<>(itemStackHashingStrategy);
+
+ private final ArrayList<ItemStackLong> outputItems;
+ private final ArrayList<FluidStackLong> outputFluids;
+
+ private final long hydrogenRequirement;
+ private final long heliumRequirement;
+
+ private final long euOutput;
+ private final long euStartCost;
+
+ private final double baseSuccessChance;
+
+ private final long spacetimeCasingTierRequired;
+
+ private final long miningTimeSeconds;
+
+ private final double recipeEnergyEfficiency;
+
+ private final ItemStack recipeTriggerItem;
+
+ private final long sumOfItems;
+ private final long rocketTier;
+
+ public TMap<ItemStack, Double> getItemStackToProbabilityMap() {
+ return itemStackToProbabilityMap;
+ }
+
+ public TMap<ItemStack, Long> getItemStackToTrueStackSizeMap() {
+ return itemStackToTrueStackSizeMap;
+ }
+
+ public double getRecipeEnergyEfficiency() {
+ return recipeEnergyEfficiency;
+ }
+
+ @SuppressWarnings("FieldCanBeLocal")
+ private final long standardRecipeEUOutPerTick = 100 * BILLION;
+
+ public long getSumOfItems() {
+ return sumOfItems;
+ }
+
+ public long getRocketTier() {
+ return rocketTier;
+ }
+
+ public EyeOfHarmonyRecipe(final ArrayList<Pair<Materials, Long>> materialList, final BlockDimensionDisplay block,
+ final double recipeEnergyEfficiency, final long hydrogenRequirement, final long heliumRequirement,
+ final long miningTimeSeconds, final long rocketTierOfRecipe, final double baseSuccessChance) {
+
+ this.rocketTier = rocketTierOfRecipe;
+ this.spacetimeCasingTierRequired = min(8, rocketTierOfRecipe);
+
+ this.recipeTriggerItem = new ItemStack(block);
+
+ this.outputItems = validDustGenerator(materialList);
+
+ this.sumOfItems = this.outputItems.stream()
+ .map(ItemStackLong::getStackSize)
+ .reduce(0L, Long::sum);
+
+ this.outputItems.add(new ItemStackLong(getStoneDustType(block.getDimension()), this.sumOfItems * 3L));
+ this.outputItems.sort(Comparator.comparingLong(ItemStackLong::getStackSize));
+ Collections.reverse(this.outputItems);
+
+ for (ItemStackLong itemStackLong : outputItems) {
+ double stackSize = (double) itemStackLong.getStackSize();
+ double probability = Math.round(100_000 * stackSize / sumOfItems) / 1000.0;
+
+ itemStackToProbabilityMap.put(itemStackLong.itemStack, probability);
+ itemStackToTrueStackSizeMap.put(itemStackLong.itemStack, itemStackLong.stackSize);
+ }
+ // End item processing.
+
+ // --- Fluid handling ---
+ ArrayList<FluidStackLong> fluidStackLongArrayList = new ArrayList<>();
+
+ int plasmaAmount = (int) ((this.spacetimeCasingTierRequired + 1) * 8_000_000L);
+
+ // If DeepDark then it should output all plasmas involved in making exotic catalyst.
+ if (rocketTier == 9) {
+ for (Materials material : VALID_PLASMAS) {
+ fluidStackLongArrayList.add(new FluidStackLong(material.getPlasma(plasmaAmount), plasmaAmount));
+ }
+ } else {
+ // --- Output and process fluids of the recipe.
+ ArrayList<FluidStack> fluidStackArrayList = new ArrayList<>(validPlasmaGenerator(materialList));
+ for (FluidStack fluidStack : fluidStackArrayList) {
+ fluidStack = new FluidStack(fluidStack, plasmaAmount);
+ fluidStackLongArrayList.add(new FluidStackLong(fluidStack, plasmaAmount));
+ }
+ }
+
+ // Add a bonus fluid of compressed star matter.
+ fluidStackLongArrayList.add(
+ new FluidStackLong(
+ MaterialsUEVplus.RawStarMatter.getFluid((this.spacetimeCasingTierRequired + 1) * 100_000),
+ (this.spacetimeCasingTierRequired + 1) * 100_000));
+
+ // Tier 0 & 1 - 576 White
+ // Tier 2 - 2304 White
+ // Tier 3 - 9216 White
+
+ // Tier 4 - 576 Black
+ // Tier 5 - 2304 Black
+ // Tier 6 - 9216 Black
+
+ // Tier 7 - 576 Universium
+ // Tier 8 - 2304 Universium
+ // Tier 9 - 9216 Universium
+ int spacetimeTier = (int) rocketTierOfRecipe;
+ if (spacetimeTier == 0 || spacetimeTier == 9) {
+ spacetimeTier -= 1;
+ }
+ fluidStackLongArrayList.add(SPECIAL_FLUIDS[spacetimeTier + 1]);
+
+ outputFluids = fluidStackLongArrayList;
+ // --- End fluid handling ---.
+
+ this.hydrogenRequirement = hydrogenRequirement;
+ this.heliumRequirement = heliumRequirement;
+
+ this.baseSuccessChance = baseSuccessChance;
+
+ this.miningTimeSeconds = miningTimeSeconds;
+ this.recipeEnergyEfficiency = recipeEnergyEfficiency;
+
+ long plasmaEU = plasmaCostCalculator(outputFluids);
+ long VM3EU = miningTimeSeconds * pow(2, 19) * 20;
+ this.euStartCost = (plasmaEU + VM3EU + standardRecipeEUOutPerTick * 20 * miningTimeSeconds);
+ this.euOutput = (long) (euStartCost * recipeEnergyEfficiency);
+ }
+
+ private ItemStack getStoneDustType(String key) {
+
+ switch (key) {
+ case "Ne":
+ return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 1);
+ case "ED":
+ case "VA":
+ case "EA":
+ return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1);
+ case "Mo":
+ return getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1);
+ case "De":
+ return getModItem(NewHorizonsCoreMod.ID, "item.DeimosStoneDust", 1);
+ case "Ma":
+ return getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1);
+ case "Ph":
+ return getModItem(NewHorizonsCoreMod.ID, "item.PhobosStoneDust", 1);
+ case "As":
+ case "KB":
+ return getModItem(NewHorizonsCoreMod.ID, "item.AsteroidsStoneDust", 1);
+ case "Ca":
+ return getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1);
+ case "Ce":
+ return getModItem(NewHorizonsCoreMod.ID, "item.CeresStoneDust", 1);
+ case "Eu":
+ return getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1);
+ case "Ga":
+ return getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1);
+ case "Io":
+ return getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1);
+ case "Me":
+ return getModItem(NewHorizonsCoreMod.ID, "item.MercuryStoneDust", 1);
+ case "Ve":
+ return getModItem(NewHorizonsCoreMod.ID, "item.VenusStoneDust", 1);
+ case "En":
+ return getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1);
+ case "Mi":
+ return getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1);
+ case "Ob":
+ return getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1);
+ case "Ti":
+ return getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1);
+ case "Pr":
+ return getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1);
+ case "Tr":
+ return getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1);
+ case "Ha":
+ return getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1);
+ case "MM":
+ return getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1);
+ case "Pl":
+ return getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1);
+ case "BE":
+ return getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1);
+ case "BF":
+ return getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1);
+ case "CB":
+ return getModItem(NewHorizonsCoreMod.ID, "item.CentauriAStoneDust", 1);
+ case "TE":
+ return getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1);
+ case "VB":
+ return getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1);
+ default:
+ return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1);
+ }
+ }
+
+ public EyeOfHarmonyRecipe(final GT5OreLayerHelper.NormalOreDimensionWrapper normalOreDimensionWrapper,
+ final GT5OreSmallHelper.SmallOreDimensionWrapper smallOreDimensionWrapper, final BlockDimensionDisplay block,
+ final double recipeEnergyEfficiency, final long hydrogenRequirement, final long heliumRequirement,
+ final long miningTimeSeconds, final long spacetimeCasingTierRequired, final double baseSuccessChance) {
+
+ // Process recipes output items.
+ // 6 * 64 = 6 stacks/second for VM tier 3 + Og gas.
+ this(
+ processDimension(normalOreDimensionWrapper, smallOreDimensionWrapper, miningTimeSeconds),
+ block,
+ recipeEnergyEfficiency,
+ hydrogenRequirement,
+ heliumRequirement,
+ miningTimeSeconds,
+ spacetimeCasingTierRequired,
+ baseSuccessChance);
+ }
+
+ // Return clone of list. Deep copy. Maybe a better way to do this?
+ public ArrayList<ItemStackLong> getOutputItems() {
+ ArrayList<ItemStackLong> copyOutputList = new ArrayList<>();
+ for (ItemStackLong itemStackLong : outputItems) {
+ copyOutputList.add(new ItemStackLong(itemStackLong));
+ }
+
+ return copyOutputList;
+ }
+
+ // Deep copy.
+ public ArrayList<FluidStackLong> getOutputFluids() {
+ ArrayList<FluidStackLong> copyOutputList = new ArrayList<>();
+
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ copyOutputList.add(new FluidStackLong(fluidStackLong));
+ }
+
+ return copyOutputList;
+ }
+
+ public long getHydrogenRequirement() {
+ return hydrogenRequirement;
+ }
+
+ public long getHeliumRequirement() {
+ return heliumRequirement;
+ }
+
+ public long getEUOutput() {
+ return euOutput;
+ }
+
+ public long getEUStartCost() {
+ return euStartCost;
+ }
+
+ public long getRecipeTimeInTicks() {
+ return miningTimeSeconds * 20;
+ }
+
+ public double getBaseRecipeSuccessChance() {
+ return baseSuccessChance;
+ }
+
+ public long getSpacetimeCasingTierRequired() {
+ return spacetimeCasingTierRequired;
+ }
+
+ public ItemStack getRecipeTriggerItem() {
+ return recipeTriggerItem;
+ }
+
+ private static final double PRIMARY_MULTIPLIER = (0.1 + 1.0 / 9.0); // Byproduct from macerating/washing chance.
+ private static final double SECONDARY_MULTIPLIER = (1.0 / 9.0); // Thermal centrifuge byproduct chance.
+ private static final double TERTIARY_MULTIPLIER = (0.1); // Macerating thermal centrifuged byproduct chance.
+ private static final double QUATERNARY_MULTIPLIER = (0.7); // Mercury/chem bath processing chance.
+
+ private static final double[] ORE_MULTIPLIER = { PRIMARY_MULTIPLIER, SECONDARY_MULTIPLIER, TERTIARY_MULTIPLIER,
+ QUATERNARY_MULTIPLIER };
+
+ public static class HashMapHelper extends HashMap<Materials, Double> {
+
+ private static final long serialVersionUID = 2297018142561480614L;
+
+ void add(Materials material, double value) {
+
+ // If key already exists.
+ if (this.containsKey(material)) {
+ this.put(material, value + this.get(material));
+ return;
+ }
+
+ // Otherwise, add value to hashmap entry.
+ this.put(material, value);
+ }
+ }
+
+ public static void processHelper(HashMapHelper outputMap, Materials material, double mainMultiplier,
+ double probability) {
+ if (material == null) return;
+ outputMap.add(material.mDirectSmelting, (material.mOreMultiplier * 2) * mainMultiplier * probability);
+
+ int index = 0;
+ for (Materials byProductMaterial : material.mOreByProducts) {
+ outputMap
+ .add(byProductMaterial.mDirectSmelting, mainMultiplier * (ORE_MULTIPLIER[index++] * 2) * probability);
+ }
+ }
+
+ private static ArrayList<Pair<Materials, Long>> processDimension(
+ GT5OreLayerHelper.NormalOreDimensionWrapper normalOreDimWrapper,
+ GT5OreSmallHelper.SmallOreDimensionWrapper smallOreDimWrapper, long timeInSeconds) {
+ HashMapHelper outputMap = new HashMapHelper();
+
+ double mainMultiplier = timeInSeconds * 384.0;
+
+ if (normalOreDimWrapper != null) {
+ normalOreDimWrapper.oreVeinToProbabilityInDimension.forEach((veinInfo, probability) -> {
+ processHelper(outputMap, veinInfo.mPrimaryVeinMaterial, mainMultiplier, probability);
+ processHelper(outputMap, veinInfo.mSecondaryMaterial, mainMultiplier, probability);
+ // 8.0 to replicate void miner getDropsVanillaVeins method yields.
+ processHelper(outputMap, veinInfo.mBetweenMaterial, mainMultiplier / 8.0, probability);
+ processHelper(outputMap, veinInfo.mSporadicMaterial, mainMultiplier / 8.0, probability);
+ });
+ }
+
+ // Iterate over small ores in dimension and add them, kinda hacky but works and is close enough.
+ if (smallOreDimWrapper != null) {
+ smallOreDimWrapper.oreVeinToProbabilityInDimension.forEach(
+ (veinInfo,
+ probability) -> processHelper(outputMap, veinInfo.getOreMaterial(), mainMultiplier, probability));
+ }
+
+ ArrayList<Pair<Materials, Long>> outputList = new ArrayList<>();
+
+ outputMap.forEach((material, quantity) -> outputList.add(Pair.of(material, (long) Math.floor(quantity))));
+
+ return outputList;
+ }
+
+ private static ArrayList<FluidStack> validPlasmaGenerator(final List<Pair<Materials, Long>> planetList) {
+
+ ArrayList<FluidStack> plasmaList = new ArrayList<>();
+
+ for (Pair<Materials, Long> pair : planetList) {
+ if (VALID_PLASMAS.contains(pair.getLeft())) {
+ plasmaList.add(
+ pair.getLeft()
+ .getPlasma(1));
+ }
+ }
+
+ return plasmaList;
+ }
+
+ private static ArrayList<ItemStackLong> validDustGenerator(final ArrayList<Pair<Materials, Long>> planetList) {
+
+ ArrayList<ItemStackLong> dustList = new ArrayList<>();
+
+ for (Pair<Materials, Long> pair : planetList) {
+ ItemStack dust = getUnificatedOreDictStack(
+ pair.getLeft()
+ .getDust(1));
+ if (dust != null) {
+ dustList.add(new ItemStackLong(dust, pair.getRight()));
+ }
+ }
+ return dustList;
+ }
+
+ private static long plasmaCostCalculator(ArrayList<FluidStackLong> plasmas) {
+ long total = 0;
+
+ for (FluidStackLong plasma : plasmas) {
+ FluidStack plasmaFluid = plasma.getRegularFluidStack(plasma, 1);
+ try {
+ String plasmaName = plasmaFluid.getFluid()
+ .getUnlocalizedName();
+ total += plasmaEnergyMap.getOrDefault(plasmaName, 0L) * plasma.amount;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ return (long) (total * getMaxPlasmaTurbineEfficiency());
+ }
+
+ private static double getMaxPlasmaTurbineEfficiency() {
+ // I hate Shirabon.
+ return 3.85;
+ }
+
+ private static final List<Materials> VALID_PLASMAS = Stream
+ .of(
+ Materials.Helium,
+ Materials.Iron,
+ Materials.Calcium,
+ Materials.Niobium,
+ Materials.Nitrogen,
+ Materials.Zinc,
+ Materials.Silver,
+ Materials.Titanium,
+ Materials.Radon,
+ Materials.Nickel,
+ Materials.Boron,
+ Materials.Sulfur,
+ Materials.Americium,
+ Materials.Bismuth,
+ Materials.Oxygen,
+ Materials.Tin)
+ .collect(Collectors.toList());
+
+ private static final HashMap<String, Long> plasmaEnergyMap = new HashMap<>() {
+
+ private static final long serialVersionUID = 7933945171103801933L;
+
+ {
+ VALID_PLASMAS.forEach(
+ (material -> put(
+ material.getPlasma(1)
+ .getFluid()
+ .getUnlocalizedName(),
+ (long) (getPlasmaFuelValueInEUPerLiterFromMaterial(material) * getMaxPlasmaTurbineEfficiency()))));
+ }
+ };
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java
new file mode 100644
index 0000000000..fb2030d52d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java
@@ -0,0 +1,184 @@
+package com.github.technus.tectech.recipe;
+
+import static com.github.technus.tectech.recipe.EyeOfHarmonyRecipe.processHelper;
+import static com.github.technus.tectech.recipe.TecTechRecipeMaps.eyeOfHarmonyRecipes;
+import static java.lang.Math.pow;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.github.technus.tectech.util.FluidStackLong;
+import com.github.technus.tectech.util.ItemStackLong;
+import com.google.common.math.LongMath;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import pers.gwyog.gtneioreplugin.plugin.block.BlockDimensionDisplay;
+import pers.gwyog.gtneioreplugin.plugin.block.ModBlocks;
+import pers.gwyog.gtneioreplugin.util.DimensionHelper;
+import pers.gwyog.gtneioreplugin.util.GT5OreLayerHelper;
+import pers.gwyog.gtneioreplugin.util.GT5OreSmallHelper;
+
+public class EyeOfHarmonyRecipeStorage {
+
+ public static final long BILLION = LongMath.pow(10, 9);
+ private static final double CHANCE_DECREASE_PER_DIMENSION = 0.05;
+
+ // Map is unique so this is fine.
+ HashMap<Block, String> blocksMapInverted = new HashMap<>() {
+
+ private static final long serialVersionUID = -1634011860327553337L;
+
+ {
+ ModBlocks.blocks.forEach((dimString, dimBlock) -> { put(dimBlock, dimString); });
+ }
+ };
+
+ private final HashMap<String, EyeOfHarmonyRecipe> recipeHashMap = new HashMap<String, EyeOfHarmonyRecipe>() {
+
+ private static final long serialVersionUID = -3501819612517400500L;
+
+ {
+ for (String dimAbbreviation : DimensionHelper.DimNameDisplayed) {
+ BlockDimensionDisplay blockDimensionDisplay = (BlockDimensionDisplay) ModBlocks.blocks
+ .get(dimAbbreviation);
+
+ if (dimAbbreviation.equals("DD")) {
+ specialDeepDarkRecipe(this, blockDimensionDisplay);
+ } else {
+
+ GT5OreLayerHelper.NormalOreDimensionWrapper normalOre = GT5OreLayerHelper.dimToOreWrapper
+ .getOrDefault(dimAbbreviation, null);
+ GT5OreSmallHelper.SmallOreDimensionWrapper smallOre = GT5OreSmallHelper.dimToSmallOreWrapper
+ .getOrDefault(dimAbbreviation, null);
+ if (normalOre == null && smallOre == null) {
+ // No ores are generated in this dimension. Fail silently.
+ continue;
+ }
+
+ long spacetimeTier = blockDimensionDisplay.getDimensionRocketTier();
+ if (spacetimeTier == 0) {
+ spacetimeTier += 1;
+ }
+
+ put(
+ dimAbbreviation,
+ new EyeOfHarmonyRecipe(
+ normalOre,
+ smallOre,
+ blockDimensionDisplay,
+ 0.6 + blockDimensionDisplay.getDimensionRocketTier() / 10.0,
+ BILLION * (blockDimensionDisplay.getDimensionRocketTier() + 1),
+ BILLION * (blockDimensionDisplay.getDimensionRocketTier() + 1),
+ timeCalculator(blockDimensionDisplay.getDimensionRocketTier()),
+ spacetimeTier - 1,
+ 1.0 - CHANCE_DECREASE_PER_DIMENSION * blockDimensionDisplay.getDimensionRocketTier()));
+ }
+ }
+ }
+ };
+
+ public EyeOfHarmonyRecipe recipeLookUp(final ItemStack aStack) {
+ String dimAbbreviation = blocksMapInverted.get(Block.getBlockFromItem(aStack.getItem()));
+ return recipeHashMap.get(dimAbbreviation);
+ }
+
+ public EyeOfHarmonyRecipeStorage() {
+
+ for (EyeOfHarmonyRecipe recipe : recipeHashMap.values()) {
+
+ ArrayList<ItemStack> outputItems = new ArrayList<>();
+ for (ItemStackLong itemStackLong : recipe.getOutputItems()) {
+ outputItems.add(itemStackLong.itemStack);
+ }
+
+ ArrayList<FluidStack> outputFluids = new ArrayList<>();
+ for (FluidStackLong fluidStackLong : recipe.getOutputFluids()) {
+ outputFluids.add(fluidStackLong.fluidStack);
+ }
+
+ ItemStack planetItem = recipe.getRecipeTriggerItem()
+ .copy();
+ planetItem.stackSize = 0;
+
+ eyeOfHarmonyRecipes.addRecipe(
+ false,
+ new ItemStack[] { planetItem },
+ outputItems.toArray(new ItemStack[0]),
+ recipe,
+ null,
+ new FluidStack[] { Materials.Hydrogen.getGas(0), Materials.Helium.getGas(0),
+ MaterialsUEVplus.RawStarMatter.getFluid(0) },
+ outputFluids.toArray(new FluidStack[0]),
+ (int) recipe.getRecipeTimeInTicks(),
+ 0,
+ 0);
+ }
+ }
+
+ private void specialDeepDarkRecipe(final HashMap<String, EyeOfHarmonyRecipe> hashMap,
+ final BlockDimensionDisplay planetItem) {
+
+ HashSet<Materials> validMaterialSet = new HashSet<>();
+
+ for (Materials material : Materials.values()) {
+
+ ItemStack normalOre = GT_OreDictUnificator.get(OrePrefixes.ore, material, 1);
+
+ if ((normalOre != null)) {
+ validMaterialSet.add(material);
+ }
+
+ ItemStack smallOre = GT_OreDictUnificator.get(OrePrefixes.oreSmall, material, 1);
+
+ if ((smallOre != null)) {
+ validMaterialSet.add(material);
+ }
+ }
+
+ ArrayList<Materials> validMaterialList = new ArrayList<>(validMaterialSet);
+
+ long rocketTier = 9;
+
+ hashMap.put(
+ "DD",
+ new EyeOfHarmonyRecipe(
+ processDD(validMaterialList),
+ planetItem,
+ 0.6 + rocketTier / 10.0,
+ BILLION * (rocketTier + 1),
+ BILLION * (rocketTier + 1),
+ timeCalculator(rocketTier),
+ rocketTier, // -1 so that we avoid out of bounds exception on NEI render.
+ 1.0 - rocketTier * CHANCE_DECREASE_PER_DIMENSION));
+ }
+
+ private static long timeCalculator(final long rocketTier) {
+ return (long) (18_000L * pow(1.4, rocketTier));
+ }
+
+ private ArrayList<Pair<Materials, Long>> processDD(final ArrayList<Materials> validMaterialList) {
+ EyeOfHarmonyRecipe.HashMapHelper outputMap = new EyeOfHarmonyRecipe.HashMapHelper();
+
+ // 10 from rocketTier + 1, 6 * 64 = VM3 + Og, 1.4 = time increase per tier.
+ double mainMultiplier = (timeCalculator(10) * (6 * 64));
+ double probability = 1.0 / validMaterialList.size();
+
+ validMaterialList.forEach((material) -> { processHelper(outputMap, material, mainMultiplier, probability); });
+
+ ArrayList<Pair<Materials, Long>> outputList = new ArrayList<>();
+
+ outputMap.forEach((material, quantity) -> outputList.add(Pair.of(material, (long) Math.floor(quantity))));
+
+ return outputList;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java
new file mode 100644
index 0000000000..38c505b89b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java
@@ -0,0 +1,82 @@
+package com.github.technus.tectech.recipe;
+
+import static com.github.technus.tectech.loader.recipe.Godforge.magmatterItemsForNEI;
+import static com.github.technus.tectech.loader.recipe.Godforge.magmatterSpaceFluidItemsForNEI;
+import static com.github.technus.tectech.loader.recipe.Godforge.magmatterTimeFluidItemsForNEI;
+import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonFluidItemsForNEI;
+import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonItemsForNEI;
+import static gregtech.api.util.GT_Utility.trans;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import codechicken.nei.PositionedStack;
+import gregtech.api.enums.MaterialsUEVplus;
+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.nei.GT_NEI_DefaultHandler;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class GodforgeExoticFrontend extends RecipeMapFrontend {
+
+ public GodforgeExoticFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO)
+ .setSize(18, 18)
+ .setPos(new Pos2d(151, 63).add(windowOffset)));
+ }
+
+ @Override
+ public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ if (neiCachedRecipe.mRecipe.mFluidOutputs[0].equals(MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000))) {
+ neiCachedRecipe.mInputs.set(0, new PositionedStack(quarkGluonItemsForNEI, 48, 23, true));
+ neiCachedRecipe.mInputs.set(1, new PositionedStack(quarkGluonFluidItemsForNEI, 48, 52, true));
+ } else {
+ neiCachedRecipe.mInputs.set(0, new PositionedStack(magmatterItemsForNEI, 48, 23, true));
+ neiCachedRecipe.mInputs.set(1, new PositionedStack(magmatterSpaceFluidItemsForNEI, 30, 52, true));
+ neiCachedRecipe.mInputs.set(2, new PositionedStack(magmatterTimeFluidItemsForNEI, 48, 52, true));
+ }
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return Collections.singletonList(new Pos2d(52, 33));
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 33));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ long eut = recipeInfo.recipe.mEUt;
+ long duration = recipeInfo.recipe.mDuration;
+ recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU");
+ recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t");
+ recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs");
+
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java
new file mode 100644
index 0000000000..8264c6a169
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java
@@ -0,0 +1,76 @@
+package com.github.technus.tectech.recipe;
+
+import static gregtech.api.util.GT_Utility.trans;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+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.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class GodforgePlasmaFrontend extends RecipeMapFrontend {
+
+ public GodforgePlasmaFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO)
+ .setSize(18, 18)
+ .setPos(new Pos2d(151, 63).add(windowOffset)));
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return Collections.singletonList(new Pos2d(52, 33));
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 33));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ long eut = recipeInfo.recipe.mEUt;
+ long duration = recipeInfo.recipe.mDuration;
+ String multistep = "No";
+ if (recipeInfo.recipe.mSpecialItems.toString()
+ .equals("true")) {
+ multistep = "Yes";
+ }
+ String requiredUpgrade = switch (recipeInfo.recipe.mSpecialValue) {
+ case 1 -> "T4-T5";
+ case 2 -> "Exotic";
+ default -> "T1-T3";
+ };
+
+ recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU");
+ recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t");
+ recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs");
+ recipeInfo.drawText(translateToLocal("gt.blockmachines.multimachine.FOG.plasmamultistep") + ": " + multistep);
+ recipeInfo
+ .drawText(translateToLocal("gt.blockmachines.multimachine.FOG.plasmarecipetier") + ": " + requiredUpgrade);
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java b/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java
new file mode 100644
index 0000000000..2f95652a77
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java
@@ -0,0 +1,101 @@
+package com.github.technus.tectech.recipe;
+
+import static gregtech.api.util.GT_Utility.trans;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Supplier;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+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.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ResearchStationFrontend extends RecipeMapFrontend {
+
+ public ResearchStationFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return Collections.singletonList(new Pos2d(52, 33));
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 33));
+ }
+
+ @Override
+ public Pos2d getSpecialItemPosition() {
+ return new Pos2d(124, 62);
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ long eut = recipeInfo.recipe.mEUt;
+ int computation = recipeInfo.recipe.mDuration;
+ short ampere = (short) (recipeInfo.recipe.mSpecialValue & 0xFFFF);
+ short minComputationPerSec = (short) (recipeInfo.recipe.mSpecialValue >>> 16);
+ recipeInfo.drawText(
+ translateToLocalFormatted(
+ "tt.nei.research.max_eu",
+ GT_Utility.formatNumbers(
+ (1 + (computation - minComputationPerSec) / minComputationPerSec) * eut * ampere * 20)));
+ recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut * ampere) + " EU/t");
+ recipeInfo.drawText(trans("154", "Voltage: ") + GT_Utility.formatNumbers(eut) + " EU/t");
+ recipeInfo.drawText(trans("155", "Amperage: ") + GT_Utility.formatNumbers(ampere));
+ recipeInfo
+ .drawText(translateToLocalFormatted("tt.nei.research.computation", GT_Utility.formatNumbers(computation)));
+ recipeInfo.drawText(
+ translateToLocalFormatted(
+ "tt.nei.research.min_computation",
+ GT_Utility.formatNumbers(minComputationPerSec)));
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+ @Override
+ public void addProgressBar(ModularWindow.Builder builder, Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ int bar1Width = 25;
+ int bar2Width = 11;
+ int bar3Height = 18;
+ List<Supplier<Float>> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width, bar3Height);
+ builder.widget(
+ new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_1, bar1Width)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(0))
+ .setSynced(false, false)
+ .setPos(new Pos2d(81, 40).add(windowOffset))
+ .setSize(bar1Width, 5));
+ builder.widget(
+ new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_2, bar2Width)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(1))
+ .setSynced(false, false)
+ .setPos(new Pos2d(124, 40).add(windowOffset))
+ .setSize(bar2Width, 5));
+ builder.widget(
+ new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_3, bar3Height)
+ .setDirection(ProgressBar.Direction.DOWN)
+ .setProgress(splitProgress.get(2))
+ .setSynced(false, false)
+ .setPos(new Pos2d(128, 44).add(windowOffset))
+ .setSize(10, bar3Height));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java
new file mode 100644
index 0000000000..1730e81713
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java
@@ -0,0 +1,278 @@
+package com.github.technus.tectech.recipe;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMaps;
+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_Utility;
+import gregtech.common.GT_RecipeAdder;
+
+public class TT_recipeAdder extends GT_RecipeAdder {
+
+ public static final ItemStack[] nullItem = new ItemStack[0];
+ public static final FluidStack[] nullFluid = new FluidStack[0];
+
+ public static boolean addResearchableAssemblylineRecipe(ItemStack aResearchItem, int totalComputationRequired,
+ int computationRequiredPerSec, int researchEUt, int researchAmperage, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int assDuration, int assEUt) {
+ if (aInputs == null) {
+ aInputs = nullItem;
+ }
+ if (aFluidInputs == null) {
+ aFluidInputs = nullFluid;
+ }
+ if (aResearchItem == null || totalComputationRequired <= 0 || aOutput == null || aInputs.length > 16) {
+ return false;
+ }
+ for (ItemStack tItem : aInputs) {
+ if (tItem == null) {
+ TecTech.LOGGER.error(
+ "addResearchableAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> "
+ + aOutput.getUnlocalizedName()
+ + " there is some null item in that recipe");
+ }
+ }
+ researchAmperage = GT_Utility.clamp(researchAmperage, 1, Short.MAX_VALUE);
+ computationRequiredPerSec = GT_Utility.clamp(computationRequiredPerSec, 1, Short.MAX_VALUE);
+ TecTechRecipeMaps.researchStationFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { aResearchItem },
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") },
+ null,
+ null,
+ totalComputationRequired,
+ researchEUt,
+ researchAmperage | computationRequiredPerSec << 16);
+ RecipeMaps.assemblylineVisualRecipes.addFakeRecipe(
+ false,
+ aInputs,
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") },
+ aFluidInputs,
+ null,
+ assDuration,
+ assEUt,
+ 0,
+ false);
+ GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(
+ new GT_Recipe.GT_Recipe_AssemblyLine(
+ CustomItemList.UnusedStuff.get(1),
+ totalComputationRequired / computationRequiredPerSec,
+ aInputs,
+ aFluidInputs,
+ aOutput,
+ assDuration,
+ assEUt));
+ TecTechRecipeMaps.researchableALRecipeList.add(
+ new GT_Recipe.GT_Recipe_AssemblyLine(
+ aResearchItem,
+ totalComputationRequired / computationRequiredPerSec,
+ aInputs,
+ aFluidInputs,
+ aOutput,
+ assDuration,
+ assEUt));
+ return true;
+ }
+
+ public static boolean addResearchableAssemblylineRecipe(ItemStack aResearchItem, int totalComputationRequired,
+ int computationRequiredPerSec, int researchEUt, int researchAmperage, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int assDuration, int assEUt) {
+ if (aInputs == null) {
+ aInputs = nullItem;
+ }
+ if (aFluidInputs == null) {
+ aFluidInputs = nullFluid;
+ }
+ if (aResearchItem == null || totalComputationRequired <= 0
+ || aOutput == null
+ || aInputs.length > 16
+ || aFluidInputs.length > 4
+ || assDuration <= 0
+ || assEUt <= 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()).modId)
+ .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 t) {
+ TecTech.LOGGER.error(
+ "addAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> there is some ... in that recipe");
+ }
+ }
+ }
+ TecTech.LOGGER.error(
+ "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);
+ }
+ researchAmperage = GT_Utility.clamp(researchAmperage, 1, Short.MAX_VALUE);
+ computationRequiredPerSec = GT_Utility.clamp(computationRequiredPerSec, 1, Short.MAX_VALUE);
+ tPersistentHash = tPersistentHash * 31 + totalComputationRequired;
+ tPersistentHash = tPersistentHash * 31 + computationRequiredPerSec;
+ tPersistentHash = tPersistentHash * 31 + researchAmperage;
+ tPersistentHash = tPersistentHash * 31 + researchEUt;
+ tPersistentHash = tPersistentHash * 31 + assDuration;
+ tPersistentHash = tPersistentHash * 31 + assEUt;
+ TecTechRecipeMaps.researchStationFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { aResearchItem },
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") },
+ null,
+ null,
+ totalComputationRequired,
+ researchEUt,
+ researchAmperage | computationRequiredPerSec << 16);
+ RecipeMaps.assemblylineVisualRecipes.addFakeRecipe(
+ false,
+ tInputs,
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") },
+ aFluidInputs,
+ null,
+ assDuration,
+ assEUt,
+ 0,
+ tAlts,
+ false);
+ GT_Recipe_AssemblyLine recipeGT = new GT_Recipe_AssemblyLine(
+ CustomItemList.UnusedStuff.get(1),
+ totalComputationRequired / computationRequiredPerSec,
+ tInputs,
+ aFluidInputs,
+ aOutput,
+ assDuration,
+ assEUt,
+ tAlts);
+ recipeGT.setPersistentHash(tPersistentHash);
+ GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(recipeGT);
+ GT_Recipe_AssemblyLine recipeTT = new GT_Recipe_AssemblyLine(
+ aResearchItem,
+ totalComputationRequired / computationRequiredPerSec,
+ tInputs,
+ aFluidInputs,
+ aOutput,
+ assDuration,
+ assEUt,
+ tAlts);
+ recipeTT.setPersistentHash(tPersistentHash);
+ TecTechRecipeMaps.researchableALRecipeList.add(recipeTT);
+ return true;
+ }
+
+ public static boolean addFOGPlasmaRecipe(ItemStack[] itemInputs, FluidStack[] fluidOutputs, int machineDuration,
+ int machineEUt, boolean multiStep, int recipeTier) {
+ if (itemInputs == null) {
+ itemInputs = nullItem;
+ }
+
+ TecTechRecipeMaps.godforgePlasmaRecipes
+ .addRecipe(false, itemInputs, null, multiStep, null, fluidOutputs, machineDuration, machineEUt, recipeTier);
+ return true;
+ }
+
+ public static boolean addFOGPlasmaRecipe(FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int machineDuration,
+ int machineEUt, boolean multiStep, int recipeTier) {
+
+ if (fluidInputs == null) {
+ fluidInputs = nullFluid;
+ }
+
+ TecTechRecipeMaps.godforgePlasmaRecipes.addRecipe(
+ false,
+ null,
+ null,
+ multiStep,
+ fluidInputs,
+ fluidOutputs,
+ machineDuration,
+ machineEUt,
+ recipeTier);
+ return true;
+ }
+
+ public static boolean addFOGExoticFakeRecipe(ItemStack[] itemInputs, FluidStack[] fluidInputs,
+ FluidStack[] fluidOutputs, int machineDuration, int machineEUt, int recipeTier) {
+
+ TecTechRecipeMaps.godforgeExoticMatterRecipes.addFakeRecipe(
+ false,
+ itemInputs,
+ null,
+ null,
+ fluidInputs,
+ fluidOutputs,
+ machineDuration,
+ machineEUt,
+ recipeTier,
+ false);
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java
new file mode 100644
index 0000000000..1626ac3252
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java
@@ -0,0 +1,77 @@
+package com.github.technus.tectech.recipe;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.github.technus.tectech.thing.CustomItemList;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.util.GT_Recipe;
+
+public class TecTechRecipeMaps {
+
+ public static void init() {}
+
+ public static final List<GT_Recipe.GT_Recipe_AssemblyLine> researchableALRecipeList = new ArrayList<>();
+
+ public static final RecipeMap<RecipeMapBackend> eyeOfHarmonyRecipes = RecipeMapBuilder.of("gt.recipe.eyeofharmony")
+ .maxIO(
+ EyeOfHarmonyFrontend.maxItemInputs,
+ EyeOfHarmonyFrontend.maxItemOutputs,
+ EyeOfHarmonyFrontend.maxFluidInputs,
+ EyeOfHarmonyFrontend.maxFluidOutputs)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_HAMMER, ProgressBar.Direction.DOWN)
+ .progressBarPos(78, 24 + 2)
+ .logoPos(10, 10)
+ .neiHandlerInfo(
+ builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_EyeOfHarmony.get(1))
+ .setMaxRecipesPerPage(1))
+ .frontend(EyeOfHarmonyFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> researchStationFakeRecipes = RecipeMapBuilder
+ .of("gt.recipe.researchStation")
+ .maxIO(1, 1, 0, 0)
+ .useSpecialSlot()
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isSpecial) {
+ return GT_UITextures.OVERLAY_SLOT_DATA_ORB;
+ }
+ if (isOutput) {
+ return TecTechUITextures.OVERLAY_SLOT_MESH;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MICROSCOPE;
+ })
+ .addSpecialTexture(19, 12, 84, 60, TecTechUITextures.PICTURE_HEAT_SINK)
+ .addSpecialTexture(41, 22, 40, 40, TecTechUITextures.PICTURE_RACK_LARGE)
+ .logo(TecTechUITextures.PICTURE_TECTECH_LOGO)
+ .logoSize(18, 18)
+ .logoPos(151, 63)
+ .neiTransferRect(81, 33, 25, 18)
+ .neiTransferRect(124, 33, 18, 29)
+ .frontend(ResearchStationFrontend::new)
+ .neiHandlerInfo(builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_Research.get(1)))
+ .build();
+
+ public static final RecipeMap<RecipeMapBackend> godforgePlasmaRecipes = RecipeMapBuilder.of("gt.recipe.fog_plasma")
+ .maxIO(1, 1, 1, 1)
+ .progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT)
+ .progressBarPos(78, 33)
+ .neiTransferRect(78, 33, 20, 20)
+ .frontend(GodforgePlasmaFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> godforgeExoticMatterRecipes = RecipeMapBuilder
+ .of("gt.recipe.fog_exotic")
+ .maxIO(1, 1, 2, 1)
+ .progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT)
+ .progressBarPos(78, 33)
+ .neiTransferRect(78, 33, 20, 20)
+ .frontend(GodforgeExoticFrontend::new)
+ .build();
+
+}
diff --git a/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java
new file mode 100644
index 0000000000..b5d75fdc71
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java
@@ -0,0 +1,98 @@
+package com.github.technus.tectech.rendering.EOH;
+
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_0;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_1;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_2;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.starModel;
+import static java.lang.Math.pow;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.FMLClientHandler;
+
+public class EOH_ItemRenderer implements IItemRenderer {
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return true;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ GL11.glPushMatrix();
+
+ if (type == ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0);
+ else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ GL11.glTranslated(0.5, 0.5, 0.5);
+ if (type == ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0);
+ }
+
+ // Render star stuff.
+ renderStarLayer(0, STAR_LAYER_0, 1.0f);
+ renderStarLayer(1, STAR_LAYER_1, 0.4f);
+ renderStarLayer(2, STAR_LAYER_2, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+
+ private void renderStarLayer(int layer, ResourceLocation texture, float alpha) {
+
+ // Begin animation.
+ GL11.glPushMatrix();
+
+ // OpenGL settings, not sure exactly what these do.
+
+ // Disables lighting, so star is always lit (I think).
+ GL11.glDisable(GL11.GL_LIGHTING);
+ // Culls things out of line of sight?
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ // Merges colours of the various layers of the star?
+ GL11.glEnable(GL11.GL_BLEND);
+ // ???
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ // Bind animation to layer of star.
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down.
+ // Size obtained from the multis current recipe.
+ float scale = 0.01f;
+
+ // Put each subsequent layer further out.
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions.
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0 -> GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F);
+ case 1 -> GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F);
+ case 2 -> GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F);
+ }
+
+ // Set colour and alpha (transparency) of the star layer.
+ GL11.glColor4f(1, 1, 1, alpha);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ // Finish animation.
+ GL11.glPopMatrix();
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java
new file mode 100644
index 0000000000..3f72cacd77
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java
@@ -0,0 +1,270 @@
+package com.github.technus.tectech.rendering.EOH;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_0;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_1;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_2;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.spaceModel;
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.starModel;
+import static java.lang.Math.pow;
+
+import java.awt.Color;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.FMLClientHandler;
+
+public abstract class EOH_RenderingUtils {
+
+ public static void renderStar(IItemRenderer.ItemRenderType type, Color color) {
+ GL11.glPushMatrix();
+
+ if (type == IItemRenderer.ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0);
+ else if (type == IItemRenderer.ItemRenderType.EQUIPPED
+ || type == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ GL11.glTranslated(0.5, 0.5, 0.5);
+ if (type == IItemRenderer.ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0);
+ }
+
+ // Render star stuff.
+ renderStarLayer(0, STAR_LAYER_0, color, 1.0f);
+ renderStarLayer(1, STAR_LAYER_1, color, 0.4f);
+ renderStarLayer(2, STAR_LAYER_2, color, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+
+ public static void renderStar(IItemRenderer.ItemRenderType type) {
+ renderStar(type, new Color(1.0f, 0.4f, 0.05f, 1.0f));
+ }
+
+ private static void renderStarLayer(int layer, ResourceLocation texture, Color color, float alpha) {
+
+ // Begin animation.
+ GL11.glPushMatrix();
+
+ // OpenGL settings, not sure exactly what these do.
+
+ // Disables lighting, so star is always lit (I think).
+ GL11.glDisable(GL11.GL_LIGHTING);
+ // Culls triangles/quads facing away from the camera
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ // Allows alpha blending to occur (transparency-based color mixing)
+ GL11.glEnable(GL11.GL_BLEND);
+ // ???
+ if (alpha < 1.0f) {
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
+ } else {
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ // Bind image to layer of star.
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down.
+ // Size obtained from the multis current recipe.
+ float scale = 0.01f;
+
+ // Put each subsequent layer further out.
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions.
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0 -> GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F);
+ case 1 -> GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F);
+ case 2 -> GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F);
+ }
+
+ // Set colour and alpha (transparency) of the star layer.
+ final float red = color.getRed() / 255.0f;
+ final float green = color.getGreen() / 255.0f;
+ final float blue = color.getBlue() / 255.0f;
+
+ GL11.glColor4f(red, green, blue, alpha);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ // Finish animation.
+ GL11.glPopMatrix();
+ }
+
+ public static void beginRenderingBlocksInWorld(final float blockSize) {
+ final Tessellator tes = Tessellator.instance;
+
+ GL11.glPushMatrix();
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+
+ tes.setColorOpaque_F(1f, 1f, 1f);
+ tes.startDrawingQuads();
+
+ GL11.glScalef(blockSize, blockSize, blockSize);
+ }
+
+ public static void endRenderingBlocksInWorld() {
+ Tessellator.instance.draw();
+
+ GL11.glPopAttrib();
+ GL11.glPopMatrix();
+ }
+
+ static final double[] BLOCK_X = { -0.5, -0.5, +0.5, +0.5, +0.5, +0.5, -0.5, -0.5 };
+ static final double[] BLOCK_Y = { +0.5, -0.5, -0.5, +0.5, +0.5, -0.5, -0.5, +0.5 };
+ static final double[] BLOCK_Z = { +0.5, +0.5, +0.5, +0.5, -0.5, -0.5, -0.5, -0.5 };
+
+ public static void addRenderedBlockInWorld(final Block block, final int meta, final double x, final double y,
+ final double z) {
+ final Tessellator tes = Tessellator.instance;
+
+ IIcon texture;
+
+ double minU;
+ double maxU;
+ double minV;
+ double maxV;
+
+ {
+ texture = block.getIcon(4, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], minU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], minU, maxV);
+ }
+
+ {
+ // Bottom face.
+ texture = block.getIcon(0, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], minU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], minU, minV);
+ }
+
+ {
+ texture = block.getIcon(2, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], minU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], minU, maxV);
+ }
+
+ {
+ texture = block.getIcon(5, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], minU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], minU, maxV);
+ }
+
+ {
+ texture = block.getIcon(1, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], minU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], minU, maxV);
+ }
+
+ {
+ texture = block.getIcon(3, meta);
+
+ minU = texture.getMinU();
+ maxU = texture.getMaxU();
+ minV = texture.getMinV();
+ maxV = texture.getMaxV();
+
+ tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], maxU, maxV);
+ tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], maxU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], minU, minV);
+ tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], minU, maxV);
+ }
+ }
+
+ public static void renderBlockInWorld(final Block block, final int meta, final float blockSize) {
+ beginRenderingBlocksInWorld(blockSize);
+
+ addRenderedBlockInWorld(block, meta, 0, 0, 0);
+
+ endRenderingBlocksInWorld();
+ }
+
+ public static void renderOuterSpaceShell() {
+
+ // Save current OpenGL state.
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+
+ // Begin animation.
+ GL11.glPushMatrix();
+
+ // Disables lighting, so star is always lit.
+ GL11.glDisable(GL11.GL_LIGHTING);
+ // Merges colors of the various layers of the star.
+ // GL11.glEnable(GL11.GL_BLEND);
+
+ // Bind animation to layer of star.
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(new ResourceLocation(MODID, "models/spaceLayer.png"));
+
+ final float scale = 0.01f * 17.5f;
+ // Scale the star up in the x, y and z directions.
+ GL11.glScalef(scale, scale, scale);
+
+ GL11.glColor4f(1, 1, 1, 1);
+
+ spaceModel.renderAll();
+
+ // Finish animation.
+ GL11.glPopMatrix();
+
+ // Restore previous OpenGL state.
+ GL11.glPopAttrib();
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java
new file mode 100644
index 0000000000..da704a37ff
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java
@@ -0,0 +1,91 @@
+package com.github.technus.tectech.rendering.EOH;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderBlockInWorld;
+import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderOuterSpaceShell;
+import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderStar;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.model.AdvancedModelLoader;
+import net.minecraftforge.client.model.IModelCustom;
+
+import org.lwjgl.opengl.GL11;
+
+import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+
+public class EOH_TESR extends TileEntitySpecialRenderer {
+
+ public static final ResourceLocation STAR_LAYER_0 = new ResourceLocation(MODID, "models/StarLayer0.png");
+ public static final ResourceLocation STAR_LAYER_1 = new ResourceLocation(MODID, "models/StarLayer1.png");
+ public static final ResourceLocation STAR_LAYER_2 = new ResourceLocation(MODID, "models/StarLayer2.png");
+ public static IModelCustom starModel;
+ public static IModelCustom spaceModel;
+
+ public EOH_TESR() {
+ starModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Star.obj"));
+ spaceModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Space.obj"));
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) {
+ if (!(tile instanceof TileEyeOfHarmony EOHRenderTile)) return;
+
+ GL11.glPushMatrix();
+ // Required to centre the render to the middle of the block.
+ GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
+
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_BLEND);
+
+ // Space shell.
+ renderOuterSpaceShell();
+
+ // Render the planets.
+ renderOrbitObjects(EOHRenderTile);
+
+ // Render the star itself.
+ renderStar(IItemRenderer.ItemRenderType.INVENTORY);
+ GL11.glPopAttrib();
+
+ GL11.glPopMatrix();
+ }
+
+ private void renderOrbitObjects(final TileEyeOfHarmony EOHRenderTile) {
+
+ if (EOHRenderTile.getOrbitingObjects() != null) {
+
+ if (EOHRenderTile.getOrbitingObjects()
+ .size() == 0) {
+ EOHRenderTile.generateImportantInfo();
+ }
+
+ for (TileEyeOfHarmony.OrbitingObject t : EOHRenderTile.getOrbitingObjects()) {
+ renderOrbit(EOHRenderTile, t);
+ }
+ }
+ }
+
+ void renderOrbit(final TileEyeOfHarmony EOHRenderTile, final TileEyeOfHarmony.OrbitingObject orbitingObject) {
+ // Render orbiting body.
+ GL11.glPushMatrix();
+
+ GL11.glRotatef(orbitingObject.zAngle, 0, 0, 1);
+ GL11.glRotatef(orbitingObject.xAngle, 1, 0, 0);
+ GL11.glRotatef((orbitingObject.rotationSpeed * 0.1f * EOHRenderTile.angle) % 360.0f, 0F, 1F, 0F);
+ GL11.glTranslated(-0.2 - orbitingObject.distance - STAR_RESCALE * EOHRenderTile.getSize(), 0, 0);
+ GL11.glRotatef((orbitingObject.orbitSpeed * 0.1f * EOHRenderTile.angle) % 360.0f, 0F, 1F, 0F);
+
+ this.bindTexture(TextureMap.locationBlocksTexture);
+ renderBlockInWorld(orbitingObject.block, 0, orbitingObject.scale);
+
+ GL11.glPopMatrix();
+ }
+
+ private static final float STAR_RESCALE = 0.2f;
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
new file mode 100644
index 0000000000..a45e342050
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
@@ -0,0 +1,609 @@
+package com.github.technus.tectech.thing;
+
+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 CustomItemList implements IItemContainer {
+
+ Casing_UEV,
+ Casing_UIV,
+ Casing_UMV,
+ Casing_UXV,
+ Casing_MAXV,
+ Hull_UEV,
+ Hull_UIV,
+ Hull_UMV,
+ Hull_UXV,
+ Hull_MAXV,
+ Transformer_UEV_UHV,
+ Transformer_UIV_UEV,
+ Transformer_UMV_UIV,
+ Transformer_UXV_UMV,
+ Transformer_MAXV_UXV,
+ WetTransformer_LV_ULV,
+ WetTransformer_MV_LV,
+ WetTransformer_HV_MV,
+ WetTransformer_EV_HV,
+ WetTransformer_IV_EV,
+ WetTransformer_LuV_IV,
+ WetTransformer_ZPM_LuV,
+ WetTransformer_UV_ZPM,
+ WetTransformer_UHV_UV,
+ WetTransformer_UEV_UHV,
+ WetTransformer_UIV_UEV,
+ WetTransformer_UMV_UIV,
+ WetTransformer_UXV_UMV,
+ WetTransformer_MAXV_UXV,
+
+ Transformer_HA_UEV_UHV,
+ Transformer_HA_UIV_UEV,
+ Transformer_HA_UMV_UIV,
+ Transformer_HA_UXV_UMV,
+ Transformer_HA_MAXV_UXV,
+
+ hatch_CreativeMaintenance,
+ hatch_CreativeData,
+ hatch_CreativeUncertainty,
+ Machine_OwnerDetector,
+ Machine_BuckConverter_IV,
+ Machine_BuckConverter_LuV,
+ Machine_BuckConverter_ZPM,
+ Machine_BuckConverter_UV,
+ Machine_BuckConverter_UHV,
+ Machine_BuckConverter_UEV,
+ Machine_BuckConverter_UIV,
+ Machine_BuckConverter_UMV,
+ Machine_BuckConverter_UXV,
+ Machine_DebugWriter,
+ Machine_DebugGenny,
+ UnusedStuff,
+ Machine_DebugPollutor,
+ DATApipe,
+ LASERpipe,
+ rack_Hatch,
+ holder_Hatch,
+ capacitor_Hatch,
+
+ eM_dynamoMulti4_EV,
+ eM_dynamoMulti16_EV,
+ eM_dynamoMulti64_EV,
+ eM_dynamoMulti4_IV,
+ eM_dynamoMulti16_IV,
+ eM_dynamoMulti64_IV,
+ eM_dynamoMulti4_LuV,
+ eM_dynamoMulti16_LuV,
+ eM_dynamoMulti64_LuV,
+ eM_dynamoMulti4_ZPM,
+ eM_dynamoMulti16_ZPM,
+ eM_dynamoMulti64_ZPM,
+ eM_dynamoMulti4_UV,
+ eM_dynamoMulti16_UV,
+ eM_dynamoMulti64_UV,
+ eM_dynamoMulti4_UHV,
+ eM_dynamoMulti16_UHV,
+ eM_dynamoMulti64_UHV,
+ eM_dynamoMulti4_UEV,
+ eM_dynamoMulti16_UEV,
+ eM_dynamoMulti64_UEV,
+ eM_dynamoMulti4_UIV,
+ eM_dynamoMulti16_UIV,
+ eM_dynamoMulti64_UIV,
+ eM_dynamoMulti4_UMV,
+ eM_dynamoMulti16_UMV,
+ eM_dynamoMulti64_UMV,
+ eM_dynamoMulti4_UXV,
+ eM_dynamoMulti16_UXV,
+ eM_dynamoMulti64_UXV,
+ eM_dynamoTunnel1_IV,
+ eM_dynamoTunnel2_IV,
+ eM_dynamoTunnel3_IV,
+ eM_dynamoTunnel4_IV,
+ eM_dynamoTunnel5_IV,
+ eM_dynamoTunnel6_IV,
+ eM_dynamoTunnel7_IV,
+ eM_dynamoTunnel1_LuV,
+ eM_dynamoTunnel2_LuV,
+ eM_dynamoTunnel3_LuV,
+ eM_dynamoTunnel4_LuV,
+ eM_dynamoTunnel5_LuV,
+ eM_dynamoTunnel6_LuV,
+ eM_dynamoTunnel7_LuV,
+ eM_dynamoTunnel1_ZPM,
+ eM_dynamoTunnel2_ZPM,
+ eM_dynamoTunnel3_ZPM,
+ eM_dynamoTunnel4_ZPM,
+ eM_dynamoTunnel5_ZPM,
+ eM_dynamoTunnel6_ZPM,
+ eM_dynamoTunnel7_ZPM,
+ eM_dynamoTunnel1_UV,
+ eM_dynamoTunnel2_UV,
+ eM_dynamoTunnel3_UV,
+ eM_dynamoTunnel4_UV,
+ eM_dynamoTunnel5_UV,
+ eM_dynamoTunnel6_UV,
+ eM_dynamoTunnel7_UV,
+ eM_dynamoTunnel1_UHV,
+ eM_dynamoTunnel2_UHV,
+ eM_dynamoTunnel3_UHV,
+ eM_dynamoTunnel4_UHV,
+ eM_dynamoTunnel5_UHV,
+ eM_dynamoTunnel6_UHV,
+ eM_dynamoTunnel7_UHV,
+ eM_dynamoTunnel1_UEV,
+ eM_dynamoTunnel2_UEV,
+ eM_dynamoTunnel3_UEV,
+ eM_dynamoTunnel4_UEV,
+ eM_dynamoTunnel5_UEV,
+ eM_dynamoTunnel6_UEV,
+ eM_dynamoTunnel7_UEV,
+ eM_dynamoTunnel1_UIV,
+ eM_dynamoTunnel2_UIV,
+ eM_dynamoTunnel3_UIV,
+ eM_dynamoTunnel4_UIV,
+ eM_dynamoTunnel5_UIV,
+ eM_dynamoTunnel6_UIV,
+ eM_dynamoTunnel7_UIV,
+ eM_dynamoTunnel1_UMV,
+ eM_dynamoTunnel2_UMV,
+ eM_dynamoTunnel3_UMV,
+ eM_dynamoTunnel4_UMV,
+ eM_dynamoTunnel5_UMV,
+ eM_dynamoTunnel6_UMV,
+ eM_dynamoTunnel7_UMV,
+ eM_dynamoTunnel1_UXV,
+ eM_dynamoTunnel2_UXV,
+ eM_dynamoTunnel3_UXV,
+ eM_dynamoTunnel4_UXV,
+ eM_dynamoTunnel5_UXV,
+ eM_dynamoTunnel6_UXV,
+ eM_dynamoTunnel7_UXV,
+ eM_dynamoTunnel9001,
+
+ eM_energyMulti4_EV,
+ eM_energyMulti16_EV,
+ eM_energyMulti64_EV,
+ eM_energyMulti4_IV,
+ eM_energyMulti16_IV,
+ eM_energyMulti64_IV,
+ eM_energyMulti4_LuV,
+ eM_energyMulti16_LuV,
+ eM_energyMulti64_LuV,
+ eM_energyMulti4_ZPM,
+ eM_energyMulti16_ZPM,
+ eM_energyMulti64_ZPM,
+ eM_energyMulti4_UV,
+ eM_energyMulti16_UV,
+ eM_energyMulti64_UV,
+ eM_energyMulti4_UHV,
+ eM_energyMulti16_UHV,
+ eM_energyMulti64_UHV,
+ eM_energyMulti4_UEV,
+ eM_energyMulti16_UEV,
+ eM_energyMulti64_UEV,
+ eM_energyMulti4_UIV,
+ eM_energyMulti16_UIV,
+ eM_energyMulti64_UIV,
+ eM_energyMulti4_UMV,
+ eM_energyMulti16_UMV,
+ eM_energyMulti64_UMV,
+ eM_energyMulti4_UXV,
+ eM_energyMulti16_UXV,
+ eM_energyMulti64_UXV,
+ eM_energyWirelessMulti4_EV,
+ eM_energyWirelessMulti16_EV,
+ eM_energyWirelessMulti64_EV,
+ eM_energyWirelessMulti4_IV,
+ eM_energyWirelessMulti16_IV,
+ eM_energyWirelessMulti64_IV,
+ eM_energyWirelessMulti4_LuV,
+ eM_energyWirelessMulti16_LuV,
+ eM_energyWirelessMulti64_LuV,
+ eM_energyWirelessMulti4_ZPM,
+ eM_energyWirelessMulti16_ZPM,
+ eM_energyWirelessMulti64_ZPM,
+ eM_energyWirelessMulti4_UV,
+ eM_energyWirelessMulti16_UV,
+ eM_energyWirelessMulti64_UV,
+ eM_energyWirelessMulti4_UHV,
+ eM_energyWirelessMulti16_UHV,
+ eM_energyWirelessMulti64_UHV,
+ eM_energyWirelessMulti4_UEV,
+ eM_energyWirelessMulti16_UEV,
+ eM_energyWirelessMulti64_UEV,
+ eM_energyWirelessMulti4_UIV,
+ eM_energyWirelessMulti16_UIV,
+ eM_energyWirelessMulti64_UIV,
+ eM_energyWirelessMulti4_UMV,
+ eM_energyWirelessMulti16_UMV,
+ eM_energyWirelessMulti64_UMV,
+ eM_energyWirelessMulti4_UXV,
+ eM_energyWirelessMulti16_UXV,
+ eM_energyWirelessMulti64_UXV,
+ eM_energyWirelessMulti4_MAX,
+ eM_energyWirelessMulti16_MAX,
+ eM_energyWirelessMulti64_MAX,
+ eM_energyTunnel1_IV,
+ eM_energyTunnel2_IV,
+ eM_energyTunnel3_IV,
+ eM_energyTunnel4_IV,
+ eM_energyTunnel5_IV,
+ eM_energyTunnel6_IV,
+ eM_energyTunnel7_IV,
+ eM_energyTunnel1_LuV,
+ eM_energyTunnel2_LuV,
+ eM_energyTunnel3_LuV,
+ eM_energyTunnel4_LuV,
+ eM_energyTunnel5_LuV,
+ eM_energyTunnel6_LuV,
+ eM_energyTunnel7_LuV,
+ eM_energyTunnel1_ZPM,
+ eM_energyTunnel2_ZPM,
+ eM_energyTunnel3_ZPM,
+ eM_energyTunnel4_ZPM,
+ eM_energyTunnel5_ZPM,
+ eM_energyTunnel6_ZPM,
+ eM_energyTunnel7_ZPM,
+ eM_energyTunnel1_UV,
+ eM_energyTunnel2_UV,
+ eM_energyTunnel3_UV,
+ eM_energyTunnel4_UV,
+ eM_energyTunnel5_UV,
+ eM_energyTunnel6_UV,
+ eM_energyTunnel7_UV,
+ eM_energyTunnel1_UHV,
+ eM_energyTunnel2_UHV,
+ eM_energyTunnel3_UHV,
+ eM_energyTunnel4_UHV,
+ eM_energyTunnel5_UHV,
+ eM_energyTunnel6_UHV,
+ eM_energyTunnel7_UHV,
+ eM_energyTunnel1_UEV,
+ eM_energyTunnel2_UEV,
+ eM_energyTunnel3_UEV,
+ eM_energyTunnel4_UEV,
+ eM_energyTunnel5_UEV,
+ eM_energyTunnel6_UEV,
+ eM_energyTunnel7_UEV,
+ eM_energyTunnel1_UIV,
+ eM_energyTunnel2_UIV,
+ eM_energyTunnel3_UIV,
+ eM_energyTunnel4_UIV,
+ eM_energyTunnel5_UIV,
+ eM_energyTunnel6_UIV,
+ eM_energyTunnel7_UIV,
+ eM_energyTunnel1_UMV,
+ eM_energyTunnel2_UMV,
+ eM_energyTunnel3_UMV,
+ eM_energyTunnel4_UMV,
+ eM_energyTunnel5_UMV,
+ eM_energyTunnel6_UMV,
+ eM_energyTunnel7_UMV,
+ eM_energyTunnel1_UXV,
+ eM_energyTunnel2_UXV,
+ eM_energyTunnel3_UXV,
+ eM_energyTunnel4_UXV,
+ eM_energyTunnel5_UXV,
+ eM_energyTunnel6_UXV,
+ eM_energyTunnel7_UXV,
+ eM_energyTunnel9001,
+ eM_energyWirelessTunnel1_UXV,
+ eM_energyWirelessTunnel2_UXV,
+ eM_energyWirelessTunnel3_UXV,
+ eM_energyWirelessTunnel4_UXV,
+ eM_energyWirelessTunnel5_UXV,
+ eM_energyWirelessTunnel6_UXV,
+ eM_energyWirelessTunnel7_UXV,
+
+ Parametrizer_Hatch,
+ ParametrizerX_Hatch,
+ ParametrizerTXT_Hatch,
+ Uncertainty_Hatch,
+ UncertaintyX_Hatch,
+ dataIn_Hatch,
+ dataOut_Hatch,
+ dataInAss_Hatch,
+ dataOutAss_Hatch,
+ eM_Containment,
+ eM_Containment_Field,
+ eM_Containment_Advanced,
+ eM_Coil,
+ eM_Teleportation,
+ eM_Dimensional,
+ eM_Ultimate_Containment,
+ eM_Ultimate_Containment_Advanced,
+ eM_Ultimate_Containment_Field,
+ eM_Spacetime,
+ eM_Computer_Casing,
+ eM_Computer_Bus,
+ eM_Computer_Vent,
+ eM_Hollow,
+ eM_Power,
+ debugBlock,
+
+ tM_TeslaBase,
+ tM_TeslaToroid,
+ EOH_Reinforced_Temporal_Casing,
+ EOH_Reinforced_Spatial_Casing,
+ EOH_Infinite_Energy_Casing,
+ tM_TeslaSecondary,
+ tM_TeslaPrimary_0,
+ tM_TeslaPrimary_1,
+ tM_TeslaPrimary_2,
+ tM_TeslaPrimary_3,
+ tM_TeslaPrimary_4,
+ tM_TeslaPrimary_5,
+ tM_TeslaPrimary_6,
+
+ Machine_Multi_Microwave,
+ Machine_Multi_TeslaCoil,
+ Machine_Multi_Transformer,
+ Machine_Multi_Computer,
+ Machine_Multi_Switch,
+ Machine_Multi_Research,
+ Machine_Multi_DataBank,
+ Machine_Multi_Infuser,
+ Machine_Multi_Decay,
+ Machine_Multi_Annihilation,
+ Machine_Multi_EyeOfHarmony,
+ Machine_Multi_ForgeOfGods,
+ Machine_Multi_SmeltingModule,
+ Machine_Multi_MoltenModule,
+ Machine_Multi_PlasmaModule,
+ Machine_Multi_QuarkGluonPlasmaModule,
+
+ hint_0,
+ hint_1,
+ hint_2,
+ hint_3,
+ hint_4,
+ hint_5,
+ hint_6,
+ hint_7,
+ hint_8,
+ hint_9,
+ hint_10,
+ hint_11,
+ hint_general,
+ hint_air,
+ hint_noAir,
+ hint_error,
+
+ scanContainer,
+ parametrizerMemory,
+ teslaCapacitor,
+ teslaCover,
+ teslaComponent,
+ teslaStaff,
+ enderLinkFluidCover,
+ powerPassUpgradeCover,
+
+ Machine_TeslaCoil_1by1_LV,
+ Machine_TeslaCoil_1by1_MV,
+ Machine_TeslaCoil_1by1_HV,
+ Machine_TeslaCoil_1by1_EV,
+ Machine_TeslaCoil_1by1_IV,
+ Machine_TeslaCoil_2by2_LV,
+ Machine_TeslaCoil_2by2_MV,
+ Machine_TeslaCoil_2by2_HV,
+ Machine_TeslaCoil_2by2_EV,
+ Machine_TeslaCoil_2by2_IV,
+ Machine_TeslaCoil_3by3_LV,
+ Machine_TeslaCoil_3by3_MV,
+ Machine_TeslaCoil_3by3_HV,
+ Machine_TeslaCoil_3by3_EV,
+ Machine_TeslaCoil_3by3_IV,
+ Machine_TeslaCoil_4by4_LV,
+ Machine_TeslaCoil_4by4_MV,
+ Machine_TeslaCoil_4by4_HV,
+ Machine_TeslaCoil_4by4_EV,
+ Machine_TeslaCoil_4by4_IV,
+ DATApipeBlock,
+ LASERpipeBlock,
+
+ SpacetimeCompressionFieldGeneratorTier0,
+ SpacetimeCompressionFieldGeneratorTier1,
+ SpacetimeCompressionFieldGeneratorTier2,
+ SpacetimeCompressionFieldGeneratorTier3,
+ SpacetimeCompressionFieldGeneratorTier4,
+ SpacetimeCompressionFieldGeneratorTier5,
+ SpacetimeCompressionFieldGeneratorTier6,
+ SpacetimeCompressionFieldGeneratorTier7,
+ SpacetimeCompressionFieldGeneratorTier8,
+
+ TimeAccelerationFieldGeneratorTier0,
+ TimeAccelerationFieldGeneratorTier1,
+ TimeAccelerationFieldGeneratorTier2,
+ TimeAccelerationFieldGeneratorTier3,
+ TimeAccelerationFieldGeneratorTier4,
+ TimeAccelerationFieldGeneratorTier5,
+ TimeAccelerationFieldGeneratorTier6,
+ TimeAccelerationFieldGeneratorTier7,
+ TimeAccelerationFieldGeneratorTier8,
+
+ StabilisationFieldGeneratorTier0,
+ StabilisationFieldGeneratorTier1,
+ StabilisationFieldGeneratorTier2,
+ StabilisationFieldGeneratorTier3,
+ StabilisationFieldGeneratorTier4,
+ StabilisationFieldGeneratorTier5,
+ StabilisationFieldGeneratorTier6,
+ StabilisationFieldGeneratorTier7,
+ StabilisationFieldGeneratorTier8,
+
+ Godforge_Gravitational_Lens,
+ Godforge_Singularity_Shielding_Casing,
+ Godforge_Guidance_Casing,
+ Godforge_Boundless_Structure_Casing,
+ Godforge_Magnetic_Confinement_Casing,
+ Godforge_Stellar_Energy_Siphon_Casing,
+ Godforge_GravitonFlowModulatorTier1,
+ Godforge_GravitonFlowModulatorTier2,
+ Godforge_GravitonFlowModulatorTier3,
+
+ astralArrayFabricator;
+
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ // public static Fluid sOilExtraHeavy, sOilHeavy, sOilMedium, sOilLight, sNaturalGas;
+
+ @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/com/github/technus/tectech/thing/block/EOH_RenderBlock.java b/src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java
new file mode 100644
index 0000000000..110dc83015
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java
@@ -0,0 +1,79 @@
+package com.github.technus.tectech.thing.block;
+
+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 com.github.technus.tectech.TecTech;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class EOH_RenderBlock extends Block {
+
+ public EOH_RenderBlock() {
+ super(Material.iron);
+ this.setResistance(20f);
+ this.setHardness(-1.0f);
+ this.setCreativeTab(TecTech.creativeTabTecTech);
+ this.setBlockName("Eye of Harmony Renderer");
+ this.setLightLevel(100.0f);
+ registerOther(this);
+ }
+
+ @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 TileEyeOfHarmony();
+ }
+
+ public static void registerOther(Block block) {
+ String name = block.getUnlocalizedName()
+ .substring(
+ block.getUnlocalizedName()
+ .indexOf(".") + 1);
+ GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1));
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) {
+ return new ArrayList<>();
+ }
+
+ @Override
+ public boolean isCollidable() {
+ return false;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java b/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java
new file mode 100644
index 0000000000..02be399bb0
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java
@@ -0,0 +1,70 @@
+package com.github.technus.tectech.thing.block;
+
+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 com.github.technus.tectech.TecTech;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ForgeOfGodsBlock extends Block {
+
+ public ForgeOfGodsBlock() {
+ super(Material.iron);
+ this.setResistance(20f);
+ this.setHardness(-1.0f);
+ this.setCreativeTab(TecTech.creativeTabTecTech);
+ this.setBlockName("Forge of the Gods Renderer");
+ this.setLightLevel(100.0f);
+ registerOther(this);
+ }
+
+ @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 TileForgeOfGods();
+ }
+
+ public static void registerOther(Block block) {
+ GameRegistry.registerBlock(block, "ForgeOfGodsRenderBlock");
+ }
+
+ @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/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java
new file mode 100644
index 0000000000..67c77f5ac4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java
@@ -0,0 +1,107 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import eu.usrv.yamcore.blocks.BlockBase;
+import gregtech.api.GregTech_API;
+
+public class GodforgeGlassBlock extends BlockBase {
+
+ public static IIcon Icon;
+ public static int renderID;
+ public static GodforgeGlassBlock INSTANCE;
+
+ public GodforgeGlassBlock() {
+ super(Material.iron);
+ setBlockBounds(0, 0, 0, 1, 1, 1);
+ setBlockName("spatiallyTranscendentGravitationalLens");
+ setHarvestLevel("wrench", 3);
+ setHardness(50);
+ setResistance(30);
+ setLightOpacity(0);
+ setStepSound(Block.soundTypeGlass);
+ setBlockTextureName(MODID + ":blockSpatiallyTranscendentGravitationalLens");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) {
+ Block block = worldIn.getBlock(x, y, z);
+ return block != this;
+ }
+
+ @Override
+ public int getRenderType() {
+ return renderID;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister reg) {
+ super.registerBlockIcons(reg);
+ Icon = blockIcon;
+ }
+
+ public static void run() {
+ INSTANCE = new GodforgeGlassBlock();
+ GameRegistry.registerBlock(INSTANCE, GodforgeGlassItem.class, INSTANCE.getUnlocalizedName());
+ GregTech_API.registerMachineBlock(INSTANCE, -1);
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMeta) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @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);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java
new file mode 100644
index 0000000000..bd7d58a4da
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java
@@ -0,0 +1,30 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+public class GodforgeGlassItem extends ItemBlock {
+
+ public static GodforgeGlassItem INSTANCE;
+
+ public GodforgeGlassItem(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ aList.add(GODFORGE_MARK);
+ aList.add(translateToLocal("tile.godforgeGlass.desc.0"));
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("tile.godforgeGlass.desc.1"));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java
new file mode 100644
index 0000000000..51c909c83d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java
@@ -0,0 +1,122 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+
+public class GodforgeGlassRender implements ISimpleBlockRenderingHandler {
+
+ @Override
+ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ Tessellator tessellator = Tessellator.instance;
+ GL11.glPushMatrix();
+ // Get icons from custom register (useful for renderers and fluids)
+ IIcon side = GodforgeGlassBlock.Icon;
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
+ RenderBlocks renderer) {
+
+ renderer.renderStandardBlock(block, x, y, z);
+ Tessellator tes = Tessellator.instance;
+ tes.setNormal(0F, 1F, 0F);
+ tes.setBrightness(15728880);
+ tes.setColorOpaque_F(0F, 1F, 1F);
+ IIcon side = GodforgeGlassBlock.Icon;
+
+ // South
+ if (world.getBlock(x, y, z + 1)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y, z + 0.999, side.getMinU(), side.getMaxV()); // 0.999 instead of 1 for fighting
+ // (textures overlapping)
+ tes.addVertexWithUV(x, y + 1, z + 0.999, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.999, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y, z + 0.999, side.getMaxU(), side.getMaxV());
+ }
+ // East
+ if (world.getBlock(x + 1, y, z)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.999, y, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y, z, side.getMaxU(), side.getMaxV());
+ }
+ // North
+ if (world.getBlock(x, y, z - 1)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 1, y, z + 0.001, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.001, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x, y + 1, z + 0.001, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x, y, z + 0.001, side.getMaxU(), side.getMaxV());
+ }
+ // West
+ if (world.getBlock(x - 1, y, z)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.001, y, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Top
+ if (world.getBlock(x, y + 1, z)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.999, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.999, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Bottom
+ if (world.getBlock(x, y - 1, z)
+ .getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.001, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.001, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z, side.getMaxU(), side.getMaxV());
+ }
+ return true;
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int modelId) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return GodforgeGlassBlock.renderID;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java
new file mode 100644
index 0000000000..790b4f390b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java
@@ -0,0 +1,111 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import eu.usrv.yamcore.blocks.BlockBase;
+import gregtech.api.GregTech_API;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public final class QuantumGlassBlock extends BlockBase {
+
+ public static IIcon stuff;
+ public static int renderID;
+ public static QuantumGlassBlock INSTANCE;
+
+ public QuantumGlassBlock() {
+ super(Material.iron);
+ setBlockBounds(0, 0, 0, 1, 1, 1);
+ setBlockName("quantumGlass");
+ setHarvestLevel("wrench", 3);
+ setHardness(50);
+ setResistance(30);
+ setLightOpacity(0);
+ setStepSound(Block.soundTypeMetal);
+ setBlockTextureName(MODID + ":blockQuantumGlass");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) {
+ Block block = worldIn.getBlock(x, y, z);
+ return block != this; // && super.shouldSideBeRendered(worldIn, x, y, z,
+ // side);
+ }
+
+ @Override
+ public int getRenderType() {
+ return renderID;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister reg) {
+ super.registerBlockIcons(reg);
+ stuff = blockIcon;
+ }
+
+ public static void run() {
+ INSTANCE = new QuantumGlassBlock();
+ GameRegistry.registerBlock(INSTANCE, QuantumGlassItem.class, INSTANCE.getUnlocalizedName());
+ GregTech_API.registerMachineBlock(INSTANCE, -1);
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMeta) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @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);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java
new file mode 100644
index 0000000000..43c41735b8
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java
@@ -0,0 +1,33 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.util.CommonValues.TEC_MARK_EM;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+/**
+ * Created by Tec on 11.04.2017.
+ */
+public class QuantumGlassItem extends ItemBlock {
+
+ public static QuantumGlassItem INSTANCE;
+
+ public QuantumGlassItem(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ aList.add(TEC_MARK_EM);
+ aList.add(translateToLocal("tile.quantumGlass.desc.0")); // Dense yet transparent
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("tile.quantumGlass.desc.1")); // Glassy & Classy
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java
new file mode 100644
index 0000000000..f45e54f4ec
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java
@@ -0,0 +1,129 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+
+/**
+ * Created by danie_000 on 19.12.2016.
+ */
+public final class QuantumGlassRender implements ISimpleBlockRenderingHandler {
+
+ @Override
+ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ Tessellator tessellator = Tessellator.instance;
+ GL11.glPushMatrix();
+ // Get icons from custom register (useful for renderers and fluids)
+ IIcon side = QuantumGlassBlock.stuff;
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
+ RenderBlocks renderer) {
+
+ renderer.renderStandardBlock(block, x, y, z);
+ Tessellator tes = Tessellator.instance;
+ GL11.glPushMatrix();
+ tes.setNormal(0F, 1F, 0F);
+ tes.setBrightness(15728880);
+ tes.setColorOpaque_F(0F, 1F, 1F);
+ IIcon side = QuantumGlassBlock.stuff;
+ GL11.glDisable(GL11.GL_CULL_FACE);
+
+ // South
+ if (world.getBlock(x, y, z + 1)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x, y, z + 0.999, side.getMinU(), side.getMaxV()); // 0.999 instead of 1 for fighting
+ // (textures overlapping)
+ tes.addVertexWithUV(x, y + 1, z + 0.999, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.999, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y, z + 0.999, side.getMaxU(), side.getMaxV());
+ }
+ // East
+ if (world.getBlock(x + 1, y, z)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.999, y, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y, z, side.getMaxU(), side.getMaxV());
+ }
+ // North
+ if (world.getBlock(x, y, z - 1)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x + 1, y, z + 0.001, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.001, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x, y + 1, z + 0.001, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x, y, z + 0.001, side.getMaxU(), side.getMaxV());
+ }
+ // West
+ if (world.getBlock(x - 1, y, z)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.001, y, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Top
+ if (world.getBlock(x, y + 1, z)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.999, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.999, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Bottom
+ if (world.getBlock(x, y - 1, z)
+ .getClass() != QuantumGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.001, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.001, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z, side.getMaxU(), side.getMaxV());
+ }
+ GL11.glPopMatrix();
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ return true;
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int modelId) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return QuantumGlassBlock.renderID;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java b/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java
new file mode 100644
index 0000000000..db8d064f6f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java
@@ -0,0 +1,104 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+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 cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import eu.usrv.yamcore.blocks.BlockBase;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public final class QuantumStuffBlock extends BlockBase {
+
+ public static IIcon stuff;
+ public static int renderID;
+ public static QuantumStuffBlock INSTANCE;
+
+ public QuantumStuffBlock() {
+ super(Material.iron);
+ setBlockBounds(0, 0, 0, 1, 1, 1);
+ setBlockName("quantumStuff");
+ setHarvestLevel("wrench", 0);
+ setHardness(500);
+ setResistance(1);
+ setLightOpacity(0);
+ setBlockTextureName(MODID + ":blockQuantumStuff");
+ }
+
+ @Override
+ public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister reg) {
+ super.registerBlockIcons(reg);
+ stuff = blockIcon;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) {
+ return false;
+ }
+
+ @Override
+ public int getRenderType() {
+ return renderID;
+ }
+
+ public static void run() {
+ INSTANCE = new QuantumStuffBlock();
+ GameRegistry.registerBlock(INSTANCE, INSTANCE.getUnlocalizedName());
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ return new ArrayList<>();
+ }
+
+ @Override
+ public Item getItemDropped(int meta, Random random, int fortune) {
+ return null;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java b/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java
new file mode 100644
index 0000000000..4230dff43f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java
@@ -0,0 +1,104 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.IBlockAccess;
+
+import org.lwjgl.opengl.GL11;
+
+import com.github.technus.tectech.TecTech;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+
+/**
+ * Created by danie_000 on 19.12.2016.
+ */
+public final class QuantumStuffRender implements ISimpleBlockRenderingHandler {
+
+ private static final Tessellator tes = Tessellator.instance;
+
+ @Override
+ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ GL11.glPushMatrix();
+ // Get icons from custom register (useful for renderers and fluids)
+ IIcon side = QuantumStuffBlock.stuff;
+ tes.startDrawingQuads();
+ tes.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ tes.startDrawingQuads();
+ tes.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ tes.startDrawingQuads();
+ tes.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ tes.startDrawingQuads();
+ tes.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ tes.startDrawingQuads();
+ tes.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ tes.startDrawingQuads();
+ tes.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side);
+ tes.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
+ RenderBlocks renderer) {
+ // renderer.renderStandardBlock(block, x, y, z);
+ GL11.glPushMatrix();
+ tes.setNormal(0F, 1F, 0F);
+ tes.setBrightness(15728880);
+ IIcon side = QuantumStuffBlock.stuff;
+ for (int i = 0; i < 6; i++) {
+ float f = 1 - TecTech.RANDOM.nextFloat() / 4f, g = f - TecTech.RANDOM.nextFloat() / 4f,
+ r = g - TecTech.RANDOM.nextFloat() / 4f - 0.25f;
+ tes.setColorOpaque_F(r, g, f);
+ float rotX = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI,
+ rotY = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI,
+ rotZ = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI;
+ tesAbuse(x, y, z, -1.425f, -1.425f, .1f, rotX, rotY, rotZ, side.getMinU(), side.getMaxV());
+ tesAbuse(x, y, z, -1.425f, 1.425f, .1f, rotX, rotY, rotZ, side.getMinU(), side.getMinV());
+ tesAbuse(x, y, z, 1.425f, 1.425f, .1f, rotX, rotY, rotZ, side.getMaxU(), side.getMinV());
+ tesAbuse(x, y, z, 1.425f, -1.425f, .1f, rotX, rotY, rotZ, side.getMaxU(), side.getMaxV());
+
+ tesAbuse(x, y, z, 1.425f, -1.425f, -.1f, rotX, rotY, rotZ, side.getMaxU(), side.getMaxV());
+ tesAbuse(x, y, z, 1.425f, 1.425f, -.1f, rotX, rotY, rotZ, side.getMaxU(), side.getMinV());
+ tesAbuse(x, y, z, -1.425f, 1.425f, -.1f, rotX, rotY, rotZ, side.getMinU(), side.getMinV());
+ tesAbuse(x, y, z, -1.425f, -1.425f, -.1f, rotX, rotY, rotZ, side.getMinU(), side.getMaxV());
+ }
+ GL11.glPopMatrix();
+ return true;
+ }
+
+ private void tesAbuse(int x, int y, int z, float sx, float sy, float sz, float rotX, float rotY, float rotZ,
+ float sideU, float sideV) {
+ Vec3 pos = Vec3.createVectorHelper(sx, sy, sz);
+ pos.rotateAroundX(rotX);
+ pos.rotateAroundY(rotY);
+ pos.rotateAroundZ(rotZ);
+ tes.addVertexWithUV(pos.xCoord + x + .5f, pos.yCoord + y + .5f, pos.zCoord + z + .5f, sideU, sideV);
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int modelId) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return QuantumStuffBlock.renderID;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java b/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java
new file mode 100644
index 0000000000..80eca10cad
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java
@@ -0,0 +1,96 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+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.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import com.github.technus.tectech.thing.tileEntity.ReactorSimTileEntity;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import ic2.core.IC2;
+import ic2.core.IHasGui;
+import ic2.core.block.TileEntityBlock;
+
+/**
+ * Created by danie_000 on 30.09.2017.
+ */
+public class ReactorSimBlock extends Block implements ITileEntityProvider {
+
+ public static ReactorSimBlock INSTANCE;
+ public static IIcon stuff;
+
+ public ReactorSimBlock() {
+ super(Material.iron);
+ setBlockBounds(0, 0, 0, 1, 1, 1);
+ setBlockName("reactorSim");
+ setHarvestLevel("wrench", 3);
+ setHardness(50);
+ setResistance(30);
+ setLightOpacity(0);
+ setStepSound(Block.soundTypeMetal);
+ setBlockTextureName(MODID + ":blockReactorSimulator");
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return true;
+ }
+
+ @Override
+ public boolean getCanBlockGrass() {
+ return true;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister reg) {
+ super.registerBlockIcons(reg);
+ stuff = blockIcon;
+ }
+
+ public static void run() {
+ INSTANCE = new ReactorSimBlock();
+ GameRegistry.registerBlock(INSTANCE, ReactorSimItem.class, INSTANCE.getUnlocalizedName());
+ GameRegistry.registerTileEntity(ReactorSimTileEntity.class, MODID + "_reactorSim");
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(World worldIn, int meta) {
+ return new ReactorSimTileEntity();
+ }
+
+ @Override
+ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float a,
+ float b, float c) {
+ if (entityPlayer.isSneaking()) {
+ return false;
+ } else {
+ TileEntity te = world.getTileEntity(x, y, z);
+ return te instanceof IHasGui
+ && (!IC2.platform.isSimulating() || IC2.platform.launchGui(entityPlayer, (IHasGui) te));
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World world, int x, int y, int z, Block srcBlock) {
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof TileEntityBlock) {
+ ((TileEntityBlock) te).onNeighborUpdate(srcBlock);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java b/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java
new file mode 100644
index 0000000000..01ed6b54ad
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java
@@ -0,0 +1,36 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.util.CommonValues.TEC_MARK_GENERAL;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+/**
+ * Created by danie_000 on 30.09.2017.
+ */
+public class ReactorSimItem extends ItemBlock {
+
+ public static QuantumGlassItem INSTANCE;
+
+ public ReactorSimItem(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ aList.add(TEC_MARK_GENERAL);
+ aList.add(translateToLocal("tile.reactorSim.desc.0")); // Fission Reaction Uncertainty Resolver 9001
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("tile.reactorSim.desc.1")); // Explodes,
+ // but
+ // not
+ // as
+ // much...
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java
new file mode 100644
index 0000000000..70314927f4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java
@@ -0,0 +1,130 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static java.lang.Math.pow;
+
+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.FMLClientHandler;
+
+public class RenderForgeOfGods extends TileEntitySpecialRenderer {
+
+ public static final ResourceLocation STAR_LAYER_0 = new ResourceLocation(MODID, "models/StarLayer0.png");
+ public static final ResourceLocation STAR_LAYER_1 = new ResourceLocation(MODID, "models/StarLayer1.png");
+ public static final ResourceLocation STAR_LAYER_2 = new ResourceLocation(MODID, "models/StarLayer2.png");
+ public static IModelCustom starModel;
+ private static IModelCustom spaceModel;
+ private static final float RED = 180 / 255f;
+ private static final float GREEN = 180 / 255f;
+ private static final float BLUE = 255 / 255f;
+
+ public RenderForgeOfGods() {
+ starModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Star.obj"));
+ spaceModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Space.obj"));
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) {
+ if (!(tile instanceof TileForgeOfGods)) return;
+
+ TileForgeOfGods FOGRenderTile = (TileForgeOfGods) tile;
+
+ // Render outer space layer.
+
+ {
+ GL11.glPushMatrix();
+ GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
+ renderOuterSpaceShell();
+
+ // Render star stuff.
+ renderStarLayer(FOGRenderTile, 0, STAR_LAYER_0, 1.0f);
+ renderStarLayer(FOGRenderTile, 1, STAR_LAYER_1, 0.4f);
+ renderStarLayer(FOGRenderTile, 2, STAR_LAYER_2, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+ }
+
+ public static void renderOuterSpaceShell() {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_BLEND);
+
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(new ResourceLocation(MODID, "models/spaceLayer.png"));
+
+ final float scale = 0.01f * 17.5f;
+ GL11.glScalef(scale, scale, scale);
+
+ GL11.glColor4f(222 / 255f, 243 / 255f, 250 / 255f, 255 / 255f);
+
+ spaceModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+
+ private static final float STAR_RESCALE = 0.2f;
+
+ private void renderStarLayer(TileForgeOfGods FOGRenderTile, int layer, ResourceLocation texture, float alpha) {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down
+ float scale = 0.01f * STAR_RESCALE * FOGRenderTile.getRenderSize();
+
+ // Put each layer further out
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0:
+ GL11.glRotatef(130, 0F, 1F, 1F);
+ break;
+ case 1:
+ GL11.glRotatef(-49, 1F, 1F, 0F);
+ break;
+ case 2:
+ GL11.glRotatef(67, 1F, 0F, 1F);
+ break;
+ }
+
+ // Set color and alpha of the star layer
+ GL11.glColor4f(RED, GREEN, BLUE, alpha);
+
+ // Spin the star
+ GL11.glRotatef((0.03f * FOGRenderTile.angle * FOGRenderTile.getRenderRotationSpeed()) % 360.0f, 0F, 0F, 1F);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java b/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java
new file mode 100644
index 0000000000..4c9d51a175
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java
@@ -0,0 +1,200 @@
+package com.github.technus.tectech.thing.block;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.stream.IntStream;
+
+import net.minecraft.block.Block;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+
+import pers.gwyog.gtneioreplugin.plugin.block.ModBlocks;
+
+public class TileEyeOfHarmony extends TileEntity {
+
+ private static final double EOH_STAR_FIELD_RADIUS = 13;
+
+ // Prevent culling when block is out of frame so model can remain active.
+ @Override
+ public AxisAlignedBB getRenderBoundingBox() {
+
+ // Assuming your block is at (x, y, z)
+ double x = this.xCoord;
+ double y = this.yCoord;
+ double z = this.zCoord;
+
+ // Create a bounding box that extends 'size' blocks in all directions from the block.
+ return AxisAlignedBB.getBoundingBox(
+ x - EOH_STAR_FIELD_RADIUS,
+ y - EOH_STAR_FIELD_RADIUS,
+ z - EOH_STAR_FIELD_RADIUS,
+ x + EOH_STAR_FIELD_RADIUS + 1,
+ y + EOH_STAR_FIELD_RADIUS + 1,
+ z + EOH_STAR_FIELD_RADIUS + 1);
+ }
+
+ public void setSize(float size) {
+ this.size = size;
+ }
+
+ public void setRotationSpeed(float rotationSpeed) {
+ this.rotationSpeed = rotationSpeed;
+ }
+
+ private float size = 10;
+ private float rotationSpeed = 10;
+
+ // Fun fact, these methods were entirely written by ChatGPT3... Take that as you will.
+ public static <T> ArrayList<T> selectNRandomElements(Collection<T> inputList, long n) {
+ ArrayList<T> randomElements = new ArrayList<>((int) n);
+ ArrayList<T> inputArray = new ArrayList<>(inputList);
+ Random rand = new Random();
+ IntStream.range(0, (int) n)
+ .forEach(i -> {
+ int randomIndex = rand.nextInt(inputArray.size());
+ randomElements.add(inputArray.get(randomIndex));
+ inputArray.remove(randomIndex);
+ });
+ return randomElements;
+ }
+
+ public static float generateRandomFloat(float a, float b) {
+ Random rand = new Random();
+ return rand.nextFloat() * (b - a) + a;
+ }
+
+ public long getTier() {
+ return tier;
+ }
+
+ public void setTier(long tier) {
+ this.tier = tier;
+ }
+
+ private long tier = 9;
+
+ public float getSize() {
+ return size;
+ }
+
+ public float getRotationSpeed() {
+ return rotationSpeed;
+ }
+
+ @Override
+ public void updateEntity() {
+ angle += 10.0f;
+ }
+
+ public static class OrbitingObject {
+
+ public OrbitingObject(Block block, float distance, float rotationSpeed, float orbitSpeed, float xAngle,
+ float zAngle, float scale) {
+ this.block = block;
+ this.distance = distance;
+ this.rotationSpeed = rotationSpeed;
+ this.orbitSpeed = orbitSpeed;
+ this.xAngle = xAngle;
+ this.zAngle = zAngle;
+ this.scale = scale;
+ }
+
+ public final Block block;
+ public final float distance;
+ public final float rotationSpeed;
+ public final float orbitSpeed;
+ public final float xAngle;
+ public final float zAngle;
+ public final float scale;
+ }
+
+ public ArrayList<OrbitingObject> getOrbitingObjects() {
+ return orbitingObjects;
+ }
+
+ private final ArrayList<OrbitingObject> orbitingObjects = new ArrayList<>();
+ private static final Set<String> BLACKLISTED_BLOCKS = Collections
+ .unmodifiableSet(new HashSet<>(Arrays.asList("Tf", "Ow", "ED", "EA", "VA")));
+ // Map of strings to blocks
+ private static final Map<String, Block> BLOCKS = new HashMap<>();
+
+ static {
+ // Initialize the map of blocks
+ ModBlocks.blocks.forEach((dimString, dimBlock) -> {
+ if (!BLACKLISTED_BLOCKS.contains(dimString)) {
+ BLOCKS.put(dimString, dimBlock);
+ }
+ });
+ }
+
+ private static final float MAX_ANGLE = 30;
+
+ // This must be set last.
+ public void generateImportantInfo() {
+
+ int index = 0;
+ for (Block block : selectNRandomElements(BLOCKS.values(), tier + 1)) {
+
+ float xAngle = generateRandomFloat(-MAX_ANGLE, MAX_ANGLE);
+ float zAngle = generateRandomFloat(-MAX_ANGLE, MAX_ANGLE);
+ index += 1.0;
+ float distance = index + generateRandomFloat(-0.2f, 0.2f);
+ float scale = generateRandomFloat(0.2f, 0.9f);
+ float rotationSpeed = generateRandomFloat(0.5f, 1.5f);
+ float orbitSpeed = generateRandomFloat(0.5f, 1.5f);
+ orbitingObjects.add(new OrbitingObject(block, distance, rotationSpeed, orbitSpeed, xAngle, zAngle, scale));
+ }
+ }
+
+ // Used to track the rotation of the star/planets.
+ public float angle;
+
+ private static final String EOH_NBT_TAG = "EOH:";
+ private static final String ROTATION_SPEED_NBT_TAG = EOH_NBT_TAG + "rotationSpeed";
+ private static final String SIZE_NBT_TAG = EOH_NBT_TAG + "size";
+ private static final String TIER_NBT_TAG = EOH_NBT_TAG + "tier";
+
+ @Override
+ public void writeToNBT(NBTTagCompound compound) {
+ super.writeToNBT(compound);
+
+ // Save other stats.
+ compound.setFloat(ROTATION_SPEED_NBT_TAG, rotationSpeed);
+ compound.setFloat(SIZE_NBT_TAG, size);
+ compound.setLong(TIER_NBT_TAG, tier);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound compound) {
+ super.readFromNBT(compound);
+
+ // Load other stats.
+ rotationSpeed = compound.getFloat(ROTATION_SPEED_NBT_TAG);
+ size = compound.getFloat(SIZE_NBT_TAG);
+ tier = compound.getLong(TIER_NBT_TAG);
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+ writeToNBT(nbttagcompound);
+ return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ readFromNBT(pkt.func_148857_g());
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java
new file mode 100644
index 0000000000..0e0b536046
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java
@@ -0,0 +1,77 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+
+public class TileForgeOfGods extends TileEntity {
+
+ private float size = 10;
+ private float rotationSpeed = 10;
+
+ @Override
+ public AxisAlignedBB getRenderBoundingBox() {
+ return INFINITE_EXTENT_AABB;
+ }
+
+ public void setRenderSize(float size) {
+ this.size = size;
+ }
+
+ public void setRenderRotationSpeed(float rotationSpeed) {
+ this.rotationSpeed = rotationSpeed;
+ }
+
+ public float getRenderSize() {
+ return size;
+ }
+
+ public float getRenderRotationSpeed() {
+ return rotationSpeed;
+ }
+
+ @Override
+ public void updateEntity() {
+ angle += 10.0f;
+ }
+
+ // Used to track the rotation of the star
+ public float angle;
+
+ private static final String FOG_NBT_TAG = "FOG:";
+ private static final String ROTATION_SPEED_NBT_TAG = FOG_NBT_TAG + "renderRotationSpeed";
+ private static final String SIZE_NBT_TAG = FOG_NBT_TAG + "renderSize";
+
+ @Override
+ public void writeToNBT(NBTTagCompound compound) {
+ super.writeToNBT(compound);
+
+ // Save stats
+ compound.setFloat(ROTATION_SPEED_NBT_TAG, rotationSpeed);
+ compound.setFloat(SIZE_NBT_TAG, size);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound compound) {
+ super.readFromNBT(compound);
+
+ // Load stats
+ rotationSpeed = compound.getFloat(ROTATION_SPEED_NBT_TAG);
+ size = compound.getFloat(SIZE_NBT_TAG);
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+ writeToNBT(nbttagcompound);
+ return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ readFromNBT(pkt.func_148857_g());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java
new file mode 100644
index 0000000000..1c6524934c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java
@@ -0,0 +1,227 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+// Mostly tesla coils, also 2 eye of harmony casings.
+public class GT_Block_CasingsBA0 extends GT_Block_Casings_Abstract {
+
+ private static final IIcon[] tM0 = new IIcon[2];
+ private static final IIcon[] tM1 = new IIcon[2];
+ private static final IIcon[] tM2 = new IIcon[2];
+ private static final IIcon[] tM3 = new IIcon[2];
+ private static final IIcon[] tM4 = new IIcon[2];
+ private static final IIcon[] tM5 = new IIcon[2];
+ private static final IIcon[] tM6 = new IIcon[2];
+ private static IIcon tM7;
+ private static final IIcon[] tM8 = new IIcon[2];
+ private static final IIcon[] tM9 = new IIcon[2];
+
+ private static IIcon EOH_INNER;
+ private static IIcon EOH_OUTER;
+ private static IIcon EOH_INFINITE;
+
+ private static final byte START_INDEX = 16;
+
+ public GT_Block_CasingsBA0() {
+ super(GT_Item_CasingsBA0.class, "gt.blockcasingsBA0", GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[texturePage][b
+ + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ /* IMPORTANT for block recoloring **/
+ }
+
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".0.name", "Redstone Alloy Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".1.name", "MV Superconductor Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".2.name", "HV Superconductor Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".3.name", "EV Superconductor Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".4.name", "IV Superconductor Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".5.name", "LuV Superconductor Primary Tesla Windings");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".9.name", "ZPM Superconductor Primary Tesla Windings");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Tesla Base Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Tesla Toroid Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Tesla Secondary Windings");
+
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".10.name", "Reinforced Temporal Structure Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".11.name", "Reinforced Spatial Structure Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".12.name", "Infinite Spacetime Energy Boundary Casing");
+
+ CustomItemList.tM_TeslaPrimary_0.set(new ItemStack(this, 1, 0));
+ CustomItemList.tM_TeslaPrimary_1.set(new ItemStack(this, 1, 1));
+ CustomItemList.tM_TeslaPrimary_2.set(new ItemStack(this, 1, 2));
+ CustomItemList.tM_TeslaPrimary_3.set(new ItemStack(this, 1, 3));
+ CustomItemList.tM_TeslaPrimary_4.set(new ItemStack(this, 1, 4));
+ CustomItemList.tM_TeslaPrimary_5.set(new ItemStack(this, 1, 5));
+ CustomItemList.tM_TeslaPrimary_6.set(new ItemStack(this, 1, 9));
+
+ CustomItemList.tM_TeslaBase.set(new ItemStack(this, 1, 6));
+ CustomItemList.tM_TeslaToroid.set(new ItemStack(this, 1, 7));
+ CustomItemList.tM_TeslaSecondary.set(new ItemStack(this, 1, 8));
+
+ CustomItemList.EOH_Reinforced_Temporal_Casing.set(new ItemStack(this, 1, 10));
+ CustomItemList.EOH_Reinforced_Spatial_Casing.set(new ItemStack(this, 1, 11));
+ CustomItemList.EOH_Infinite_Energy_Casing.set(new ItemStack(this, 1, 12));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ tM0[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0");
+ tM0[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0");
+ tM1[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1");
+ tM1[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1");
+ tM2[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2");
+ tM2[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2");
+ tM3[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3");
+ tM3[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3");
+ tM4[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4");
+ tM4[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4");
+ tM5[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5");
+ tM5[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5");
+ tM9[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6");
+ tM9[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6");
+
+ tM6[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_BASE_TOP_BOTTOM");
+ tM6[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_BASE_SIDES");
+ tM7 = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_TOROID");
+ tM8[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM");
+ tM8[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_SECONDARY_SIDES");
+
+ EOH_INNER = aIconRegister.registerIcon("gregtech:iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING");
+ EOH_OUTER = aIconRegister.registerIcon("gregtech:iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING");
+ EOH_INFINITE = aIconRegister.registerIcon("gregtech:iconsets/EM_POWER_INFINITE");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM0[0];
+ default:
+ return tM0[1];
+ }
+ case 1:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM1[0];
+ default:
+ return tM1[1];
+ }
+ case 2:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM2[0];
+ default:
+ return tM2[1];
+ }
+ case 3:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM3[0];
+ default:
+ return tM3[1];
+ }
+ case 4:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM4[0];
+ default:
+ return tM4[1];
+ }
+ case 5:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM5[0];
+ default:
+ return tM5[1];
+ }
+ case 6:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM6[0];
+ default:
+ return tM6[1];
+ }
+ case 7:
+ return tM7;
+ case 8:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM8[0];
+ default:
+ return tM8[1];
+ }
+ case 9:
+ switch (ordinalSide) {
+ case 0:
+ case 1:
+ return tM9[0];
+ default:
+ return tM9[1];
+ }
+ case 10:
+ return EOH_INNER;
+ case 11:
+ return EOH_OUTER;
+ case 12:
+ return EOH_INFINITE;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i <= 12; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java
new file mode 100644
index 0000000000..00021154f4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java
@@ -0,0 +1,64 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_BOTTOM_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_SIDE_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_TOP_TT;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+public class GT_Block_CasingsNH extends GT_Block_Casings_Abstract {
+
+ public static boolean mConnectedMachineTextures = true;
+
+ public GT_Block_CasingsNH() {
+ super(GT_Item_CasingsNH.class, "gt.blockcasingsNH", GT_Material_Casings.INSTANCE);
+ setCreativeTab(creativeTabTecTech);
+
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[8][b + 64] = new GT_CopiedBlockTexture(this, 6, b);
+ /* IMPORTANT for block recoloring */
+ }
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "UEV Machine Casing"); // adding
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "UIV Machine Casing"); // adding
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "UMV Machine Casing"); // adding
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "UXV Machine Casing"); // adding
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "MAX Machine Casing"); // adding
+
+ CustomItemList.Casing_UEV.set(new ItemStack(this, 1, 10));
+ CustomItemList.Casing_UIV.set(new ItemStack(this, 1, 11));
+ CustomItemList.Casing_UMV.set(new ItemStack(this, 1, 12));
+ CustomItemList.Casing_UXV.set(new ItemStack(this, 1, 13));
+ CustomItemList.Casing_MAXV.set(new ItemStack(this, 1, 14));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ // super.registerBlockIcons(aIconRegister);
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if (ordinalSide == 0) {
+ return MACHINECASINGS_BOTTOM_TT[aMeta].getIcon();
+ }
+ if (ordinalSide == 1) {
+ return MACHINECASINGS_TOP_TT[aMeta].getIcon();
+ }
+ return MACHINECASINGS_SIDE_TT[aMeta].getIcon();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java
new file mode 100644
index 0000000000..dc15b87f95
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java
@@ -0,0 +1,196 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.TecTech.tectechTexturePage1;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+public class GT_Block_CasingsTT extends GT_Block_Casings_Abstract {
+
+ public static final byte texturePage = tectechTexturePage1;
+ public static final short textureOffset = texturePage << 7; // Start of PAGE 8 (which is the 9th page) (8*128)
+ private static IIcon eM0, eM1, eM1s, eM2, eM2s, eM3, eM3s, eM4, eM5, eM6, eM7, eM7s, eM8, eM9, eM10, eM11, eM12,
+ eM13, eM14;
+ private static final IIcon[] debug = new IIcon[6];
+
+ public GT_Block_CasingsTT() {
+ super(GT_Item_CasingsTT.class, "gt.blockcasingsTT", GT_Material_Casings.INSTANCE);
+ setCreativeTab(creativeTabTecTech);
+
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[texturePage][b] = new GT_CopiedBlockTexture(this, 6, b);
+ /* IMPORTANT for block recoloring **/
+ }
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "High Power Casing");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Computer Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Computer Heat Vent");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Advanced Computer Casing");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Molecular Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Advanced Molecular Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Containment Field Generator");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Molecular Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Hollow Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Spacetime Altering Casing");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Teleportation Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Dimensional Bridge Generator");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Ultimate Molecular Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".13.name", "Ultimate Advanced Molecular Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".14.name", "Ultimate Containment Field Generator");
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Debug Sides"); // NOT REGISTER AS
+ // TEXTURE FOR
+ // HATCHES!
+
+ CustomItemList.eM_Power.set(new ItemStack(this, 1, 0));
+
+ CustomItemList.eM_Computer_Casing.set(new ItemStack(this, 1, 1));
+ CustomItemList.eM_Computer_Vent.set(new ItemStack(this, 1, 2));
+ CustomItemList.eM_Computer_Bus.set(new ItemStack(this, 1, 3));
+
+ CustomItemList.eM_Containment.set(new ItemStack(this, 1, 4));
+ CustomItemList.eM_Containment_Advanced.set(new ItemStack(this, 1, 5));
+ CustomItemList.eM_Containment_Field.set(new ItemStack(this, 1, 6));
+
+ CustomItemList.eM_Coil.set(new ItemStack(this, 1, 7));
+ CustomItemList.eM_Hollow.set(new ItemStack(this, 1, 8));
+ CustomItemList.eM_Spacetime.set(new ItemStack(this, 1, 9));
+
+ CustomItemList.eM_Teleportation.set(new ItemStack(this, 1, 10));
+ CustomItemList.eM_Dimensional.set(new ItemStack(this, 1, 11));
+
+ CustomItemList.eM_Ultimate_Containment.set(new ItemStack(this, 1, 12));
+ CustomItemList.eM_Ultimate_Containment_Advanced.set(new ItemStack(this, 1, 13));
+ CustomItemList.eM_Ultimate_Containment_Field.set(new ItemStack(this, 1, 14));
+
+ CustomItemList.debugBlock.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ // super.registerBlockIcons(aIconRegister);
+ eM0 = aIconRegister.registerIcon("gregtech:iconsets/EM_POWER");
+
+ eM1 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_NONSIDE");
+ eM1s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC");
+ eM2 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_VENT_NONSIDE");
+ eM2s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_VENT");
+ eM3 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_ADV_NONSIDE");
+ eM3s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_ADV");
+
+ eM4 = aIconRegister.registerIcon("gregtech:iconsets/EM_CASING");
+ eM5 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_CASING");
+ eM6 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD");
+
+ eM7 = aIconRegister.registerIcon("gregtech:iconsets/EM_COIL_NONSIDE");
+ eM7s = aIconRegister.registerIcon("gregtech:iconsets/EM_COIL");
+ eM8 = aIconRegister.registerIcon("gregtech:iconsets/EM_HOLLOW");
+ eM9 = aIconRegister.registerIcon("gregtech:iconsets/EM_TIMESPACE");
+
+ eM10 = aIconRegister.registerIcon("gregtech:iconsets/EM_TELE");
+ eM11 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM");
+
+ eM12 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_CASING");
+ eM13 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_FIELD_CASING");
+ eM14 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_FIELD");
+
+ debug[0] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_0");
+ debug[1] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_1");
+ debug[2] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_2");
+ debug[3] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_3");
+ debug[4] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_4");
+ debug[5] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_5");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return eM0;
+ case 1:
+ if (ordinalSide < 2) {
+ return eM1;
+ }
+ return eM1s;
+ case 2:
+ if (ordinalSide < 2) {
+ return eM2;
+ }
+ return eM2s;
+ case 3:
+ if (ordinalSide < 2) {
+ return eM3;
+ }
+ return eM3s;
+ case 4:
+ return eM4;
+ case 5:
+ return eM5;
+ case 6:
+ return eM6;
+ case 7:
+ if (ordinalSide < 2) {
+ return eM7;
+ }
+ return eM7s;
+ case 8:
+ return eM8;
+ case 9:
+ return eM9;
+ case 10:
+ return eM10;
+ case 11:
+ return eM11;
+ case 12:
+ return eM12;
+ case 13:
+ return eM13;
+ case 14:
+ return eM14;
+ case 15:
+ return debug[ordinalSide];
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i <= 15; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java
new file mode 100644
index 0000000000..de6336ed60
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java
@@ -0,0 +1,111 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.COSMIC_MARK;
+import static com.github.technus.tectech.util.CommonValues.THETA_MOVEMENT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static net.minecraft.util.EnumChatFormatting.AQUA;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.enums.TierEU;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_CasingsBA0 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_CasingsBA0(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ if (aStack.getItemDamage() < 15) {
+ aList.add(THETA_MOVEMENT);
+ } else {
+ aList.add(COSMIC_MARK);
+ }
+ switch (aStack.getItemDamage()) {
+ case 0: // "Redstone Alloy Primary Tesla Windings"
+ case 1: // "MV Superconductor Primary Tesla Windings"
+ case 2: // "HV Superconductor Primary Tesla Windings"
+ case 3: // "EV Superconductor Primary Tesla Windings"
+ case 4: // "IV Superconductor Primary Tesla Windings"
+ case 5: // "LuV Superconductor Primary Tesla Windings"
+ aList.add(
+ translateToLocal("gt.blockcasingsBA0.0.desc.0") + " "
+ + formatNumbers(V[aStack.getItemDamage() + 1])
+ + " EU/t"); // Handles up to
+ aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.0.desc.1")); // What
+ // one
+ // man
+ // calls
+ // God,
+ // another
+ // calls
+ // the
+ // laws of physics.
+ break;
+ case 6: // "Tesla Base Casing"
+ aList.add(translateToLocal("gt.blockcasingsBA0.6.desc.0")); // The base of a wondrous contraption
+ aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.6.desc.1")); // it's
+ // alive,
+ // IT'S
+ // ALIVE!
+ break;
+ case 7: // "Tesla Toroid Casing"
+ aList.add(translateToLocal("gt.blockcasingsBA0.7.desc.0")); // Made out of the finest tin foil!
+ aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.7.desc.1")); // Faraday
+ // suits
+ // might
+ // come
+ // later
+ break;
+ case 8: // "Tesla Secondary Windings"
+ aList.add(translateToLocal("gt.blockcasingsBA0.8.desc.0")); // Picks up power from a primary coil
+ aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.8.desc.1")); // Who
+ // wouldn't
+ // want
+ // a
+ // 32k
+ // epoxy
+ // multi?
+ break;
+ case 9: // "ZPM Superconductor Primary Tesla Windings"
+ aList.add(translateToLocal("gt.blockcasingsBA0.0.desc.0") + " " + formatNumbers(TierEU.ZPM) + " EU/t"); // Handles
+ // up
+ // to
+ aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.0.desc.1")); // What
+ // one
+ // man
+ // calls
+ // God,
+ // another
+ case 10: // Reinforced Temporal Structure Casing
+ aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.10.desc.0"));
+ aList.add(GRAY + translateToLocal("gt.blockcasingsBA0.10.desc.1"));
+ // Designed to resist spatial shearing from internal volume expansion.
+ // Can survive at least one big bang, maybe two...
+ break;
+ case 11: // Reinforced Temporal Structure Casing
+ aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.11.desc.0"));
+ aList.add(GRAY + translateToLocal("gt.blockcasingsBA0.11.desc.1"));
+ // Resistant to temporal shearing from time dilation differences.
+ // This block can last an eternity without any decay.
+ break;
+ case 12: // Infinite Spacetime Energy Boundary Casing
+ aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.12.desc.0"));
+ // Provides a stable bridge between spacetime regions.
+ break;
+ default:
+ aList.add("Damn son where did you get that!?");
+ aList.add(EnumChatFormatting.BLUE + "From outer space... I guess...");
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java
new file mode 100644
index 0000000000..b69abca128
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java
@@ -0,0 +1,15 @@
+package com.github.technus.tectech.thing.casing;
+
+import net.minecraft.block.Block;
+
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+public class GT_Item_CasingsNH extends GT_Item_Casings_Abstract {
+
+ public GT_Item_CasingsNH(Block par1) {
+ super(par1);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java
new file mode 100644
index 0000000000..3c2f349b03
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java
@@ -0,0 +1,133 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.COSMIC_MARK;
+import static com.github.technus.tectech.util.CommonValues.TEC_MARK_EM;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+public class GT_Item_CasingsTT extends GT_Item_Casings_Abstract {
+
+ public GT_Item_CasingsTT(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ if (aStack.getItemDamage() < 15) {
+ aList.add(TEC_MARK_EM);
+ } else {
+ aList.add(COSMIC_MARK);
+ }
+ switch (aStack.getItemDamage()) {
+ case 0: // "High Power Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.0.desc.0")); // Well suited for high power applications.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.0.desc.1")); // The power levels are rising!
+ break;
+ case 1: // "Computer Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.1.desc.0")); // Nice and clean casing.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.1.desc.1")); // Dust can break it!?
+ break;
+ case 2: // "Computer Heat Vent"
+ aList.add(translateToLocal("gt.blockcasingsTT.2.desc.0")); // Air vent with a filter.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.2.desc.1")); // Perfectly muffled sound!
+ break;
+ case 3: // "Advanced Computer Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.3.desc.0")); // Contains high bandwidth bus
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.3.desc.1")); // couple thousand qubits wide.
+ break;
+ case 4: // "Molecular Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.4.desc.0")); // Stops elemental things.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.4.desc.1")); // Radiation and emotions too...
+ break;
+ case 5: // "Advanced Molecular Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.5.desc.0")); // Cooling and stabilization.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.5.desc.1")); // A comfortable machine bed.
+ break;
+ case 6: // "Containment Field Generator"
+ aList.add(translateToLocal("gt.blockcasingsTT.6.desc.0")); // Creates a field that...
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.6.desc.1")); // can stop even force carriers.
+ break;
+ case 7: // "Molecular Coil"
+ aList.add(translateToLocal("gt.blockcasingsTT.7.desc.0")); // Well it does things too...
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.7.desc.1")); // [Use this coil!]
+ break;
+ case 8: // "Collider Hollow Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.8.desc.0")); // Reinforced accelerator tunnel.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.8.desc.1")); // Most advanced pipe ever.
+ break;
+ case 9: // "Spacetime Altering Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.9.desc.0")); // c is no longer the limit.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.9.desc.1")); // Wibbly wobbly timey wimey stuff.
+ break;
+ case 10: // "Teleportation Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.10.desc.0")); // Remote connection.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.10.desc.1")); // Better touch with a stick.
+ break;
+ case 11: // "Dimensional Bridge Generator"
+ aList.add(translateToLocal("gt.blockcasingsTT.11.desc.0")); // Interdimensional Operations.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.11.desc.1")); // Around the universe and other
+ // places too.
+ break;
+ case 12: // "Ultimate Molecular Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.12.desc.0")); // Ultimate in every way.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.12.desc.1")); // I don't know what it can't do.
+ break;
+ case 13: // "Ultimate Advanced Molecular Casing"
+ aList.add(translateToLocal("gt.blockcasingsTT.13.desc.0")); // More Ultimate in every way.
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.13.desc.1")); // I don't know what I am doing!
+ break;
+ case 14: // "Ultimate Containment Field Generator"
+ aList.add(translateToLocal("gt.blockcasingsTT.14.desc.0")); // Black Hole...
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockcasingsTT.14.desc.1")); // Meh...
+ break;
+ case 15: // "Debug Sides"
+ aList.add(translateToLocal("gt.blockcasingsTT.15.desc.0")); // Lazy man way of determining sides.
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("gt.blockcasingsTT.15.desc.1"));
+ break;
+ default: // WTF?
+ aList.add("Damn son where did you get that!?");
+ aList.add(EnumChatFormatting.BLUE + "From outer space... I guess...");
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java
new file mode 100644
index 0000000000..e527fc552d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java
@@ -0,0 +1,114 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK;
+import static net.minecraft.util.EnumChatFormatting.AQUA;
+import static net.minecraft.util.EnumChatFormatting.BOLD;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_Casings_Godforge extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings_Godforge(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ aList.add(GODFORGE_MARK);
+ switch (aStack.getItemDamage()) {
+ case 0:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.0.Tooltip.0",
+ "Shielded by the event horizon of a singularity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.0.Tooltip.1", "Don't get too close..."));
+ break;
+ case 1:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.1.Tooltip.0",
+ "Designed to route stellar matter using spacetime distortion"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.1.Tooltip.1", "Reality Distortion"));
+ break;
+ case 2:
+ aList.add(
+ GT_LanguageManager
+ .addStringLocalization("godforge.casings.2.Tooltip.0", "Unaffected by gravitational forces"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.2.Tooltip.1",
+ "Not even a black hole could tear it apart."));
+ break;
+ case 3:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.3.Tooltip.0",
+ "Creates enormous magnetic fields capable of constraining entire stars"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.3.Tooltip.1", "It's super effective!"));
+ break;
+ case 4:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.4.Tooltip.0",
+ "Taps into streams of stellar matter to harness their heat energy"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.4.Tooltip.1", "Turn up the heat!"));
+ break;
+ case 5:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.5.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.5.Tooltip.1",
+ "Exponential scaling past 800 Galaxies"));
+ break;
+ case 6:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.6.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.6.Tooltip.1", "Getting closer..."));
+ break;
+ case 7:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.7.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization("godforge.casings.7.Tooltip.1", "Gravity Central"));
+ break;
+ default:
+ aList.add(
+ EnumChatFormatting.RED.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.Error.Tooltip", "Error, report to GTNH team"));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java
new file mode 100644
index 0000000000..f966d85695
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java
@@ -0,0 +1,56 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.google.common.math.LongMath.pow;
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_Casings_Spacetime extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings_Spacetime(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ switch (aStack.getItemDamage()) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "EOH.Spacetime.Standard.Tooltip.0",
+ "Supports an internal spacetime volume of up to ")
+ + formatNumbers(pow(10, 5 + aStack.getItemDamage()))
+ + "km³.");
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "EOH.Spacetime.Standard.Tooltip.1",
+ "Capable of running recipes up to tier ")
+ + (aStack.getItemDamage() + 1));
+ break;
+ default:
+ aList.add(
+ EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager
+ .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team"));
+ }
+ aList.add(AuthorColen);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java
new file mode 100644
index 0000000000..6bd86524a1
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java
@@ -0,0 +1,47 @@
+package com.github.technus.tectech.thing.casing;
+
+import static gregtech.api.enums.GT_Values.AuthorColen;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_Casings_Stabilisation extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings_Stabilisation(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ switch (aStack.getItemDamage()) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "EOH.Stability.Tooltip.0",
+ "Increases stability of spacetime field."));
+ break;
+ default:
+ aList.add(
+ EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager
+ .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team"));
+ }
+ aList.add(AuthorColen);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java
new file mode 100644
index 0000000000..994f40b9e7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java
@@ -0,0 +1,46 @@
+package com.github.technus.tectech.thing.casing;
+
+import static gregtech.api.enums.GT_Values.AuthorColen;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_Casings_TimeAcceleration extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings_TimeAcceleration(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ switch (aStack.getItemDamage()) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager
+ .addStringLocalization("EOH.TimeDilation.Standard.Tooltip", "Time dilation in a box."));
+ break;
+ default:
+ aList.add(
+ EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD
+ + GT_LanguageManager
+ .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team"));
+ }
+ aList.add(AuthorColen);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java b/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java
new file mode 100644
index 0000000000..809e6bbff1
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java
@@ -0,0 +1,124 @@
+package com.github.technus.tectech.thing.casing;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+public class GodforgeCasings extends GT_Block_Casings_Abstract {
+
+ private static IIcon GodforgeTrim;
+ private static IIcon GodforgeInner;
+ private static IIcon GodforgeSupport;
+ private static IIcon GodforgeOuter;
+ private static IIcon GodforgeEnergy;
+ private static IIcon GravitonModulatorT1;
+ private static IIcon GravitonModulatorT2;
+ private static IIcon GravitonModulatorT3;
+
+ private static final byte START_INDEX = 64;
+
+ public GodforgeCasings() {
+ super(GT_Item_Casings_Godforge.class, "gt.godforgecasing", GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ }
+
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".0.name", "Singularity Reinforced Stellar Shielding Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Celestial Matter Guidance Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".2.name",
+ "Boundless Gravitationally Severed Structure Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".3.name",
+ "Transcendentally Amplified Magnetic Confinement Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Stellar Energy Siphon Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Remote Graviton Flow Modulator");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Medial Graviton Flow Modulator");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Central Graviton Flow Modulator");
+
+ CustomItemList.Godforge_Singularity_Shielding_Casing.set(new ItemStack(this, 1, 0));
+ CustomItemList.Godforge_Guidance_Casing.set(new ItemStack(this, 1, 1));
+ CustomItemList.Godforge_Boundless_Structure_Casing.set(new ItemStack(this, 1, 2));
+ CustomItemList.Godforge_Magnetic_Confinement_Casing.set(new ItemStack(this, 1, 3));
+ CustomItemList.Godforge_Stellar_Energy_Siphon_Casing.set(new ItemStack(this, 1, 4));
+ CustomItemList.Godforge_GravitonFlowModulatorTier1.set(new ItemStack(this, 1, 5));
+ CustomItemList.Godforge_GravitonFlowModulatorTier2.set(new ItemStack(this, 1, 6));
+ CustomItemList.Godforge_GravitonFlowModulatorTier3.set(new ItemStack(this, 1, 7));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ GodforgeTrim = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_TRIM");
+ GodforgeInner = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_INNER");
+ GodforgeSupport = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_SUPPORT");
+ GodforgeOuter = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_TOP_BOTTOM");
+ GodforgeEnergy = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_ENERGY");
+ GravitonModulatorT1 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_2");
+ GravitonModulatorT2 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_1");
+ GravitonModulatorT3 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_0");
+ }
+
+ @Override
+ public IIcon getIcon(int aSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return GodforgeTrim;
+ case 1:
+ return GodforgeInner;
+ case 2:
+ return GodforgeSupport;
+ case 3:
+ return GodforgeOuter;
+ case 4:
+ return GodforgeEnergy;
+ case 5:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT1;
+ case 6:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT2;
+ case 7:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT3;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int aSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(aSide, tMeta);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i <= 7; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java b/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java
new file mode 100644
index 0000000000..6d00822c19
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java
@@ -0,0 +1,120 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.WHITE;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class SpacetimeCompressionFieldCasing extends GT_Block_Casings_Abstract {
+
+ private static IIcon textureTier0;
+ private static IIcon textureTier1;
+ private static IIcon textureTier2;
+ private static IIcon textureTier3;
+ private static IIcon textureTier4;
+ private static IIcon textureTier5;
+ private static IIcon textureTier6;
+ private static IIcon textureTier7;
+ private static IIcon textureTier8;
+ private static final int MAX_BLOCK_TIER = 9;
+
+ private static final byte START_INDEX = 16;
+
+ public SpacetimeCompressionFieldCasing() {
+ super(
+ GT_Item_Casings_Spacetime.class,
+ "gt.spacetime_compression_field_generator",
+ GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ }
+
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + i + ".name",
+ WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Spacetime Compression Field Generator");
+ }
+
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier0.set(new ItemStack(this, 1, 0));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier1.set(new ItemStack(this, 1, 1));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier2.set(new ItemStack(this, 1, 2));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier3.set(new ItemStack(this, 1, 3));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier4.set(new ItemStack(this, 1, 4));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier5.set(new ItemStack(this, 1, 5));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier6.set(new ItemStack(this, 1, 6));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier7.set(new ItemStack(this, 1, 7));
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.set(new ItemStack(this, 1, 8));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_0");
+ textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_1");
+ textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_2");
+ textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_3");
+ textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_4");
+ textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_5");
+ textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_6");
+ textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_7");
+ textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_8");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return textureTier0;
+ case 1:
+ return textureTier1;
+ case 2:
+ return textureTier2;
+ case 3:
+ return textureTier3;
+ case 4:
+ return textureTier4;
+ case 5:
+ return textureTier5;
+ case 6:
+ return textureTier6;
+ case 7:
+ return textureTier7;
+ case 8:
+ return textureTier8;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java b/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java
new file mode 100644
index 0000000000..ed35e82b83
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java
@@ -0,0 +1,117 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.WHITE;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class StabilisationFieldCasing extends GT_Block_Casings_Abstract {
+
+ private static IIcon textureTier0;
+ private static IIcon textureTier1;
+ private static IIcon textureTier2;
+ private static IIcon textureTier3;
+ private static IIcon textureTier4;
+ private static IIcon textureTier5;
+ private static IIcon textureTier6;
+ private static IIcon textureTier7;
+ private static IIcon textureTier8;
+ private static final int MAX_BLOCK_TIER = 9;
+
+ private static final byte START_INDEX = 32;
+
+ public StabilisationFieldCasing() {
+ super(GT_Item_Casings_Stabilisation.class, "gt.stabilisation_field_generator", GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ }
+
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + i + ".name",
+ WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Stabilisation Field Generator");
+ }
+
+ CustomItemList.StabilisationFieldGeneratorTier0.set(new ItemStack(this, 1, 0));
+ CustomItemList.StabilisationFieldGeneratorTier1.set(new ItemStack(this, 1, 1));
+ CustomItemList.StabilisationFieldGeneratorTier2.set(new ItemStack(this, 1, 2));
+ CustomItemList.StabilisationFieldGeneratorTier3.set(new ItemStack(this, 1, 3));
+ CustomItemList.StabilisationFieldGeneratorTier4.set(new ItemStack(this, 1, 4));
+ CustomItemList.StabilisationFieldGeneratorTier5.set(new ItemStack(this, 1, 5));
+ CustomItemList.StabilisationFieldGeneratorTier6.set(new ItemStack(this, 1, 6));
+ CustomItemList.StabilisationFieldGeneratorTier7.set(new ItemStack(this, 1, 7));
+ CustomItemList.StabilisationFieldGeneratorTier8.set(new ItemStack(this, 1, 8));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_0");
+ textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_1");
+ textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_2");
+ textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_3");
+ textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_4");
+ textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_5");
+ textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_6");
+ textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_7");
+ textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_8");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return textureTier0;
+ case 1:
+ return textureTier1;
+ case 2:
+ return textureTier2;
+ case 3:
+ return textureTier3;
+ case 4:
+ return textureTier4;
+ case 5:
+ return textureTier5;
+ case 6:
+ return textureTier6;
+ case 7:
+ return textureTier7;
+ case 8:
+ return textureTier8;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java b/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java
new file mode 100644
index 0000000000..009a9f4255
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java
@@ -0,0 +1,28 @@
+package com.github.technus.tectech.thing.casing;
+
+import net.minecraft.block.Block;
+
+import com.github.technus.tectech.thing.block.EOH_RenderBlock;
+import com.github.technus.tectech.thing.block.ForgeOfGodsBlock;
+
+/**
+ * Created by danie_000 on 03.10.2016.
+ */
+public final class TT_Container_Casings {
+
+ public static Block sBlockCasingsTT;
+
+ public static Block sBlockCasingsBA0;
+
+ public static Block sBlockCasingsNH;
+ public static Block TimeAccelerationFieldGenerator;
+ public static Block SpacetimeCompressionFieldGenerators;
+ public static Block StabilisationFieldGenerators;
+
+ public static Block eyeOfHarmonyRenderBlock = new EOH_RenderBlock();
+ public static Block forgeOfGodsRenderBlock = new ForgeOfGodsBlock();
+
+ public static Block GodforgeCasings;
+
+ private TT_Container_Casings() {}
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java b/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java
new file mode 100644
index 0000000000..739fe300a9
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java
@@ -0,0 +1,120 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.WHITE;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class TimeAccelerationFieldCasing extends GT_Block_Casings_Abstract {
+
+ private static IIcon textureTier0;
+ private static IIcon textureTier1;
+ private static IIcon textureTier2;
+ private static IIcon textureTier3;
+ private static IIcon textureTier4;
+ private static IIcon textureTier5;
+ private static IIcon textureTier6;
+ private static IIcon textureTier7;
+ private static IIcon textureTier8;
+ private static final int MAX_BLOCK_TIER = 9;
+
+ private static final byte START_INDEX = 48;
+
+ public TimeAccelerationFieldCasing() {
+ super(
+ GT_Item_Casings_TimeAcceleration.class,
+ "gt.time_acceleration_field_generator",
+ GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ }
+
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + i + ".name",
+ WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Time Dilation Field Generator");
+ }
+
+ CustomItemList.TimeAccelerationFieldGeneratorTier0.set(new ItemStack(this, 1, 0));
+ CustomItemList.TimeAccelerationFieldGeneratorTier1.set(new ItemStack(this, 1, 1));
+ CustomItemList.TimeAccelerationFieldGeneratorTier2.set(new ItemStack(this, 1, 2));
+ CustomItemList.TimeAccelerationFieldGeneratorTier3.set(new ItemStack(this, 1, 3));
+ CustomItemList.TimeAccelerationFieldGeneratorTier4.set(new ItemStack(this, 1, 4));
+ CustomItemList.TimeAccelerationFieldGeneratorTier5.set(new ItemStack(this, 1, 5));
+ CustomItemList.TimeAccelerationFieldGeneratorTier6.set(new ItemStack(this, 1, 6));
+ CustomItemList.TimeAccelerationFieldGeneratorTier7.set(new ItemStack(this, 1, 7));
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.set(new ItemStack(this, 1, 8));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_0");
+ textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_1");
+ textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_2");
+ textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_3");
+ textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_4");
+ textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_5");
+ textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_6");
+ textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_7");
+ textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_8");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return textureTier0;
+ case 1:
+ return textureTier1;
+ case 2:
+ return textureTier2;
+ case 3:
+ return textureTier3;
+ case 4:
+ return textureTier4;
+ case 5:
+ return textureTier5;
+ case 6:
+ return textureTier6;
+ case 7:
+ return textureTier7;
+ case 8:
+ return textureTier8;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i < MAX_BLOCK_TIER; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java
new file mode 100644
index 0000000000..b3fe110201
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java
@@ -0,0 +1,252 @@
+package com.github.technus.tectech.thing.cover;
+
+import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.getEnderFluidContainer;
+import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.getEnderLinkTag;
+
+import java.util.UUID;
+
+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.github.technus.tectech.mechanics.enderStorage.EnderLinkTag;
+import com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData;
+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.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import eu.usrv.yamcore.auxiliary.PlayerChatHelper;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+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_TM_EnderFluidLink extends GT_CoverBehavior {
+
+ private static final int L_PER_TICK = 8000;
+ private static final int IMPORT_EXPORT_MASK = 0b0001;
+ private static final int PUBLIC_PRIVATE_MASK = 0b0010;
+
+ public GT_Cover_TM_EnderFluidLink() {}
+
+ private void transferFluid(IFluidHandler source, ForgeDirection side, IFluidHandler target, ForgeDirection tSide,
+ int amount) {
+ FluidStack fluidStack = source.drain(side, amount, false);
+
+ if (fluidStack != null) {
+ int fluidTransferred = target.fill(tSide, fluidStack, true);
+ source.drain(side, fluidTransferred, true);
+ }
+ }
+
+ private boolean testBit(int aCoverVariable, int bitMask) {
+ return (aCoverVariable & bitMask) != 0;
+ }
+
+ private int toggleBit(int aCoverVariable, int bitMask) {
+ return (aCoverVariable ^ bitMask);
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((aTileEntity instanceof IFluidHandler fluidHandlerSelf)) {
+ IFluidHandler fluidHandlerEnder = getEnderFluidContainer(getEnderLinkTag((IFluidHandler) aTileEntity));
+
+ if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) {
+ transferFluid(fluidHandlerEnder, ForgeDirection.UNKNOWN, fluidHandlerSelf, side, L_PER_TICK);
+ } else {
+ transferFluid(fluidHandlerSelf, side, fluidHandlerEnder, ForgeDirection.UNKNOWN, L_PER_TICK);
+ }
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return "";
+ }
+
+ @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 int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int newCoverVariable = toggleBit(aCoverVariable, IMPORT_EXPORT_MASK);
+
+ if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) {
+ PlayerChatHelper.SendInfo(aPlayer, "Ender Suction Engaged!"); // TODO Translation support
+ } else {
+ PlayerChatHelper.SendInfo(aPlayer, "Ender Filling Engaged!");
+ }
+ return newCoverVariable;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ // Runs each tick
+ return 1;
+ }
+
+ // region GUI
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ // Only open gui if we're placed on a fluid tank
+ if (buildContext.getTile() instanceof IFluidHandler) {
+ return new EnderFluidLinkUIFactory(buildContext).createWindow();
+ }
+ return null;
+ }
+
+ private class EnderFluidLinkUIFactory extends UIFactory {
+
+ private static final int START_X = 10;
+ private static final int START_Y = 25;
+ private static final int SPACE_X = 18;
+ private static final int SPACE_Y = 18;
+ private static final int PUBLIC_BUTTON_ID = 0;
+ private static final int PRIVATE_BUTTON_ID = 1;
+ private static final int IMPORT_BUTTON_ID = 2;
+ private static final int EXPORT_BUTTON_ID = 3;
+
+ public EnderFluidLinkUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ TextFieldWidget frequencyField = new TextFieldWidget();
+ builder.widget(frequencyField.setGetter(() -> {
+ ICoverable te = getUIBuildContext().getTile();
+ if (!frequencyField.isClient() && te instanceof IFluidHandler) {
+ return EnderWorldSavedData.getEnderLinkTag((IFluidHandler) te)
+ .getFrequency();
+ }
+ return "";
+ })
+ .setSetter(val -> {
+ ICoverable te = getUIBuildContext().getTile();
+ if (!frequencyField.isClient() && te instanceof IFluidHandler) {
+ UUID uuid;
+ if (testBit(convert(getCoverData()), PUBLIC_PRIVATE_MASK)) {
+ uuid = getUUID();
+ if (!(te instanceof IGregTechTileEntity)) return;
+ if (!uuid.equals(((IGregTechTileEntity) te).getOwnerUuid())) return;
+ } else {
+ uuid = null;
+ }
+ EnderWorldSavedData.bindEnderLinkTag((IFluidHandler) te, new EnderLinkTag(val, uuid));
+ }
+ })
+ .setTextColor(Color.WHITE.dark(1))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setFocusOnGuiOpen(true)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2))
+ .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 0)
+ .setSize(SPACE_X * 5 - 8, 12))
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_TM_EnderFluidLink.this,
+ (id, coverData) -> !getClickable(id, convert(coverData)),
+ (id, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(id, convert(coverData))))
+ .addToggleButton(
+ PUBLIC_BUTTON_ID,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .addTooltip(GT_Utility.trans("326", "Public"))
+ .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 2))
+ .addToggleButton(
+ PRIVATE_BUTTON_ID,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLACKLIST)
+ .addTooltip(GT_Utility.trans("327", "Private"))
+ .setPos(START_X + SPACE_X * 1, START_Y + SPACE_Y * 2))
+ .addToggleButton(
+ IMPORT_BUTTON_ID,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("007", "Import"))
+ .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 3))
+ .addToggleButton(
+ EXPORT_BUTTON_ID,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("006", "Export"))
+ .setPos(START_X + SPACE_X * 1, START_Y + SPACE_Y * 3)))
+ .widget(
+ new TextWidget(GT_Utility.trans("328", "Channel")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(START_X + SPACE_X * 5, 4 + START_Y + SPACE_Y * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("329", "Public/Private")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(START_X + SPACE_X * 2, 4 + START_Y + SPACE_Y * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("229", "Import/Export")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(START_X + SPACE_X * 2, 4 + START_Y + SPACE_Y * 3));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ switch (id) {
+ case PUBLIC_BUTTON_ID:
+ case PRIVATE_BUTTON_ID:
+ return toggleBit(coverVariable, PUBLIC_PRIVATE_MASK);
+ case IMPORT_BUTTON_ID:
+ case EXPORT_BUTTON_ID:
+ return toggleBit(coverVariable, IMPORT_EXPORT_MASK);
+ }
+ return coverVariable;
+ }
+
+ private boolean getClickable(int id, int coverVariable) {
+ switch (id) {
+ case PUBLIC_BUTTON_ID:
+ return testBit(coverVariable, PUBLIC_PRIVATE_MASK);
+ case PRIVATE_BUTTON_ID:
+ return !testBit(coverVariable, PUBLIC_PRIVATE_MASK);
+ case IMPORT_BUTTON_ID:
+ return testBit(coverVariable, IMPORT_EXPORT_MASK);
+ case EXPORT_BUTTON_ID:
+ return !testBit(coverVariable, IMPORT_EXPORT_MASK);
+ }
+ return false;
+ }
+
+ private UUID getUUID() {
+ return getUIBuildContext().getPlayer()
+ .getUniqueID();
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java
new file mode 100644
index 0000000000..ef867e9a35
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java
@@ -0,0 +1,53 @@
+package com.github.technus.tectech.thing.cover;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+
+public class GT_Cover_TM_PowerPassUpgrade extends GT_CoverBehavior {
+
+ public GT_Cover_TM_PowerPassUpgrade() {}
+
+ @Override
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0)
+ .getMetaTileEntity();
+ if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) {
+ return !multi.ePowerPassCover;
+ }
+ return false;
+ }
+
+ @Override
+ public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) {
+ IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0)
+ .getMetaTileEntity();
+ if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) {
+ multi.ePowerPassCover = true;
+ multi.ePowerPass = true;
+ }
+ super.placeCover(side, aCover, aTileEntity);
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0)
+ .getMetaTileEntity();
+ if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) {
+ multi.ePowerPassCover = false;
+ multi.ePowerPass = false;
+ }
+ return true;
+ }
+
+ @Deprecated
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java
new file mode 100644
index 0000000000..e5d2b7acde
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java
@@ -0,0 +1,71 @@
+package com.github.technus.tectech.thing.cover;
+
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove;
+import static ic2.api.info.Info.DMG_ELECTRIC;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.tesla.TeslaCoverConnection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Cover_TM_TeslaCoil extends GT_CoverBehavior {
+
+ public GT_Cover_TM_TeslaCoil() {}
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ // Only do stuff if we're on top and have power
+ if (side == ForgeDirection.UP || aTileEntity.getEUCapacity() > 0) {
+ // Makes sure we're on the list
+ teslaSimpleNodeSetAdd(
+ new TeslaCoverConnection(
+ aTileEntity.getIGregTechTileEntityOffset(0, 0, 0),
+ getTeslaReceptionCapability()));
+ }
+ return super.doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity, aTimer);
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ teslaSimpleNodeSetRemove(
+ new TeslaCoverConnection(aTileEntity.getIGregTechTileEntityOffset(0, 0, 0), getTeslaReceptionCapability()));
+ return super.onCoverRemoval(side, aCoverID, aCoverVariable, aTileEntity, aForced);
+ }
+
+ @Override
+ public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return "Do not attempt to use screwdriver!"; // TODO Translation support
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Shock a non-hazmat player if they dare stuff a screwdriver into one of these
+ if (aTileEntity.getStoredEU() > 0 && !GT_Utility.isWearingFullElectroHazmat(aPlayer)) {
+ aPlayer.attackEntityFrom(DMG_ELECTRIC, 20);
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ // It updates once every 10 ticks, so once every 0.5 second
+ return 10;
+ }
+
+ public byte getTeslaReceptionCapability() {
+ return 2;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java
new file mode 100644
index 0000000000..7169cb61fb
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java
@@ -0,0 +1,44 @@
+package com.github.technus.tectech.thing.cover;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_TM_TeslaCoil_Ultimate extends GT_Cover_TM_TeslaCoil {
+
+ public GT_Cover_TM_TeslaCoil_Ultimate() {}
+
+ @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) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public byte getTeslaReceptionCapability() {
+ return 1;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java
new file mode 100644
index 0000000000..8c0c801363
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java
@@ -0,0 +1,184 @@
+package com.github.technus.tectech.thing.gui;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+@SuppressWarnings("SimplifyStreamApiCallChains")
+public class TecTechUITextures {
+
+ public static final AdaptableUITexture BACKGROUND_SCREEN_BLUE = AdaptableUITexture
+ .of(MODID, "gui/background/screen_blue", 90, 72, 2);
+ public static final UITexture BACKGROUND_SCREEN_BLUE_PARAMETRIZER_TXT = UITexture
+ .fullImage(MODID, "gui/background/screen_blue_parametrizer_txt");
+ public static final UITexture BACKGROUND_SCREEN_BLUE_NO_INVENTORY = UITexture
+ .fullImage(MODID, "gui/background/screen_blue_no_inventory");
+ public static final UITexture BACKGROUND_STAR = UITexture.fullImage(MODID, "gui/background/star");
+ public static final UITexture BACKGROUND_GLOW_ORANGE = UITexture.fullImage(MODID, "gui/background/orange_glow");
+ public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow");
+ public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow");
+ public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow");
+ public static final UITexture BACKGROUND_GLOW_WHITE = UITexture.fullImage(MODID, "gui/background/white_glow");
+ public static final UITexture BACKGROUND_SPACE = UITexture.fullImage(MODID, "gui/background/space");
+
+ public static final UITexture BUTTON_STANDARD_16x16 = UITexture.fullImage(MODID, "gui/button/standard_16x16");
+ public static final UITexture BUTTON_STANDARD_LIGHT_16x16 = UITexture
+ .fullImage(MODID, "gui/button/standard_light_16x16");
+ public static final UITexture BUTTON_CELESTIAL_32x32 = UITexture.fullImage(MODID, "gui/button/celestial");
+
+ public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_DISABLED = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_switch_disabled");
+ public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_OFF = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_switch_off");
+ public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_ON = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_switch_on");
+ public static final UITexture OVERLAY_BUTTON_HEAT_OFF = UITexture.fullImage(MODID, "gui/overlay_button/heat_off");
+ public static final UITexture OVERLAY_BUTTON_HEAT_ON = UITexture.fullImage(MODID, "gui/overlay_button/heat_on");
+ public static final UITexture[] OVERLAY_BUTTON_UNCERTAINTY = IntStream.range(0, 16)
+ .mapToObj(i -> UITexture.fullImage(MODID, "gui/overlay_button/uncertainty/" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture OVERLAY_BUTTON_SAFE_VOID_DISABLED = UITexture
+ .fullImage(MODID, "gui/overlay_button/safe_void_disabled");
+ public static final UITexture OVERLAY_BUTTON_SAFE_VOID_OFF = UITexture
+ .fullImage(MODID, "gui/overlay_button/safe_void_off");
+ public static final UITexture OVERLAY_BUTTON_SAFE_VOID_ON = UITexture
+ .fullImage(MODID, "gui/overlay_button/safe_void_on");
+ public static final UITexture OVERLAY_BUTTON_POWER_PASS_DISABLED = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_pass_disabled");
+ public static final UITexture OVERLAY_BUTTON_POWER_PASS_OFF = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_pass_off");
+ public static final UITexture OVERLAY_BUTTON_POWER_PASS_ON = UITexture
+ .fullImage(MODID, "gui/overlay_button/power_pass_on");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_ID = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_id");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_0 = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_0");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_1 = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_1");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_X = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_x");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_S = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_s");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_T = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_t");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_C = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_c");
+ public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_IF = UITexture
+ .fullImage(MODID, "gui/overlay_button/parametrizer_if");
+ public static final UITexture OVERLAY_BUTTON_ARROW_BLUE_UP = UITexture
+ .fullImage(MODID, "gui/overlay_button/arrow_blue_up");
+ public static final UITexture OVERLAY_BUTTON_BATTERY_ON = UITexture
+ .fullImage(MODID, "gui/overlay_button/battery_on");
+ public static final UITexture OVERLAY_BUTTON_BATTERY_OFF = UITexture
+ .fullImage(MODID, "gui/overlay_button/battery_off");
+ public static final UITexture OVERLAY_BUTTON_FLAG = UITexture.fullImage(MODID, "gui/overlay_button/flag");
+ public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue");
+
+ public static final UITexture OVERLAY_SLOT_RACK = UITexture.fullImage(MODID, "gui/overlay_slot/rack");
+ public static final UITexture OVERLAY_SLOT_MESH = UITexture.fullImage(MODID, "gui/overlay_slot/mesh");
+
+ public static final UITexture PROGRESSBAR_RESEARCH_STATION_1 = UITexture
+ .fullImage(MODID, "gui/progressbar/research_station_1");
+ public static final UITexture PROGRESSBAR_RESEARCH_STATION_2 = UITexture
+ .fullImage(MODID, "gui/progressbar/research_station_2");
+ public static final UITexture PROGRESSBAR_RESEARCH_STATION_3 = UITexture
+ .fullImage(MODID, "gui/progressbar/research_station_3");
+ public static final UITexture PROGRESSBAR_GODFORGE_PLASMA = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_plasma");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_background");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_red");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue_inverted");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_red_inverted");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple_inverted");
+ public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED = UITexture
+ .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow_inverted");
+
+ public static final UITexture PICTURE_TECTECH_LOGO = UITexture.fullImage(MODID, "gui/picture/tectech_logo");
+ public static final UITexture PICTURE_TECTECH_LOGO_DARK = UITexture
+ .fullImage(MODID, "gui/picture/tectech_logo_dark");
+ public static final UITexture PICTURE_GODFORGE_LOGO = UITexture.fullImage(MODID, "gui/picture/gorge_logo");
+ public static final UITexture PICTURE_RACK_LARGE = UITexture.fullImage(MODID, "gui/picture/rack_large");
+ public static final UITexture PICTURE_HEAT_SINK = UITexture.fullImage(MODID, "gui/picture/heat_sink");
+ public static final UITexture PICTURE_UNCERTAINTY_MONITOR = UITexture
+ .fullImage(MODID, "gui/picture/uncertainty/monitor");
+ public static final UITexture PICTURE_UNCERTAINTY_INDICATOR = UITexture
+ .fullImage(MODID, "gui/picture/uncertainty/indicator");
+ public static final UITexture PICTURE_UNCERTAINTY_SELECTED = UITexture
+ .fullImage(MODID, "gui/picture/uncertainty/selected");
+ public static final UITexture[] PICTURE_UNCERTAINTY_VALID = IntStream.range(0, 9)
+ .mapToObj(i -> UITexture.fullImage(MODID, "gui/picture/uncertainty/valid_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] PICTURE_UNCERTAINTY_INVALID = IntStream.range(0, 9)
+ .mapToObj(i -> UITexture.fullImage(MODID, "gui/picture/uncertainty/invalid_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture PICTURE_HEAT_SINK_SMALL = UITexture.fullImage(MODID, "gui/picture/heat_sink_small");
+ public static final UITexture PICTURE_PARAMETER_BLANK = UITexture.fullImage(MODID, "gui/picture/parameter_blank");
+ public static final UITexture[] PICTURE_PARAMETER_BLUE = IntStream.range(0, 20)
+ .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_blue", 158, 4, i * 8, 0, i * 8 + 6, 4))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] PICTURE_PARAMETER_CYAN = IntStream.range(0, 20)
+ .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_cyan", 158, 4, i * 8, 0, i * 8 + 6, 4))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] PICTURE_PARAMETER_GREEN = IntStream.range(0, 20)
+ .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_green", 158, 4, i * 8, 0, i * 8 + 6, 4))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] PICTURE_PARAMETER_ORANGE = IntStream.range(0, 20)
+ .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_orange", 158, 4, i * 8, 0, i * 8 + 6, 4))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] PICTURE_PARAMETER_RED = IntStream.range(0, 20)
+ .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_red", 158, 4, i * 8, 0, i * 8 + 6, 4))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture PICTURE_PARAMETER_GRAY = UITexture.fullImage(MODID, "gui/picture/parameter_gray");
+ public static final UITexture PICTURE_UNCERTAINTY_MONITOR_MULTIMACHINE = UITexture
+ .fullImage(MODID, "gui/picture/uncertainty/monitor_multimachine");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_FULL = UITexture.fullImage(MODID, "gui/picture/connector");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_EMPTY = UITexture
+ .fullImage(MODID, "gui/picture/connector_empty");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_SWITCH = UITexture
+ .fullImage(MODID, "gui/picture/connector_switch");
+ public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE = UITexture
+ .fullImage(MODID, "gui/picture/milestone_charge");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION = UITexture
+ .fullImage(MODID, "gui/picture/milestone_conversion");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST = UITexture
+ .fullImage(MODID, "gui/picture/milestone_catalyst");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION = UITexture
+ .fullImage(MODID, "gui/picture/milestone_composition");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW = UITexture
+ .fullImage(MODID, "gui/picture/milestone_charge_glow");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW = UITexture
+ .fullImage(MODID, "gui/picture/milestone_conversion_glow");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW = UITexture
+ .fullImage(MODID, "gui/picture/milestone_catalyst_glow");
+ public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW = UITexture
+ .fullImage(MODID, "gui/picture/milestone_composition_glow");
+ public static final UITexture PICTURE_OVERLAY_BLUE = UITexture.fullImage(MODID, "gui/picture/overlay_blue");
+ public static final UITexture PICTURE_OVERLAY_ORANGE = UITexture.fullImage(MODID, "gui/picture/overlay_orange");
+ public static final UITexture PICTURE_OVERLAY_GREEN = UITexture.fullImage(MODID, "gui/picture/overlay_green");
+ public static final UITexture PICTURE_OVERLAY_PURPLE = UITexture.fullImage(MODID, "gui/picture/overlay_purple");
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java b/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java
new file mode 100644
index 0000000000..f0d0df6206
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java
@@ -0,0 +1,53 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class AstralArrayFabricator extends Item {
+
+ public static AstralArrayFabricator INSTANCE;
+
+ private AstralArrayFabricator() {
+ setHasSubtypes(false);
+ setUnlocalizedName("tm.itemAstralArrayFabricator");
+ setTextureName(MODID + ":itemAstralArray");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc1"));
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc2"));
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc3"));
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("item.tm.itemAstralArrayFabricator.desc0"));
+ }
+
+ public static void run() {
+ INSTANCE = new AstralArrayFabricator();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ astralArrayFabricator.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java b/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java
new file mode 100644
index 0000000000..00a1c29599
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java
@@ -0,0 +1,56 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.enderLinkFluidCover;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public final class EnderFluidLinkCover extends Item {
+
+ public static EnderFluidLinkCover INSTANCE;
+
+ private EnderFluidLinkCover() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.enderfluidlinkcover");
+ setTextureName(MODID + ":itemEnderFluidLinkCover");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ aList.add(translateToLocal("item.tm.enderfluidlinkcover.desc.0")); // Ender-Fluid-Enables Machines!
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.1")); // Use on any side
+ // of a fluid tank
+ // to link it to
+ // the Ender
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.2")); // Ender Tanks so
+ // are laggy -Bot
+ // from the Chads
+ // of NH
+ }
+
+ public static void run() {
+ INSTANCE = new EnderFluidLinkCover();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ enderLinkFluidCover.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java b/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java
new file mode 100644
index 0000000000..f293f4178b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java
@@ -0,0 +1,169 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.util.GT_Utility;
+
+public class EuMeterGT extends Item {
+
+ public static EuMeterGT INSTANCE;
+
+ private EuMeterGT() {
+ setMaxStackSize(1);
+ setUnlocalizedName("em.EuMeterGT");
+ setTextureName(MODID + ":itemEuMeterGT");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity == null || aPlayer instanceof FakePlayer) {
+ return aPlayer instanceof EntityPlayerMP;
+ }
+ if (aPlayer instanceof EntityPlayerMP && !aPlayer.isSneaking() && tTileEntity instanceof IGregTechTileEntity) {
+ String clientLocale;
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+
+ if (tTileEntity instanceof BaseMetaTileEntity) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ EnumChatFormatting.AQUA + "----- X:"
+ + aX
+ + " Y:"
+ + aY
+ + " Z:"
+ + aZ
+ + " D:"
+ + aWorld.provider.dimensionId
+ + " S:"
+ + ordinalSide
+ + " -----");
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Stored_energy", clientLocale) + ": "
+ + EnumChatFormatting.YELLOW
+ + (((BaseMetaTileEntity) tTileEntity).getUniversalEnergyStored())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.GREEN
+ + (((BaseMetaTileEntity) tTileEntity).getUniversalEnergyCapacity()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Stored_EU", clientLocale) + ": "
+ + EnumChatFormatting.YELLOW
+ + (((BaseMetaTileEntity) tTileEntity).getStoredEU())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.GREEN
+ + (((BaseMetaTileEntity) tTileEntity).getEUCapacity()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Average_IO", clientLocale) + ": "
+ + EnumChatFormatting.YELLOW
+ + (((BaseMetaTileEntity) tTileEntity).getAverageElectricInput())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.YELLOW
+ + (((BaseMetaTileEntity) tTileEntity).getAverageElectricOutput()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Average_IO_(max)", clientLocale) + ": "
+ + EnumChatFormatting.GOLD
+ + (((BaseMetaTileEntity) tTileEntity).getInputVoltage())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.GOLD
+ + (((BaseMetaTileEntity) tTileEntity).getOutputVoltage()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Average_IO_max", clientLocale) + ": "
+ + EnumChatFormatting.RED
+ + (((BaseMetaTileEntity) tTileEntity).getMaxSafeInput())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.RED
+ + (((BaseMetaTileEntity) tTileEntity).getMaxEnergyOutput()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Amperage_IO_(max)", clientLocale) + ": "
+ + EnumChatFormatting.GOLD
+ + (((BaseMetaTileEntity) tTileEntity).getInputAmperage())
+ + EnumChatFormatting.RESET
+ + '/'
+ + EnumChatFormatting.GOLD
+ + (((BaseMetaTileEntity) tTileEntity).getOutputAmperage()));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Side_capabilities", clientLocale) + ": "
+ + (((BaseMetaTileEntity) tTileEntity).inputEnergyFrom(side)
+ ? translateToLocalFormatted("tt.keyword.input", clientLocale) + " "
+ : "")
+ + (((BaseMetaTileEntity) tTileEntity).outputsEnergyTo(side)
+ ? translateToLocalFormatted("tt.keyword.output", clientLocale)
+ : ""));
+ return true;
+ } else if (tTileEntity instanceof BaseMetaPipeEntity) {
+ if (((BaseMetaPipeEntity) tTileEntity).getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable) {
+ ArrayList<String> tList = new ArrayList<>();
+ GT_Utility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ);
+ for (String str : tList) {
+ GT_Utility.sendChatToPlayer(aPlayer, str);
+ }
+ }
+ return true;
+ }
+ }
+ if (!(aPlayer instanceof EntityPlayerMP)) {
+ GT_Utility.doSoundAtClient(new ResourceLocation(Reference.MODID, "fx_scan"), 1, 1.0F, aX, aY, aZ);
+ }
+ return false;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.TEC_MARK_GENERAL);
+ aList.add(translateToLocal("item.em.EuMeterGT.desc.0")); // Measures basic EU related stuff
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.EuMeterGT.desc.1")); // Just right click on
+ // blocks.
+ }
+
+ public static void run() {
+ INSTANCE = new EuMeterGT();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java b/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java
new file mode 100644
index 0000000000..753bb691b9
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java
@@ -0,0 +1,234 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.thing.CustomItemList.parametrizerMemory;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.entity.player.EntityPlayerMP;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_ParamText;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+/**
+ * Created by Tec on 15.03.2017.
+ */
+public final class ParametrizerMemoryCard extends Item {
+
+ public static ParametrizerMemoryCard INSTANCE;
+ private static IIcon locked, unlocked;
+
+ private ParametrizerMemoryCard() {
+ setMaxStackSize(1);
+ setHasSubtypes(true);
+ setUnlocalizedName("em.parametrizerMemoryCard");
+ setTextureName(MODID + ":itemParametrizerMemoryCardUnlocked");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(aPlayer instanceof EntityPlayerMP)) return false;
+ if (!(tTileEntity instanceof IGregTechTileEntity)) return false;
+ aStack.stackSize = 1;
+ IMetaTileEntity metaTE = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity();
+
+ if (metaTE instanceof GT_MetaTileEntity_Hatch_ParamText parametrizer) {
+ if (aStack.getTagCompound() == null) {
+ aStack.setTagCompound(new NBTTagCompound());
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (aStack.getItemDamage() == 1) {
+ // write to parametrizer
+ parametrizer.param = tNBT.getInteger("param");
+ parametrizer.value0D = tNBT.getDouble("value0D");
+ parametrizer.value1D = tNBT.getDouble("value1D");
+ parametrizer.value0s = tNBT.getString("value0s");
+ parametrizer.value1s = tNBT.getString("value1s");
+ } else {
+ // read from parametrizer
+ NBTTagCompound newTag = new NBTTagCompound();
+ newTag.setInteger("param", parametrizer.param);
+ newTag.setDouble("value0D", parametrizer.value0D);
+ newTag.setDouble("value1D", parametrizer.value1D);
+ newTag.setString("value0s", parametrizer.value0s);
+ newTag.setString("value1s", parametrizer.value1s);
+ aStack.setTagCompound(newTag);
+ }
+ return true;
+ } else if (metaTE instanceof GT_MetaTileEntity_Hatch_Param parametrizer) {
+ if (aStack.getTagCompound() == null) {
+ aStack.setTagCompound(new NBTTagCompound());
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (aStack.getItemDamage() == 1) {
+ // write to parametrizer
+ parametrizer.param = tNBT.getInteger("param");
+ parametrizer.value0D = tNBT.getDouble("value0D");
+ parametrizer.value1D = tNBT.getDouble("value1D");
+ } else {
+ // read from parametrizer
+ NBTTagCompound newTag = new NBTTagCompound();
+ tNBT.setInteger("param", parametrizer.param);
+ tNBT.setDouble("value0D", parametrizer.value0D);
+ tNBT.setDouble("value1D", parametrizer.value1D);
+ aStack.setTagCompound(newTag);
+ }
+ return true;
+ } else if (metaTE instanceof GT_MetaTileEntity_MultiblockBase_EM controller) {
+ if (aStack.getTagCompound() == null) {
+ aStack.setTagCompound(new NBTTagCompound());
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (aStack.getItemDamage() == 1) {
+ // write to controller
+ if (tNBT.hasKey("paramList", Constants.NBT.TAG_LIST)) {
+ // from controller
+ NBTTagList tagList = tNBT.getTagList("paramList", Constants.NBT.TAG_COMPOUND);
+ for (int hatch = 0; hatch < 10; hatch++) {
+ NBTTagCompound tag = tagList.getCompoundTagAt(hatch);
+ controller.parametrization
+ .trySetParameters(hatch, tag.getDouble("value0D"), tag.getDouble("value1D"));
+ }
+ } else {
+ // from parametrizer
+ controller.parametrization.trySetParameters(
+ tNBT.getInteger("param"),
+ tNBT.getDouble("value0D"),
+ tNBT.getDouble("value1D"));
+ }
+ } else {
+ // read from controller
+ NBTTagCompound newTag = new NBTTagCompound();
+ NBTTagList tagList = new NBTTagList();
+ for (int hatch = 0; hatch < 10; hatch++) {
+ NBTTagCompound tagChild = new NBTTagCompound();
+ Parameters.Group.ParameterIn[] parameters = controller.parametrization.getGroup(hatch).parameterIn;
+ if (parameters[0] != null) {
+ tagChild.setDouble("value0D", parameters[0].get());
+ }
+ if (parameters[1] != null) {
+ tagChild.setDouble("value1D", parameters[1].get());
+ }
+ tagList.appendTag(tagChild);
+ }
+ newTag.setTag("paramList", tagList);
+ aStack.setTagCompound(newTag);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (aPlayer instanceof EntityPlayerMP && aPlayer.isSneaking()) {
+ aStack.stackSize = 1;
+ if (aStack.getItemDamage() == 1) {
+ aStack.setItemDamage(0);
+ } else {
+ aStack.setItemDamage(1);
+ }
+ return aStack;
+ }
+ return aStack;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ if (stack.getItemDamage() == 1) {
+ return StatCollector.translateToLocal("item.em.parametrizerMemoryCard.name.paste");
+ } else {
+ return StatCollector.translateToLocal("item.em.parametrizerMemoryCard.name.copy");
+ }
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ aList.add(CommonValues.THETA_MOVEMENT);
+ aList.add(translateToLocal("item.em.parametrizerMemoryCard.desc.0")); // Stores Parameters
+
+ if (aStack.getItemDamage() == 1) {
+ // Use on Multiblock Controller to configure it
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.1"));
+ } else {
+ // Use on Multiblock Controller to store parameters
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.2"));
+ }
+ // Sneak right click to lock/unlock
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.3"));
+
+ double temp;
+ if (tNBT != null && tNBT.hasKey("param")) {
+ aList.add("Hatch ID: " + EnumChatFormatting.AQUA + tNBT.getInteger("param"));
+ temp = tNBT.getInteger("value0D");
+ aList.add("Value 0D: " + EnumChatFormatting.AQUA + temp);
+ aList.add(
+ "Value 0B: " + EnumChatFormatting.AQUA
+ + TT_Utility.longBitsToShortString(Double.doubleToLongBits(temp)));
+ aList.add("Value 0s: " + EnumChatFormatting.AQUA + tNBT.getString("value0s"));
+ temp = tNBT.getInteger("value1D");
+ aList.add("Value 1D: " + EnumChatFormatting.AQUA + temp);
+ aList.add(
+ "Value 1B: " + EnumChatFormatting.AQUA
+ + TT_Utility.longBitsToShortString(Double.doubleToLongBits(temp)));
+ aList.add("Value 1s: " + EnumChatFormatting.AQUA + tNBT.getString("value1s"));
+ }
+ }
+
+ public static void run() {
+ INSTANCE = new ParametrizerMemoryCard();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ parametrizerMemory.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ locked = iconRegister.registerIcon(MODID + ":itemParametrizerMemoryCardLocked");
+ unlocked = itemIcon = iconRegister.registerIcon(getIconString());
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ if (damage == 1) {
+ return locked;
+ }
+ return unlocked;
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List<ItemStack> list) {
+ ItemStack that = new ItemStack(this, 1);
+ that.setTagCompound(new NBTTagCompound());
+ list.add(that);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java b/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java
new file mode 100644
index 0000000000..015d284c4e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java
@@ -0,0 +1,55 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.powerPassUpgradeCover;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public final class PowerPassUpgradeCover extends Item {
+
+ public static PowerPassUpgradeCover INSTANCE;
+
+ private PowerPassUpgradeCover() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.powerpassupgradecover");
+ setTextureName(MODID + ":itemPowerPassUpgradeCover");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ aList.add(translateToLocal("item.tm.powerpassupgradecover.desc.0")); // Add power pass functionality to TecTech
+ // Multiblocks
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.powerpassupgradecover.desc.1")); // Active
+ // transformer in
+ // a can??
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.powerpassupgradecover.desc.2")); // Chain them up
+ // like Christmas
+ // lights!
+ }
+
+ public static void run() {
+ INSTANCE = new PowerPassUpgradeCover();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ powerPassUpgradeCover.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java b/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java
new file mode 100644
index 0000000000..35f2199663
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java
@@ -0,0 +1,91 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.*;
+import static java.lang.Math.pow;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.FMLClientHandler;
+
+public class RenderForgeOfGodsItem implements IItemRenderer {
+
+ @Override
+ public boolean handleRenderType(ItemStack item, IItemRenderer.ItemRenderType type) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType type, ItemStack item,
+ IItemRenderer.ItemRendererHelper helper) {
+ return true;
+ }
+
+ @Override
+ public void renderItem(IItemRenderer.ItemRenderType type, ItemStack item, Object... data) {
+ GL11.glPushMatrix();
+
+ if (type == IItemRenderer.ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0);
+ else if (type == IItemRenderer.ItemRenderType.EQUIPPED
+ || type == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ GL11.glTranslated(0.5, 0.5, 0.5);
+ if (type == IItemRenderer.ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0);
+ }
+
+ // Render star stuff
+ renderStarLayer(0, STAR_LAYER_0, 1.0f);
+ renderStarLayer(1, STAR_LAYER_1, 0.4f);
+ renderStarLayer(2, STAR_LAYER_2, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+
+ private void renderStarLayer(int layer, ResourceLocation texture, float alpha) {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ FMLClientHandler.instance()
+ .getClient()
+ .getTextureManager()
+ .bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down
+ float scale = 0.01f;
+
+ // Put each layer further out
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0:
+ GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F);
+ break;
+ case 1:
+ GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F);
+ break;
+ case 2:
+ GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F);
+ break;
+ }
+
+ // Set colour and alpha of the star layer
+ GL11.glColor4f(222, 243, 250, alpha);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java
new file mode 100644
index 0000000000..6e292bc9c7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java
@@ -0,0 +1,108 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.teslaCapacitor;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public final class TeslaCoilCapacitor extends Item {
+
+ public static TeslaCoilCapacitor INSTANCE;
+ private static IIcon LVicon, MVicon, HVicon, EVicon, IVicon, LuVicon, ZPMicon;
+
+ private TeslaCoilCapacitor() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.teslaCoilCapacitor");
+ setTextureName(MODID + ":itemCapacitorLV");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ if (aStack.getItemDamage() >= 0 && aStack.getItemDamage() <= 6) {
+ aList.add(
+ translateToLocal("item.tm.teslaCoilCapacitor.desc.0") + " "
+ + V[aStack.getItemDamage() + 1] * 512
+ + " "
+ + translateToLocal("item.tm.teslaCoilCapacitor.desc.1")
+ + " "
+ + V[aStack.getItemDamage() + 1]
+ + " EU/t"); // Stores 16384 EU in a tesla tower at 32 EU/t
+ } else {
+ aList.add(translateToLocal("item.tm.teslaCoilCapacitor.desc.2")); // Yeet this broken item into some spicy
+ // water!
+ }
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCoilCapacitor.desc.3")); // Insert into a
+ // Capacitor hatch
+ // of a Tesla Tower
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCoilCapacitor.desc.4")); // Capacitors are
+ // the same thing as
+ // batteries, right?
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ public static void run() {
+ INSTANCE = new TeslaCoilCapacitor();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ teslaCapacitor.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ LVicon = itemIcon = iconRegister.registerIcon(getIconString());
+ MVicon = iconRegister.registerIcon(MODID + ":itemCapacitorMV");
+ HVicon = iconRegister.registerIcon(MODID + ":itemCapacitorHV");
+ EVicon = iconRegister.registerIcon(MODID + ":itemCapacitorEV");
+ IVicon = iconRegister.registerIcon(MODID + ":itemCapacitorIV");
+ LuVicon = iconRegister.registerIcon(MODID + ":itemCapacitorLuV");
+ ZPMicon = iconRegister.registerIcon(MODID + ":itemCapacitorZPM");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ switch (damage) {
+ case 1:
+ return MVicon;
+ case 2:
+ return HVicon;
+ case 3:
+ return EVicon;
+ case 4:
+ return IVicon;
+ case 5:
+ return LuVicon;
+ case 6:
+ return ZPMicon;
+ default:
+ return LVicon;
+ }
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ for (int i = 0; i <= 6; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java
new file mode 100644
index 0000000000..b4f1d33382
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java
@@ -0,0 +1,72 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.teslaComponent;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public final class TeslaCoilComponent extends Item {
+
+ public static TeslaCoilComponent INSTANCE;
+ private static IIcon ultItemIcon;
+
+ private TeslaCoilComponent() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.itemTeslaComponent");
+ setTextureName(MODID + ":itemTeslaComponent");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.itemTeslaComponent.desc")); // Tesla bois need
+ // these!
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ public static void run() {
+ INSTANCE = new TeslaCoilComponent();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ teslaComponent.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ ultItemIcon = iconRegister.registerIcon(MODID + ":itemTeslaComponentUltimate");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ if (damage == 1) {
+ return ultItemIcon;
+ }
+ return itemIcon;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java
new file mode 100644
index 0000000000..3ee7fd3e93
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java
@@ -0,0 +1,87 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.teslaCover;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+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.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public final class TeslaCoilCover extends Item {
+
+ public static TeslaCoilCover INSTANCE;
+ private static IIcon ultItemIcon;
+
+ private TeslaCoilCover() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.teslaCover");
+ setTextureName(MODID + ":itemTeslaCover");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ switch (aStack.getItemDamage()) {
+ case 0:
+ aList.add(translateToLocal("item.tm.teslaCover.desc.0")); // Tesla-Enables Machines!
+ break;
+ case 1:
+ aList.add(translateToLocal("item.tm.teslaCover.desc.1")); // Tesla-Enables Machines! (BUT LOUDER!!)
+ break;
+ default:
+ aList.add(translateToLocal("item.tm.teslaCover.desc.2")); // Yeet this broken item into some spicy
+ // water!
+ break;
+ }
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCover.desc.3")); // Use on top of a machine
+ // to enable Tesla
+ // capabilities
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCover.desc.4")); // Who the hell uses cables
+ // anyway?
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ public static void run() {
+ INSTANCE = new TeslaCoilCover();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ teslaCover.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ ultItemIcon = iconRegister.registerIcon(MODID + ":itemTeslaCoverUltimate");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ if (damage == 1) {
+ return ultItemIcon;
+ }
+ return itemIcon;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java b/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java
new file mode 100644
index 0000000000..88028f910c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java
@@ -0,0 +1,54 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.teslaStaff;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+
+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.util.ResourceLocation;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.util.CommonValues;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Utility;
+
+public final class TeslaStaff extends Item {
+
+ public static TeslaStaff INSTANCE;
+
+ private TeslaStaff() {
+ setUnlocalizedName("tm.teslaStaff");
+ setTextureName(MODID + ":itemTeslaStaff");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(CommonValues.THETA_MOVEMENT);
+ aList.add(translateToLocal("item.tm.teslaStaff.desc"));
+ }
+
+ @Override
+ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer aPlayer, Entity entity) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Zapperoni!");
+ if (!(aPlayer instanceof EntityPlayerMP)) {
+ double aX = aPlayer.posX;
+ double aY = aPlayer.posY;
+ double aZ = aPlayer.posZ;
+ GT_Utility.doSoundAtClient(new ResourceLocation(Reference.MODID, "fx_scan"), 1, 1.0F, aX, aY, aZ);
+ }
+ return false;
+ }
+
+ public static void run() {
+ INSTANCE = new TeslaStaff();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ teslaStaff.set(INSTANCE);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java
new file mode 100644
index 0000000000..cd4d743587
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java
@@ -0,0 +1,318 @@
+package com.github.technus.tectech.thing.metaTileEntity;
+
+import static gregtech.api.enums.Dyes.MACHINE_METAL;
+import static gregtech.api.enums.Textures.BlockIcons.CustomIcon;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN_MULTI;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_ON_WIRELESS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT_MULTI;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.GT_SidedTexture;
+import gregtech.api.render.TextureFactory;
+
+public class Textures {
+
+ private static final IIconContainer OVERLAY_ENERGY_IN_POWER = new CustomIcon("iconsets/OVERLAY_ENERGY_IN_POWER");
+ private static final IIconContainer OVERLAY_ENERGY_OUT_POWER = new CustomIcon("iconsets/OVERLAY_ENERGY_OUT_POWER");
+ private static final IIconContainer OVERLAY_ENERGY_IN_LASER = new CustomIcon("iconsets/OVERLAY_ENERGY_IN_LASER");
+ private static final IIconContainer OVERLAY_ENERGY_OUT_LASER = new CustomIcon("iconsets/OVERLAY_ENERGY_OUT_LASER");
+ private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_4A = new CustomIcon(
+ "iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A");
+ private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_16A = new CustomIcon(
+ "iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A");
+ private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_LASER = new CustomIcon(
+ "iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER");
+ private static final IIconContainer MACHINE_UEV_SIDE = new CustomIcon("iconsets/MACHINE_UEV_SIDE");
+ private static final IIconContainer MACHINE_UIV_SIDE = new CustomIcon("iconsets/MACHINE_UIV_SIDE");
+ private static final IIconContainer MACHINE_UMV_SIDE = new CustomIcon("iconsets/MACHINE_UMV_SIDE");
+ private static final IIconContainer MACHINE_UXV_SIDE = new CustomIcon("iconsets/MACHINE_UXV_SIDE");
+ private static final IIconContainer MACHINE_MAXV_SIDE = new CustomIcon("iconsets/MACHINE_MAXV_SIDE");
+ private static final IIconContainer MACHINE_UEV_TOP = new CustomIcon("iconsets/MACHINE_UEV_TOP");
+ private static final IIconContainer MACHINE_UIV_TOP = new CustomIcon("iconsets/MACHINE_UIV_TOP");
+ private static final IIconContainer MACHINE_UMV_TOP = new CustomIcon("iconsets/MACHINE_UMV_TOP");
+ private static final IIconContainer MACHINE_UXV_TOP = new CustomIcon("iconsets/MACHINE_UXV_TOP");
+ private static final IIconContainer MACHINE_MAXV_TOP = new CustomIcon("iconsets/MACHINE_MAXV_TOP");
+ private static final IIconContainer MACHINE_UEV_BOTTOM = new CustomIcon("iconsets/MACHINE_UEV_BOTTOM");
+ private static final IIconContainer MACHINE_UIV_BOTTOM = new CustomIcon("iconsets/MACHINE_UIV_BOTTOM");
+ private static final IIconContainer MACHINE_UMV_BOTTOM = new CustomIcon("iconsets/MACHINE_UMV_BOTTOM");
+ private static final IIconContainer MACHINE_UXV_BOTTOM = new CustomIcon("iconsets/MACHINE_UXV_BOTTOM");
+ private static final IIconContainer MACHINE_MAXV_BOTTOM = new CustomIcon("iconsets/MACHINE_MAXV_BOTTOM");
+
+ private static final IIconContainer TESLA_TRANSCEIVER_TOP = new CustomIcon("iconsets/TESLA_TRANSCEIVER_TOP");
+
+ public static IIconContainer[] MACHINECASINGS_SIDE_TT = new IIconContainer[] { 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_TT = new IIconContainer[] { 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_TT = new IIconContainer[] { 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, };
+ public static ITexture[] OVERLAYS_ENERGY_IN_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_OUT_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_IN_MULTI_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_OUT_MULTI_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_IN_POWER_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_OUT_POWER_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_IN_LASER_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 60, 60, 245, 0 }), },
+ OVERLAYS_ENERGY_OUT_LASER_TT = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 180, 180, 180, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 220, 220, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 200, 200, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 180, 180, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 160, 160, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 140, 140, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 120, 120, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 100, 100, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 80, 80, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 60, 60, 245, 0 }), };
+ public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A = {
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }) };
+
+ public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A = {
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }) };
+
+ public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A = {
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }) };
+
+ public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_LASER = {
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }) };
+
+ public static ITexture[][] MACHINE_CASINGS_TT = new ITexture[15][17];
+
+ public static ITexture TESLA_TRANSCEIVER_TOP_BA = new GT_RenderedTexture(TESLA_TRANSCEIVER_TOP);
+
+ public static void run() {
+ for (byte i = 0; i < MACHINE_CASINGS_TT.length; i++) {
+ for (byte j = 0; j < MACHINE_CASINGS_TT[i].length; j++) {
+ MACHINE_CASINGS_TT[i][j] = new GT_SidedTexture(
+ MACHINECASINGS_BOTTOM_TT[i],
+ MACHINECASINGS_TOP_TT[i],
+ MACHINECASINGS_SIDE_TT[i],
+ Dyes.getModulation(j - 1, MACHINE_METAL.mRGBa));
+ }
+ }
+ MACHINE_CASINGS = MACHINE_CASINGS_TT;
+
+ // These will throw IndexOutOfBoundsException if one of the arrays are the wrong length
+ System.arraycopy(OVERLAYS_ENERGY_IN_TT, 0, OVERLAYS_ENERGY_IN, 0, OVERLAYS_ENERGY_IN_TT.length);
+ System.arraycopy(OVERLAYS_ENERGY_OUT_TT, 0, OVERLAYS_ENERGY_OUT, 0, OVERLAYS_ENERGY_OUT_TT.length);
+ System
+ .arraycopy(OVERLAYS_ENERGY_IN_MULTI_TT, 0, OVERLAYS_ENERGY_IN_MULTI, 0, OVERLAYS_ENERGY_IN_MULTI_TT.length);
+ System.arraycopy(
+ OVERLAYS_ENERGY_OUT_MULTI_TT,
+ 0,
+ OVERLAYS_ENERGY_OUT_MULTI,
+ 0,
+ OVERLAYS_ENERGY_OUT_MULTI_TT.length);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java
new file mode 100644
index 0000000000..3cb7a93f77
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java
@@ -0,0 +1,268 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.github.technus.tectech.util.TT_Utility.getUniqueIdentifier;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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 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.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by Tec on 03.04.2017.
+ */
+public class GT_MetaTileEntity_Hatch_Capacitor extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
+
+ private static Textures.BlockIcons.CustomIcon TM_H;
+ private static Textures.BlockIcons.CustomIcon TM_H_ACTIVE;
+ private static final Map<String, GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent> componentBinds = new HashMap<>();
+
+ public GT_MetaTileEntity_Hatch_Capacitor(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 16,
+ new String[] { CommonValues.THETA_MOVEMENT, translateToLocal("gt.blockmachines.hatch.capacitor.desc.0"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.capacitor.desc.1") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_Capacitor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 16, aDescription, aTextures);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ TM_H_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_CAPS_ACTIVE");
+ TM_H = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_CAPS");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TM_H_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TM_H) };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Capacitor(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @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 side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return getBaseMetaTileEntity().isActive() ? 0 : mInventory.length;
+ }
+
+ public long[] getCapacitors() {
+ long tier = -1;
+ long tCurrent = 0;
+ long tEnergyMax = 0;
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] == null || mInventory[i].stackSize != 1) {
+ continue;
+ }
+ CapacitorComponent cap = componentBinds.get(getUniqueIdentifier(mInventory[i]));
+ if (cap != null && cap.tier > tier) {
+ tier = cap.tier;
+ }
+ }
+ if (tier >= 0) {
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] == null || mInventory[i].stackSize != 1) {
+ continue;
+ }
+ CapacitorComponent cap = componentBinds.get(getUniqueIdentifier(mInventory[i]));
+ if (cap == null) {
+ continue;
+ }
+ if (cap.tier < tier) {
+ if (getBaseMetaTileEntity().isActive()) {
+ mInventory[i] = null;
+ getBaseMetaTileEntity().setOnFire();
+ }
+ } else {
+ tCurrent += cap.current;
+ tEnergyMax += cap.energyMax;
+ }
+ }
+ }
+ return new long[] { tier, tCurrent, tEnergyMax };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !getBaseMetaTileEntity().isActive();
+ }
+ })
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(52, 7));
+ }
+
+ public static void run() {
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.0",
+ 0,
+ 1,
+ V[1] * 512); // LV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.1",
+ 1,
+ 1,
+ V[2] * 512); // MV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.2",
+ 2,
+ 1,
+ V[3] * 512); // HV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.3",
+ 3,
+ 1,
+ V[4] * 512); // EV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.4",
+ 4,
+ 1,
+ V[5] * 512); // IV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.5",
+ 5,
+ 1,
+ V[6] * 512); // LuV Capacitor
+ new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent(
+ Reference.MODID + ":item.tm.teslaCoilCapacitor.6",
+ 6,
+ 1,
+ V[7] * 512); // ZPM Capacitor
+ }
+
+ public static class CapacitorComponent implements Comparable<GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent> {
+
+ private final String unlocalizedName;
+ private final long tier, current, energyMax;
+
+ CapacitorComponent(ItemStack is, long tier, long current, long energyMax) {
+ this(getUniqueIdentifier(is), tier, current, energyMax);
+ }
+
+ CapacitorComponent(String is, long tier, long current, long energyMax) {
+ unlocalizedName = is;
+ this.tier = tier;
+ this.current = current;
+ this.energyMax = energyMax;
+ componentBinds.put(unlocalizedName, this);
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Tesla Capacitor registered: " + unlocalizedName);
+ }
+ }
+
+ @Override
+ public int compareTo(CapacitorComponent o) {
+ return unlocalizedName.compareTo(o.unlocalizedName);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CapacitorComponent) {
+ return compareTo((CapacitorComponent) obj) == 0;
+ }
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java
new file mode 100644
index 0000000000..e4b279e46d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java
@@ -0,0 +1,133 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.util.CommonValues.MOVE_AT;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+/**
+ * Created by danie_000 on 27.10.2016.
+ */
+public class GT_MetaTileEntity_Hatch_CreativeData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> {
+
+ public GT_MetaTileEntity_Hatch_CreativeData(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.debug.tt.data.desc.0"),
+ translateToLocal("gt.blockmachines.debug.tt.data.desc.1"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.data.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_CreativeData(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CreativeData(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) {
+ return new QuantumDataPacket(nbt);
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return isOutputFacing(side);
+ }
+
+ @Override
+ public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ IConnectsToDataPipe current = this, source = this, next;
+ int range = 0;
+ while ((next = current.getNext(source)) != null && range++ < 1000) {
+ if (next instanceof GT_MetaTileEntity_Hatch_InputData) {
+ ((GT_MetaTileEntity_Hatch_InputData) next).setContents(q);
+ break;
+ }
+ source = current;
+ current = next;
+ }
+ q = null;
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) {
+ IGregTechTileEntity base = getBaseMetaTileEntity();
+ byte color = base.getColorization();
+ if (color < 0) {
+ return null;
+ }
+ IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing());
+ if (next == null) {
+ return null;
+ }
+ IMetaTileEntity meta = next.getMetaTileEntity();
+ if (meta instanceof GT_MetaTileEntity_Pipe_Data) {
+ ((GT_MetaTileEntity_Pipe_Data) meta).markUsed();
+ return (IConnectsToDataPipe) meta;
+ } else if (meta instanceof GT_MetaTileEntity_Hatch_InputData
+ && ((GT_MetaTileEntity_Hatch_InputData) meta).getColorization() == color
+ && ((GT_MetaTileEntity_Hatch_InputData) meta).canConnectData(
+ base.getFrontFacing()
+ .getOpposite())) {
+ return (IConnectsToDataPipe) meta;
+ }
+ return null;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (MOVE_AT == aTick % 20) {
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ getBaseMetaTileEntity().setActive(true);
+ if (q == null) q = new QuantumDataPacket(0xFFFFFFFFL);
+ moveAround(aBaseMetaTileEntity);
+ } else {
+ q = null;
+ getBaseMetaTileEntity().setActive(false);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java
new file mode 100644
index 0000000000..b62375076b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java
@@ -0,0 +1,96 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.objects.GT_RenderedTexture;
+
+public class GT_MetaTileEntity_Hatch_CreativeMaintenance extends GT_MetaTileEntity_Hatch_Maintenance {
+
+ private static Textures.BlockIcons.CustomIcon face;
+
+ public GT_MetaTileEntity_Hatch_CreativeMaintenance(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_CreativeMaintenance(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures, false);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.THETA_MOVEMENT,
+ translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.0"), // For automatically maintaining
+ // Multiblocks
+ translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.1"), // Does fix everything but itself.
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.2") // Fixing is
+ // for plebs!
+ };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ face = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_FULLAUTOMAINTENANCE");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(face) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(face) };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CreativeMaintenance(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ 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;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java
new file mode 100644
index 0000000000..fa295721e5
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java
@@ -0,0 +1,58 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_Hatch_CreativeUncertainty extends GT_MetaTileEntity_Hatch_Uncertainty {
+
+ public GT_MetaTileEntity_Hatch_CreativeUncertainty(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_CreativeUncertainty(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CreativeUncertainty(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.debug.tt.certain.desc.0"), // Feeling
+ // certain,
+ // for
+ // sure
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.debug.tt.certain.desc.1") // Schrödinger's cat escaped the
+ // box
+ };
+ }
+
+ @Override
+ public void regenerate() {
+ // no-op
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && (aTick % 100) == 0) {
+ if (mode == 0) {
+ aBaseMetaTileEntity.setActive(false);
+ status = -128;
+ } else {
+ aBaseMetaTileEntity.setActive(true);
+ compute();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java
new file mode 100644
index 0000000000..e0ea91f090
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java
@@ -0,0 +1,202 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.util.CommonValues.MOVE_AT;
+import static gregtech.api.enums.Dyes.MACHINE_METAL;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.mechanics.dataTransport.DataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.util.TT_Utility;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by danie_000 on 11.12.2016.
+ */
+public abstract class GT_MetaTileEntity_Hatch_DataConnector<T extends DataPacket> extends GT_MetaTileEntity_Hatch
+ implements IConnectsToDataPipe {
+
+ public static Textures.BlockIcons.CustomIcon EM_D_SIDES;
+ public static Textures.BlockIcons.CustomIcon EM_D_ACTIVE;
+ public static Textures.BlockIcons.CustomIcon EM_D_CONN;
+
+ private String clientLocale = "en_US";
+
+ public T q;
+
+ public short id = -1;
+
+ protected GT_MetaTileEntity_Hatch_DataConnector(int aID, String aName, String aNameRegional, int aTier,
+ String[] descr) {
+ super(aID, aName, aNameRegional, aTier, 0, descr);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ protected GT_MetaTileEntity_Hatch_DataConnector(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ EM_D_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_EM_D_ACTIVE");
+ EM_D_SIDES = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_EM_D_SIDES");
+ EM_D_CONN = new Textures.BlockIcons.CustomIcon("iconsets/EM_DATA_CONN");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture(
+ EM_D_ACTIVE,
+ Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())),
+ new GT_RenderedTexture(EM_D_CONN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture(
+ EM_D_SIDES,
+ Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())),
+ new GT_RenderedTexture(EM_D_CONN) };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setShort("eID", id);
+ if (q != null) {
+ aNBT.setTag("eDATA", q.toNbt());
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ id = aNBT.getShort("eID");
+ if (aNBT.hasKey("eDATA")) {
+ q = loadPacketFromNBT(aNBT.getCompoundTag("eDATA"));
+ }
+ }
+
+ protected abstract T loadPacketFromNBT(NBTTagCompound nbt);
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (MOVE_AT == aTick % 20) {
+ if (q == null) {
+ getBaseMetaTileEntity().setActive(false);
+ } else {
+ getBaseMetaTileEntity().setActive(true);
+ moveAround(aBaseMetaTileEntity);
+ }
+ }
+ }
+ }
+
+ public abstract void moveAround(IGregTechTileEntity aBaseMetaTileEntity);
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ 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 boolean isFluidInputAllowed(FluidStack aFluid) {
+ 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 boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ if (id > 0) {
+ return new String[] {
+ translateToLocalFormatted("tt.keyword.ID", clientLocale) + ": " + EnumChatFormatting.AQUA + id,
+ translateToLocalFormatted("tt.keyword.Content", clientLocale) + ": "
+ + EnumChatFormatting.AQUA
+ + (q != null ? q.getContentString() : 0),
+ translateToLocalFormatted("tt.keyword.PacketHistory", clientLocale) + ": "
+ + EnumChatFormatting.RED
+ + (q != null ? q.getTraceSize() : 0), };
+ }
+ return new String[] {
+ translateToLocalFormatted("tt.keyword.Content", clientLocale) + ": "
+ + EnumChatFormatting.AQUA
+ + (q != null ? q.getContentString() : 0),
+ translateToLocalFormatted("tt.keyword.PacketHistory", clientLocale) + ": "
+ + EnumChatFormatting.RED
+ + (q != null ? q.getTraceSize() : 0), };
+ }
+
+ @Override
+ public byte getColorization() {
+ return getBaseMetaTileEntity().getColorization();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java
new file mode 100644
index 0000000000..7664f13f42
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java
@@ -0,0 +1,128 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+
+/**
+ * Created by danie_000 on 16.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_DynamoMulti extends GT_MetaTileEntity_Hatch {
+
+ public final int Amperes;
+
+ public GT_MetaTileEntity_Hatch_DynamoMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL,
+ translateToLocal("gt.blockmachines.hatch.dynamomulti.desc.0") }); // Multiple Ampere Energy
+ // Extractor for Multiblocks
+ Amperes = aAmp;
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_DynamoMulti(String aName, int aTier, int aAmp, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ Amperes = aAmp;
+ }
+
+ public GT_MetaTileEntity_Hatch_DynamoMulti(int aID, String aName, String aNameRegional, int aTier, int i,
+ String[] description, int aAmp) {
+ super(aID, aName, aNameRegional, aTier, 0, description);
+ Amperes = aAmp;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[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 128L * Amperes;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier] * 4L * Amperes;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return Amperes;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DynamoMulti(mName, mTier, Amperes, 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/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java
new file mode 100644
index 0000000000..d94370ed97
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java
@@ -0,0 +1,225 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT;
+import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+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 com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Created by danie_000 on 16.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_DynamoTunnel extends GT_MetaTileEntity_Hatch_DynamoMulti
+ implements IConnectsToEnergyTunnel {
+
+ public GT_MetaTileEntity_Hatch_DynamoTunnel(int ID, String unlocalisedName, String localisedName, int tier,
+ int amps) {
+ super(
+ ID,
+ unlocalisedName,
+ localisedName,
+ tier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL,
+ translateToLocal("gt.blockmachines.hatch.dynamotunnel.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.dynamotunnel.desc.1") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(amps * V[tier])
+ + EnumChatFormatting.RESET
+ + " EU/t" },
+ amps);
+
+ TT_Utility.setTier(tier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_DynamoTunnel(String aName, int aTier, int aAmp, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aAmp, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_OUT_LASER_TT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_OUT_LASER_TT[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 isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 24L * Amperes;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public ConnectionType getConnectionType() {
+ return ConnectionType.LASER;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DynamoTunnel(mName, mTier, Amperes, 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;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ byte Tick = (byte) (aTick % 20);
+ if (TRANSFER_AT == Tick) {
+ if (aBaseMetaTileEntity.getStoredEU() > 0) {
+ setEUVar(aBaseMetaTileEntity.getStoredEU() - Amperes);
+ if (aBaseMetaTileEntity.getStoredEU() < 0) {
+ setEUVar(0);
+ }
+ }
+ if (aBaseMetaTileEntity.getStoredEU() > getMinimumStoredEU()) {
+ moveAround(aBaseMetaTileEntity);
+ }
+ }
+ }
+ }
+
+ private void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ byte color = getBaseMetaTileEntity().getColorization();
+ if (color < 0) {
+ return;
+ }
+ final ForgeDirection front = aBaseMetaTileEntity.getFrontFacing();
+ final ForgeDirection opposite = front.getOpposite();
+ for (short dist = 1; dist < 1000; dist++) {
+
+ IGregTechTileEntity tGTTileEntity = aBaseMetaTileEntity
+ .getIGregTechTileEntityAtSideAndDistance(front, dist);
+ if (tGTTileEntity != null && tGTTileEntity.getColorization() == color) {
+ IMetaTileEntity aMetaTileEntity = tGTTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity != null) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyTunnel
+ && opposite == tGTTileEntity.getFrontFacing()) {
+ if (maxEUOutput() > ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) {
+ aMetaTileEntity.doExplosion(maxEUOutput());
+ setEUVar(aBaseMetaTileEntity.getStoredEU() - maxEUOutput());
+ return;
+ } else if (maxEUOutput()
+ == ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) {
+ long diff = Math.min(
+ Amperes * 20L * maxEUOutput(),
+ Math.min(
+ ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUStore()
+ - aMetaTileEntity.getBaseMetaTileEntity()
+ .getStoredEU(),
+ aBaseMetaTileEntity.getStoredEU()));
+
+ setEUVar(aBaseMetaTileEntity.getStoredEU() - diff);
+
+ ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).setEUVar(
+ aMetaTileEntity.getBaseMetaTileEntity()
+ .getStoredEU() + diff);
+ }
+ return;
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy) {
+ if (((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).connectionCount < 2) {
+ return;
+ } else {
+ ((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).markUsed();
+ }
+ } else {
+ return;
+ }
+ } else {
+ if (tGTTileEntity instanceof PowerLogicHost) {
+ PowerLogic logic = ((PowerLogicHost) tGTTileEntity).getPowerLogic(opposite);
+ if (logic == null || !logic.canUseLaser() || opposite != tGTTileEntity.getFrontFacing()) {
+ return;
+ }
+
+ long ampsUsed = logic.injectEnergy(maxEUOutput(), Amperes);
+ setEUVar(aBaseMetaTileEntity.getStoredEU() - ampsUsed * maxEUOutput());
+ }
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side) {
+ return isOutputFacing(side);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java
new file mode 100644
index 0000000000..20c3b993f5
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java
@@ -0,0 +1,134 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+
+/**
+ * Created by danie_000 on 16.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_EnergyMulti extends GT_MetaTileEntity_Hatch {
+
+ public final int Amperes;
+
+ public GT_MetaTileEntity_Hatch_EnergyMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.hatch.energymulti.desc.0"),
+ translateToLocalFormatted("gt.blockmachines.hatch.energymulti.desc.2", aAmp + (aAmp >> 2)),
+ translateToLocalFormatted("gt.blockmachines.hatch.energymulti.desc.3", aAmp) });
+ Amperes = aAmp;
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_EnergyMulti(String aName, int aTier, int aAmp, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ Amperes = aAmp;
+ }
+
+ public GT_MetaTileEntity_Hatch_EnergyMulti(int aID, String aName, String aNameRegional, int aTier, int i,
+ String[] description, int aAmp) {
+ super(aID, aName, aNameRegional, aTier, 0, description);
+ Amperes = aAmp;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[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 128L * Amperes;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier] * 4L * Amperes;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return Amperes + (Amperes >> 2);
+ }
+
+ @Override
+ public long maxWorkingAmperesIn() {
+ return Amperes;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_EnergyMulti(mName, mTier, Amperes, 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/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java
new file mode 100644
index 0000000000..30b8f32685
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java
@@ -0,0 +1,152 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT;
+import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Created by danie_000 on 16.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_EnergyTunnel extends GT_MetaTileEntity_Hatch_EnergyMulti
+ implements IConnectsToEnergyTunnel {
+
+ public GT_MetaTileEntity_Hatch_EnergyTunnel(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL,
+ translateToLocal("gt.blockmachines.hatch.energytunnel.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.energytunnel.desc.1") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(aAmp * V[aTier])
+ + EnumChatFormatting.RESET
+ + " EU/t" },
+ aAmp); // Energy injecting terminal for Multiblocks
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_EnergyTunnel(String aName, int aTier, int aAmp, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aAmp, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_LASER_TT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_LASER_TT[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 isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 24L * Amperes;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public ConnectionType getConnectionType() {
+ return ConnectionType.LASER;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_EnergyTunnel(mName, mTier, Amperes, 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;
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ byte Tick = (byte) (aTick % 20);
+ if (TRANSFER_AT == Tick) {
+ if (aBaseMetaTileEntity.getStoredEU() > 0) {
+ setEUVar(aBaseMetaTileEntity.getStoredEU() - Amperes);
+ if (aBaseMetaTileEntity.getStoredEU() < 0) {
+ setEUVar(0);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java
new file mode 100644
index 0000000000..38dd876553
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java
@@ -0,0 +1,181 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+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.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by Tec on 03.04.2017.
+ */
+public class GT_MetaTileEntity_Hatch_Holder extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo {
+
+ private static Textures.BlockIcons.CustomIcon EM_H;
+ private static Textures.BlockIcons.CustomIcon EM_H_ACTIVE;
+
+ public GT_MetaTileEntity_Hatch_Holder(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.holder.desc.0"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.holder.desc.1") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_Holder(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ EM_H_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/EM_HOLDER_ACTIVE");
+ EM_H = new Textures.BlockIcons.CustomIcon("iconsets/EM_HOLDER");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_H_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_H) };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Holder(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ // if(aBaseMetaTileEntity.isActive())
+ // aPlayer.addChatComponentMessage(new ChatComponentText("It is still active..."));
+ // else if(heat>0)
+ // aPlayer.addChatComponentMessage(new ChatComponentText("It is still warm..."));
+ // else
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO)
+ .setSize(18, 18)
+ .setPos(151, 63));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK)
+ .setPos(46, 17)
+ .setSize(84, 60))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_RACK_LARGE)
+ .setPos(68, 27)
+ .setSize(40, 40))
+ .widget(new SlotWidget(new BaseSlot(inventoryHandler, 0) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !getBaseMetaTileEntity().isActive();
+ }
+ }).setPos(79, 38))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16)
+ .setPos(152, 24)
+ .setSize(16, 16))
+ .widget(
+ new DrawableWidget()
+ .setDrawable(
+ () -> getBaseMetaTileEntity().isActive() ? TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON
+ : TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED)
+ .setPos(152, 24)
+ .setSize(16, 16))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java
new file mode 100644
index 0000000000..03c9cfbf3c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java
@@ -0,0 +1,102 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+/**
+ * Created by danie_000 on 27.10.2016.
+ */
+public class GT_MetaTileEntity_Hatch_InputData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> {
+
+ private boolean delDelay = true;
+
+ public GT_MetaTileEntity_Hatch_InputData(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.datain.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.datain.desc.1"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.datain.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_InputData(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputData(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) {
+ return new QuantumDataPacket(nbt);
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source) {
+ return null;
+ }
+
+ public void setContents(QuantumDataPacket qIn) {
+ if (qIn == null) {
+ this.q = null;
+ } else {
+ if (qIn.getContent() > 0) {
+ this.q = qIn;
+ delDelay = true;
+ } else {
+ this.q = null;
+ }
+ }
+ }
+
+ @Override
+ public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (delDelay) {
+ delDelay = false;
+ } else {
+ setContents(null);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java
new file mode 100644
index 0000000000..50e9eebd76
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java
@@ -0,0 +1,246 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem;
+import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_ACTIVE;
+import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_CONN;
+import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_SIDES;
+import static com.github.technus.tectech.util.CommonValues.MOVE_AT;
+import static gregtech.api.enums.Dyes.MACHINE_METAL;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.ArrayList;
+
+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.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.objects.GT_RenderedTexture;
+
+public class GT_MetaTileEntity_Hatch_InputDataItems extends GT_MetaTileEntity_Hatch_DataAccess
+ implements IConnectsToDataPipe {
+
+ public boolean delDelay = true;
+ private ItemStack[] stacks;
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_Hatch_InputDataItems(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_InputDataItems(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture(
+ EM_D_ACTIVE,
+ Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())),
+ new GT_RenderedTexture(EM_D_CONN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture(
+ EM_D_SIDES,
+ Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())),
+ new GT_RenderedTexture(EM_D_CONN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputDataItems(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source) {
+ return null;
+ }
+
+ public void setContents(InventoryDataPacket iIn) {
+ if (iIn == null) {
+ stacks = null;
+ } else {
+ if (iIn.getContent().length > 0) {
+ stacks = iIn.getContent();
+ delDelay = true;
+ } else {
+ stacks = null;
+ }
+ }
+ }
+
+ @Override
+ public void onRemoval() {
+ stacks = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ NBTTagCompound stacksTag = new NBTTagCompound();
+ if (stacks != null) {
+ stacksTag.setInteger("count", stacks.length);
+ for (int i = 0; i < stacks.length; i++) {
+ stacksTag.setTag(Integer.toString(i), stacks[i].writeToNBT(new NBTTagCompound()));
+ }
+ }
+ aNBT.setTag("data_stacks", stacksTag);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ NBTTagCompound stacksTag = aNBT.getCompoundTag("data_stacks");
+ int count = stacksTag.getInteger("count");
+ if (count > 0) {
+ ArrayList<ItemStack> stacks = new ArrayList<>();
+ for (int i = 0; i < count; i++) {
+ ItemStack stack = ItemStack.loadItemStackFromNBT(stacksTag.getCompoundTag(Integer.toString(i)));
+ if (stack != null) {
+ stacks.add(stack);
+ }
+ }
+ if (stacks.size() > 0) {
+ this.stacks = stacks.toArray(nullItem);
+ }
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return stacks != null ? stacks.length : 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ return stacks != null && aIndex < stacks.length ? stacks[aIndex] : null;
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ return false;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if (MOVE_AT == aTick % 20) {
+ if (stacks == null) {
+ getBaseMetaTileEntity().setActive(false);
+ } else {
+ getBaseMetaTileEntity().setActive(true);
+ if (delDelay) {
+ delDelay = false;
+ } else {
+ setContents(null);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.datainass.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.datainass.desc.1"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.datainass.desc.2") };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { translateToLocalFormatted("tt.keyphrase.Content_Stack_Count", clientLocale) + ": "
+ + (stacks == null ? 0 : stacks.length) };
+ }
+
+ @Override
+ public byte getColorization() {
+ return getBaseMetaTileEntity().getColorization();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java
new file mode 100644
index 0000000000..7e769123bc
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java
@@ -0,0 +1,116 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+/**
+ * Created by danie_000 on 27.10.2016.
+ */
+public class GT_MetaTileEntity_Hatch_OutputData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> {
+
+ public GT_MetaTileEntity_Hatch_OutputData(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.dataout.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.dataout.desc.1"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.dataout.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputData(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputData(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) {
+ return new QuantumDataPacket(nbt);
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return isOutputFacing(side);
+ }
+
+ @Override
+ public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ IConnectsToDataPipe current = this, source = this, next;
+ int range = 0;
+ while ((next = current.getNext(source)) != null && range++ < 1000) {
+ if (next instanceof GT_MetaTileEntity_Hatch_InputData) {
+ ((GT_MetaTileEntity_Hatch_InputData) next).setContents(q);
+ break;
+ }
+ source = current;
+ current = next;
+ }
+ q = null;
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) {
+ IGregTechTileEntity base = getBaseMetaTileEntity();
+ byte color = base.getColorization();
+ if (color < 0) {
+ return null;
+ }
+ IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing());
+ if (next == null) {
+ return null;
+ }
+ IMetaTileEntity meta = next.getMetaTileEntity();
+ if (meta instanceof GT_MetaTileEntity_Pipe_Data) {
+ ((GT_MetaTileEntity_Pipe_Data) meta).markUsed();
+ return (IConnectsToDataPipe) meta;
+ } else if (meta instanceof GT_MetaTileEntity_Hatch_InputData
+ && ((GT_MetaTileEntity_Hatch_InputData) meta).getColorization() == color
+ && ((GT_MetaTileEntity_Hatch_InputData) meta).canConnectData(
+ base.getFrontFacing()
+ .getOpposite())) {
+ return (IConnectsToDataPipe) meta;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java
new file mode 100644
index 0000000000..0cdf1b969b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java
@@ -0,0 +1,141 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_OutputDataItems
+ extends GT_MetaTileEntity_Hatch_DataConnector<InventoryDataPacket> {
+
+ public GT_MetaTileEntity_Hatch_OutputDataItems(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.dataoutass.desc.0"),
+ translateToLocal("gt.blockmachines.hatch.dataoutass.desc.1"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.dataoutass.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputDataItems(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputDataItems(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.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 int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ protected InventoryDataPacket loadPacketFromNBT(NBTTagCompound nbt) {
+ return new InventoryDataPacket(nbt);
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return isInputFacing(side);
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return isOutputFacing(side);
+ }
+
+ @Override
+ public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ IConnectsToDataPipe current = this, source = this, next;
+ int range = 0;
+ while ((next = current.getNext(source)) != null && range++ < 1000) {
+ if (next instanceof GT_MetaTileEntity_Hatch_InputDataItems) {
+ ((GT_MetaTileEntity_Hatch_InputDataItems) next).setContents(q);
+ break;
+ }
+ source = current;
+ current = next;
+ }
+ q = null;
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) {
+ IGregTechTileEntity base = getBaseMetaTileEntity();
+ byte color = base.getColorization();
+ if (color < 0) {
+ return null;
+ }
+ IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing());
+ if (next == null) {
+ return null;
+ }
+ IMetaTileEntity meta = next.getMetaTileEntity();
+ if (meta instanceof GT_MetaTileEntity_Pipe_Data) {
+ ((GT_MetaTileEntity_Pipe_Data) meta).markUsed();
+ return (IConnectsToDataPipe) meta;
+ } else if (meta instanceof GT_MetaTileEntity_Hatch_InputDataItems
+ && ((GT_MetaTileEntity_Hatch_InputDataItems) meta).getColorization() == color
+ && ((GT_MetaTileEntity_Hatch_InputDataItems) meta).canConnectData(
+ base.getFrontFacing()
+ .getOpposite())) {
+ return (IConnectsToDataPipe) meta;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java
new file mode 100644
index 0000000000..90f0267695
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java
@@ -0,0 +1,559 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+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.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_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by danie_000 on 15.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_Param extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo, IAddUIWidgets {
+
+ public int pointer = 0;
+ public int param = -1;
+ public double value0D = 0;
+ public double value1D = 0;
+ public double input0D = 0;
+ public double input1D = 0;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_Hatch_Param(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL,
+ EnumChatFormatting.DARK_RED
+ + "Deprecated; Now you can set parameter by clicking LED on multiblock GUI.",
+ EnumChatFormatting.DARK_RED
+ + "If it doesn't work, try removing Parametrizer from multiblock structure." });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_Param(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/PARAM");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/PARAM_ACTIVE");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenON) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenOFF) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Param(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ translateToLocalFormatted("tt.keyword.Parametrizer", clientLocale) + " "
+ + translateToLocalFormatted("tt.keyword.ID", clientLocale)
+ + ": "
+ + EnumChatFormatting.GREEN
+ + param,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0D: " + EnumChatFormatting.AQUA + value0D,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1D: " + EnumChatFormatting.BLUE + value1D,
+ translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 0D: " + EnumChatFormatting.GOLD + input0D,
+ translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 1D: "
+ + EnumChatFormatting.YELLOW
+ + input1D, };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ 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 saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("ePointer", pointer);
+ aNBT.setDouble("eValue0D", value0D);
+ aNBT.setDouble("eValue1D", value1D);
+ aNBT.setDouble("eInput0D", input0D);
+ aNBT.setDouble("eInput1D", input1D);
+ aNBT.setInteger("eParam", param);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ pointer = aNBT.getInteger("ePointer");
+ if (aNBT.hasKey("eFloats") || aNBT.hasKey("eValue0i")
+ || aNBT.hasKey("eValue1i")
+ || aNBT.hasKey("eInput0i")
+ || aNBT.hasKey("eInput1i")) {
+ boolean usesFloat = aNBT.getBoolean("eFloats");
+ if (usesFloat) {
+ value0D = Double.longBitsToDouble(aNBT.getLong("eValue0i"));
+ value1D = Double.longBitsToDouble(aNBT.getLong("eValue1i"));
+ input0D = Double.longBitsToDouble(aNBT.getLong("eInput0i"));
+ input1D = Double.longBitsToDouble(aNBT.getLong("eInput1i"));
+ } else {
+ value0D = aNBT.getLong("eValue0i");
+ value1D = aNBT.getLong("eValue1i");
+ input0D = aNBT.getLong("eInput0i");
+ input1D = aNBT.getLong("eInput1i");
+ }
+ } else {
+ value0D = aNBT.getDouble("eValue0D");
+ value1D = aNBT.getDouble("eValue1D");
+ input0D = aNBT.getDouble("eInput0D");
+ input1D = aNBT.getDouble("eInput1D");
+ }
+ param = aNBT.getInteger("eParam");
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK)
+ .setSize(18, 18)
+ .setPos(112, 55));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final boolean isAdvanced = mTier > 5;
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
+ .setPos(43, 4)
+ .setSize(90, 72));
+
+ addChangeParamButton(
+ builder,
+ (shift, columnPointer, secondRow) -> param -= shift ? 16 : 4,
+ 7,
+ 4,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ secondRow.set(false);
+ } else {
+ columnPointer.addAndGet(shift ? -16 : -4);
+ }
+ } else {
+ value0D -= shift ? 4096 : 256;
+ }
+ }, 7, 22, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ columnPointer.addAndGet(shift ? -16 : -4);
+ } else {
+ secondRow.set(true);
+ }
+ } else {
+ value1D -= shift ? 4096 : 256;
+ }
+ }, 7, 40, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (shift) {
+ if (secondRow.get()) {
+ value1D = Double.longBitsToDouble(0xFFFF_FFFF_FFFF_FFFFL);
+ } else {
+ value0D = Double.longBitsToDouble(0xFFFF_FFFF_FFFF_FFFFL);
+ }
+ } else {
+ if (secondRow.get()) {
+ long temp = Double.doubleToLongBits(value1D);
+ temp |= 1L << (long) columnPointer.get();
+ value1D = Double.longBitsToDouble(temp);
+ } else {
+ long temp = Double.doubleToLongBits(value0D);
+ temp |= 1L << (long) columnPointer.get();
+ value0D = Double.longBitsToDouble(temp);
+ }
+ }
+ } else {
+ value0D /= shift ? 4096 : 256;
+ value1D /= shift ? 4096 : 256;
+ }
+ },
+ 7,
+ 58,
+ isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_S : GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+
+ addChangeParamButton(
+ builder,
+ (shift, columnPointer, secondRow) -> param -= shift ? 2 : 1,
+ 25,
+ 4,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL,
+ TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ secondRow.set(false);
+ } else {
+ columnPointer.addAndGet(shift ? -2 : -1);
+ }
+ } else {
+ value0D -= shift ? 16 : 1;
+ }
+ }, 25, 22, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ columnPointer.addAndGet(shift ? -2 : -1);
+ } else {
+ secondRow.set(true);
+ }
+ } else {
+ value1D -= shift ? 16 : 1;
+ }
+ }, 25, 40, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (shift) {
+ if (secondRow.get()) {
+ value1D = Double.longBitsToDouble(0);
+ } else {
+ value0D = Double.longBitsToDouble(0);
+ }
+ } else {
+ if (secondRow.get()) {
+ long temp = Double.doubleToLongBits(value1D);
+ temp &= ~(1L << (long) columnPointer.get());
+ value1D = Double.longBitsToDouble(temp);
+ } else {
+ long temp = Double.doubleToLongBits(value0D);
+ temp &= ~(1L << (long) columnPointer.get());
+ value0D = Double.longBitsToDouble(temp);
+ }
+ }
+ } else {
+ value0D /= shift ? 16 : 2;
+ value1D /= shift ? 16 : 2;
+ }
+ },
+ 25,
+ 58,
+ isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_C : GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL,
+ isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_X);
+
+ addChangeParamButton(
+ builder,
+ (shift, columnPointer, secondRow) -> param += shift ? 2 : 1,
+ 133,
+ 4,
+ GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL,
+ TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ secondRow.set(false);
+ } else {
+ columnPointer.addAndGet(shift ? 2 : 1);
+ }
+ } else {
+ value0D += shift ? 16 : 1;
+ }
+ }, 133, 22, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ columnPointer.addAndGet(shift ? 2 : 1);
+ } else {
+ secondRow.set(true);
+ }
+ } else {
+ value1D += shift ? 16 : 1;
+ }
+ }, 133, 40, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (shift) {
+ if (secondRow.get()) {
+ value1D = Double.longBitsToDouble(~Double.doubleToLongBits(value1D));
+ } else {
+ value0D = Double.longBitsToDouble(~Double.doubleToLongBits(value1D));
+ }
+ } else {
+ if (secondRow.get()) {
+ long temp = Double.doubleToLongBits(value1D);
+ temp ^= 1L << (long) columnPointer.get();
+ value1D = Double.longBitsToDouble(temp);
+ } else {
+ long temp = Double.doubleToLongBits(value0D);
+ temp ^= 1L << (long) columnPointer.get();
+ value0D = Double.longBitsToDouble(temp);
+ }
+ }
+ } else {
+ value0D *= shift ? 16 : 2;
+ value1D *= shift ? 16 : 2;
+ }
+ },
+ 133,
+ 58,
+ isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_T : GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL,
+ isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+
+ addChangeParamButton(
+ builder,
+ (shift, columnPointer, secondRow) -> param += shift ? 16 : 4,
+ 151,
+ 4,
+ GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE,
+ TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ secondRow.set(false);
+ } else {
+ columnPointer.addAndGet(shift ? 16 : 4);
+ }
+ } else {
+ value0D += shift ? 4096 : 256;
+ }
+ }, 151, 22, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ if (secondRow.get()) {
+ columnPointer.addAndGet(shift ? 16 : 4);
+ } else {
+ secondRow.set(true);
+ }
+ } else {
+ value1D += shift ? 4096 : 256;
+ }
+ }, 151, 40, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1);
+ addChangeParamButton(builder, (shift, columnPointer, secondRow) -> {
+ if (isAdvanced) {
+ value0D = input0D;
+ value1D = input1D;
+ } else {
+ value0D *= shift ? 4096 : 256;
+ value1D *= shift ? 4096 : 256;
+ }
+ },
+ 151,
+ 58,
+ isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_IF : GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE,
+ isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID);
+
+ builder.widget(new FakeSyncWidget.IntegerSyncer(() -> pointer, val -> pointer = val))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> param, val -> param = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> value0D, val -> value0D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> value1D, val -> value1D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> input0D, val -> input0D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> input1D, val -> input1D = val));
+
+ final String CIRCLED_0 = "\u24EA";
+ final String CIRCLED_1 = "\u2460";
+ final String ARROW_DOWN = "\u2b07";
+ final String ARROW_UP = "\u2b06";
+ builder.widget(
+ TextWidget.dynamicString(() -> (isAdvanced ? "Parameters X: " : "Parameters: ") + param)
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 7))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_DOWN + TT_Utility.formatNumberExp(input0D))
+ .setSynced(false)
+ .setDefaultColor(0x22ddff)
+ .setPos(46, 16))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_DOWN + TT_Utility.formatNumberExp(input1D))
+ .setSynced(false)
+ .setDefaultColor(0x00ffff)
+ .setPos(46, 24))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_UP + TT_Utility.formatNumberExp(value0D))
+ .setSynced(false)
+ .setDefaultColor(0x00bbff)
+ .setPos(46, 33))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_UP + TT_Utility.formatNumberExp(value1D))
+ .setSynced(false)
+ .setDefaultColor(0x0077ff)
+ .setPos(46, 41))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> CIRCLED_0 + ARROW_UP + TT_Utility.longBitsToShortString(Double.doubleToLongBits(value0D)))
+ .setSynced(false)
+ .setDefaultColor(0x00bbff)
+ .setScale(.5f)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(46, 50))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> CIRCLED_1 + ARROW_UP + TT_Utility.longBitsToShortString(Double.doubleToLongBits(value1D)))
+ .setSynced(false)
+ .setDefaultColor(0x0077ff)
+ .setScale(.5f)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(46, 58));
+ if (isAdvanced) {
+ builder.widget(
+ TextWidget.dynamicString(
+ () -> "Pointer " + Integer.toHexString(pointer | 0x10000)
+ .substring(1))
+ .setSynced(false)
+ .setDefaultColor(0x0033ff)
+ .setPos(46, 66));
+ }
+ }
+
+ private void addChangeParamButton(ModularWindow.Builder builder, OnClick onClick, int xPos, int yPos,
+ IDrawable overlay1, IDrawable overlay2) {
+ final boolean isAdvanced = mTier > 5;
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ AtomicInteger columnPointer = new AtomicInteger(pointer & 0xff);
+ AtomicBoolean secondRow = new AtomicBoolean((pointer & 0x0100) != 0);
+ onClick.accept(clickData.shift, columnPointer, secondRow);
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (isAdvanced) {
+ if (columnPointer.get() >= 64) {
+ columnPointer.set(63);
+ } else if (columnPointer.get() < 0) {
+ columnPointer.set(0);
+ }
+ pointer = secondRow.get() ? columnPointer.get() + 0x100 : columnPointer.get();
+ }
+ if (param > 9) {
+ param = 9;
+ } else if (param < -1) {
+ param = -1;
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(
+ overlay2 != null ? new IDrawable[] { GT_UITextures.BUTTON_STANDARD, overlay1, overlay2 }
+ : new IDrawable[] { GT_UITextures.BUTTON_STANDARD, overlay1 })
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+
+ @FunctionalInterface
+ private interface OnClick {
+
+ void accept(boolean shift, AtomicInteger columnPointer, AtomicBoolean secondRow);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java
new file mode 100644
index 0000000000..42a7e0cd81
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java
@@ -0,0 +1,291 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+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.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.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 com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+/**
+ * Created by danie_000 on 15.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_ParamText extends GT_MetaTileEntity_Hatch_Param {
+
+ public String value0s = "";
+ public String value1s = "";
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_Hatch_ParamText(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_ParamText(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Hatch_ParamText(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ translateToLocalFormatted("tt.keyword.Parametrizer", clientLocale) + " "
+ + translateToLocalFormatted("tt.keyword.ID", clientLocale)
+ + ": "
+ + EnumChatFormatting.GREEN
+ + param,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0S: "
+ + EnumChatFormatting.DARK_AQUA
+ + value0s,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1S: "
+ + EnumChatFormatting.DARK_BLUE
+ + value1s,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0D: " + EnumChatFormatting.AQUA + value0D,
+ translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1D: " + EnumChatFormatting.BLUE + value1D,
+ translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 0D: " + EnumChatFormatting.GOLD + input0D,
+ translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 1D: "
+ + EnumChatFormatting.YELLOW
+ + input1D, };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ 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 saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setString("eIeValue0S", value0s);
+ aNBT.setString("eIeValue1S", value1s);
+ aNBT.removeTag("ePointer");
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ value0s = aNBT.getString("eIeValue0S");
+ value1s = aNBT.getString("eIeValue1S");
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_GENERAL,
+ EnumChatFormatting.DARK_RED + "Deprecated; Now you can set parameter by clicking LED on multiblock GUI.",
+ EnumChatFormatting.DARK_RED + "If it doesn't work, try removing Parametrizer from multiblock structure.", };
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK)
+ .setSize(18, 18)
+ .setPos(148, 55));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_PARAMETRIZER_TXT)
+ .setPos(7, 4)
+ .setSize(162, 72));
+
+ addChangeNumberButton(builder, -16, -4, 7, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE);
+ addChangeNumberButton(builder, -2, -1, 25, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL);
+ addChangeNumberButton(builder, 2, 1, 133, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL);
+ addChangeNumberButton(builder, 16, 4, 151, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE);
+
+ builder.widget(new FakeSyncWidget.IntegerSyncer(() -> param, val -> param = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> value0D, val -> value0D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> value1D, val -> value1D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> input0D, val -> input0D = val))
+ .widget(new FakeSyncWidget.DoubleSyncer(() -> input1D, val -> input1D = val));
+ // .widget(new FakeSyncWidget.StringSyncer(() -> value0s, val -> value0s = val))
+ // .widget(new FakeSyncWidget.StringSyncer(() -> value1s, val -> value1s = val));
+
+ final String CIRCLED_0 = "\u24EA";
+ final String CIRCLED_1 = "\u2460";
+ final String ARROW_DOWN = "\u2b07";
+ final String ARROW_UP = "\u2b06";
+ builder.widget(
+ TextWidget.dynamicString(() -> "Parameters: " + param)
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 7))
+ .widget(
+ new TextWidget(CIRCLED_0 + ARROW_UP).setDefaultColor(0x00bbff)
+ .setPos(10, 29))
+ .widget(
+ new TextWidget(CIRCLED_1 + ARROW_UP).setDefaultColor(0x0077ff)
+ .setPos(10, 44))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_DOWN + TT_Utility.formatNumberExp(input0D))
+ .setSynced(false)
+ .setDefaultColor(0x22ddff)
+ .setPos(10, 56))
+ .widget(
+ TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_DOWN + TT_Utility.formatNumberExp(input1D))
+ .setSynced(false)
+ .setDefaultColor(0x00ffff)
+ .setPos(10, 65));
+
+ addTextField(builder, true);
+ addTextField(builder, false);
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, int changeNumberShift, int changeNumber, int xPos,
+ IDrawable overlay) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ param += clickData.shift ? changeNumberShift : changeNumber;
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (param > 9) {
+ param = 9;
+ } else if (param < -1) {
+ param = -1;
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID)
+ .setSize(18, 18)
+ .setPos(xPos, 4));
+ }
+
+ private void addTextField(ModularWindow.Builder builder, boolean isIndex0) {
+ TextFieldWidget widget = new TextFieldWidget();
+ builder.widget(
+ widget.setGetter(() -> isIndex0 ? value0s : value1s)
+ .setSetter(str -> {
+ double val;
+ try {
+ val = parse(str);
+ } catch (Exception e) {
+ // This shouldn't happen as long as validator works
+ str = "";
+ val = 0;
+ }
+ if (isIndex0) {
+ value0s = str;
+ value0D = val;
+ } else {
+ value1s = str;
+ value1D = val;
+ }
+ })
+ .setValidator(str -> {
+ try {
+ parse(str);
+ return str;
+ } catch (Exception e) {
+ return widget.getLastText()
+ .size() > 0 ? widget.getLastText()
+ .get(0) : "";
+ }
+ })
+ .setTextColor(Color.WHITE.dark(1))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2))
+ .setPos(26, isIndex0 ? 26 : 41)
+ .setSize(138, 12));
+ }
+
+ private double parse(String str) {
+ double val;
+ if (str.contains("b")) {
+ String[] split = str.split("b");
+ val = TT_Utility.bitStringToInt(split[0].replaceAll("[^-]", "") + split[1].replaceAll("_", ""));
+ } else if (str.contains("x")) {
+ String[] split = str.split("x");
+ val = TT_Utility.hexStringToInt(split[0].replaceAll("[^-]", "") + split[1].replaceAll("_", ""));
+ } else {
+ val = TT_Utility.stringToDouble(str);
+ }
+ return val;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java
new file mode 100644
index 0000000000..2b65ba607e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java
@@ -0,0 +1,470 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT;
+import static com.github.technus.tectech.util.TT_Utility.getUniqueIdentifier;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.OpenComputers;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.HashMap;
+import java.util.Map;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+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.gui.modularui.GT_UIInfos;
+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;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by Tec on 03.04.2017.
+ */
+public class GT_MetaTileEntity_Hatch_Rack extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static Textures.BlockIcons.CustomIcon EM_R;
+ private static Textures.BlockIcons.CustomIcon EM_R_ACTIVE;
+ public int heat = 0;
+ private float overClock = 1, overVolt = 1;
+ private static final Map<String, RackComponent> componentBinds = new HashMap<>();
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_Hatch_Rack(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 4,
+ new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.rack.desc.0"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.rack.desc.1") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_Rack(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("eHeat", heat);
+ aNBT.setFloat("eOverClock", overClock);
+ aNBT.setFloat("eOverVolt", overVolt);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ heat = aNBT.getInteger("eHeat");
+ overClock = aNBT.getFloat("eOverClock");
+ overVolt = aNBT.getFloat("eOverVolt");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ EM_R_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/EM_RACK_ACTIVE");
+ EM_R = new Textures.BlockIcons.CustomIcon("iconsets/EM_RACK");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_R_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_R) };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Rack(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (aBaseMetaTileEntity.isActive() || heat > 500) {
+ return false;
+ }
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (aBaseMetaTileEntity.isActive() || heat > 500) {
+ return false;
+ }
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ // if(aBaseMetaTileEntity.isActive())
+ // aPlayer.addChatComponentMessage(new ChatComponentText("It is still active..."));
+ // else if(heat>0)
+ // aPlayer.addChatComponentMessage(new ChatComponentText("It is still warm..."));
+ // else
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ private int getComputationPower(float overclock, float overvolt, boolean tickingComponents) {
+ float computation = 0, heat = 0;
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] == null || mInventory[i].stackSize != 1) {
+ continue;
+ }
+ RackComponent comp = componentBinds.get(getUniqueIdentifier(mInventory[i]));
+ if (comp == null) {
+ continue;
+ }
+ if (tickingComponents) {
+ if (this.heat > comp.maxHeat) {
+ mInventory[i] = null;
+ continue;
+ } else if (comp.subZero || this.heat >= 0) {
+ heat += (1f + comp.coEff * this.heat / 10000f)
+ * (comp.heat > 0 ? comp.heat * overclock * overclock * overvolt : comp.heat);
+ // =MAX(0;MIN(MIN($B4;1*C$3+C$3-0,25);1+RAND()+(C$3-1)-($B4-1)/2))
+ if (overvolt * 10f > 7f + TecTech.RANDOM.nextFloat()) {
+ computation += comp.computation * Math.max(
+ 0,
+ Math.min(
+ Math.min(overclock, overvolt + overvolt - 0.25),
+ 1 + TecTech.RANDOM.nextFloat() + (overvolt - 1) - (overclock - 1) / 2));
+ }
+ }
+ } else {
+ computation += comp.computation * overclock;
+ }
+ }
+ if (tickingComponents) {
+ this.heat += Math.ceil(heat);
+ }
+ return (int) Math.floor(computation);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ public int tickComponents(float oc, float ov) {
+ if (oc > 3 + TecTech.RANDOM.nextFloat() || ov > 2 + TecTech.RANDOM.nextFloat()) {
+ getBaseMetaTileEntity().setToFire();
+ }
+ overClock = oc;
+ overVolt = ov;
+ return getComputationPower(overClock, overVolt, true);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (aTick % 20 == MULTI_CHECK_AT) {
+ if (heat > 0) {
+ float heatC = 0;
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] == null || mInventory[i].stackSize != 1) {
+ continue;
+ }
+ RackComponent comp = componentBinds.get(getUniqueIdentifier(mInventory[i]));
+ if (comp == null) {
+ continue;
+ }
+ if (heat > comp.maxHeat) {
+ mInventory[i] = null;
+ } else if (comp.heat < 0) {
+ heatC += comp.heat * (heat / 10000f);
+ }
+ }
+ heat += Math.max(-heat, Math.ceil(heatC));
+ }
+
+ if (heat > 0) {
+ heat -= Math.max(heat / 1000, 1);
+ } else if (heat < 0) {
+ heat -= Math.min(heat / 1000, -1);
+ }
+
+ if (heat > 10000) {
+ aBaseMetaTileEntity.setToFire();
+ } else if (heat > 9000) {
+ aBaseMetaTileEntity.setOnFire();
+ } else if (heat < -10000) {
+ heat = -10000;
+ }
+ }
+ }
+ }
+
+ @Override
+ public int getSizeInventory() { // HACK TO NOT DROP CONTENTS!!!
+ return heat > 500 || getBaseMetaTileEntity().isActive() ? 0 : mInventory.length;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ translateToLocalFormatted("tt.keyphrase.Base_computation", clientLocale) + ": "
+ + EnumChatFormatting.AQUA
+ + getComputationPower(1, 0, false),
+ translateToLocalFormatted("tt.keyphrase.After_overclocking", clientLocale) + ": "
+ + EnumChatFormatting.AQUA
+ + getComputationPower(overClock, 0, false),
+ translateToLocalFormatted("tt.keyphrase.Heat_Accumulated", clientLocale) + ": "
+ + EnumChatFormatting.RED
+ + (heat + 99) / 100
+ + EnumChatFormatting.RESET
+ + " %" };
+ // heat==0? --> ((heat+9)/10) = 0
+ // Heat==1-10? --> 1
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO)
+ .setSize(18, 18)
+ .setPos(151, 63));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK)
+ .setPos(46, 17)
+ .setSize(84, 60));
+
+ Pos2d[] positions = new Pos2d[] { new Pos2d(68, 27), new Pos2d(90, 27), new Pos2d(68, 49), new Pos2d(90, 49), };
+ for (int i = 0; i < positions.length; i++) {
+ builder.widget(new SlotWidget(new BaseSlot(inventoryHandler, i) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !getBaseMetaTileEntity().isActive() && heat <= 0;
+ }
+ }).setBackground(getGUITextureSet().getItemSlot(), TecTechUITextures.OVERLAY_SLOT_RACK)
+ .setPos(positions[i]));
+
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16)
+ .setPos(152, 24)
+ .setSize(16, 16))
+ .widget(
+ new DrawableWidget()
+ .setDrawable(
+ () -> getBaseMetaTileEntity().isActive() ? TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON
+ : TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED)
+ .setPos(152, 24)
+ .setSize(16, 16))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16)
+ .setPos(152, 41)
+ .setSize(16, 16))
+ .widget(
+ new DrawableWidget()
+ .setDrawable(
+ () -> heat > 0 ? TecTechUITextures.OVERLAY_BUTTON_HEAT_ON
+ : TecTechUITextures.OVERLAY_BUTTON_HEAT_OFF)
+ .setPos(152, 41)
+ .setSize(16, 16))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> heat, val -> heat = val));
+ }
+ }
+
+ public static void run() { // 20k heat cap max!
+ new RackComponent(ItemList.Circuit_Primitive.get(1), 1, 4, 0, 500, true); // Primitive Circuit
+ new RackComponent(ItemList.Circuit_Basic.get(1), 4, 8, 0, 1000, true); // Basic Circuit
+ new RackComponent(ItemList.Circuit_Microprocessor.get(1), 6, 8, 0, 1250, true);
+ new RackComponent(ItemList.Circuit_Good.get(1), 6, 9, -.05f, 1500, true); // Good Circuit
+ new RackComponent(ItemList.Circuit_Integrated_Good.get(1), 7, 9, -.075f, 1750, true);
+ new RackComponent(ItemList.Circuit_Processor.get(1), 8, 9, -.07f, 1800, true);
+ new RackComponent(ItemList.Circuit_Parts_Advanced.get(1), 1, 2, -.05f, 2000, true);
+ new RackComponent(ItemList.Circuit_Nanoprocessor.get(1), 8, 10, -.09f, 2250, true); // Advanced Circuit
+ new RackComponent(ItemList.Circuit_Advanced.get(1), 8, 10, -.1f, 2500, true);
+ new RackComponent(ItemList.Circuit_Data.get(1), 9, 1, -.1f, 3000, true); // EV Circuit
+ new RackComponent(ItemList.Circuit_Nanocomputer.get(1), 11, 10, -.125f, 3300, true);
+ new RackComponent(ItemList.Circuit_Quantumprocessor.get(1), 13, 10, -.15f, 3600, true);
+ new RackComponent(ItemList.Circuit_Elite.get(1), 12, 10, -.15F, 3500, true); // IV Circuit
+ new RackComponent(ItemList.Circuit_Elitenanocomputer.get(1), 14, 10, -.15F, 4000, true);
+ new RackComponent(ItemList.Circuit_Quantumcomputer.get(1), 16, 10, -.15F, 4500, true);
+ new RackComponent(ItemList.Circuit_Crystalprocessor.get(1), 18, 10, -.15F, 5000, true);
+ new RackComponent(ItemList.Circuit_Master.get(1), 16, 12, -.2F, 5000, true); // LuV Circuit
+ new RackComponent(ItemList.Circuit_Masterquantumcomputer.get(1), 16, 13, -.2F, 5100, true);
+ new RackComponent(ItemList.Circuit_Crystalcomputer.get(1), 20, 14, -.25F, 5200, true);
+ new RackComponent(ItemList.Circuit_Neuroprocessor.get(1), 24, 15, -.3F, 5300, true);
+ new RackComponent(ItemList.Circuit_Quantummainframe.get(1), 22, 14, -.3F, 5200, true); // ZPM Circuit
+ new RackComponent(ItemList.Circuit_Ultimatecrystalcomputer.get(1), 26, 16, -.3F, 5400, true);
+ new RackComponent(ItemList.Circuit_Wetwarecomputer.get(1), 30, 18, -.3F, 5600, true);
+ new RackComponent(ItemList.Circuit_Crystalmainframe.get(1), 30, 18, -.35F, 5500, true); // UV Circuit
+ new RackComponent(ItemList.Circuit_Wetwaresupercomputer.get(1), 35, 22, -.3F, 5700, true);
+ new RackComponent(ItemList.Circuit_Wetwaremainframe.get(1), 38, 25, -.4F, 6000, true); // UHV Circuit
+
+ new RackComponent("IC2:ic2.reactorVent", 0, -1, 10f, 1000, false);
+ new RackComponent("IC2:ic2.reactorVentCore", 0, -1, 20f, 2500, false);
+ new RackComponent("IC2:ic2.reactorVentGold", 0, -1, 40f, 5000, false);
+ new RackComponent("IC2:ic2.reactorVentDiamond", 0, -1, 80f, 10000, false); // 2x oc
+
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ // GTNH-GT5u circuits
+ // these components causes crashes when used with the original GT5u
+ new RackComponent(ItemList.NandChip.get(1), 2, 6, 0, 750, true); // Primitive Circuit
+ new RackComponent(ItemList.Circuit_Biowarecomputer.get(1), 40, 26, -.35F, 5900, true);
+ new RackComponent(ItemList.Circuit_Biowaresupercomputer.get(1), 42, 30, -.4F, 6200, true);
+ new RackComponent(ItemList.Circuit_Biomainframe.get(1), 44, 28, -.4F, 6000, true); // UEV Circuit
+ new RackComponent(ItemList.Circuit_Bioprocessor.get(1), 34, 20, -.35F, 5800, true);
+
+ new RackComponent("dreamcraft:item.HighEnergyCircuitParts", 3, 2, -.1f, 9001, true);
+ new RackComponent("dreamcraft:item.HighEnergyFlowCircuit", 24, 16, -.25f, 10000, true);
+ new RackComponent("dreamcraft:item.NanoCircuit", 50, 35, -.45f, 8000, true);
+ new RackComponent("dreamcraft:item.PikoCircuit", 64, 40, -.5f, 8500, true);
+ new RackComponent("dreamcraft:item.QuantumCircuit", 128, 48, -.6f, 9000, true);
+ }
+
+ if (OpenComputers.isModLoaded()) {
+ new RackComponent("OpenComputers:item.oc.Transistor", 0, 1, 0f, 100, true); // Transistor
+ new RackComponent("OpenComputers:item.oc.Microchip0", 7, 12, -.05f, 1500, true); // chip t1
+ new RackComponent("OpenComputers:item.oc.Microchip1", 18, 20, -.1f, 3000, true); // chip t2
+ new RackComponent("OpenComputers:item.oc.Microchip2", 25, 22, -.15f, 4500, true); // chip t3
+ new RackComponent("OpenComputers:item.oc.ALU", 10, 15, -.05f, 3000, true); // alu
+ new RackComponent("OpenComputers:item.oc.ControlUnit", 25, 18, -.05f, 1500, true); // cu
+
+ new RackComponent("OpenComputers:item.oc.ComponentBus0", 42, 30, -.05f, 1500, true); // bus t1
+ new RackComponent("OpenComputers:item.oc.ComponentBus1", 70, 50, -.1f, 3000, true); // bus t2
+ new RackComponent("OpenComputers:item.oc.ComponentBus2", 105, 72, -.15f, 4500, true); // bus t3
+
+ new RackComponent("OpenComputers:item.oc.CPU0", 106, 73, -.1f, 1500, true); // cpu t1
+ new RackComponent("OpenComputers:item.oc.CPU1", 226, 153, -.15f, 3000, true); // cpu t2
+ new RackComponent("OpenComputers:item.oc.CPU2", 374, 241, -.2f, 4500, true); // cpu t3
+
+ new RackComponent("OpenComputers:item.oc.GraphicsCard0", 20, 27, -.1f, 1500, true); // gpu t1
+ new RackComponent("OpenComputers:item.oc.GraphicsCard1", 62, 67, -.2f, 3000, true); // gpu t2
+ new RackComponent("OpenComputers:item.oc.GraphicsCard2", 130, 111, -.3f, 4500, true); // gpu t3
+
+ new RackComponent("OpenComputers:item.oc.APU0", 350, 234, -.1f, 1500, true); // apu t2
+ new RackComponent("OpenComputers:item.oc.APU1", 606, 398, -.2f, 4500, true); // apu t3
+ new RackComponent("OpenComputers:item.oc.APU2", 1590, 1006, -.3f, 9000, true); // apu tC
+ }
+ }
+
+ public static class RackComponent implements Comparable<RackComponent> {
+
+ private final String unlocalizedName;
+ private final float heat, coEff, computation, maxHeat;
+ private final boolean subZero;
+
+ RackComponent(ItemStack is, float computation, float heat, float coEff, float maxHeat, boolean subZero) {
+ this(getUniqueIdentifier(is), computation, heat, coEff, maxHeat, subZero);
+ }
+
+ RackComponent(String is, float computation, float heat, float coEff, float maxHeat, boolean subZero) {
+ unlocalizedName = is;
+ this.heat = heat;
+ this.coEff = coEff;
+ this.computation = computation;
+ this.maxHeat = maxHeat;
+ this.subZero = subZero;
+ componentBinds.put(unlocalizedName, this);
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Component registered: " + unlocalizedName);
+ }
+ }
+
+ @Override
+ public int compareTo(RackComponent o) {
+ return unlocalizedName.compareTo(o.unlocalizedName);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof RackComponent) {
+ return compareTo((RackComponent) obj) == 0;
+ }
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java
new file mode 100644
index 0000000000..6ecbe67d22
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java
@@ -0,0 +1,474 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+import static org.lwjgl.opengl.GL11.GL_BLEND;
+import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
+import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
+import static org.lwjgl.opengl.GL11.glBlendFunc;
+import static org.lwjgl.opengl.GL11.glColor4f;
+import static org.lwjgl.opengl.GL11.glDisable;
+import static org.lwjgl.opengl.GL11.glEnable;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+import com.gtnewhorizons.modularui.api.GlStateManager;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+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.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+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.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_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Created by danie_000 on 15.12.2016.
+ */
+public class GT_MetaTileEntity_Hatch_Uncertainty extends GT_MetaTileEntity_Hatch
+ implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+ public short[] matrix = new short[] { 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500,
+ 500 };
+ public byte selection = -1, mode = 0, status = -128; // all 8 bits set
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_Hatch_Uncertainty(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "");
+ TT_Utility.setTier(aTier, this);
+ regenerate();
+ }
+
+ public GT_MetaTileEntity_Hatch_Uncertainty(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ regenerate();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/UC");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/UC_ACTIVE");
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenON) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenOFF) };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && (aTick & 15) == 0) {
+ if (mode == 0) {
+ aBaseMetaTileEntity.setActive(false);
+ status = -128;
+ } else {
+ aBaseMetaTileEntity.setActive(true);
+ shift();
+ compute();
+ }
+ }
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Uncertainty(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ translateToLocalFormatted("tt.keyword.Status", clientLocale) + ": " + EnumChatFormatting.GOLD + status };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ 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 saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mSel", selection);
+ aNBT.setByte("mMode", mode);
+ aNBT.setByte("mStatus", status);
+ NBTTagCompound mat = new NBTTagCompound();
+ for (int i = 0; i < 16; i++) {
+ mat.setShort(Integer.toString(i), matrix[i]);
+ }
+ aNBT.setTag("mMat", mat);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ selection = aNBT.getByte("mSel");
+ mode = aNBT.getByte("mMode");
+ status = aNBT.getByte("mStatus");
+ NBTTagCompound mat = aNBT.getCompoundTag("mMat");
+ for (int i = 0; i < 16; i++) {
+ matrix[i] = mat.getShort(Integer.toString(i));
+ }
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.certain.desc.0"), // Feeling
+ // certain,
+ // or
+ // not?
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.hatch.certain.desc.1") // Schrödinger equation in a box
+ };
+ }
+
+ private boolean balanceCheck(int sideLenY, short... masses) {
+ float inequality = 0;
+ for (int i = 0; i < masses.length >> 1; i++) {
+ inequality += Math.abs(masses[i] - masses[masses.length - i - 1]);
+ }
+ return inequality < masses.length << 7;
+ }
+
+ public void regenerate() {
+ for (int i = 0; i < matrix.length; i++) {
+ matrix[i] = (short) TecTech.RANDOM.nextInt(1000);
+ }
+ }
+
+ public byte compute() {
+ int result = 0;
+ switch (mode) {
+ case 1: // ooo oxo ooo
+ result = balanceCheck(4, matrix) ? 0 : 1;
+ break;
+ case 2: // ooo xox ooo
+ result += balanceCheck(
+ 4,
+ matrix[0],
+ matrix[4],
+ matrix[1],
+ matrix[5],
+ matrix[2],
+ matrix[6],
+ matrix[3],
+ matrix[7]) ? 0 : 1;
+ result += balanceCheck(
+ 4,
+ matrix[8],
+ matrix[12],
+ matrix[9],
+ matrix[13],
+ matrix[10],
+ matrix[14],
+ matrix[11],
+ matrix[15]) ? 0 : 2;
+ break;
+ case 3: // oxo xox oxo
+ result += balanceCheck(
+ 2,
+ matrix[0],
+ matrix[4],
+ matrix[8],
+ matrix[12],
+ matrix[1],
+ matrix[5],
+ matrix[9],
+ matrix[13]) ? 0 : 1;
+ result += balanceCheck(
+ 4,
+ matrix[0],
+ matrix[4],
+ matrix[1],
+ matrix[5],
+ matrix[2],
+ matrix[6],
+ matrix[3],
+ matrix[7]) ? 0 : 2;
+ result += balanceCheck(
+ 4,
+ matrix[8],
+ matrix[12],
+ matrix[9],
+ matrix[13],
+ matrix[10],
+ matrix[14],
+ matrix[11],
+ matrix[15]) ? 0 : 4;
+ result += balanceCheck(
+ 2,
+ matrix[2],
+ matrix[6],
+ matrix[10],
+ matrix[14],
+ matrix[3],
+ matrix[7],
+ matrix[11],
+ matrix[15]) ? 0 : 8;
+ break;
+ case 4: // xox ooo xox
+ result += balanceCheck(2, matrix[0], matrix[4], matrix[1], matrix[5]) ? 0 : 1;
+ result += balanceCheck(2, matrix[8], matrix[12], matrix[9], matrix[13]) ? 0 : 2;
+ result += balanceCheck(2, matrix[2], matrix[6], matrix[3], matrix[7]) ? 0 : 4;
+ result += balanceCheck(2, matrix[10], matrix[14], matrix[11], matrix[15]) ? 0 : 8;
+ break;
+ case 5: // xox oxo xox
+ result += balanceCheck(2, matrix[0], matrix[4], matrix[1], matrix[5]) ? 0 : 1;
+ result += balanceCheck(2, matrix[8], matrix[12], matrix[9], matrix[13]) ? 0 : 2;
+ result += balanceCheck(4, matrix) ? 0 : 4;
+ result += balanceCheck(2, matrix[2], matrix[6], matrix[3], matrix[7]) ? 0 : 8;
+ result += balanceCheck(2, matrix[10], matrix[14], matrix[11], matrix[15]) ? 0 : 16;
+ break;
+ }
+ return status = (byte) result;
+ }
+
+ private void shift() {
+ int i = TecTech.RANDOM.nextInt(16), j = TecTech.RANDOM.nextInt(128);
+ matrix[i] += ((matrix[i] & 1) == 0 ? 2 : -2) * j >> 5;
+ matrix[i] += j == 0 ? 1 : 0;
+ if (matrix[i] < 0) {
+ matrix[i] = 0;
+ } else if (matrix[i] > 1000) {
+ matrix[i] = 999;
+ }
+ }
+
+ public byte update(int newMode) {
+ if (newMode == mode) {
+ return status;
+ }
+ if (newMode < 0 || newMode > 5) {
+ newMode = 0;
+ }
+ mode = (byte) newMode;
+ regenerate();
+ compute();
+ return status;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK)
+ .setSize(18, 18)
+ .setPos(112, 55));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final boolean isAdvanced = mTier > 7;
+
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
+ .setPos(43, 4)
+ .setSize(90, 72))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_MONITOR)
+ .setPos(46, 27)
+ .setSize(46, 46));
+
+ int[] xPositions = new int[] { 7, 25, 133, 151 };
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ final int index = i * 4 + j;
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (selection == -1) {
+ selection = (byte) index;
+ } else {
+ short temp = matrix[selection];
+ matrix[selection] = matrix[index];
+ matrix[index] = temp;
+ selection = -1;
+ }
+ compute();
+ })
+ .setPlayClickSound(false)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, TecTechUITextures.OVERLAY_BUTTON_UNCERTAINTY[index])
+ .setPos(xPositions[i], 4 + j * 18)
+ .setSize(18, 18))
+ .widget(new FakeSyncWidget.ShortSyncer(() -> matrix[index], val -> matrix[index] = val));
+ }
+ }
+ builder.widget(new FakeSyncWidget.ByteSyncer(() -> selection, val -> selection = val))
+ .widget(new FakeSyncWidget.ByteSyncer(() -> mode, val -> mode = val))
+ .widget(new FakeSyncWidget.ByteSyncer(() -> status, val -> status = val));
+
+ builder.widget(
+ new TextWidget().setStringSupplier(() -> "Status: " + (status == 0 ? "OK" : "NG"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 7));
+
+ for (int i = 0; i < 9; i++) {
+ final int index = i;
+ builder.widget(new DrawableWidget().setDrawable(() -> {
+ UITexture valid = TecTechUITextures.PICTURE_UNCERTAINTY_VALID[index];
+ UITexture invalid = TecTechUITextures.PICTURE_UNCERTAINTY_INVALID[index];
+ switch (mode) {
+ case 1: // ooo oxo ooo
+ if (index == 4) return status == 0 ? valid : invalid;
+ break;
+ case 2: // ooo xox ooo
+ if (index == 3) return (status & 1) == 0 ? valid : invalid;
+ if (index == 5) return (status & 2) == 0 ? valid : invalid;
+ break;
+ case 3: // oxo xox oxo
+ if (index == 1) return (status & 1) == 0 ? valid : invalid;
+ if (index == 3) return (status & 2) == 0 ? valid : invalid;
+ if (index == 5) return (status & 4) == 0 ? valid : invalid;
+ if (index == 7) return (status & 8) == 0 ? valid : invalid;
+ break;
+ case 4: // xox ooo xox
+ if (index == 0) return (status & 1) == 0 ? valid : invalid;
+ if (index == 2) return (status & 2) == 0 ? valid : invalid;
+ if (index == 6) return (status & 4) == 0 ? valid : invalid;
+ if (index == 8) return (status & 8) == 0 ? valid : invalid;
+ break;
+ case 5: // xox oxo xox
+ if (index == 0) return (status & 1) == 0 ? valid : invalid;
+ if (index == 2) return (status & 2) == 0 ? valid : invalid;
+ if (index == 4) return (status & 4) == 0 ? valid : invalid;
+ if (index == 6) return (status & 8) == 0 ? valid : invalid;
+ if (index == 8) return (status & 16) == 0 ? valid : invalid;
+ break;
+ }
+ return null;
+ })
+ .setPos(55 + (index % 3) * 12, 36 + (index / 3) * 12)
+ .setSize(4, 4));
+ }
+
+ for (int i = 0; i < 16; i++) {
+ final int index = i;
+ builder.widget(new DrawableWidget() {
+
+ @Override
+ public void draw(float partialTicks) {
+ if (isAdvanced) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(1f, 1f, 1f, (float) matrix[index] / 1000f);
+
+ // super.draw but without disabling blend
+ GlStateManager.pushMatrix();
+ getDrawable().draw(Pos2d.ZERO, getSize(), partialTicks);
+ GlStateManager.popMatrix();
+
+ glDisable(GL_BLEND);
+ glColor4f(1f, 1f, 1f, 1f);
+ } else {
+ if (TecTech.RANDOM.nextInt(1000) < matrix[index]) {
+ super.draw(partialTicks);
+ }
+ }
+ }
+ }.setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_INDICATOR)
+ .setPos(47 + (i / 4) * 12, 28 + (i % 4) * 12)
+ .setSize(8, 8))
+ .widget(
+ new DrawableWidget()
+ .setDrawable(() -> selection == index ? TecTechUITextures.PICTURE_UNCERTAINTY_SELECTED : null)
+ .setPos(46 + (i / 4) * 12, 27 + (i % 4) * 12)
+ .setSize(10, 10));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java
new file mode 100644
index 0000000000..3d3f417b51
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java
@@ -0,0 +1,216 @@
+package com.github.technus.tectech.thing.metaTileEntity.hatch;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_LASER;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BLUE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GRAY;
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.enums.GT_Values.V;
+import static java.lang.Long.min;
+
+import java.math.BigInteger;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.util.TT_Utility;
+
+import gregtech.api.interfaces.IGlobalWirelessEnergy;
+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_Hatch_WirelessMulti extends GT_MetaTileEntity_Hatch_EnergyMulti
+ implements IGlobalWirelessEnergy, IWirelessEnergyHatchInformation {
+
+ private final BigInteger eu_transferred_per_operation = BigInteger
+ .valueOf(Amperes * V[mTier] * ticks_between_energy_addition);
+ private final long eu_transferred_per_operation_long = eu_transferred_per_operation.longValue();
+
+ private String owner_uuid;
+ private String owner_name;
+
+ public GT_MetaTileEntity_Hatch_WirelessMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.",
+ GRAY + "Does not connect to wires. This block withdraws EU from the network.",
+ AuthorColen + GRAY + BOLD + " & " + BLUE + BOLD + "Cloud" },
+ aAmp);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_Hatch_WirelessMulti(String aName, int aTier, int aAmp, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aAmp, aDescription, aTextures);
+ }
+
+ private ITexture[] TEXTURE_OVERLAY;
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ switch (Amperes) {
+ case 4:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A;
+ break;
+ case 16:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A;
+ break;
+ case 64:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A;
+ break;
+ default:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_LASER;
+ break;
+ }
+ return new ITexture[] { aBaseTexture, TEXTURE_OVERLAY[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ switch (Amperes) {
+ case 4:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A;
+ break;
+ case 16:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A;
+ break;
+ case 64:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A;
+ break;
+ default:
+ TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_LASER;
+ break;
+ }
+ return new ITexture[] { aBaseTexture, TEXTURE_OVERLAY[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 Amperes * V[mTier];
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return totalStorage(V[mTier]) * Amperes / 2;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return Amperes;
+ }
+
+ @Override
+ public long maxWorkingAmperesIn() {
+ return Amperes;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_WirelessMulti(mName, mTier, Amperes, 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;
+ }
+
+ @Override
+ public ConnectionType getConnectionType() {
+ return ConnectionType.WIRELESS;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // On first tick find the player name and attempt to add them to the map.
+
+ // UUID and username of the owner.
+ owner_uuid = aBaseMetaTileEntity.getOwnerUuid()
+ .toString();
+ owner_name = aBaseMetaTileEntity.getOwnerName();
+
+ strongCheckOrAddUser(owner_uuid, owner_name);
+
+ 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/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java
new file mode 100644
index 0000000000..c01a17af86
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java
@@ -0,0 +1,5101 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+public abstract class ForgeOfGodsRingsStructureString {
+
+ public static final String[][] SECOND_RING = { {
+
+ " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC CCBB ",
+ " BBEC CEBB ",
+ " BEEC CEEB ",
+ " EEC CEE ",
+ " EC CE ",
+ " EC CCCCC CE ",
+ " 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 C C ",
+ " EC CCCCC CE ",
+ " EC CE ",
+ " EEC CEE ",
+ " BEEC CEEB ",
+ " BBEC CEBB ",
+ " BBCC CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC D CCBB ",
+ " BBEC D CEBB ",
+ " BBBEEC DD CEEBBB ",
+ " EEEEC D CEEEE ",
+ " EEEC DD CEEE ",
+ " EEEC CCCCC CEEE ",
+ " EEC CHHHHHC CEE ",
+ " EEC CHHHHHHHC CEE ",
+ " EEC CHHHHHHHC CEE ",
+ " EEC CHHHHHHHC CEE ",
+ " EEC CHHHHHHHC CEE ",
+ " EEC CHHHHHHHC CEE ",
+ " EEC CHHHHHC CEE ",
+ " EEEC CCCCC CEEE ",
+ " EEEC DD CEEE ",
+ " EEEEC D CEEEE ",
+ " BBBEEC DD CEEBBB ",
+ " BBEC D CEBB ",
+ " BBCC D CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC CCBB ",
+ " BBEC CEBB ",
+ " BBBEEC CEEBBB ",
+ " BBBBEEEEC CEEEEBBBB ",
+ " EEEEEEEC CEEEEEEE ",
+ " EEEEEEEC CCCCC CEEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEEC CCCCC CEEEEEEE ",
+ " EEEEEEEC CEEEEEEE ",
+ " BBBBEEEEC CEEEEBBBB ",
+ " BBBEEC CEEBBB ",
+ " BBEC CEBB ",
+ " BBCC CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BBBBEEE EEEBBBB ",
+ " BBBEEEEEEE EEEEEEEBBB ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " EEEEEEEKKK KKKEEEEEEE ",
+ " EEEEEEEKKK KKKEEEEEEE ",
+ " EEEEEEEKKK KKKEEEEEEE ",
+ " EEEEEEEKKK KKKEEEEEEE ",
+ " EEEEEEEKKK KKKEEEEEEE ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " BBBEEEEEEE EEEEEEEBBB ",
+ " BBBBEEE EEEBBBB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BBBBBEEEE EEEEBBBBB ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " BBBBBEEEE EEEEBBBBB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " BBBEEEEE EEEEEBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEKK KKEEEEEE ",
+ " EEEEEEKK KKEEEEEE ",
+ " EEEEEEKK KKEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBEEEEE EEEEEBBB ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BBBBBEEE EEEBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEKKK KKKEEEEE ",
+ " EEEEEKKK KKKEEEEE ",
+ " EEEEEKKK KKKEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBEEE EEEBBBBB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BBEEEE EEEEBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBEEEE EEEEBB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BBBBEE EEBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBEE EEBBBB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEKK KKEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BEEEE EEEEB ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " BEEEE EEEEB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BBEEE EEEBB ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " BBEEE EEEBB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " BBBBE EBBBB ",
+ " EEEEE EEEEE ",
+ " EEEKK KKEEE ",
+ " EEEEE EEEEE ",
+ " BBBBE EBBBB ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEK KEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEK KEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEK KEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEKK KKEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEKK KKEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEK KEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEKK KKEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBB BBBBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEKKK KKKEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBBBB BBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBB BBBBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEKK KKEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBBBB BBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBB BBBBBBBBB ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " EEEEEKKKK KKKKEEEEE ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " BBBBBBBBB BBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBB BBBBBBBBBBBB ",
+ " EEEEEEEEEEEE EEEEEEEEEEEE ",
+ " EEEEEEEKKKKK KKKKKEEEEEEE ",
+ " EEEEEEEEEEEE EEEEEEEEEEEE ",
+ " BBBBBBBBBBBB BBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEKKKKKKKKKKKKKKKEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " } };
+
+ public static final String[][] THIRD_RING = {
+ { " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBBEC CEBBB ",
+ " EEEC CEEE ",
+ " EEC CEE ",
+ " EEC CCCCC CEE ",
+ " EC CC CC CE ",
+ " EC C C CE ",
+ " 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 C C ",
+ " EC C C CE ",
+ " EC CC CC CE ",
+ " EEC CCCCC CEE ",
+ " EEC CEE ",
+ " EEEC CEEE ",
+ " BBBEC CEBBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCCD CCBB ",
+ " BBBEC DD CEBBB ",
+ " BBBEEEC D CEEEBBB ",
+ " EEEEEC DD CEEEEE ",
+ " EEEEEC DCCCCC CEEEEE ",
+ " EEEEC CCHHHHHCC CEEEE ",
+ " EEEEC CHHHHHHHHHC CEEEE ",
+ " EEEC CHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHHHC CEEE ",
+ " EEEC CHHHHHHHHHC CEEE ",
+ " EEEEC CHHHHHHHHHC CEEEE ",
+ " EEEEC CCHHHHHCC CEEEE ",
+ " EEEEEC CCCCCD CEEEEE ",
+ " EEEEEC DD CEEEEE ",
+ " BBBEEEC D CEEEBBB ",
+ " BBBEC DD CEBBB ",
+ " BBCC DCCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " BBBBBBB ",
+ " BBCCCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBBEC CEBBB ",
+ " BBBBEEEC CEEEBBBB ",
+ " BEEEEEEC CEEEEEEB ",
+ " EEEEEEEC CCCCC CEEEEEEE ",
+ " EEEEEEC CC CC CEEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEC C C CEEEEE ",
+ " EEEEEEC C C CEEEEEE ",
+ " EEEEEEC CC CC CEEEEEE ",
+ " EEEEEEEC CCCCC CEEEEEEE ",
+ " BEEEEEEC CEEEEEEB ",
+ " BBBBEEEC CEEEBBBB ",
+ " BBBEC CEBBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCCCBB ",
+ " BBBBBBB " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BBBBEEEE EEEEBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEII IIEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBEEEE EEEEBBBB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BBBBBEE EEBBBBB ",
+ " BEEEEEEE EEEEEEEB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BEEEEEEE EEEEEEEB ",
+ " BBBBBEE EEBBBBB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BBEEEE EEEEBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBEEEE EEEEBB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " BBBBBE EBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBE EBBBBB ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BBEEE EEEBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEII IIEEE ",
+ " EEEII IIEEE ",
+ " EEEII IIEEE ",
+ " EEEII IIEEE ",
+ " EEEII IIEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBEEE EEEBB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BEEE EEEB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BEEE EEEB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " BBBE EBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBE EBBB ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI EEEE ",
+ " EEEI IEEE ",
+ " EEEI EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEI IEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEI IEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEI IEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEII IIEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEI IEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEII IIEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBB BBBBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEIII IIIEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBBBB BBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBB BBBBBBBBB ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " EEEEEEIII IIIEEEEEE ",
+ " EEEEEEEEE EEEEEEEEE ",
+ " BBBBBBBBB BBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBB BBBBBBBBBBB ",
+ " EEEEEEEEEEE EEEEEEEEEEE ",
+ " EEEEEEIIIII IIIIIEEEEEE ",
+ " EEEEEEEEEEE EEEEEEEEEEE ",
+ " BBBBBBBBBBB BBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEIIIIIIIIIIIIIEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " } };
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java
new file mode 100644
index 0000000000..bbf9e56f89
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java
@@ -0,0 +1,5429 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+public abstract class ForgeOfGodsStructureString {
+
+ public static final String[][] MAIN_STRUCTURE = { {
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BB BB ",
+ " B DDD DDD B ",
+ " DDFD DFDD ",
+ " DDADD DDADD ",
+ " DFDD DDFD ",
+ " DDD DDD ",
+ " ",
+ " ",
+ " ",
+ " DDD DDD ",
+ " DFDD DDFD ",
+ " DDADD DDADD ",
+ " DDFD DFDD ",
+ " B DDD DDD B ",
+ " BB BB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BEEBBBBB BBBBBEEB ",
+ " BEEEECCCCBCCCCEEEEB ",
+ " BEEECEE CFC EECEEEB ",
+ " BECEEE CFC EEECEB ",
+ " BCEE CFC EECB ",
+ " BCEE CCCFC EECB ",
+ " BC CFFCCFC CB ",
+ " BCCCCFCCFCFCCCCCB ",
+ " BFFFCCF~FCCFFFB ",
+ " BCCCCCFCFCCFCCCCB ",
+ " BC CFCCFFC CB ",
+ " BCEE CFCCC EECB ",
+ " BCEE CFC EECB ",
+ " BECEEE CFC EEECEB ",
+ " BEEECEE CFC EECEEEB ",
+ " BEEEECCCCBCCCCEEEEB ",
+ " BEEBBBBB BBBBBEEB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BBEEBBB BBBEEBB ",
+ " BEEEEEEB BEEEEEEB ",
+ " BEEDDDDDBBBBBDDDDDEEB ",
+ " BEEDEE EEDEEB ",
+ " BEDE EDEB ",
+ " BED DEB ",
+ " BED DEB ",
+ " BB BB ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " BB BB ",
+ " BED DEB ",
+ " BED DEB ",
+ " BEDE EDEB ",
+ " BEEDEE EEDEEB ",
+ " BEEDDDDDBBBBBDDDDDEEB ",
+ " BEEEEEEB BEEEEEEB ",
+ " BBEEBBB BBBEEBB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BEEEEB BEEEEB ",
+ " BEEDDBBB BBBDDEEB ",
+ " BED DEB ",
+ " BED DEB ",
+ " BB BB ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " BB BB ",
+ " BED DEB ",
+ " BED DEB ",
+ " BEEDDBBB BBBDDEEB ",
+ " BEEEEB BEEEEB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BEEBB BBEEB ",
+ " BBB BEB ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " BEB BEB ",
+ " BEBBB BBEEB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " J ",
+ " BEEEEEB ",
+ " EEE EEE ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " JE EJ ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " EEE EEE ",
+ " BEEEEEB ",
+ " J " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " J ",
+ " BEEEEEB ",
+ " EEE EEE ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " JE EJ ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " EEE EEE ",
+ " BEEEEEB ",
+ " J " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " J ",
+ " BEEEEEB ",
+ " EEEE EEE ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " JE EJ ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " EEE EEE ",
+ " BEEEEEB ",
+ " J " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " J ",
+ " BEEEEEB ",
+ " EEE EEE ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " JE EJ ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " EE EE ",
+ " E E ",
+ " EEE EEE ",
+ " BEEEEEB ",
+ " J " },
+ { " ",
+ " BEEEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEEEB ",
+ " " },
+ { " ",
+ " BEEEB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " E E ",
+ " E E ",
+ " E E ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BEEEB ",
+ " " },
+ { " ",
+ " BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B B ",
+ " B B ",
+ " B B ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB ",
+ " BBCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " EEC CEE ",
+ " EC CE ",
+ " EC CE ",
+ " C CCC C ",
+ " C C C C ",
+ " C C C C ",
+ " C C C C ",
+ " C CCC C ",
+ " EC CE ",
+ " EC CE ",
+ " EEC CEE ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCBB ",
+ " BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB ",
+ " BBCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBBEEC CEEBBB ",
+ " BBEEEEC DDCEEEEBB ",
+ " EEEEEEC DDD CEEEEEE ",
+ " EEEEEC CCCDD CEEEEE ",
+ " EEEEEC CHHHC CEEEEE ",
+ " EEEEEC CHHHC CEEEEE ",
+ " EEEEEC CHHHC CEEEEE ",
+ " EEEEEC DDCCC CEEEEE ",
+ " EEEEEEC DDD CEEEEEE ",
+ " BBEEEECDD CEEEEBB ",
+ " BBBEEC CEEBBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCBB ",
+ " BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB ",
+ " BBCCCCCBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBBEEC CEEBBB ",
+ " BBBBEEEEC CEEEEBBBB ",
+ " BBEEEEEEEEC CEEEEEEEEBB ",
+ " EEEEEEEEEC CCC CEEEEEEEEE ",
+ " EEEEEEEEEC C C CEEEEEEEEE ",
+ " EEEEEEEEEC C C CEEEEEEEEE ",
+ " EEEEEEEEEC C C CEEEEEEEEE ",
+ " EEEEEEEEEC CCC CEEEEEEEEE ",
+ " BBEEEEEEEEC CEEEEEEEEBB ",
+ " BBBBEEEEC CEEEEBBBB ",
+ " BBBEEC CEEBBB ",
+ " BBCC CCBB ",
+ " BBCC CCBB ",
+ " BBCCCCCBB ",
+ " BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " BBBBEEEE EEEEBBBB ",
+ " BBBBBEEEEEEEE EEEEEEEEBBBBB ",
+ " EEEEEEEEEEEEE EEEEEEEEEEEEE ",
+ " EEEEEEEEEGGGG GGGGEEEEEEEEE ",
+ " EEEEEEEGGGGGG GGGGGGEEEEEEE ",
+ " EEEEEEEEEGGGG GGGGEEEEEEEEE ",
+ " EEEEEEEEEEEEE EEEEEEEEEEEEE ",
+ " BBBBBEEEEEEEE EEEEEEEEBBBBB ",
+ " BBBBEEEE EEEEBBBB ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB BB ",
+ " BBBBBEE EEBBBBB ",
+ " BBBEEEEEEE EEEEEEEBBB ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " EEEEEEGGGG GGGGEEEEEE ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " BBBEEEEEEE EEEEEEEBBB ",
+ " BBBBBEE EEBBBBB ",
+ " BB BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " BBBBBEEE EEEBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEGGG GGGEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBEEE EEEBBBBB ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBB BBBBBBB ",
+ " EEEEEEE EEEEEEE ",
+ " EEEEEGG GGEEEEE ",
+ " EEEEEEE EEEEEEE ",
+ " BBBBBBB BBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBB BBBBBBB ",
+ " EEEEEEE EEEEEEE ",
+ " EEEEGGG GGGEEEE ",
+ " EEEEEEE EEEEEEE ",
+ " BBBBBBB BBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEGG GGEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEGG GGEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "BBB BBB",
+ "EEE EEE",
+ "EEG GEE",
+ "EEE EEE",
+ "BBB BBB",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBB BBB ",
+ " EEE EEE ",
+ " EEG GEE ",
+ " EEE EEE ",
+ " BBB BBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBB BBBB ",
+ " EEEE EEEE ",
+ " EEEG GEEE ",
+ " EEEE EEEE ",
+ " BBBB BBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEGG GGEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEGG GGEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBB BBBBB ",
+ " EEEEE EEEEE ",
+ " EEEEG GEEEE ",
+ " EEEEE EEEEE ",
+ " BBBBB BBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBB BBBBBB ",
+ " EEEEEE EEEEEE ",
+ " EEEEGG GGEEEE ",
+ " EEEEEE EEEEEE ",
+ " BBBBBB BBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBB BBBBBBB ",
+ " EEEEEEE EEEEEEE ",
+ " EEEEGGG GGGEEEE ",
+ " EEEEEEE EEEEEEE ",
+ " BBBBBBB BBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBB BBBBBBB ",
+ " EEEEEEE EEEEEEE ",
+ " EEEEEGG GGEEEEE ",
+ " EEEEEEE EEEEEEE ",
+ " BBBBBBB BBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBB BBBBBBBB ",
+ " EEEEEEEE EEEEEEEE ",
+ " EEEEEGGG GGGEEEEE ",
+ " EEEEEEEE EEEEEEEE ",
+ " BBBBBBBB BBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBB BBBBBBBBBB ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " EEEEEEGGGG GGGGEEEEEE ",
+ " EEEEEEEEEE EEEEEEEEEE ",
+ " BBBBBBBBBB BBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBB BBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEE EEEEEEEEEEEEE ",
+ " EEEEEEEGGGGGG GGGGGGEEEEEEE ",
+ " EEEEEEEEEEEEE EEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBB BBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEGGGGGGGGGGGGGGGEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBBBBBBBBBBBBBB ",
+ " EEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEE ",
+ " EEEEEEEEEEEEEEE ",
+ " BBBBBBBBBBBBBBB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " } };
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java
new file mode 100644
index 0000000000..afa09dd193
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java
@@ -0,0 +1,1767 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.TecTech.eyeOfHarmonyRecipeStorage;
+import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0;
+import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES;
+import static com.github.technus.tectech.util.TT_Utility.toStandardForm;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.util.GT_ParallelHelper.calculateChancedOutputMultiplier;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static java.lang.Math.exp;
+import static java.lang.Math.max;
+import static java.lang.Math.pow;
+import static net.minecraft.util.EnumChatFormatting.BLUE;
+import static net.minecraft.util.EnumChatFormatting.GOLD;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+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.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.recipe.EyeOfHarmonyRecipe;
+import com.github.technus.tectech.recipe.TecTechRecipeMaps;
+import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.FluidStackLong;
+import com.github.technus.tectech.util.ItemStackLong;
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IGlobalWirelessEnergy;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_MultiblockBase_EM
+ implements IConstructable, IGlobalWirelessEnergy, ISurvivalConstructable {
+
+ public static final boolean EOH_DEBUG_MODE = false;
+ private static final long MOLTEN_SPACETIME_PER_FAILURE_TIER = 14_400L;
+ private static final double SPACETIME_FAILURE_BASE = 2;
+ private static final String TOOLTIP_BAR = GOLD
+ + "---------------------------------------------------------------------------------------";
+
+ // Region variables.
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+
+ private int spacetimeCompressionFieldMetadata = -1;
+ private int timeAccelerationFieldMetadata = -1;
+ private int stabilisationFieldMetadata = -1;
+
+ private static final double SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE = 0.03;
+ private static final double TIME_ACCEL_DECREASE_CHANCE_PER_TIER = 0.0925;
+ // % Increase in recipe chance and % decrease in yield per tier.
+ private static final double STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER = 0.05;
+ private static final double LOG_CONSTANT = Math.log(1.7);
+ private static final double PARALLEL_MULTIPLIER_CONSTANT = 1.63;
+ private static final long POWER_DIVISION_CONSTANT = 9;
+ private static final int TOTAL_CASING_TIERS_WITH_POWER_PENALTY = 8;
+ private static final long PRECISION_MULTIPLIER = 1_000_000;
+
+ private String userUUID = "";
+ private BigInteger outputEU_BigInt = BigInteger.ZERO;
+ private long startEU = 0;
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); // 200 blocks max per
+ // placement.
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 16, 16, 0, realBudget, source, actor, false, true);
+ }
+
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+
+ // Multiblock structure.
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_EyeOfHarmony> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_EyeOfHarmony>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] {
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " C C ", " CCCCCCCCC ",
+ " C C ", " CCCCCCCCC ",
+ " C C ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " C C ", " C C ",
+ " C C ", " DDDDD ",
+ " DDCDCDD ", " CCCCDCCDCCDCCCC ",
+ " DDDDDDD ", " CCCCDCCDCCDCCCC ",
+ " DDCDCDD ", " DDDDD ",
+ " C C ", " C C ",
+ " C C ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " C C ", " C C ",
+ " D ", " D ",
+ " DDDDDDD ", " DD DD ",
+ " D EEE D ", " CCC D EAAAE D CCC ",
+ " DDD EAAAE DDD ", " CCC D EAAAE D CCC ",
+ " D EEE D ", " DD DD ",
+ " DDDDDDD ", " D ",
+ " D ", " C C ",
+ " C C ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " D ", " D ",
+ " ", " ",
+ " ", " ",
+ " ", " CC CC ",
+ " DD DD ", " CC CC ",
+ " ", " ",
+ " ", " ",
+ " ", " D ",
+ " D ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " CCCCC ", " D ",
+ " A ", " A ",
+ " ", " ",
+ " ", " ",
+ " C C ", " CC CC ",
+ " CDAA AADC ", " CC CC ",
+ " C C ", " ",
+ " ", " ",
+ " ", " A ",
+ " A ", " D ",
+ " CCCCC ", " C C ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " D ", " SEEAEES ",
+ " ", " ",
+ " ", " ",
+ " ", " S S ",
+ " E E ", " CC E E CC ",
+ " DA AD ", " CC E E CC ",
+ " E E ", " S S ",
+ " ", " ",
+ " ", " ",
+ " ", " SEEAEES ",
+ " D ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " C C ",
+ " CCCCC ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " CC CC ",
+ " CDA ADC ", " CC CC ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " CCCCC ", " C C ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " C C ", " C C ",
+ " D ", " SEEAEES ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " S S ",
+ " E E ", " CC E E CC ",
+ " DA AD ", " CC E E CC ",
+ " E E ", " S S ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " SEEAEES ",
+ " D ", " C C ",
+ " C C ", " ",
+ " " },
+ { " ", " ",
+ " C C ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " DA AD ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " C C ", " ",
+ " " },
+ { " ", " C C ",
+ " C C ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " CC CC ",
+ " DA AD ", " CC CC ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " C C ", " C C ",
+ " " },
+ { " ", " C C ",
+ " D ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " D D ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " D ", " C C ",
+ " " },
+ { " ", " C C ",
+ " D ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " D D ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " D ", " C C ",
+ " " },
+ { " CCCCCCC ", " C C ",
+ " DDDDDDD ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " D D ",
+ " D D ", "CCD DCC",
+ " D D ", "CCD DCC",
+ " D D ", " D D ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " DDDDDDD ", " C C ",
+ " C C " },
+ { " CCHHHHHCC ", " DDDDD ",
+ " DD DD ", " ",
+ " ", " S S ",
+ " ", " S S ",
+ " ", " ",
+ " ", " ",
+ " D D ", " D D ",
+ " D D ", "CD DC",
+ " D D ", "CD DC",
+ " D D ", " D D ",
+ " D D ", " ",
+ " ", " ",
+ " ", " S S ",
+ " ", " S S ",
+ " ", " ",
+ " DD DD ", " DDDDD ",
+ " C C " },
+ { " CHHHHHHHC ", " DDCDCDD ",
+ " D EEE D ", " ",
+ " C C ", " E E ",
+ " C C ", " E E ",
+ " ", " ",
+ " ", " ",
+ " D D ", " D D ",
+ " D D ", "CCE ECC",
+ " DE ED ", "CCE ECC",
+ " D D ", " D D ",
+ " D D ", " ",
+ " ", " ",
+ " ", " E E ",
+ " C C ", " E E ",
+ " C C ", " ",
+ " D EEE D ", " DDCDCDD ",
+ " C C " },
+ { " CHHCCCHHC ", " CCCCDCCDCCDCCCC ",
+ " CCC D EAAAE D CCC ", " CC CC ",
+ " CC CC ", " CC E E CC ",
+ " CC CC ", " CC E E CC ",
+ " C C ", " CC CC ",
+ " C C ", " C C ",
+ "CCD DCC", "CD DC",
+ "CCE ECC", "CCA ACC",
+ "CDA ADC", "CCA ACC",
+ "CCE ECC", "CD DC",
+ "CCD DCC", " C C ",
+ " C C ", " CC CC ",
+ " C C ", " CC E E CC ",
+ " CC CC ", " CC E E CC ",
+ " CC CC ", " CC CC ",
+ " CCC D EAAAE D CCC ", " CCCCDCCDCCDCCCC ",
+ " CCCCCCCCC " },
+ { " CHHC~CHHC ", " DDDDDDD ",
+ " DDD EAAAE DDD ", " DD DD ",
+ " CDAA AADC ", " DA AD ",
+ " CDA ADC ", " DA AD ",
+ " DA AD ", " DA AD ",
+ " D D ", " D D ",
+ " D D ", " D D ",
+ " DE ED ", "CDA ADC",
+ " DA AD ", "CDA ADC",
+ " DE ED ", " D D ",
+ " D D ", " D D ",
+ " D D ", " DA AD ",
+ " DA AD ", " DA AD ",
+ " CDA ADC ", " DA AD ",
+ " CDAA AADC ", " DD DD ",
+ " DDD EAAAE DDD ", " DDDDDDD ",
+ " C C " },
+ { " CHHCCCHHC ", " CCCCDCCDCCDCCCC ",
+ " CCC D EAAAE D CCC ", " CC CC ",
+ " CC CC ", " CC E E CC ",
+ " CC CC ", " CC E E CC ",
+ " C C ", " CC CC ",
+ " C C ", " C C ",
+ "CCD DCC", "CD DC",
+ "CCE ECC", "CCA ACC",
+ "CDA ADC", "CCA ACC",
+ "CCE ECC", "CD DC",
+ "CCD DCC", " C C ",
+ " C C ", " CC CC ",
+ " C C ", " CC E E CC ",
+ " CC CC ", " CC E E CC ",
+ " CC CC ", " CC CC ",
+ " CCC D EAAAE D CCC ", " CCCCDCCDCCDCCCC ",
+ " CCCCCCCCC " },
+ { " CHHHHHHHC ", " DDCDCDD ",
+ " D EEE D ", " ",
+ " C C ", " E E ",
+ " C C ", " E E ",
+ " ", " ",
+ " ", " ",
+ " D D ", " D D ",
+ " D D ", "CCE ECC",
+ " DE ED ", "CCE ECC",
+ " D D ", " D D ",
+ " D D ", " ",
+ " ", " ",
+ " ", " E E ",
+ " C C ", " E E ",
+ " C C ", " ",
+ " D EEE D ", " DDCDCDD ",
+ " C C " },
+ { " CCHHHHHCC ", " DDDDD ",
+ " DD DD ", " ",
+ " ", " S S ",
+ " ", " S S ",
+ " ", " ",
+ " ", " ",
+ " D D ", " D D ",
+ " D D ", "CD DC",
+ " D D ", "CD DC",
+ " D D ", " D D ",
+ " D D ", " ",
+ " ", " ",
+ " ", " S S ",
+ " ", " S S ",
+ " ", " ",
+ " DD DD ", " DDDDD ",
+ " C C " },
+ { " CCCCCCC ", " C C ",
+ " DDDDDDD ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " D D ",
+ " D D ", "CCD DCC",
+ " D D ", "CCD DCC",
+ " D D ", " D D ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " DDDDDDD ", " C C ",
+ " C C " },
+ { " ", " C C ",
+ " D ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " D D ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " D ", " C C ",
+ " " },
+ { " ", " C C ",
+ " D ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " D D ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " D ", " C C ",
+ " " },
+ { " ", " C C ",
+ " C C ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " CC CC ",
+ " DA AD ", " CC CC ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " C C ", " C C ",
+ " " },
+ { " ", " ",
+ " C C ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " DA AD ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " C C ", " ",
+ " " },
+ { " ", " ",
+ " C C ", " C C ",
+ " D ", " SEEAEES ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " S S ",
+ " E E ", " CC E E CC ",
+ " DA AD ", " CC E E CC ",
+ " E E ", " S S ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " SEEAEES ",
+ " D ", " C C ",
+ " C C ", " ",
+ " " },
+ { " ", " ",
+ " ", " C C ",
+ " CCCCC ", " D ",
+ " A ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " CC CC ",
+ " CDA ADC ", " CC CC ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " A ", " D ",
+ " CCCCC ", " C C ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " D ", " SEEAEES ",
+ " ", " ",
+ " ", " ",
+ " ", " S S ",
+ " E E ", " CC E E CC ",
+ " DA AD ", " CC E E CC ",
+ " E E ", " S S ",
+ " ", " ",
+ " ", " ",
+ " ", " SEEAEES ",
+ " D ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " CCCCC ", " D ",
+ " A ", " A ",
+ " ", " ",
+ " ", " ",
+ " C C ", " CC CC ",
+ " CDAA AADC ", " CC CC ",
+ " C C ", " ",
+ " ", " ",
+ " ", " A ",
+ " A ", " D ",
+ " CCCCC ", " C C ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " D ", " D ",
+ " ", " ",
+ " ", " ",
+ " ", " CC CC ",
+ " DD DD ", " CC CC ",
+ " ", " ",
+ " ", " ",
+ " ", " D ",
+ " D ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " C C ", " C C ",
+ " D ", " D ",
+ " DDDDDDD ", " DD DD ",
+ " D EEE D ", " CCC D EAAAE D CCC ",
+ " DDD EAAAE DDD ", " CCC D EAAAE D CCC ",
+ " D EEE D ", " DD DD ",
+ " DDDDDDD ", " D ",
+ " D ", " C C ",
+ " C C ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " C C ",
+ " C C ", " C C ",
+ " C C ", " DDDDD ",
+ " DDCDCDD ", " CCCCDCCDCCDCCCC ",
+ " DDDDDDD ", " CCCCDCCDCCDCCCC ",
+ " DDCDCDD ", " DDDDD ",
+ " C C ", " C C ",
+ " C C ", " C C ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " C C ", " C C ",
+ " C C ", " CCCCCCCCC ",
+ " C C ", " CCCCCCCCC ",
+ " C C ", " C C ",
+ " C C ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " " } }))
+ .addElement(
+ 'A',
+ withChannel(
+ "spacetime compression",
+ ofBlocksTiered(
+ (block, meta) -> block == TT_Container_Casings.SpacetimeCompressionFieldGenerators ? meta : null,
+ ImmutableList.of(
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 0),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 1),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 2),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 3),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 4),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 5),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 6),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 7),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 8)),
+ -1,
+ (t, meta) -> t.spacetimeCompressionFieldMetadata = meta,
+ t -> t.spacetimeCompressionFieldMetadata)))
+ .addElement(
+ 'S',
+ withChannel(
+ "stabilisation",
+ ofBlocksTiered(
+ (block, meta) -> block == TT_Container_Casings.StabilisationFieldGenerators ? meta : null,
+ ImmutableList.of(
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 0),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 1),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 2),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 3),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 4),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 5),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 6),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 7),
+ Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 8)),
+ -1,
+ (t, meta) -> t.stabilisationFieldMetadata = meta,
+ t -> t.stabilisationFieldMetadata)))
+ .addElement('C', ofBlock(sBlockCasingsBA0, 11))
+ .addElement('D', ofBlock(sBlockCasingsBA0, 10))
+ .addElement(
+ 'H',
+ buildHatchAdder(GT_MetaTileEntity_EM_EyeOfHarmony.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus)
+ .casingIndex(texturePage << 7)
+ .dot(1)
+ .buildAndChain(sBlockCasingsBA0, 12))
+ .addElement(
+ 'E',
+ withChannel(
+ "time dilation",
+ ofBlocksTiered(
+ (block, meta) -> block == TT_Container_Casings.TimeAccelerationFieldGenerator ? meta : null,
+ ImmutableList.of(
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 0),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 1),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 2),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 3),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 4),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 5),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 6),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 7),
+ Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 8)),
+ -1,
+ (t, meta) -> t.timeAccelerationFieldMetadata = meta,
+ t -> t.timeAccelerationFieldMetadata)))
+ .build();
+
+ private double hydrogenOverflowProbabilityAdjustment;
+ private double heliumOverflowProbabilityAdjustment;
+ private double stellarPlasmaOverflowProbabilityAdjustment;
+ private static final long TICKS_BETWEEN_HATCH_DRAIN = EOH_DEBUG_MODE ? 10 : 20;
+
+ private List<ItemStackLong> outputItems = new ArrayList<>();
+ private List<FluidStackLong> outputFluids = new ArrayList<>();
+
+ private void calculateInputFluidExcessValues(final long hydrogenRecipeRequirement,
+ final long heliumRecipeRequirement) {
+
+ double hydrogenStored = getHydrogenStored();
+ double heliumStored = getHeliumStored();
+ double stellarPlasmaStored = getStellarPlasmaStored();
+
+ double hydrogenExcessPercentage = hydrogenStored / hydrogenRecipeRequirement - 1;
+ double heliumExcessPercentage = heliumStored / heliumRecipeRequirement - 1;
+ double stellarPlasmaExcessPercentage = stellarPlasmaStored
+ / (heliumRecipeRequirement * (12.4 / 1_000_000f) * parallelAmount) - 1;
+
+ hydrogenOverflowProbabilityAdjustment = 1 - exp(-pow(30 * hydrogenExcessPercentage, 2));
+ heliumOverflowProbabilityAdjustment = 1 - exp(-pow(30 * heliumExcessPercentage, 2));
+ stellarPlasmaOverflowProbabilityAdjustment = 1 - exp(-pow(30 * stellarPlasmaExcessPercentage, 2));
+ }
+
+ private double recipeChanceCalculator() {
+ double chance = currentRecipe.getBaseRecipeSuccessChance()
+ - timeAccelerationFieldMetadata * TIME_ACCEL_DECREASE_CHANCE_PER_TIER
+ + stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
+
+ if (parallelAmount > 1) {
+ chance -= stellarPlasmaOverflowProbabilityAdjustment;
+ } else {
+ chance -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment);
+ }
+
+ return MathHelper.clamp_double(chance, 0.0, 1.0);
+ }
+
+ private double recipeYieldCalculator() {
+ double yield = 1.0 - stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
+
+ if (parallelAmount > 1) {
+ yield -= stellarPlasmaOverflowProbabilityAdjustment;
+ } else {
+ yield -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment);
+ }
+ return MathHelper.clamp_double(yield, 0.0, 1.0);
+ }
+
+ private int recipeProcessTimeCalculator(final long recipeTime, final long recipeSpacetimeCasingRequired) {
+
+ // Tier 1 recipe.
+ // Tier 2 spacetime blocks.
+ // = 3% discount.
+
+ // Tier 1 recipe.
+ // Tier 3 spacetime blocks.
+ // = 3%*3% = 5.91% discount.
+
+ final long spacetimeCasingDifference = (recipeSpacetimeCasingRequired - spacetimeCompressionFieldMetadata);
+ final double recipeTimeDiscounted = recipeTime * pow(2.0, -timeAccelerationFieldMetadata)
+ * pow(1 - SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE, -spacetimeCasingDifference)
+ / max(1, pow(2, currentCircuitMultiplier));
+ return (int) Math.max(recipeTimeDiscounted, 1.0);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_EyeOfHarmony> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ public GT_MetaTileEntity_EM_EyeOfHarmony(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_EyeOfHarmony(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_EyeOfHarmony(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+
+ spacetimeCompressionFieldMetadata = -1;
+ timeAccelerationFieldMetadata = -1;
+ stabilisationFieldMetadata = -1;
+
+ // Check structure of multi.
+ if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 16, 16, 0)) {
+ return false;
+ }
+
+ // Make sure there are no Crafting Input Buffers/Buses/Slaves.
+ if (!mDualInputHatches.isEmpty()) {
+ return false;
+ }
+
+ // Check if there is 1 output bus, and it is a ME output bus.
+ {
+ if (mOutputBusses.size() != 1) {
+ return false;
+ }
+
+ if (!(mOutputBusses.get(0) instanceof GT_MetaTileEntity_Hatch_OutputBus_ME)) {
+ return false;
+ }
+ }
+
+ // Check if there is 1 output hatch, and they are ME output hatches.
+ {
+ if (mOutputHatches.size() != 1) {
+ return false;
+ }
+
+ if (!(mOutputHatches.get(0) instanceof GT_MetaTileEntity_Hatch_Output_ME)) {
+ return false;
+ }
+ }
+
+ // Check there is 1 input bus, and it is not a stocking input bus.
+ {
+ if (mInputBusses.size() != 1) {
+ return false;
+ }
+
+ if (mInputBusses.get(0) instanceof GT_MetaTileEntity_Hatch_InputBus_ME) {
+ return false;
+ }
+ }
+
+ // Make sure there are no energy hatches.
+ {
+ if (mEnergyHatches.size() > 0) {
+ return false;
+ }
+
+ if (mExoticEnergyHatches.size() > 0) {
+ return false;
+ }
+ }
+
+ // Make sure there are 2 input hatches.
+ if (mInputHatches.size() != 2) {
+ return false;
+ }
+
+ mHardHammer = true;
+ mSoftHammer = true;
+ mScrewdriver = true;
+ mCrowbar = true;
+ mSolderingTool = true;
+ mWrench = true;
+ return true;
+ }
+
+ private boolean animationsEnabled = true;
+
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ animationsEnabled = !animationsEnabled;
+ aPlayer.addChatMessage(
+ new ChatComponentText("Animations are now " + (animationsEnabled ? "enabled" : "disabled") + "."));
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Spacetime Manipulator, EOH")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("Creates a pocket of spacetime that is bigger on the inside using transdimensional")
+ .addInfo("engineering. Certified Time Lord regulation compliant. This multi uses too much EU")
+ .addInfo("to be handled with conventional means. All EU requirements are handled directly by")
+ .addInfo("your wireless EU network.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("This multiblock will constantly consume hydrogen and helium when it is not running a")
+ .addInfo("recipe once per second. It will store this internally, you can see the totals by")
+ .addInfo("using a scanner. This multi also has three tiered blocks with " + RED + 9 + GRAY + " tiers")
+ .addInfo("each. They are as follows and have the associated effects on the multi.")
+ .addInfo(BLUE + "Spacetime Compression Field Generator:")
+ .addInfo("- The tier of this block determines what recipes can be run. If the multiblocks")
+ .addInfo(" spacetime compression field block exceeds the requirements of the recipe it")
+ .addInfo(
+ " will decrease the processing time by " + RED
+ + formatNumbers(SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE * 100)
+ + "%"
+ + GRAY
+ + " per tier over the requirement (multiplicative).")
+ .addInfo(BLUE + "Time Dilation Field Generator:")
+ .addInfo(
+ "- Decreases the time required for a recipe by " + RED
+ + "50%"
+ + GRAY
+ + " per tier of block (multiplicative).")
+ .addInfo(
+ " Decreases the probability of a recipe succeeding by " + RED
+ + formatNumbers(TIME_ACCEL_DECREASE_CHANCE_PER_TIER * 100)
+ + "%"
+ + GRAY
+ + " per tier (additive)")
+ .addInfo(BLUE + "Stabilisation Field Generator:")
+ .addInfo(
+ "- Increases the probability of a recipe succeeding by " + RED
+ + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100)
+ + "%"
+ + GRAY
+ + " per tier (additive).")
+ .addInfo(
+ " Decreases the yield of a recipe by " + RED
+ + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100)
+ + "%"
+ + GRAY
+ + " per tier (additive). ")
+ .addInfo(" > Low tier stabilisation field generators have a power output penalty.")
+ .addInfo(
+ " The power output penalty for using Crude Stabilisation Field Generators is " + RED
+ + formatNumbers(
+ STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * TOTAL_CASING_TIERS_WITH_POWER_PENALTY
+ * 100)
+ + "%"
+ + GRAY
+ + ".")
+ .addInfo(
+ " This penalty decreases by " + RED
+ + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100)
+ + "%"
+ + GRAY
+ + " per tier (additive).")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("Going over a recipe requirement on hydrogen or helium has a penalty on yield and recipe chance.")
+ .addInfo("All stored hydrogen and helium is consumed during a craft. The associated formulas are:")
+ .addInfo(GREEN + "Overflow ratio = (Stored fluid / Recipe requirement) - 1")
+ .addInfo(GREEN + "Adjustment value = 1 - exp(-(30 * Overflow ratio)^2)")
+ .addInfo("The Adjustment value is then subtracted from the total yield and recipe chance.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("It should be noted that base recipe chance is determined per recipe and yield always starts")
+ .addInfo("at 1 and subtracts depending on penalties. All fluid/item outputs are multiplied by the")
+ .addInfo("yield. Failure fluid is exempt.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("This multiblock can only output to ME output buses/hatches.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("This multiblock can be overclocked by placing a programmed circuit into the input bus.")
+ .addInfo(
+ "E.g. A circuit of 2 will provide 2 OCs, 16x EU input and 0.25x the time. EU output is unaffected.")
+ .addInfo("All outputs are equal. All item and fluid output chances & amounts per recipe are unaffected.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo(
+ "If a recipe fails the EOH will output " + GREEN
+ + "Success chance * "
+ + formatNumbers(MOLTEN_SPACETIME_PER_FAILURE_TIER)
+ + " * ("
+ + SPACETIME_FAILURE_BASE
+ + ")^(Recipe tier)"
+ + GRAY
+ + "L of molten")
+ .addInfo(
+ MaterialsUEVplus.SpaceTime.getLocalizedNameForItem("%material")
+ + " instead of fluid/item outputs and output as much EU as a successful recipe.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo(
+ "This multiblock can perform parallel processing by placing Astral Array Fabricators into the input bus.")
+ .addInfo("The amount of parallel is calculated via these formulas:")
+ .addInfo(GREEN + "Parallel exponent = floor(log(8 * Astral Array amount) / log(1.7))")
+ .addInfo(GREEN + "Parallel = 2^(Parallel exponent)")
+ .addInfo("If the EOH is running parallel recipes, the power calculation changes.")
+ .addInfo("The power needed for parallel processing is calculated as follows:")
+ .addInfo(GREEN + "total EU = ((EU output - EU input * 1.63) / 9) * 2.3^(Parallel exponent - 1)")
+ .addInfo(
+ "Furthermore, if parallel recipes are run, the recipes consume "
+ + MaterialsUEVplus.RawStarMatter.getLocalizedNameForItem("%material"))
+ .addInfo("instead of helium and hydrogen. Overflow penalties still apply.")
+ .addInfo(
+ "The required amount of fluid to start a recipe is " + GREEN
+ + "12.4 / 10^6 * Helium amount * Parallel"
+ + GRAY
+ + ".")
+ .addInfo("The success or failure of each parallel is determined independently.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo("Animations can be disabled by using a screwdriver on the multiblock.")
+ .addSeparator()
+ .addStructureInfo("Eye of Harmony structure is too complex! See schematic for details.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "896" + EnumChatFormatting.GRAY + " Reinforced Spatial Structure Casing.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "534" + EnumChatFormatting.GRAY + " Reinforced Temporal Structure Casing.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "31"
+ + EnumChatFormatting.GRAY
+ + " Infinite SpaceTime Energy Boundary Casing.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "168" + EnumChatFormatting.GRAY + " Time Dilation Field Generator.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Stabilisation Field Generator.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "138" + EnumChatFormatting.GRAY + " Spacetime Compression Field Generator.")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 2 + EnumChatFormatting.GRAY + " input hatches.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " ME output hatch.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " input bus.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " ME output bus.")
+ .addStructureInfo("--------------------------------------------")
+ .beginStructureBlock(33, 33, 33, false)
+ .toolTipFinisher(AuthorColen.substring(8) + EnumChatFormatting.GRAY + "&" + CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG_ACTIVE");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12],
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12] };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM(STRUCTURE_PIECE_MAIN, 16, 16, 0, stackSize, hintsOnly);
+ }
+
+ private final Map<Fluid, Long> validFluidMap = new HashMap<>() {
+
+ private static final long serialVersionUID = -8452610443191188130L;
+
+ {
+ put(Materials.Hydrogen.mGas, 0L);
+ put(Materials.Helium.mGas, 0L);
+ put(MaterialsUEVplus.RawStarMatter.mFluid, 0L);
+ }
+ };
+
+ private void drainFluidFromHatchesAndStoreInternally() {
+ List<FluidStack> fluidStacks = getStoredFluids();
+ for (FluidStack fluidStack : fluidStacks) {
+ if (validFluidMap.containsKey(fluidStack.getFluid())) {
+ validFluidMap.merge(fluidStack.getFluid(), (long) fluidStack.amount, Long::sum);
+ fluidStack.amount = 0;
+ }
+ }
+ updateSlots();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for visual
+ return TecTechRecipeMaps.eyeOfHarmonyRecipes;
+ }
+
+ private EyeOfHarmonyRecipe currentRecipe;
+
+ // Counter for lag prevention.
+ private long lagPreventer = 0;
+
+ // Check for recipe every recipeCheckInterval ticks.
+ private static final long RECIPE_CHECK_INTERVAL = 3 * 20;
+ private long currentCircuitMultiplier = 0;
+ private long astralArrayAmount = 0;
+ private long parallelAmount = 1;
+ private long successfulParallelAmount = 0;
+ private double yield = 0;
+ private BigInteger usedEU = BigInteger.ZERO;
+ private FluidStackLong stellarPlasma;
+ private FluidStackLong starMatter;
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ ItemStack controllerStack = getControllerSlot();
+ if (controllerStack == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_planet_block");
+ }
+
+ lagPreventer++;
+ if (lagPreventer < RECIPE_CHECK_INTERVAL) {
+ lagPreventer = 0;
+ // No item in multi gui slot.
+
+ currentRecipe = eyeOfHarmonyRecipeStorage.recipeLookUp(controllerStack);
+ if (currentRecipe == null) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+ CheckRecipeResult result = processRecipe(currentRecipe);
+ if (!result.wasSuccessful()) currentRecipe = null;
+ return result;
+ }
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ private long getHydrogenStored() {
+ return validFluidMap.get(Materials.Hydrogen.mGas);
+ }
+
+ private long getHeliumStored() {
+ return validFluidMap.get(Materials.Helium.mGas);
+ }
+
+ private long getStellarPlasmaStored() {
+ return validFluidMap.get(MaterialsUEVplus.RawStarMatter.mFluid);
+ }
+
+ public CheckRecipeResult processRecipe(EyeOfHarmonyRecipe recipeObject) {
+
+ // Get circuit damage, clamp it and then use it later for overclocking.
+ currentCircuitMultiplier = 0;
+ if (!mInputBusses.isEmpty()) {
+ for (ItemStack itemStack : mInputBusses.get(0)
+ .getRealInventory()) {
+ if (GT_Utility.isAnyIntegratedCircuit(itemStack)) {
+ currentCircuitMultiplier = MathHelper.clamp_int(itemStack.getItemDamage(), 0, 24);
+ break;
+ }
+ }
+ }
+
+ astralArrayAmount = 0;
+
+ for (ItemStack itemStack : mInputBusses.get(0)
+ .getRealInventory()) {
+ if (itemStack != null && itemStack.isItemEqual(astralArrayFabricator.get(1))) {
+ astralArrayAmount += itemStack.stackSize;
+ }
+ }
+
+ long parallelExponent = 1;
+
+ if (astralArrayAmount != 0) {
+ parallelExponent = (long) Math.floor(Math.log(8 * astralArrayAmount) / LOG_CONSTANT);
+ parallelAmount = (long) pow(2, parallelExponent);
+ } else {
+ parallelAmount = 1;
+ }
+
+ // Debug mode, overwrites the required fluids to initiate the recipe to 100L of each.
+ if (parallelAmount > 1) {
+ if ((EOH_DEBUG_MODE && getStellarPlasmaStored() < 100) || (!EOH_DEBUG_MODE && getStellarPlasmaStored()
+ < currentRecipe.getHeliumRequirement() * (12.4 / 1_000_000f) * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_stellar_plasma");
+ }
+ }
+
+ if (parallelAmount == 1) {
+ if ((EOH_DEBUG_MODE && getHydrogenStored() < 100)
+ || (!EOH_DEBUG_MODE && getHydrogenStored() < currentRecipe.getHydrogenRequirement() * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_hydrogen");
+ }
+
+ if ((EOH_DEBUG_MODE && getHeliumStored() < 100)
+ || (!EOH_DEBUG_MODE && getHeliumStored() < currentRecipe.getHeliumRequirement() * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_helium");
+ }
+ }
+
+ if (spacetimeCompressionFieldMetadata == -1) {
+ return CheckRecipeResultRegistry
+ .insufficientMachineTier((int) recipeObject.getSpacetimeCasingTierRequired());
+ }
+
+ // Check tier of spacetime compression blocks is high enough.
+ if ((spacetimeCompressionFieldMetadata + 1) < recipeObject.getSpacetimeCasingTierRequired()) {
+ return CheckRecipeResultRegistry
+ .insufficientMachineTier((int) recipeObject.getSpacetimeCasingTierRequired());
+ }
+
+ // Calculate multipliers used in power calculations
+ double powerMultiplier = Math.max(1, Math.pow(2.3, (parallelExponent - 1)));
+
+ // Determine EU recipe input
+ startEU = recipeObject.getEUStartCost();
+
+ // Calculate normal EU values
+ double outputEUPenalty = (TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata)
+ * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
+ outputEU_BigInt = BigInteger.valueOf((long) (recipeObject.getEUOutput() * (1 - outputEUPenalty)));
+ usedEU = BigInteger.valueOf(-startEU)
+ .multiply(BigInteger.valueOf((long) Math.pow(4, currentCircuitMultiplier)));
+
+ // Calculate parallel EU values
+ if (parallelAmount > 1) {
+ outputEU_BigInt = outputEU_BigInt
+ .multiply(BigInteger.valueOf((long) (powerMultiplier * PRECISION_MULTIPLIER)))
+ .divide(BigInteger.valueOf(PRECISION_MULTIPLIER * POWER_DIVISION_CONSTANT));
+
+ usedEU = usedEU
+ .multiply(
+ BigInteger.valueOf((long) (powerMultiplier * PARALLEL_MULTIPLIER_CONSTANT * PRECISION_MULTIPLIER)))
+ .divide(BigInteger.valueOf(PRECISION_MULTIPLIER * POWER_DIVISION_CONSTANT));
+ }
+
+ // Remove EU from the users network.
+ if (!addEUToGlobalEnergyMap(userUUID, usedEU)) {
+ return SimpleCheckRecipeResult.ofFailure("insufficient_power_no_val");
+ }
+
+ mMaxProgresstime = recipeProcessTimeCalculator(
+ recipeObject.getRecipeTimeInTicks(),
+ recipeObject.getSpacetimeCasingTierRequired());
+
+ calculateInputFluidExcessValues(recipeObject.getHydrogenRequirement(), recipeObject.getHeliumRequirement());
+
+ if (EOH_DEBUG_MODE) {
+ hydrogenOverflowProbabilityAdjustment = 0;
+ heliumOverflowProbabilityAdjustment = 0;
+ stellarPlasmaOverflowProbabilityAdjustment = 0;
+ }
+
+ successChance = recipeChanceCalculator();
+ currentRecipeRocketTier = currentRecipe.getRocketTier();
+
+ // Reduce internal storage by input fluid quantity required for recipe.
+ if (parallelAmount > 1) {
+ validFluidMap.put(MaterialsUEVplus.RawStarMatter.mFluid, 0L);
+ } else {
+ validFluidMap.put(Materials.Hydrogen.mGas, 0L);
+ validFluidMap.put(Materials.Helium.mGas, 0L);
+ }
+
+ yield = recipeYieldCalculator();
+ if (EOH_DEBUG_MODE) {
+ successChance = 1; // Debug recipes, sets them to 100% output chance.
+ }
+
+ // Return copies of the output objects.
+ outputFluids = recipeObject.getOutputFluids();
+ outputItems = recipeObject.getOutputItems();
+
+ // Star matter is always the last element in the array.
+ starMatter = new FluidStackLong(outputFluids.get(outputFluids.size() - 1));
+
+ // And stellar plasma is the second last.
+ stellarPlasma = new FluidStackLong(outputFluids.get(outputFluids.size() - 2));
+
+ successfulParallelAmount = (long) calculateChancedOutputMultiplier(
+ (int) (10000 * successChance),
+ (int) parallelAmount);
+ // Iterate over item output list and apply yield & successful parallel values.
+ for (ItemStackLong itemStackLong : outputItems) {
+ itemStackLong.stackSize *= yield * successfulParallelAmount;
+ }
+
+ // Iterate over fluid output list and apply yield & successful parallel values.
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ fluidStackLong.amount *= yield * successfulParallelAmount;
+ }
+
+ updateSlots();
+
+ if (animationsEnabled) {
+ createRenderBlock(currentRecipe);
+ }
+
+ recipeRunning = true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ private void createRenderBlock(final EyeOfHarmonyRecipe currentRecipe) {
+
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 16 * 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), eyeOfHarmonyRenderBlock);
+ TileEyeOfHarmony rendererTileEntity = (TileEyeOfHarmony) this.getBaseMetaTileEntity()
+ .getWorld()
+ .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+
+ rendererTileEntity.setTier(currentRecipe.getRocketTier());
+
+ int recipeSpacetimeTier = (int) currentRecipe.getSpacetimeCasingTierRequired();
+
+ // Star is a larger size depending on the spacetime tier of the recipe.
+ rendererTileEntity.setSize((1 + recipeSpacetimeTier));
+
+ // Star rotates faster the higher tier time dilation you use in the multi.
+ // Lower value = faster rotation speed.
+ rendererTileEntity.setRotationSpeed((1 + timeAccelerationFieldMetadata) / 2.0f);
+ }
+
+ private double successChance;
+ private long currentRecipeRocketTier;
+
+ private void outputFailedChance() {
+ long failedParallelAmount = parallelAmount - successfulParallelAmount;
+ if (failedParallelAmount > 0) {
+ // 2^Tier spacetime released upon recipe failure.
+ outputFluidToAENetwork(
+ MaterialsUEVplus.SpaceTime.getMolten(1),
+ (long) ((successChance * MOLTEN_SPACETIME_PER_FAILURE_TIER
+ * pow(SPACETIME_FAILURE_BASE, currentRecipeRocketTier + 1)) * failedParallelAmount));
+ }
+ super.outputAfterRecipe_EM();
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ destroyRenderBlock();
+ recipeRunning = false;
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ super.onBlockDestroyed();
+ destroyRenderBlock();
+ }
+
+ private void destroyRenderBlock() {
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ }
+
+ public void outputAfterRecipe_EM() {
+ recipeRunning = false;
+ eRequiredData = 0L;
+
+ destroyRenderBlock();
+
+ // Output EU
+ addEUToGlobalEnergyMap(userUUID, outputEU_BigInt);
+
+ startEU = 0;
+ outputEU_BigInt = BigInteger.ZERO;
+
+ outputFailedChance();
+
+ if (successfulParallelAmount > 0) {
+ for (ItemStackLong itemStack : outputItems) {
+ outputItemToAENetwork(itemStack.itemStack, itemStack.stackSize);
+ }
+
+ for (FluidStackLong fluidStack : outputFluids) {
+ outputFluidToAENetwork(fluidStack.fluidStack, fluidStack.amount);
+ }
+ }
+
+ // Clear the array list for new recipes.
+ outputItems = new ArrayList<>();
+ outputFluids = new ArrayList<>();
+
+ // Do other stuff from TT superclasses. E.g. outputting fluids.
+ super.outputAfterRecipe_EM();
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aTick == 1) {
+ userUUID = String.valueOf(getBaseMetaTileEntity().getOwnerUuid());
+ String userName = getBaseMetaTileEntity().getOwnerName();
+ strongCheckOrAddUser(userUUID, userName);
+ }
+
+ if (!recipeRunning && mMachine) {
+ if ((aTick % TICKS_BETWEEN_HATCH_DRAIN) == 0) {
+ drainFluidFromHatchesAndStoreInternally();
+ }
+ }
+ }
+
+ private boolean recipeRunning = false;
+
+ // Will void if AE network is full.
+ private void outputItemToAENetwork(ItemStack item, long amount) {
+
+ if ((item == null) || (amount <= 0)) {
+ return;
+ }
+
+ if (amount < Integer.MAX_VALUE) {
+ ItemStack tmpItem = item.copy();
+ tmpItem.stackSize = (int) amount;
+ ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem);
+ } else {
+ // For item stacks > Int max.
+ while (amount >= Integer.MAX_VALUE) {
+ ItemStack tmpItem = item.copy();
+ tmpItem.stackSize = Integer.MAX_VALUE;
+ ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem);
+ amount -= Integer.MAX_VALUE;
+ }
+ ItemStack tmpItem = item.copy();
+ tmpItem.stackSize = (int) amount;
+ ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem);
+ }
+ }
+
+ private void outputFluidToAENetwork(FluidStack fluid, long amount) {
+
+ if ((fluid == null) || (amount <= 0)) {
+ return;
+ }
+
+ if (amount < Integer.MAX_VALUE) {
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = (int) amount;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ } else {
+ // For fluidStacks > Int max.
+ while (amount >= Integer.MAX_VALUE) {
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = Integer.MAX_VALUE;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ amount -= Integer.MAX_VALUE;
+ }
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = (int) amount;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData()));
+ str.add(GOLD + "---------------- Control Block Statistics ----------------");
+ if (spacetimeCompressionFieldMetadata < 0) {
+ str.add("Spacetime Compression Field Grade: None");
+ } else {
+ str.add(
+ "Spacetime Compression Field Grade: " + EOH_TIER_FANCY_NAMES[spacetimeCompressionFieldMetadata]
+ + RESET
+ + " ("
+ + YELLOW
+ + spacetimeCompressionFieldMetadata
+ + RESET
+ + ")");
+ }
+ if (timeAccelerationFieldMetadata < 0) {
+ str.add("Time Dilation Field Grade: None");
+ } else {
+ str.add(
+ "Time Dilation Field Grade: " + EOH_TIER_FANCY_NAMES[timeAccelerationFieldMetadata]
+ + RESET
+ + " ("
+ + YELLOW
+ + timeAccelerationFieldMetadata
+ + RESET
+ + ")");
+ }
+ if (stabilisationFieldMetadata < 0) {
+ str.add("Stabilisation Field Grade: None");
+ } else {
+ str.add(
+ "Stabilisation Field Grade: " + EOH_TIER_FANCY_NAMES[stabilisationFieldMetadata]
+ + RESET
+ + " ("
+ + YELLOW
+ + stabilisationFieldMetadata
+ + RESET
+ + ")");
+ }
+ str.add(GOLD + "----------------- Internal Fluids Stored ----------------");
+ validFluidMap.forEach(
+ (key, value) -> str.add(BLUE + key.getLocalizedName() + RESET + " : " + RED + formatNumbers(value)));
+ if (recipeRunning) {
+ str.add(GOLD + "---------------------- Other Stats ---------------");
+ str.add("Recipe Success Chance: " + RED + formatNumbers(100 * successChance) + RESET + "%");
+ str.add("Recipe Yield: " + RED + formatNumbers(100 * yield) + RESET + "%");
+ str.add("Astral Array Fabricators detected: " + RED + formatNumbers(astralArrayAmount));
+ str.add("Total Parallel: " + RED + formatNumbers(parallelAmount));
+ str.add("EU Output: " + RED + toStandardForm(outputEU_BigInt) + RESET + " EU");
+ str.add("EU Input: " + RED + toStandardForm(usedEU.abs()) + RESET + " EU");
+ int currentMaxProgresstime = Math.max(maxProgresstime(), 1);
+ if (starMatter != null && starMatter.fluidStack != null) {
+ FluidStackLong starMatterOutput = new FluidStackLong(
+ starMatter.fluidStack,
+ (long) (starMatter.amount * yield * successChance * parallelAmount));
+ str.add(
+ "Average " + starMatterOutput.fluidStack.getLocalizedName()
+ + " Output: "
+ + RED
+ + formatNumbers(starMatterOutput.amount)
+ + RESET
+ + " L, "
+ + YELLOW
+ + formatNumbers(starMatterOutput.amount * 20.0 / currentMaxProgresstime)
+ + RESET
+ + " L/s");
+
+ FluidStackLong stellarPlasmaOutput = new FluidStackLong(
+ MaterialsUEVplus.RawStarMatter.getFluid(0),
+ (long) (stellarPlasma.amount * yield * successChance * parallelAmount));
+ str.add(
+ "Average " + stellarPlasmaOutput.fluidStack.getLocalizedName()
+ + " Output: "
+ + RED
+ + formatNumbers(stellarPlasmaOutput.amount)
+ + RESET
+ + " L, "
+ + YELLOW
+ + formatNumbers(stellarPlasmaOutput.amount * 20.0 / currentMaxProgresstime)
+ + RESET
+ + " L/s");
+ }
+ BigInteger euPerTick = (outputEU_BigInt.subtract(usedEU.abs()))
+ .divide(BigInteger.valueOf(currentMaxProgresstime));
+
+ str.add("Estimated EU/t: " + RED + toStandardForm(euPerTick) + RESET + " EU/t");
+ }
+ str.add(GOLD + "-----------------------------------------------------");
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return new String[] { "Eye of Harmony multiblock" };
+ }
+
+ // NBT save/load strings.
+ private static final String EYE_OF_HARMONY = "eyeOfHarmonyOutput";
+ private static final String NUMBER_OF_ITEMS_NBT_TAG = EYE_OF_HARMONY + "numberOfItems";
+ private static final String NUMBER_OF_FLUIDS_NBT_TAG = EYE_OF_HARMONY + "numberOfFluids";
+ private static final String ITEM_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "itemOutput";
+ private static final String FLUID_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "fluidOutput";
+ private static final String RECIPE_RUNNING_NBT_TAG = EYE_OF_HARMONY + "recipeRunning";
+ private static final String CURRENT_RECIPE_STAR_MATTER_TAG = EYE_OF_HARMONY + "recipeStarMatter";
+ private static final String CURRENT_RECIPE_STELLAR_PLASMA_TAG = EYE_OF_HARMONY + "recipeStellarPlasma";
+ private static final String CURRENT_RECIPE_FIXED_OUTPUTS_TAG = EYE_OF_HARMONY + "recipeFixedOutputs";
+ private static final String RECIPE_SUCCESS_CHANCE_NBT_TAG = EYE_OF_HARMONY + "recipeSuccessChance";
+ private static final String ROCKET_TIER_NBT_TAG = EYE_OF_HARMONY + "rocketTier";
+ private static final String CURRENT_CIRCUIT_MULTIPLIER_TAG = EYE_OF_HARMONY + "currentCircuitMultiplier";
+ private static final String ANIMATIONS_ENABLED = EYE_OF_HARMONY + "animationsEnabled";
+ private static final String CALCULATED_EU_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "outputEU_BigInt";
+ private static final String PARALLEL_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "parallelAmount";
+ private static final String YIELD_NBT_TAG = EYE_OF_HARMONY + "yield";
+ private static final String SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "successfulParallelAmount";
+ private static final String ASTRAL_ARRAY_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "astralArrayAmount";
+ private static final String CALCULATED_EU_INPUT_NBT_TAG = EYE_OF_HARMONY + "usedEU";
+
+ // Sub tags, less specific names required.
+ private static final String STACK_SIZE = "stackSize";
+ private static final String ITEM_STACK_NBT_TAG = "itemStack";
+ private static final String FLUID_AMOUNT = "fluidAmount";
+ private static final String FLUID_STACK_NBT_TAG = "fluidStack";
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ // Save the quantity of fluid stored inside the controller.
+ validFluidMap.forEach((key, value) -> aNBT.setLong("stored." + key.getUnlocalizedName(), value));
+
+ aNBT.setBoolean(RECIPE_RUNNING_NBT_TAG, recipeRunning);
+ aNBT.setDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG, successChance);
+ aNBT.setLong(ROCKET_TIER_NBT_TAG, currentRecipeRocketTier);
+ aNBT.setLong(CURRENT_CIRCUIT_MULTIPLIER_TAG, currentCircuitMultiplier);
+ aNBT.setBoolean(ANIMATIONS_ENABLED, animationsEnabled);
+ aNBT.setLong(PARALLEL_AMOUNT_NBT_TAG, parallelAmount);
+ aNBT.setLong(SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG, successfulParallelAmount);
+ aNBT.setDouble(YIELD_NBT_TAG, yield);
+ aNBT.setLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG, astralArrayAmount);
+ aNBT.setByteArray(CALCULATED_EU_OUTPUT_NBT_TAG, outputEU_BigInt.toByteArray());
+ aNBT.setByteArray(CALCULATED_EU_INPUT_NBT_TAG, usedEU.toByteArray());
+
+ // Store damage values/stack sizes of GT items being outputted.
+ NBTTagCompound itemStackListNBTTag = new NBTTagCompound();
+ itemStackListNBTTag.setLong(NUMBER_OF_ITEMS_NBT_TAG, outputItems.size());
+
+ int index = 0;
+ for (ItemStackLong itemStackLong : outputItems) {
+ // Save stack size to NBT.
+ itemStackListNBTTag.setLong(index + STACK_SIZE, itemStackLong.stackSize);
+
+ // Save ItemStack to NBT.
+ aNBT.setTag(index + ITEM_STACK_NBT_TAG, itemStackLong.itemStack.writeToNBT(new NBTTagCompound()));
+
+ index++;
+ }
+
+ aNBT.setTag(ITEM_OUTPUT_NBT_TAG, itemStackListNBTTag);
+
+ // Store damage values/stack sizes of GT fluids being outputted.
+ NBTTagCompound fluidStackListNBTTag = new NBTTagCompound();
+ fluidStackListNBTTag.setLong(NUMBER_OF_FLUIDS_NBT_TAG, outputFluids.size());
+
+ int indexFluids = 0;
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ // Save fluid amount to NBT.
+ fluidStackListNBTTag.setLong(indexFluids + FLUID_AMOUNT, fluidStackLong.amount);
+
+ // Save FluidStack to NBT.
+ aNBT.setTag(indexFluids + FLUID_STACK_NBT_TAG, fluidStackLong.fluidStack.writeToNBT(new NBTTagCompound()));
+
+ indexFluids++;
+ }
+
+ aNBT.setTag(FLUID_OUTPUT_NBT_TAG, fluidStackListNBTTag);
+
+ if (starMatter != null && starMatter.fluidStack != null) {
+
+ NBTTagCompound fixedRecipeOutputs = new NBTTagCompound();
+
+ fixedRecipeOutputs.setLong(0 + FLUID_AMOUNT, starMatter.amount);
+ aNBT.setTag(CURRENT_RECIPE_STAR_MATTER_TAG, starMatter.fluidStack.writeToNBT(new NBTTagCompound()));
+
+ fixedRecipeOutputs.setLong(1 + FLUID_AMOUNT, stellarPlasma.amount);
+ aNBT.setTag(CURRENT_RECIPE_STELLAR_PLASMA_TAG, stellarPlasma.fluidStack.writeToNBT(new NBTTagCompound()));
+
+ aNBT.setTag(CURRENT_RECIPE_FIXED_OUTPUTS_TAG, fixedRecipeOutputs);
+ }
+
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+
+ // Load the quantity of fluid stored inside the controller.
+ validFluidMap
+ .forEach((key, value) -> validFluidMap.put(key, aNBT.getLong("stored." + key.getUnlocalizedName())));
+
+ // Load other stuff from NBT.
+ recipeRunning = aNBT.getBoolean(RECIPE_RUNNING_NBT_TAG);
+ successChance = aNBT.getDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG);
+ currentRecipeRocketTier = aNBT.getLong(ROCKET_TIER_NBT_TAG);
+ currentCircuitMultiplier = aNBT.getLong(CURRENT_CIRCUIT_MULTIPLIER_TAG);
+ animationsEnabled = aNBT.getBoolean(ANIMATIONS_ENABLED);
+ parallelAmount = aNBT.getLong(PARALLEL_AMOUNT_NBT_TAG);
+ yield = aNBT.getDouble(YIELD_NBT_TAG);
+ successfulParallelAmount = aNBT.getLong(SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG);
+ astralArrayAmount = aNBT.getLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG);
+ outputEU_BigInt = new BigInteger(aNBT.getByteArray(CALCULATED_EU_OUTPUT_NBT_TAG));
+ usedEU = new BigInteger(aNBT.getByteArray(CALCULATED_EU_INPUT_NBT_TAG));
+
+ // Load damage values/stack sizes of GT items being outputted and convert back to items.
+ NBTTagCompound tempItemTag = aNBT.getCompoundTag(ITEM_OUTPUT_NBT_TAG);
+
+ // Iterate over all stored items.
+ for (int index = 0; index < tempItemTag.getInteger(NUMBER_OF_ITEMS_NBT_TAG); index++) {
+
+ // Load stack size from NBT.
+ long stackSize = tempItemTag.getLong(index + STACK_SIZE);
+
+ // Load ItemStack from NBT.
+ ItemStack itemStack = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(index + ITEM_STACK_NBT_TAG));
+
+ outputItems.add(new ItemStackLong(itemStack, stackSize));
+ }
+
+ // Load damage values/fluid amounts of GT fluids being outputted and convert back to fluids.
+ NBTTagCompound tempFluidTag = aNBT.getCompoundTag(FLUID_OUTPUT_NBT_TAG);
+
+ // Iterate over all stored fluids.
+ for (int indexFluids = 0; indexFluids < tempFluidTag.getInteger(NUMBER_OF_FLUIDS_NBT_TAG); indexFluids++) {
+
+ // Load fluid amount from NBT.
+ long fluidAmount = tempFluidTag.getLong(indexFluids + FLUID_AMOUNT);
+
+ // Load FluidStack from NBT.
+ FluidStack fluidStack = FluidStack
+ .loadFluidStackFromNBT(aNBT.getCompoundTag(indexFluids + FLUID_STACK_NBT_TAG));
+
+ outputFluids.add(new FluidStackLong(fluidStack, fluidAmount));
+ }
+
+ tempFluidTag = aNBT.getCompoundTag(CURRENT_RECIPE_FIXED_OUTPUTS_TAG);
+ starMatter = new FluidStackLong(
+ FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(CURRENT_RECIPE_STAR_MATTER_TAG)),
+ tempFluidTag.getLong(0 + FLUID_AMOUNT));
+ stellarPlasma = new FluidStackLong(
+ FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(CURRENT_RECIPE_STELLAR_PLASMA_TAG)),
+ tempFluidTag.getLong(1 + FLUID_AMOUNT));
+
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java
new file mode 100644
index 0000000000..6d6d7fdb43
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java
@@ -0,0 +1,2385 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock;
+import static com.github.technus.tectech.util.GodforgeMath.allowModuleConnection;
+import static com.github.technus.tectech.util.GodforgeMath.calculateEnergyDiscountForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calculateFuelConsumption;
+import static com.github.technus.tectech.util.GodforgeMath.calculateMaxFuelFactor;
+import static com.github.technus.tectech.util.GodforgeMath.calculateMaxHeatForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calculateMaxParallelForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calculateProcessingVoltageForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calculateSpeedBonusForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calculateStartupFuelConsumption;
+import static com.github.technus.tectech.util.GodforgeMath.queryMilestoneStats;
+import static com.github.technus.tectech.util.GodforgeMath.setMiscModuleParameters;
+import static com.github.technus.tectech.util.TT_Utility.toExponentForm;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static java.lang.Math.floor;
+import static java.lang.Math.log;
+import static java.lang.Math.max;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.CustomItemList;
+import com.github.technus.tectech.thing.block.GodforgeGlassBlock;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule;
+import com.github.technus.tectech.util.CommonValues;
+import com.google.common.math.LongMath;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+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.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.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.IWidgetBuilder;
+import com.gtnewhorizons.modularui.api.widget.Interactable;
+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.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+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.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+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.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.util.GT_HatchElementBuilder;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.IGT_HatchAdder;
+
+public class GT_MetaTileEntity_EM_ForgeOfGods extends GT_MetaTileEntity_MultiblockBase_EM
+ implements IConstructable, ISurvivalConstructable {
+
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+
+ private int fuelConsumptionFactor = 1;
+ private int selectedFuelType = 0;
+ private int internalBattery = 0;
+ private int maxBatteryCharge = 100;
+ private int gravitonShardsAvailable = 0;
+ private int gravitonShardsSpent = 0;
+ private int ringAmount = 1;
+ private int stellarFuelAmount = 0;
+ private int neededStartupFuel = 0;
+ private long fuelConsumption = 0;
+ private long totalRecipesProcessed = 0;
+ private long totalFuelConsumed = 0;
+ private float totalExtensionsBuilt = 0;
+ private float powerMilestonePercentage = 0;
+ private float recipeMilestonePercentage = 0;
+ private float fuelMilestonePercentage = 0;
+ private float structureMilestonePercentage = 0;
+ private float invertedPowerMilestonePercentage = 0;
+ private float invertedRecipeMilestonePercentage = 0;
+ private float invertedFuelMilestonePercentage = 0;
+ private float invertedStructureMilestonePercentage = 0;
+ private BigInteger totalPowerConsumed = BigInteger.ZERO;
+ private boolean batteryCharging = false;
+ private boolean inversion = false;
+ public ArrayList<GT_MetaTileEntity_EM_BaseModule> moduleHatches = new ArrayList<>();
+ protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16);
+
+ private static final int FUEL_CONFIG_WINDOW_ID = 9;
+ private static final int UPGRADE_TREE_WINDOW_ID = 10;
+ private static final int INDIVIDUAL_UPGRADE_WINDOW_ID = 11;
+ private static final int BATTERY_CONFIG_WINDOW_ID = 12;
+ private static final int MILESTONE_WINDOW_ID = 13;
+ private static final int INDIVIDUAL_MILESTONE_WINDOW_ID = 14;
+ private static final int MANUAL_INSERTION_WINDOW_ID = 15;
+ private static final int TEXTURE_INDEX = 960;
+ private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 };
+ private static final long POWER_MILESTONE_CONSTANT = LongMath.pow(10, 15);
+ private static final long RECIPE_MILESTONE_CONSTANT = LongMath.pow(10, 7);
+ private static final long FUEL_MILESTONE_CONSTANT = 10_000;
+ private static final long RECIPE_MILESTONE_T7_CONSTANT = RECIPE_MILESTONE_CONSTANT * LongMath.pow(6, 6);
+ private static final long FUEL_MILESTONE_T7_CONSTANT = FUEL_MILESTONE_CONSTANT * LongMath.pow(3, 6);
+ private static final BigInteger POWER_MILESTONE_T7_CONSTANT = BigInteger.valueOf(POWER_MILESTONE_CONSTANT)
+ .multiply(BigInteger.valueOf(LongMath.pow(9, 6)));
+ private static final double POWER_LOG_CONSTANT = Math.log(9);
+ private static final double RECIPE_LOG_CONSTANT = Math.log(6);
+ private static final double FUEL_LOG_CONSTANT = Math.log(3);
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+ protected static final String STRUCTURE_PIECE_SECOND_RING = "second_ring";
+ protected static final String STRUCTURE_PIECE_THIRD_RING = "third_ring";
+ private static final String TOOLTIP_BAR = EnumChatFormatting.BLUE + "--------------------------------------------";
+ private static final ItemStack STELLAR_FUEL = Avaritia.isModLoaded() ? getModItem(Avaritia.ID, "Resource", 1, 8)
+ : GT_OreDictUnificator.get(OrePrefixes.block, Materials.CosmicNeutronium, 1);
+
+ private final boolean debugMode = true;
+
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5);
+ // 1000 blocks max per placement.
+ int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 63, 20, 1, realBudget, env, false, true);
+ if (isUpgradeActive(26) && stackSize.stackSize > 1) {
+ built += survivialBuildPiece(
+ STRUCTURE_PIECE_SECOND_RING,
+ stackSize,
+ 55,
+ 11,
+ -67,
+ realBudget,
+ env,
+ false,
+ true);
+ }
+ if (isUpgradeActive(29) && stackSize.stackSize > 2) {
+ built += survivialBuildPiece(
+ STRUCTURE_PIECE_THIRD_RING,
+ stackSize,
+ 47,
+ 13,
+ -76,
+ realBudget,
+ env,
+ false,
+ true);
+ }
+ return built;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ public static final IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_ForgeOfGods>builder()
+ .addShape(STRUCTURE_PIECE_MAIN, ForgeOfGodsStructureString.MAIN_STRUCTURE)
+ .addShape(STRUCTURE_PIECE_SECOND_RING, ForgeOfGodsRingsStructureString.SECOND_RING)
+ .addShape(STRUCTURE_PIECE_THIRD_RING, ForgeOfGodsRingsStructureString.THIRD_RING)
+ .addElement('A', classicHatches(TEXTURE_INDEX + 3, 1, GodforgeCasings, 3))
+ .addElement('B', ofBlock(GodforgeCasings, 0))
+ .addElement('C', ofBlock(GodforgeCasings, 1))
+ .addElement('D', ofBlock(GodforgeCasings, 2))
+ .addElement('E', ofBlock(GodforgeCasings, 3))
+ .addElement('F', ofBlock(GodforgeCasings, 4))
+ .addElement('G', ofBlock(GodforgeCasings, 5))
+ .addElement('H', ofBlock(GodforgeGlassBlock.INSTANCE, 0))
+ .addElement('I', ofBlock(GodforgeCasings, 7))
+ .addElement(
+ 'J',
+ GT_HatchElementBuilder.<GT_MetaTileEntity_EM_ForgeOfGods>builder()
+ .atLeast(moduleElement.Module)
+ .casingIndex(TEXTURE_INDEX)
+ .dot(3)
+ .buildAndChain(GodforgeCasings, 0))
+ .addElement('K', ofBlock(GodforgeCasings, 6))
+ .build();
+
+ public GT_MetaTileEntity_EM_ForgeOfGods(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_ForgeOfGods(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_ForgeOfGods(mName);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_CONTROLLER");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1),
+ new TT_RenderedExtendedFacingTexture(ScreenON) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1) };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1, stackSize, hintsOnly);
+ if (isUpgradeActive(26) && stackSize.stackSize > 1) {
+ buildPiece(STRUCTURE_PIECE_SECOND_RING, stackSize, hintsOnly, 55, 11, -67);
+ }
+ if (isUpgradeActive(29) && stackSize.stackSize > 2) {
+ buildPiece(STRUCTURE_PIECE_THIRD_RING, stackSize, hintsOnly, 47, 13, -76);
+ }
+ }
+
+ private final ArrayList<FluidStack> validFuelList = new ArrayList<>() {
+
+ {
+ add(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1));
+ add(MaterialsUEVplus.RawStarMatter.getFluid(1));
+ add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1));
+ }
+ };
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+
+ moduleHatches.clear();
+
+ // Check structure of multi.
+ if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1)) {
+ return false;
+ }
+
+ // Check there is 1 input bus.
+ if (mInputBusses.size() != 1) {
+ return false;
+ }
+
+ // Make sure there are no energy hatches.
+
+ if (mEnergyHatches.size() > 0) {
+ return false;
+ }
+
+ if (mExoticEnergyHatches.size() > 0) {
+ return false;
+ }
+
+ // Make sure there is 1 input hatch.
+ if (mInputHatches.size() != 1) {
+ return false;
+ }
+
+ if (isUpgradeActive(26) && checkPiece(STRUCTURE_PIECE_SECOND_RING, 55, 11, -67)) {
+ ringAmount = 2;
+ if (isUpgradeActive(29) && checkPiece(STRUCTURE_PIECE_THIRD_RING, 47, 13, -76)) {
+ ringAmount = 3;
+ }
+ }
+
+ mHardHammer = true;
+ mSoftHammer = true;
+ mScrewdriver = true;
+ mCrowbar = true;
+ mSolderingTool = true;
+ mWrench = true;
+ return true;
+ }
+
+ int ticker = 0;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ ticker++;
+ // Check and drain fuel
+ if (ticker % (5 * SECONDS) == 0) {
+ ticker = 0;
+ FluidStack fluidInHatch = null;
+ if (mInputHatches != null && mInputHatches.size() != 0) {
+ fluidInHatch = mInputHatches.get(0)
+ .getFluid();
+ }
+ int maxModuleCount = 8;
+
+ if (upgrades[26]) {
+ maxModuleCount += 4;
+ }
+ if (upgrades[29]) {
+ maxModuleCount += 4;
+ }
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ if (internalBattery == 0) {
+
+ for (ItemStack itemStack : mInputBusses.get(0)
+ .getRealInventory()) {
+ if (itemStack != null && itemStack.isItemEqual(STELLAR_FUEL)) {
+ stellarFuelAmount += itemStack.stackSize;
+ itemStack.stackSize = 0;
+ }
+ }
+ neededStartupFuel = calculateStartupFuelConsumption(this);
+ if (stellarFuelAmount >= neededStartupFuel) {
+ stellarFuelAmount -= neededStartupFuel;
+ increaseBattery(neededStartupFuel);
+ }
+ } else {
+ fuelConsumption = (long) calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1);
+ if (fluidInHatch != null && fluidInHatch.isFluidEqual(validFuelList.get(selectedFuelType))) {
+ FluidStack fluidNeeded = new FluidStack(
+ validFuelList.get(selectedFuelType),
+ (int) fuelConsumption);
+ FluidStack fluidReal = mInputHatches.get(0)
+ .drain(fluidNeeded.amount, true);
+ if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) {
+ reduceBattery(fuelConsumptionFactor);
+ } else {
+ totalFuelConsumed += getFuelFactor();
+ if (batteryCharging) {
+ increaseBattery(fuelConsumptionFactor);
+ }
+ }
+ } else {
+ reduceBattery(fuelConsumptionFactor);
+ }
+ }
+ } else {
+ reduceBattery(fuelConsumptionFactor);
+ }
+
+ determineCompositionMilestoneLevel();
+ checkInversionStatus();
+ determineMilestoneProgress();
+ if (!debugMode) {
+ determineGravitonShardAmount();
+ }
+
+ // Do module calculations and checks
+ if (moduleHatches.size() > 0 && internalBattery > 0 && moduleHatches.size() <= maxModuleCount) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ if (allowModuleConnection(module, this)) {
+ module.connect();
+ calculateMaxHeatForModules(module, this);
+ calculateSpeedBonusForModules(module, this);
+ calculateMaxParallelForModules(module, this);
+ calculateEnergyDiscountForModules(module, this);
+ setMiscModuleParameters(module, this);
+ queryMilestoneStats(module, this);
+ if (!upgrades[28]) {
+ calculateProcessingVoltageForModules(module, this);
+ }
+ } else {
+ module.disconnect();
+ }
+ }
+ } else if (moduleHatches.size() > maxModuleCount) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+ if (mEfficiency < 0) mEfficiency = 0;
+ fixAllMaintenance();
+ }
+ }
+ }
+
+ public boolean addModuleToMachineList(IGregTechTileEntity tileEntity, int baseCasingIndex) {
+ if (tileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity metaTileEntity = tileEntity.getMetaTileEntity();
+ if (metaTileEntity == null) {
+ return false;
+ }
+ if (metaTileEntity instanceof GT_MetaTileEntity_EM_BaseModule) {
+ return moduleHatches.add((GT_MetaTileEntity_EM_BaseModule) metaTileEntity);
+ }
+ return false;
+ }
+
+ public enum moduleElement implements IHatchElement<GT_MetaTileEntity_EM_ForgeOfGods> {
+
+ Module(GT_MetaTileEntity_EM_ForgeOfGods::addModuleToMachineList, GT_MetaTileEntity_EM_BaseModule.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_ForgeOfGods tileEntity) {
+ return tileEntity.moduleHatches.size();
+ }
+ };
+
+ private final List<Class<? extends IMetaTileEntity>> mteClasses;
+ private final IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> adder;
+
+ @SafeVarargs
+ moduleElement(IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> 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_EM_ForgeOfGods> adder() {
+ return adder;
+ }
+ }
+
+ private void createRenderBlock() {
+
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 16 * 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), forgeOfGodsRenderBlock);
+ TileForgeOfGods rendererTileEntity = (TileForgeOfGods) this.getBaseMetaTileEntity()
+ .getWorld()
+ .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+
+ rendererTileEntity.setRenderSize(20);
+ rendererTileEntity.setRenderRotationSpeed(5);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData()));
+ str.add(TOOLTIP_BAR);
+ str.add("Number of Rings: " + EnumChatFormatting.GOLD + ringAmount);
+ str.add("Total Upgrades Unlocked: " + EnumChatFormatting.GOLD + getTotalActiveUpgrades());
+ str.add("Connected Modules: " + EnumChatFormatting.GOLD + moduleHatches.size());
+ str.add(TOOLTIP_BAR);
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ createRenderBlock();
+ }
+
+ @Override
+ public void onRemoval() {
+ if (moduleHatches != null && moduleHatches.size() > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+ super.onRemoval();
+ }
+
+ protected void fixAllMaintenance() {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (doesBindPlayerInventory()) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
+ .setPos(4, 4)
+ .setSize(190, 85));
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY)
+ .setPos(4, 4)
+ .setSize(190, 171));
+ }
+ buildContext.addSyncedWindow(UPGRADE_TREE_WINDOW_ID, this::createUpgradeTreeWindow);
+ buildContext.addSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID, this::createIndividualUpgradeWindow);
+ buildContext.addSyncedWindow(FUEL_CONFIG_WINDOW_ID, this::createFuelConfigWindow);
+ buildContext.addSyncedWindow(BATTERY_CONFIG_WINDOW_ID, this::createBatteryWindow);
+ buildContext.addSyncedWindow(MILESTONE_WINDOW_ID, this::createMilestoneWindow);
+ buildContext.addSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID, this::createIndividualMilestoneWindow);
+ buildContext.addSyncedWindow(MANUAL_INSERTION_WINDOW_ID, this::createManualInsertionWindow);
+ builder.widget(
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(UPGRADE_TREE_WINDOW_ID);
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP);
+ return button.toArray(new IDrawable[0]);
+ })
+ .addTooltip("Path of Celestial Transcendence")
+ .setPos(174, 167)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL)
+ .setPos(174, 183)
+ .setSize(16, 6))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(FUEL_CONFIG_WINDOW_ID);
+ }
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_HEAT_ON);
+ return button.toArray(new IDrawable[0]);
+ })
+ .addTooltip(translateToLocal("fog.button.fuelconfig.tooltip"))
+ .setPos(174, 110)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ TextWidget.dynamicText(this::storedFuel)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setPos(6, 8)
+ .setSize(74, 34))
+ .widget(createPowerSwitchButton())
+ .widget(createBatteryButton(builder))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> {
+ if (val) {
+ getBaseMetaTileEntity().enableWorking();
+ } else {
+ getBaseMetaTileEntity().disableWorking();
+ }
+ }))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ checkMachine_EM(this.getBaseMetaTileEntity(), null);
+ }
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_CYCLIC_BLUE);
+ return button.toArray(new IDrawable[0]);
+ })
+ .addTooltip(translateToLocal("fog.button.structurecheck.tooltip"))
+ .setPos(8, 91)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(MILESTONE_WINDOW_ID);
+ }
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_FLAG);
+ return button.toArray(new IDrawable[0]);
+ })
+ .addTooltip(translateToLocal("fog.button.milestones.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 91));
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO)
+ .setSize(18, 18)
+ .setPos(172, 67));
+ }
+
+ @Override
+ protected ButtonWidget createPowerSwitchButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ getBaseMetaTileEntity().disableWorking();
+ } else {
+ getBaseMetaTileEntity().enableWorking();
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(174, doesBindPlayerInventory() ? 148 : 172)
+ .setSize(16, 16);
+ button.addTooltip("Power Switch")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return (ButtonWidget) button;
+ }
+
+ protected Widget createBatteryButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (clickData.mouseButton == 0) {
+ batteryCharging = !batteryCharging;
+ } else if (clickData.mouseButton == 1 && !widget.isClient() && upgrades[8]) {
+ widget.getContext()
+ .openSyncedWindow(BATTERY_CONFIG_WINDOW_ID);
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ if (batteryCharging) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_OFF);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(174, 129)
+ .setSize(16, 16);
+ button.addTooltip(translateToLocal("fog.button.battery.tooltip.01"))
+ .addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.battery.tooltip.02"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> batteryCharging, val -> batteryCharging = val),
+ builder);
+ return button;
+ }
+
+ protected ModularWindow createBatteryWindow(final EntityPlayer player) {
+ final int WIDTH = 78;
+ final int HEIGHT = 52;
+ 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.BottomRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
+ .add(WIDTH - 3, 0)
+ .subtract(0, 10)));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.batteryinfo")
+ .setPos(3, 4)
+ .setSize(74, 20))
+ .widget(
+ new NumericWidget().setSetter(val -> maxBatteryCharge = (int) val)
+ .setGetter(() -> maxBatteryCharge)
+ .setBounds(1, Integer.MAX_VALUE)
+ .setDefaultValue(100)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(4, 25)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD));
+ return builder.build();
+ }
+
+ protected ModularWindow createFuelConfigWindow(final EntityPlayer player) {
+ final int WIDTH = 78;
+ final int HEIGHT = 130;
+ 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("gt.blockmachines.multimachine.FOG.fuelconsumption")
+ .setPos(3, 2)
+ .setSize(74, 34))
+ .widget(
+ new NumericWidget().setSetter(val -> fuelConsumptionFactor = (int) val)
+ .setGetter(() -> fuelConsumptionFactor)
+ .setBounds(1, calculateMaxFuelFactor(this))
+ .setDefaultValue(1)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(4, 35)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD))
+ .widget(
+ new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO)
+ .setPos(64, 24)
+ .setSize(10, 10)
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.0"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.1"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.2"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.3"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype")
+ .setPos(3, 57)
+ .setSize(74, 24))
+ .widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelusage")
+ .setPos(3, 100)
+ .setSize(74, 20))
+ .widget(
+ TextWidget.dynamicText(this::fuelUsage)
+ .setPos(3, 115)
+ .setSize(74, 15))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1)
+ .getUnlocalizedName()
+ .substring(6),
+ (String) -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1)
+ .getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(1, 1)
+ .setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 0;
+ })
+ .setBackground(() -> {
+ if (selectedFuelType == 0) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ })
+ .setSize(18, 18)
+ .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder))
+
+ .setPos(6, 82)
+ .setSize(18, 18))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.RawStarMatter.getFluid(1)
+ .getUnlocalizedName()
+ .substring(6),
+ (String) -> MaterialsUEVplus.RawStarMatter.getFluid(1)
+ .getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(1, 1)
+ .setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 1;
+ })
+ .setBackground(() -> {
+ if (selectedFuelType == 1) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ })
+ .setSize(18, 18))
+ .setPos(29, 82)
+ .setSize(18, 18)
+ .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1)
+ .getUnlocalizedName()
+ .substring(6),
+ (String) -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1)
+ .getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(1, 1)
+ .setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 2;
+ })
+ .setBackground(() -> {
+ if (selectedFuelType == 2) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ })
+ .setSize(18, 18))
+ .setPos(52, 82)
+ .setSize(18, 18)
+ .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder));
+
+ return builder.build();
+ }
+
+ private final int[] milestoneProgress = new int[] { 0, 0, 0, 0 };
+
+ protected ModularWindow createMilestoneWindow(final EntityPlayer player) {
+ final int WIDTH = 400;
+ final int HEIGHT = 300;
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(TecTechUITextures.BACKGROUND_SPACE);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ builder.widget(createMilestoneButton(0, 80, 100, new Pos2d(62, 24)));
+ builder.widget(createMilestoneButton(1, 70, 98, new Pos2d(263, 25)));
+ builder.widget(createMilestoneButton(2, 100, 100, new Pos2d(52, 169)));
+ builder.widget(createMilestoneButton(3, 100, 100, new Pos2d(248, 169)));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.powermilestone")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setPos(77, 45)
+ .setSize(50, 30));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.recipemilestone")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setPos(268, 45)
+ .setSize(60, 30));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelmilestone")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setPos(77, 190)
+ .setSize(50, 30));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.purchasablemilestone")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setPos(268, 190)
+ .setSize(60, 30));
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND)
+ .setPos(37, 70)
+ .setSize(130, 7))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND)
+ .setPos(233, 70)
+ .setSize(130, 7))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND)
+ .setPos(37, 215)
+ .setSize(130, 7))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND)
+ .setPos(233, 215)
+ .setSize(130, 7));
+ builder.widget(
+ new ProgressBar().setProgress(() -> powerMilestonePercentage)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(37, 70)
+ .addTooltip(milestoneProgressText(0, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> recipeMilestonePercentage)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(233, 70)
+ .addTooltip(milestoneProgressText(1, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> fuelMilestonePercentage)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(37, 215)
+ .addTooltip(milestoneProgressText(2, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> structureMilestonePercentage)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(233, 215)
+ .addTooltip(milestoneProgressText(3, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> invertedPowerMilestonePercentage)
+ .setDirection(ProgressBar.Direction.LEFT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(37, 70)
+ .addTooltip(milestoneProgressText(0, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> invertedRecipeMilestonePercentage)
+ .setDirection(ProgressBar.Direction.LEFT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(233, 70)
+ .addTooltip(milestoneProgressText(1, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> invertedFuelMilestonePercentage)
+ .setDirection(ProgressBar.Direction.LEFT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(37, 215)
+ .addTooltip(milestoneProgressText(2, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new ProgressBar().setProgress(() -> invertedStructureMilestonePercentage)
+ .setDirection(ProgressBar.Direction.LEFT)
+ .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED, 130)
+ .setSynced(true, false)
+ .setSize(130, 7)
+ .setPos(233, 215)
+ .addTooltip(milestoneProgressText(3, false))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(382, 6));
+ return builder.build();
+ }
+
+ protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer player) {
+ final int WIDTH = 150;
+ final int HEIGHT = 150;
+ int symbol_width;
+ int symbol_height;
+ String milestoneType;
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ UITexture symbol;
+ switch (currentMilestoneID) {
+ case 1 -> {
+ symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION;
+ symbol_width = 54;
+ symbol_height = 75;
+ milestoneType = "recipe";
+ }
+ case 2 -> {
+ symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST;
+ symbol_width = 75;
+ symbol_height = 75;
+ milestoneType = "fuel";
+ }
+ case 3 -> {
+ symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION;
+ symbol_width = 75;
+ symbol_height = 75;
+ milestoneType = "purchasable";
+ }
+ default -> {
+ symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE;
+ symbol_width = 60;
+ symbol_height = 75;
+ milestoneType = "power";
+ }
+ }
+
+ builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE);
+ builder.setDraggable(true);
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(134, 4))
+ .widget(
+ new DrawableWidget().setDrawable(symbol)
+ .setSize(symbol_width, symbol_height)
+ .setPos((WIDTH - symbol_width) / 2, (HEIGHT - symbol_height) / 2))
+ .widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG." + milestoneType + "milestone")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(0, 8)
+ .setSize(150, 15))
+ .widget(
+ TextWidget.dynamicText(this::inversionStatusText)
+ .setDefaultColor(EnumChatFormatting.AQUA)
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.8f)
+ .setPos(0, 120)
+ .setSize(150, 15))
+ .widget(
+ TextWidget.dynamicText(() -> totalMilestoneProgress(currentMilestoneID))
+ .setScale(0.7f)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setTextAlignment(Alignment.Center)
+ .setPos(5, 30)
+ .setSize(140, 30))
+ .widget(
+ TextWidget.dynamicText(() -> currentMilestone(currentMilestoneID))
+ .setScale(0.7f)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setTextAlignment(Alignment.Center)
+ .setPos(5, 50)
+ .setSize(140, 30))
+ .widget(
+ TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID, true))
+ .setScale(0.7f)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setSize(140, 30)
+ .setPos(5, 70))
+ .widget(
+ TextWidget.dynamicText(() -> gravitonShardAmountText(currentMilestoneID))
+ .setScale(0.7f)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setSize(140, 30)
+ .setPos(5, 90));
+
+ return builder.build();
+ }
+
+ private int currentMilestoneID = 0;
+
+ private Widget createMilestoneButton(int milestoneID, int width, int height, Pos2d pos) {
+ return new ButtonWidget().setOnClick((clickData, widget) -> {
+ currentMilestoneID = milestoneID;
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID);
+ }
+ })
+ .setSize(width, height)
+ .setBackground(() -> switch (milestoneID) {
+ case 1 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW };
+ case 2 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW };
+ case 3 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW };
+ default -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW };
+ })
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.milestoneinfo"))
+ .setPos(pos)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ }
+
+ private int currentUpgradeID = 0;
+ private int currentColorCode = 0;
+ private int currentMilestoneBG = 0;
+ private int gravitonShardCost = 0;
+ private int[] prereqUpgrades = new int[] {};
+ private int[] followupUpgrades = new int[] {};
+ private boolean allPrereqRequired = false;
+ private boolean isUpradeSplitStart = false;
+ private boolean[] upgrades = new boolean[31];
+
+ protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ final int PARENT_WIDTH = 300;
+ final int PARENT_HEIGHT = 1000;
+ ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT);
+ scrollable.widget(
+ createUpgradeBox(0, 0, 3, new int[] {}, false, new int[] { 1 }, false, 0, new Pos2d(126, 56), scrollable))
+ .widget(
+ createUpgradeBox(
+ 1,
+ 0,
+ 1,
+ new int[] { 0 },
+ false,
+ new int[] { 2, 3 },
+ false,
+ 1,
+ new Pos2d(126, 116),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 2,
+ 0,
+ 2,
+ new int[] { 1 },
+ false,
+ new int[] { 4, 5 },
+ false,
+ 1,
+ new Pos2d(96, 176),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 3,
+ 0,
+ 2,
+ new int[] { 1 },
+ false,
+ new int[] { 5, 6 },
+ false,
+ 1,
+ new Pos2d(156, 176),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 4,
+ 0,
+ 0,
+ new int[] { 2 },
+ false,
+ new int[] { 8 },
+ false,
+ 1,
+ new Pos2d(66, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 5,
+ 0,
+ 3,
+ new int[] { 2, 3 },
+ false,
+ new int[] { 7 },
+ false,
+ 1,
+ new Pos2d(126, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 6,
+ 0,
+ 1,
+ new int[] { 3 },
+ false,
+ new int[] { 10 },
+ false,
+ 1,
+ new Pos2d(186, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 7,
+ 0,
+ 3,
+ new int[] { 5 },
+ false,
+ new int[] { 8, 9, 10 },
+ false,
+ 2,
+ new Pos2d(126, 296),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 8,
+ 0,
+ 0,
+ new int[] { 4, 7 },
+ true,
+ new int[] { 11 },
+ false,
+ 2,
+ new Pos2d(56, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 9,
+ 0,
+ 2,
+ new int[] { 7 },
+ false,
+ new int[] {},
+ false,
+ 2,
+ new Pos2d(126, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 10,
+ 0,
+ 1,
+ new int[] { 6, 7 },
+ true,
+ new int[] { 11 },
+ false,
+ 2,
+ new Pos2d(196, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 11,
+ 0,
+ 3,
+ new int[] { 8, 10 },
+ false,
+ new int[] { 12, 13, 14 },
+ false,
+ 2,
+ new Pos2d(126, 416),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 12,
+ 1,
+ 2,
+ new int[] { 11 },
+ false,
+ new int[] { 17 },
+ true,
+ 3,
+ new Pos2d(66, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 13,
+ 2,
+ 1,
+ new int[] { 11 },
+ false,
+ new int[] { 18 },
+ true,
+ 3,
+ new Pos2d(126, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 14,
+ 3,
+ 0,
+ new int[] { 11 },
+ false,
+ new int[] { 15, 19 },
+ true,
+ 3,
+ new Pos2d(186, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 15,
+ 3,
+ 1,
+ new int[] { 14 },
+ false,
+ new int[] {},
+ false,
+ 4,
+ new Pos2d(246, 496),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 16,
+ 1,
+ 1,
+ new int[] { 17 },
+ false,
+ new int[] {},
+ false,
+ 4,
+ new Pos2d(6, 556),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 17,
+ 1,
+ 0,
+ new int[] { 12 },
+ false,
+ new int[] { 16, 20 },
+ false,
+ 3,
+ new Pos2d(66, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 18,
+ 2,
+ 1,
+ new int[] { 13 },
+ false,
+ new int[] { 21 },
+ false,
+ 3,
+ new Pos2d(126, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 19,
+ 3,
+ 0,
+ new int[] { 14 },
+ false,
+ new int[] { 22 },
+ false,
+ 3,
+ new Pos2d(186, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 20,
+ 1,
+ 0,
+ new int[] { 17 },
+ false,
+ new int[] { 23 },
+ false,
+ 3,
+ new Pos2d(66, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 21,
+ 2,
+ 1,
+ new int[] { 18 },
+ false,
+ new int[] { 23 },
+ false,
+ 3,
+ new Pos2d(126, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 22,
+ 3,
+ 1,
+ new int[] { 19 },
+ false,
+ new int[] { 23 },
+ false,
+ 3,
+ new Pos2d(186, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 23,
+ 0,
+ 0,
+ new int[] { 20, 21, 22 },
+ false,
+ new int[] { 24 },
+ false,
+ 4,
+ new Pos2d(126, 656),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 24,
+ 0,
+ 1,
+ new int[] { 23 },
+ false,
+ new int[] { 25 },
+ false,
+ 5,
+ new Pos2d(126, 718),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 25,
+ 0,
+ 1,
+ new int[] { 24 },
+ false,
+ new int[] { 26 },
+ false,
+ 6,
+ new Pos2d(36, 758),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 26,
+ 0,
+ 3,
+ new int[] { 25 },
+ false,
+ new int[] { 27 },
+ false,
+ 7,
+ new Pos2d(36, 848),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 27,
+ 0,
+ 2,
+ new int[] { 26 },
+ false,
+ new int[] { 28 },
+ false,
+ 8,
+ new Pos2d(126, 888),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 28,
+ 0,
+ 0,
+ new int[] { 27 },
+ false,
+ new int[] { 29 },
+ false,
+ 9,
+ new Pos2d(216, 848),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 29,
+ 0,
+ 3,
+ new int[] { 28 },
+ false,
+ new int[] { 30 },
+ false,
+ 10,
+ new Pos2d(216, 758),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 30,
+ 0,
+ 3,
+ new int[] { 29 },
+ false,
+ new int[] {},
+ false,
+ 12,
+ new Pos2d(126, 798),
+ scrollable))
+ .widget(new TextWidget("").setPos(0, 945));
+
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_STAR)
+ .setPos(0, 350)
+ .setSize(300, 300))
+ .widget(
+ scrollable.setSize(292, 292)
+ .setPos(4, 354))
+ .widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(282, 354));
+ if (debugMode) {
+ builder.widget(
+ new MultiChildWidget()
+ .addChild(
+ new ButtonWidget().setOnClick((clickData, widget) -> upgrades = new boolean[31])
+ .setSize(40, 15)
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .addChild(
+ new TextWidget(translateToLocal("fog.debug.resetbutton.text"))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.57f)
+ .setMaxWidth(36)
+ .setPos(3, 3))
+ .addChild(
+ new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val)
+ .setGetter(() -> gravitonShardsAvailable)
+ .setBounds(0, 112)
+ .setDefaultValue(0)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(25, 18)
+ .setPos(4, 16)
+ .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD))
+ .addChild(
+ new ButtonWidget().setOnClick((clickData, widget) -> Arrays.fill(upgrades, true))
+ .setSize(40, 15)
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .addTooltip(translateToLocal("fog.debug.unlockall.text"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(0, 35))
+ .addChild(
+ new TextWidget(translateToLocal("fog.debug.unlockall.text")).setTextAlignment(Alignment.Center)
+ .setScale(0.57f)
+ .setMaxWidth(36)
+ .setPos(3, 38))
+ .setPos(4, 354));
+
+ }
+ return builder.build();
+ }
+
+ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) {
+ UITexture background;
+ UITexture overlay;
+ UITexture milestoneSymbol;
+ float widthRatio;
+ switch (currentColorCode) {
+ case 1 -> {
+ background = TecTechUITextures.BACKGROUND_GLOW_PURPLE;
+ overlay = TecTechUITextures.PICTURE_OVERLAY_PURPLE;
+ }
+ case 2 -> {
+ background = TecTechUITextures.BACKGROUND_GLOW_ORANGE;
+ overlay = TecTechUITextures.PICTURE_OVERLAY_ORANGE;
+ }
+ case 3 -> {
+ background = TecTechUITextures.BACKGROUND_GLOW_GREEN;
+ overlay = TecTechUITextures.PICTURE_OVERLAY_GREEN;
+ }
+ default -> {
+ background = TecTechUITextures.BACKGROUND_GLOW_BLUE;
+ overlay = TecTechUITextures.PICTURE_OVERLAY_BLUE;
+ }
+ }
+ switch (currentMilestoneBG) {
+ case 1 -> {
+ milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION;
+ widthRatio = 0.72f;
+ }
+ case 2 -> {
+ milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST;
+ widthRatio = 1f;
+ }
+ case 3 -> {
+ milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION;
+ widthRatio = 1f;
+ }
+ default -> {
+ milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE;
+ widthRatio = 0.8f;
+ }
+ }
+ int WIDTH = 250;
+ int HEIGHT = 250;
+ int LORE_POS = 110;
+ if (currentUpgradeID == 0) {
+ WIDTH = 300;
+ HEIGHT = 300;
+ LORE_POS = 85;
+ }
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT)
+ .setBackground(background)
+ .widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(WIDTH - 15, 3))
+ .widget(
+ new DrawableWidget().setDrawable(milestoneSymbol)
+ .setPos((int) ((1 - widthRatio / 2) * WIDTH / 2), HEIGHT / 4)
+ .setSize((int) (WIDTH / 2 * widthRatio), HEIGHT / 2))
+ .widget(
+ new DrawableWidget().setDrawable(overlay)
+ .setPos(WIDTH / 4, HEIGHT / 4)
+ .setSize(WIDTH / 2, HEIGHT / 2))
+ .widget(
+ new MultiChildWidget()
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.tt." + (currentUpgradeID)))
+ .setTextAlignment(Alignment.Center)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setSize(WIDTH - 15, 30)
+ .setPos(9, 5))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID)))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setDefaultColor(0x9c9c9c)
+ .setSize(WIDTH - 15, LORE_POS - 30)
+ .setPos(9, 30))
+ .addChild(
+ new TextWidget(
+ EnumChatFormatting.ITALIC + translateToLocal("fog.upgrade.lore." + (currentUpgradeID)))
+ .setTextAlignment(Alignment.Center)
+ .setDefaultColor(0x9c9c9c)
+ .setSize(WIDTH - 15, (int) (HEIGHT * 0.9) - LORE_POS)
+ .setPos(9, LORE_POS))
+ .addChild(
+ new TextWidget(
+ translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + " "
+ + EnumChatFormatting.BLUE
+ + gravitonShardCost).setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(70)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(11, HEIGHT - 25))
+ .addChild(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.availableshards"))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(90)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(WIDTH - 87, HEIGHT - 25))
+ .addChild(
+ TextWidget.dynamicText(this::gravitonShardAmount)
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(90)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(WIDTH - 27, HEIGHT - 18)))
+ .setSize(WIDTH, HEIGHT)
+
+ .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ int unlockedPrereqUpgrades = 0;
+ int unlockedFollowupUpgrades = 0;
+ int unlockedSplitUpgrades = 0;
+ if (!upgrades[currentUpgradeID]) {
+ for (int prereqUpgrade : prereqUpgrades) {
+ if (upgrades[prereqUpgrade]) {
+ unlockedPrereqUpgrades++;
+ }
+ }
+ if (allPrereqRequired) {
+ if (unlockedPrereqUpgrades == prereqUpgrades.length
+ && gravitonShardsAvailable >= gravitonShardCost) {
+ gravitonShardsAvailable -= gravitonShardCost;
+ gravitonShardsSpent += gravitonShardCost;
+ upgrades[currentUpgradeID] = true;
+ }
+ } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades.length == 0) {
+ if (isUpradeSplitStart) {
+ for (int splitUpgrade : FIRST_SPLIT_UPGRADES) {
+ if (upgrades[splitUpgrade]) {
+ unlockedSplitUpgrades++;
+ }
+ }
+ unlockedSplitUpgrades -= (ringAmount - 1);
+ }
+ if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) {
+ gravitonShardsAvailable -= gravitonShardCost;
+ gravitonShardsSpent += gravitonShardCost;
+ upgrades[currentUpgradeID] = true;
+ }
+ }
+ } else {
+ for (int followupUpgrade : followupUpgrades) {
+ if (upgrades[followupUpgrade]) {
+ unlockedFollowupUpgrades++;
+ }
+ }
+ if (unlockedFollowupUpgrades == 0) {
+ gravitonShardsAvailable += gravitonShardCost;
+ gravitonShardsSpent -= gravitonShardCost;
+ upgrades[currentUpgradeID] = false;
+ }
+ }
+ })
+ .setSize(40, 15)
+ .setBackground(() -> {
+ if (upgrades[currentUpgradeID]) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD };
+ }
+ })
+ .addTooltip(translateToLocal("fog.upgrade.confirm"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.confirm")).setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(36)
+ .setPos(3, 5))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(MANUAL_INSERTION_WINDOW_ID);
+ widget.getContext()
+ .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
+ widget.getContext()
+ .closeWindow(UPGRADE_TREE_WINDOW_ID);
+ }
+ })
+ .setBackground(TecTechUITextures.BUTTON_CELESTIAL_32x32)
+ .setPos(50, 50))
+ .setPos(WIDTH / 2 - 21, (int) (HEIGHT * 0.9)));
+ return builder.build();
+ }
+
+ /**
+ * @param upgradeID ID of the upgrade
+ * @param colorCode Number deciding which colored background to use, 0 for blue, 1 for purple, 2 for
+ * orange and 3 for green
+ * @param milestone Number deciding which milestone symbol to display in the background, 0 for charge,
+ * 1 for conversion, 2 for catalyst and 3 for composition
+ * @param prerequisiteUpgradeIDs IDs of the prior upgrades directly connected to the current one
+ * @param requireAllPrerequisites Decides how many connected prerequisite upgrades have to be unlocked to be able to
+ * unlock this one. True means ALL, False means AT LEAST ONE
+ * @param followingUpgradeIDs IDs of the following upgrades directly connected to the current one
+ * @param isStartOfSplit Whether this upgrade is one of the initial split upgrades
+ * @param shardCost How many graviton shards are needed to unlock this upgrade
+ * @param pos Position of the upgrade inside the scrollableWidget
+ */
+ private Widget createUpgradeBox(int upgradeID, int colorCode, int milestone, int[] prerequisiteUpgradeIDs,
+ boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, int shardCost, Pos2d pos,
+ IWidgetBuilder<?> builder) {
+ return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ currentUpgradeID = upgradeID;
+ currentColorCode = colorCode;
+ currentMilestoneBG = milestone;
+ gravitonShardCost = shardCost;
+ prereqUpgrades = prerequisiteUpgradeIDs;
+ allPrereqRequired = requireAllPrerequisites;
+ followupUpgrades = followingUpgradeIDs;
+ isUpradeSplitStart = isStartOfSplit;
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
+ })
+ .setSize(40, 15)
+ .setBackground(() -> {
+ if (upgrades[upgradeID]) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD };
+ }
+ })
+ .addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.tt." + upgradeID)).setTextAlignment(Alignment.Center)
+ .setScale(0.57f)
+ .setMaxWidth(36)
+ .setPos(3, 3))
+ .setPos(pos)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> upgrades[upgradeID], val -> upgrades[upgradeID] = val),
+ builder);
+ }
+
+ List<ItemStack> inputs = new ArrayList<>(
+ Arrays.asList(
+ ItemList.Electric_Motor_UMV.get(13L),
+ ItemList.Electric_Pump_UXV.get(32L),
+ ItemList.Electric_Piston_UXV.get(32L),
+ ItemList.Robot_Arm_UXV.get(32L),
+ ItemList.Superconducting_Magnet_Solenoid_UIV.get(48L),
+ ItemList.NaquadriaSupersolid.get(32L),
+ CustomItemList.astralArrayFabricator.get(36L),
+ CustomItemList.Machine_Multi_EyeOfHarmony.get(2L)));
+
+ protected ModularWindow createManualInsertionWindow(final EntityPlayer player) {
+ final int WIDTH = 189;
+ final int HEIGHT = 84;
+ final int PARENT_WIDTH = getGUIWidth();
+ final int PARENT_HEIGHT = getGUIHeight();
+ final MultiChildWidget columns = new MultiChildWidget();
+ final DynamicPositionedColumn column1 = new DynamicPositionedColumn();
+ final DynamicPositionedColumn column2 = new DynamicPositionedColumn();
+ final DynamicPositionedColumn column3 = new DynamicPositionedColumn();
+ List<DynamicPositionedColumn> columnList = Arrays.asList(column1, column2, column3);
+ 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)))
+ .subtract(5, 0)
+ .add(0, 4));
+ builder.widget(
+ SlotGroup.ofItemHandler(inputSlotHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .phantom(false)
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(111, 6));
+ for (int i = 0; i < inputs.size(); i++) {
+ int index = i;
+ int cleanDiv4 = index / 4;
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.BUTTON_STANDARD_PRESSED)
+ .setPos(6 + cleanDiv4 * 36, 6 + index % 4 * 18)
+ .setSize(18, 18));
+ columnList.get(cleanDiv4)
+ .addChild(
+ new ItemDrawable().setItem(inputs.get(index))
+ .asWidget()
+ .dynamicTooltip(() -> {
+ List<String> tooltip = new ArrayList<>();
+ tooltip.add(
+ inputs.get(index) != null ? inputs.get(index)
+ .getDisplayName() : "");
+ return tooltip;
+ })
+ .setSize(16, 16));
+ }
+
+ columns.addChild(
+ column1.setSpace(2)
+ .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setSize(34, 72)
+ .setPos(1, 1));
+ columns.addChild(
+ column2.setSpace(2)
+ .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setSize(34, 72)
+ .setPos(37, 1));
+ columns.addChild(
+ column3.setSpace(2)
+ .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setSize(34, 72)
+ .setPos(73, 1));
+ builder.widget(
+ columns.setSize(72, 72)
+ .setPos(6, 6));
+ return builder.build();
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Material Manipulator") // Machine Type:
+ .addInfo("Controller block for the Forge of Gods") // Controller
+ .addInfo("Uses a Star to to manipulate metals")
+ .addSeparator()
+ .beginStructureBlock(1, 4, 2, false)
+ .addStructureInfo("Output bus/hatch has to be the ME variant")
+ .addStructureInfo("Dot 2 of Input Hatch is the Fuel Input Hatch")
+ .addInputHatch("Any Infinite Spacetime Casing", 1)
+ .addInputHatch("Any Infinite Spacetime Casing", 2) // Fuel
+ // Input
+ // Hatch
+ .addInputBus("Any Infinite Spacetime Casing", 1)
+ .addOutputBus("Any Infinite Spacetime Casing", 1)
+ .addOutputHatch("Any Infinite Spacetime Casing", 1)
+ .toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+ @Override
+ public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) {
+ return true;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return new String[] { "Forge of Gods multiblock" };
+ }
+
+ public int getFuelType() {
+ return selectedFuelType;
+ }
+
+ private void setFuelType(int fuelType) {
+ selectedFuelType = fuelType;
+ }
+
+ public int getFuelFactor() {
+ return fuelConsumptionFactor;
+ }
+
+ public boolean isUpgradeActive(int upgradeID) {
+ return upgrades[upgradeID];
+ }
+
+ public int getRingAmount() {
+ return ringAmount;
+ }
+
+ public int getTotalActiveUpgrades() {
+ int totalUpgrades = 0;
+ for (boolean upgrade : upgrades) {
+ if (upgrade) {
+ totalUpgrades++;
+ }
+ }
+ return totalUpgrades;
+ }
+
+ private Text fuelUsage() {
+ return new Text(fuelConsumption + " L/5s");
+ }
+
+ private Text gravitonShardAmount() {
+ EnumChatFormatting enoughGravitonShards = EnumChatFormatting.RED;
+ if (gravitonShardsAvailable >= gravitonShardCost) {
+ enoughGravitonShards = EnumChatFormatting.GREEN;
+ }
+ return new Text(enoughGravitonShards + Integer.toString(gravitonShardsAvailable));
+
+ }
+
+ private Text storedFuel() {
+ if (internalBattery == 0) {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel") + " "
+ + stellarFuelAmount
+ + "/"
+ + neededStartupFuel);
+ }
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " "
+ + internalBattery
+ + "/"
+ + maxBatteryCharge);
+ }
+
+ private void checkInversionStatus() {
+ int inversionChecker = 0;
+ for (int progress : milestoneProgress) {
+ if (progress < 7) {
+ break;
+ }
+ inversionChecker++;
+ }
+ inversion = inversionChecker == 4;
+ }
+
+ private Text inversionStatusText() {
+ String inversionStatus = "";
+ if (inversion) {
+ inversionStatus = EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.inversion");
+ }
+ return new Text(inversionStatus);
+ }
+
+ private void determineCompositionMilestoneLevel() {
+ int[] uniqueModuleCount = new int[5];
+ int smelting = 0;
+ int molten = 0;
+ int plasma = 0;
+ int exotic = 0;
+ int exoticMagmatter = 0;
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ uniqueModuleCount[0] = 1;
+ smelting++;
+ continue;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule) {
+ uniqueModuleCount[1] = 1;
+ molten++;
+ continue;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ uniqueModuleCount[2] = 1;
+ plasma++;
+ continue;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ if (!((GT_MetaTileEntity_EM_ExoticModule) module).isMagmatterModeOn()) {
+ uniqueModuleCount[3] = 1;
+ exotic++;
+ } else {
+ uniqueModuleCount[4] = 1;
+ exoticMagmatter++;
+ }
+ }
+
+ }
+ totalExtensionsBuilt = Arrays.stream(uniqueModuleCount)
+ .sum() + ringAmount
+ - 1;
+ if (inversion) {
+ totalExtensionsBuilt += (smelting - 1
+ + (molten - 1) * 2
+ + (plasma - 1) * 3
+ + (exotic - 1) * 4
+ + (exoticMagmatter - 1) * 5) / 5f;
+ }
+ milestoneProgress[3] = (int) Math.floor(totalExtensionsBuilt);
+ }
+
+ private void determineMilestoneProgress() {
+ int closestRelevantSeven;
+ float rawProgress;
+ float actualProgress;
+ if (milestoneProgress[0] < 7) {
+ powerMilestonePercentage = (float) max(
+ (log((totalPowerConsumed.divide(BigInteger.valueOf(POWER_MILESTONE_CONSTANT))).longValue())
+ / POWER_LOG_CONSTANT + 1),
+ 0) / 7;
+ milestoneProgress[0] = (int) floor(powerMilestonePercentage * 7);
+ }
+ if (inversion) {
+ rawProgress = (totalPowerConsumed.divide(POWER_MILESTONE_T7_CONSTANT)
+ .floatValue() - 1) / 7;
+ closestRelevantSeven = (int) floor(rawProgress);
+ actualProgress = rawProgress - closestRelevantSeven;
+ milestoneProgress[0] = 7 + (int) floor(rawProgress * 7);
+ if (closestRelevantSeven % 2 == 0) {
+ invertedPowerMilestonePercentage = actualProgress;
+ powerMilestonePercentage = 1 - invertedPowerMilestonePercentage;
+ } else {
+ powerMilestonePercentage = actualProgress;
+ invertedPowerMilestonePercentage = 1 - powerMilestonePercentage;
+ }
+ }
+
+ if (milestoneProgress[1] < 7) {
+ recipeMilestonePercentage = (float) max(
+ (log(totalRecipesProcessed * 1f / RECIPE_MILESTONE_CONSTANT) / RECIPE_LOG_CONSTANT + 1),
+ 0) / 7;
+ milestoneProgress[1] = (int) floor(recipeMilestonePercentage * 7);
+ }
+ if (inversion) {
+ rawProgress = (((float) totalRecipesProcessed / RECIPE_MILESTONE_T7_CONSTANT) - 1) / 7;
+ closestRelevantSeven = (int) floor(rawProgress);
+ actualProgress = rawProgress - closestRelevantSeven;
+ milestoneProgress[1] = 7 + (int) floor(rawProgress * 7);
+ if (closestRelevantSeven % 2 == 0) {
+ invertedRecipeMilestonePercentage = actualProgress;
+ recipeMilestonePercentage = 1 - invertedRecipeMilestonePercentage;
+ } else {
+ recipeMilestonePercentage = actualProgress;
+ invertedRecipeMilestonePercentage = 1 - recipeMilestonePercentage;
+ }
+ }
+ if (milestoneProgress[2] < 7) {
+ fuelMilestonePercentage = (float) max(
+ (log(totalFuelConsumed * 1f / FUEL_MILESTONE_CONSTANT) / FUEL_LOG_CONSTANT + 1),
+ 0) / 7;
+ milestoneProgress[2] = (int) floor(fuelMilestonePercentage * 7);
+ }
+ if (inversion) {
+ rawProgress = (((float) totalFuelConsumed / FUEL_MILESTONE_T7_CONSTANT) - 1) / 7;
+ closestRelevantSeven = (int) floor(rawProgress);
+ actualProgress = rawProgress - closestRelevantSeven;
+ milestoneProgress[2] = 7 + (int) floor(rawProgress * 7);
+ if ((closestRelevantSeven % 2) == 0) {
+ invertedFuelMilestonePercentage = actualProgress;
+ fuelMilestonePercentage = 1 - invertedFuelMilestonePercentage;
+ } else {
+ fuelMilestonePercentage = actualProgress;
+ invertedFuelMilestonePercentage = 1 - fuelMilestonePercentage;
+ }
+ }
+
+ if (milestoneProgress[3] < 7) {
+ structureMilestonePercentage = totalExtensionsBuilt / 7f;
+ }
+ if (inversion) {
+ rawProgress = (totalExtensionsBuilt - 7) / 7f;
+ closestRelevantSeven = (int) floor(rawProgress);
+ actualProgress = rawProgress - closestRelevantSeven;
+ if ((closestRelevantSeven % 2) == 0) {
+ invertedStructureMilestonePercentage = actualProgress;
+ structureMilestonePercentage = 1 - invertedStructureMilestonePercentage;
+ } else {
+ structureMilestonePercentage = actualProgress;
+ invertedStructureMilestonePercentage = 1 - structureMilestonePercentage;
+ }
+ }
+ }
+
+ private void determineGravitonShardAmount() {
+ int sum = 0;
+ for (int progress : milestoneProgress) {
+ if (!inversion) {
+ progress = Math.min(progress, 7);
+ }
+ sum += progress * (progress + 1) / 2;
+ }
+ gravitonShardsAvailable = sum - gravitonShardsSpent;
+ }
+
+ private Text gravitonShardAmountText(int milestoneID) {
+ int sum;
+ int progress = milestoneProgress[milestoneID];
+ if (!inversion) {
+ progress = Math.min(progress, 7);
+ }
+ sum = progress * (progress + 1) / 2;
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.shardgain") + ": " + EnumChatFormatting.GRAY + sum);
+ }
+
+ private Text totalMilestoneProgress(int milestoneID) {
+ long progress;
+ BigInteger bigProgress;
+ String suffix;
+ boolean shift = Interactable.hasShiftDown();
+ switch (milestoneID) {
+ case 1 -> {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes");
+ progress = totalRecipesProcessed;
+ }
+ case 2 -> {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel");
+ progress = totalFuelConsumed;
+ }
+ case 3 -> {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions");
+ progress = milestoneProgress[3];
+ }
+ default -> {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power");
+ bigProgress = totalPowerConsumed;
+ if (!shift && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": "
+ + EnumChatFormatting.GRAY
+ + toExponentForm(bigProgress)
+ + " "
+ + suffix);
+ } else {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": "
+ + EnumChatFormatting.GRAY
+ + bigProgress
+ + " "
+ + suffix);
+ }
+ }
+ }
+ if (!shift) {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": "
+ + EnumChatFormatting.GRAY
+ + formatNumbers(progress)
+ + " "
+ + suffix);
+ } else {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": "
+ + EnumChatFormatting.GRAY
+ + progress
+ + " "
+ + suffix);
+ }
+
+ }
+
+ private Text currentMilestone(int milestoneID) {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.milestoneprogress") + ": "
+ + EnumChatFormatting.GRAY
+ + milestoneProgress[milestoneID]);
+ }
+
+ private Text milestoneProgressText(int milestoneID, boolean formatting) {
+ long max;
+ BigInteger bigMax;
+ String suffix;
+ String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress");
+ Text done = new Text(translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete"));
+ if (Interactable.hasShiftDown()) {
+ formatting = false;
+ done = new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + EnumChatFormatting.DARK_RED
+ + "?");
+ }
+ switch (milestoneID) {
+ case 0:
+ if (milestoneProgress[0] < 7 || inversion) {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power");
+ if (inversion) {
+ bigMax = POWER_MILESTONE_T7_CONSTANT.multiply(BigInteger.valueOf(milestoneProgress[0] - 5));
+ } else {
+ bigMax = BigInteger.valueOf(LongMath.pow(9, milestoneProgress[0]))
+ .multiply(BigInteger.valueOf(LongMath.pow(10, 15)));
+ }
+ if (formatting && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) {
+ return new Text(
+ progressText + ": " + EnumChatFormatting.GRAY + toExponentForm(bigMax) + " " + suffix);
+ } else {
+ return new Text(progressText + ": " + EnumChatFormatting.GRAY + bigMax + " " + suffix);
+ }
+ } else {
+ return done;
+ }
+ case 1:
+ if (milestoneProgress[1] < 7 || inversion) {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes");
+ if (inversion) {
+ max = RECIPE_MILESTONE_T7_CONSTANT * (milestoneProgress[1] - 5);
+ } else {
+ max = LongMath.pow(6, milestoneProgress[1]) * LongMath.pow(10, 7);
+ }
+ break;
+ } else {
+ return done;
+ }
+ case 2:
+ if (milestoneProgress[2] < 7 || inversion) {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel");
+ if (inversion) {
+ max = FUEL_MILESTONE_T7_CONSTANT * (milestoneProgress[2] - 5);
+ } else {
+ max = LongMath.pow(3, milestoneProgress[2]) * LongMath.pow(10, 4);
+ }
+ break;
+ } else {
+ return done;
+ }
+ case 3:
+ if (milestoneProgress[3] < 7 || inversion) {
+ suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions");
+ max = milestoneProgress[3] + 1;
+ break;
+ } else {
+ return done;
+ }
+ default:
+ return new Text("Error");
+ }
+ if (formatting) {
+ return new Text(progressText + ": " + EnumChatFormatting.GRAY + formatNumbers(max) + " " + suffix);
+ } else {
+ return new Text(progressText + ": " + EnumChatFormatting.GRAY + max + " " + suffix);
+ }
+ }
+
+ private void increaseBattery(int amount) {
+ if ((internalBattery + amount) <= maxBatteryCharge) {
+ internalBattery += amount;
+ } else {
+ batteryCharging = false;
+ }
+ }
+
+ public void reduceBattery(int amount) {
+ if (internalBattery - amount <= 0) {
+ internalBattery = 0;
+ if (moduleHatches.size() > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+ } else {
+ internalBattery -= amount;
+ totalFuelConsumed += amount;
+ }
+
+ }
+
+ public int getBatteryCharge() {
+ return internalBattery;
+ }
+
+ public int getMaxBatteryCharge() {
+ return maxBatteryCharge;
+ }
+
+ public void addTotalPowerConsumed(BigInteger amount) {
+ totalPowerConsumed = totalPowerConsumed.add(amount);
+ }
+
+ public void addTotalRecipesProcessed(long amount) {
+ totalRecipesProcessed += amount;
+ }
+
+ @Override
+ protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) {}
+
+ @Override
+ public void setItemNBT(NBTTagCompound NBT) {
+ NBT.setInteger("selectedFuelType", selectedFuelType);
+ NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
+ NBT.setInteger("internalBattery", internalBattery);
+ NBT.setBoolean("batteryCharging", batteryCharging);
+ NBT.setInteger("batterySize", maxBatteryCharge);
+ NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable);
+ NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent);
+ NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray());
+ NBT.setLong("totalRecipesProcessed", totalRecipesProcessed);
+ NBT.setLong("totalFuelConsumed", totalFuelConsumed);
+ NBT.setInteger("starFuelStored", stellarFuelAmount);
+
+ // Store booleanArray of all upgrades
+ NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound();
+
+ int upgradeIndex = 0;
+ for (Boolean upgrade : upgrades) {
+ upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade);
+ upgradeIndex++;
+ }
+
+ NBT.setTag("upgrades", upgradeBooleanArrayNBTTag);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setInteger("selectedFuelType", selectedFuelType);
+ NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
+ NBT.setInteger("internalBattery", internalBattery);
+ NBT.setBoolean("batteryCharging", batteryCharging);
+ NBT.setInteger("batterySize", maxBatteryCharge);
+ NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable);
+ NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent);
+ NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray());
+ NBT.setLong("totalRecipesProcessed", totalRecipesProcessed);
+ NBT.setLong("totalFuelConsumed", totalFuelConsumed);
+ NBT.setInteger("starFuelStored", stellarFuelAmount);
+
+ // Store booleanArray of all upgrades
+ NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound();
+
+ int upgradeIndex = 0;
+ for (Boolean upgrade : upgrades) {
+ upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade);
+ upgradeIndex++;
+ }
+
+ NBT.setTag("upgrades", upgradeBooleanArrayNBTTag);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound NBT) {
+ selectedFuelType = NBT.getInteger("selectedFuelType");
+ fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor");
+ internalBattery = NBT.getInteger("internalBattery");
+ batteryCharging = NBT.getBoolean("batteryCharging");
+ maxBatteryCharge = NBT.getInteger("batterySize");
+ gravitonShardsAvailable = NBT.getInteger("gravitonShardsAvailable");
+ gravitonShardsSpent = NBT.getInteger("gravitonShardsSpent");
+ totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed"));
+ totalRecipesProcessed = NBT.getLong("totalRecipesProcessed");
+ totalFuelConsumed = NBT.getLong("totalFuelConsumed");
+ stellarFuelAmount = NBT.getInteger("starFuelStored");
+
+ NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades");
+
+ for (int upgradeIndex = 0; upgradeIndex < 31; upgradeIndex++) {
+ boolean upgrade = tempBooleanTag.getBoolean("upgrade" + upgradeIndex);
+ upgrades[upgradeIndex] = upgrade;
+ }
+
+ super.loadNBTData(NBT);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java
new file mode 100644
index 0000000000..1be94b4333
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java
@@ -0,0 +1,525 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW;
+import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT;
+import static com.github.technus.tectech.util.CommonValues.V;
+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.Maintenance;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+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.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Rack;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReason;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public class GT_MetaTileEntity_EM_computer extends GT_MetaTileEntity_MultiblockBase_EM
+ implements ISurvivalConstructable {
+
+ // region variables
+ private final ArrayList<GT_MetaTileEntity_Hatch_Rack> eRacks = new ArrayList<>();
+
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+ // endregion
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.em.computer.hint.0"), // 1 - Classic/Data Hatches or
+ // Computer casing
+ translateToLocal("gt.blockmachines.multimachine.em.computer.hint.1"), // 2 - Rack Hatches or Advanced
+ // computer casing
+ };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_computer> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_computer>builder()
+ .addShape("front", transpose(new String[][] { { " AA" }, { " AA" }, { " ~A" }, { " AA" } }))
+ .addShape("cap", transpose(new String[][] { { "-CB" }, { " DD" }, { " DD" }, { "-CB" } }))
+ .addShape("slice", transpose(new String[][] { { "-CB" }, { " ED" }, { " ED" }, { "-CB" } }))
+ .addShape("back", transpose(new String[][] { { " AA" }, { " AA" }, { " AA" }, { " AA" } }))
+ .addElement('B', ofBlock(sBlockCasingsTT, 1))
+ .addElement('C', ofBlock(sBlockCasingsTT, 2))
+ .addElement('D', ofBlock(sBlockCasingsTT, 3))
+ .addElement(
+ 'A',
+ buildHatchAdder(GT_MetaTileEntity_EM_computer.class)
+ .atLeast(
+ Energy.or(HatchElement.EnergyMulti),
+ Maintenance,
+ HatchElement.Uncertainty,
+ HatchElement.OutputData)
+ .casingIndex(textureOffset + 1)
+ .dot(1)
+ .buildAndChain(ofBlock(sBlockCasingsTT, 1)))
+ .addElement('E', ofChain(RackHatchElement.INSTANCE.newAny(textureOffset + 3, 2), ofBlock(sBlockCasingsTT, 3)))
+ .build();
+ // endregion
+
+ // region parameters
+ protected Parameters.Group.ParameterIn overclock, overvolt;
+ protected Parameters.Group.ParameterOut maxCurrentTemp, availableData;
+
+ private static final INameFunction<GT_MetaTileEntity_EM_computer> OC_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgi.0"); // Overclock ratio
+ private static final INameFunction<GT_MetaTileEntity_EM_computer> OV_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgi.1"); // Overvoltage ratio
+ private static final INameFunction<GT_MetaTileEntity_EM_computer> MAX_TEMP_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgo.0"); // Current max. heat
+ private static final INameFunction<GT_MetaTileEntity_EM_computer> COMPUTE_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgo.1"); // Produced computation
+ private static final IStatusFunction<GT_MetaTileEntity_EM_computer> OC_STATUS = (base, p) -> LedStatus
+ .fromLimitsInclusiveOuterBoundary(p.get(), 0, 1, 1, 3);
+ private static final IStatusFunction<GT_MetaTileEntity_EM_computer> OV_STATUS = (base, p) -> LedStatus
+ .fromLimitsInclusiveOuterBoundary(p.get(), .7, .8, 1.2, 2);
+ private static final IStatusFunction<GT_MetaTileEntity_EM_computer> MAX_TEMP_STATUS = (base, p) -> LedStatus
+ .fromLimitsInclusiveOuterBoundary(p.get(), -10000, 0, 0, 5000);
+ private static final IStatusFunction<GT_MetaTileEntity_EM_computer> COMPUTE_STATUS = (base, p) -> {
+ if (base.eAvailableData < 0) {
+ return STATUS_TOO_LOW;
+ }
+ if (base.eAvailableData == 0) {
+ return STATUS_NEUTRAL;
+ }
+ return STATUS_OK;
+ };
+ // endregion
+
+ public GT_MetaTileEntity_EM_computer(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ eCertainMode = 5;
+ eCertainStatus = -128; // no-brain value
+ }
+
+ public GT_MetaTileEntity_EM_computer(String aName) {
+ super(aName);
+ eCertainMode = 5;
+ eCertainStatus = -128; // no-brain value
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_computer(mName);
+ }
+
+ @Override
+ protected void parametersInstantiation_EM() {
+ Parameters.Group hatch_0 = parametrization.getGroup(0);
+ overclock = hatch_0.makeInParameter(0, 1, OC_NAME, OC_STATUS);
+ overvolt = hatch_0.makeInParameter(1, 1, OV_NAME, OV_STATUS);
+ maxCurrentTemp = hatch_0.makeOutParameter(0, 0, MAX_TEMP_NAME, MAX_TEMP_STATUS);
+ availableData = hatch_0.makeOutParameter(1, 0, COMPUTE_NAME, COMPUTE_STATUS);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ eRacks.clear();
+ if (!structureCheck_EM("front", 1, 2, 0)) {
+ return false;
+ }
+ if (!structureCheck_EM("cap", 1, 2, -1)) {
+ return false;
+ }
+ byte offset = -2, totalLen = 4;
+ while (offset > -16) {
+ if (!structureCheck_EM("slice", 1, 2, offset)) {
+ break;
+ }
+ totalLen++;
+ offset--;
+ }
+ if (totalLen > 17) {
+ return false;
+ }
+ if (!structureCheck_EM("cap", 1, 2, ++offset)) {
+ return false;
+ }
+ if (!structureCheck_EM("back", 1, 2, --offset)) {
+ return false;
+ }
+ eCertainMode = (byte) Math.min(totalLen / 3, 5);
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(iGregTechTileEntity.isActive());
+ }
+ return eUncertainHatches.size() == 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setDouble("computation", availableData.get());
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (availableData != null) {
+ availableData.set(aNBT.getDouble("computation"));
+ eAvailableData = (long) availableData.get();
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && mMachine
+ && !aBaseMetaTileEntity.isActive()
+ && aTick % 20 == MULTI_CHECK_AT) {
+ double maxTemp = 0;
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ if (rack.heat > maxTemp) {
+ maxTemp = rack.heat;
+ }
+ }
+ maxCurrentTemp.set(maxTemp);
+ }
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ parametrization.setToDefaults(false, true);
+ eAvailableData = 0;
+ double maxTemp = 0;
+ double overClockRatio = overclock.get();
+ double overVoltageRatio = overvolt.get();
+ if (Double.isNaN(overClockRatio) || Double.isNaN(overVoltageRatio)) {
+ return SimpleCheckRecipeResult.ofFailure("no_computing");
+ }
+ if (overclock.getStatus(true).isOk && overvolt.getStatus(true).isOk) {
+ float eut = V[8] * (float) overVoltageRatio * (float) overClockRatio;
+ if (eut < Integer.MAX_VALUE - 7) {
+ mEUt = -(int) eut;
+ } else {
+ mEUt = -(int) V[8];
+ return CheckRecipeResultRegistry.POWER_OVERFLOW;
+ }
+ short thingsActive = 0;
+ int rackComputation;
+
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ if (rack.heat > maxTemp) {
+ maxTemp = rack.heat;
+ }
+ rackComputation = rack.tickComponents((float) overClockRatio, (float) overVoltageRatio);
+ if (rackComputation > 0) {
+ eAvailableData += rackComputation;
+ thingsActive += 4;
+ }
+ rack.getBaseMetaTileEntity()
+ .setActive(true);
+ }
+
+ for (GT_MetaTileEntity_Hatch_InputData di : eInputData) {
+ if (di.q != null) // ok for power losses
+ {
+ thingsActive++;
+ }
+ }
+
+ if (thingsActive > 0 && eCertainStatus == 0) {
+ thingsActive += eOutputData.size();
+ eAmpereFlow = 1 + (thingsActive >> 2);
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ maxCurrentTemp.set(maxTemp);
+ availableData.set(eAvailableData);
+ return SimpleCheckRecipeResult.ofSuccess("computing");
+ } else {
+ eAvailableData = 0;
+ mEUt = -(int) V[8];
+ eAmpereFlow = 1;
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ maxCurrentTemp.set(maxTemp);
+ availableData.set(eAvailableData);
+ return SimpleCheckRecipeResult.ofSuccess("no_computing");
+ }
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_computing");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ if (!eOutputData.isEmpty()) {
+ Vec3Impl pos = new Vec3Impl(
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+
+ QuantumDataPacket pack = new QuantumDataPacket(eAvailableData / eOutputData.size()).unifyTraceWith(pos);
+ if (pack == null) {
+ return;
+ }
+ for (GT_MetaTileEntity_Hatch_InputData hatch : eInputData) {
+ if (hatch.q == null || hatch.q.contains(pos)) {
+ continue;
+ }
+ pack = pack.unifyPacketWith(hatch.q);
+ if (pack == null) {
+ return;
+ }
+ }
+
+ for (GT_MetaTileEntity_Hatch_OutputData o : eOutputData) {
+ o.q = pack;
+ }
+ }
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.computer.name")) // Machine Type: Quantum
+ // Computer
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.computer.desc.0")) // Controller block of
+ // the Quantum Computer
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.computer.desc.1")) // Used to generate
+ // computation (and heat)
+ .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex!
+ .addSeparator()
+ .beginVariableStructureBlock(2, 2, 4, 4, 5, 16, false)
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.certain.tier.07.name"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"),
+ 1) // Uncertainty Resolver: Any Computer Casing on first or last slice
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.DataConnector"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"),
+ 1) // Optical Connector: Any Computer Casing on first or last slice
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.rack.tier.08.name"),
+ translateToLocal("tt.keyword.Structure.AnyAdvComputerCasingExceptOuter"),
+ 2) // Computer Rack: Any Advanced Computer Casing, except the outer ones
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.param.tier.05.name"),
+ translateToLocal("tt.keyword.Structure.Optional") + " "
+ + translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"),
+ 2) // Parametrizer: (optional) Any Computer Casing on first or last slice
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), 1) // Energy
+ // Hatch:
+ // Any
+ // Computer
+ // Casing
+ // on
+ // first
+ // or
+ // last
+ // slice
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), 1) // Maintenance
+ // Hatch:
+ // Any
+ // Computer
+ // Casing
+ // on
+ // first
+ // or
+ // last
+ // slice
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_COMPUTER");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_COMPUTER_ACTIVE");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3],
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3] };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return GT_MetaTileEntity_EM_switch.activitySound;
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+
+ @Override
+ protected void extraExplosions_EM() {
+ for (MetaTileEntity tTileEntity : eRacks) {
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(V[9]);
+ }
+ }
+
+ @Override
+ protected long getAvailableData_EM() {
+ return eAvailableData;
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ eAvailableData = 0;
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+
+ @Override
+ protected void afterRecipeCheckFailed() {
+ super.afterRecipeCheckFailed();
+ for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+
+ public final boolean addRackToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Rack) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eRacks.add((GT_MetaTileEntity_Hatch_Rack) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("front", 1, 2, 0, stackSize, hintsOnly);
+ structureBuild_EM("cap", 1, 2, -1, stackSize, hintsOnly);
+
+ byte offset = -2;
+ for (int rackSlices = Math.min(stackSize.stackSize, 12); rackSlices > 0; rackSlices--) {
+ structureBuild_EM("slice", 1, 2, offset--, stackSize, hintsOnly);
+ }
+
+ structureBuild_EM("cap", 1, 2, offset--, stackSize, hintsOnly);
+ structureBuild_EM("back", 1, 2, offset, stackSize, hintsOnly);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ int built;
+ built = survivialBuildPiece("front", stackSize, 1, 2, 0, elementBudget, source, actor, false, true);
+ if (built >= 0) return built;
+ built = survivialBuildPiece("cap", stackSize, 1, 2, -1, elementBudget, source, actor, false, true);
+ if (built >= 0) return built;
+
+ byte offset = -2;
+ for (int rackSlices = Math.min(stackSize.stackSize, 12); rackSlices > 0; rackSlices--) {
+ built = survivialBuildPiece("slice", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true);
+ if (built >= 0) return built;
+ }
+ built = survivialBuildPiece("cap", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true);
+ if (built >= 0) return built;
+ return survivialBuildPiece("back", stackSize, 1, 2, offset, elementBudget, source, actor, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_computer> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ private enum RackHatchElement implements IHatchElement<GT_MetaTileEntity_EM_computer> {
+
+ INSTANCE;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Rack.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GT_MetaTileEntity_EM_computer> adder() {
+ return GT_MetaTileEntity_EM_computer::addRackToMachineList;
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_computer t) {
+ return t.eRacks.size();
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java
new file mode 100644
index 0000000000..bbf719542b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java
@@ -0,0 +1,302 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputDataItems;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputDataItems;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.IGT_HatchAdder;
+
+public class GT_MetaTileEntity_EM_dataBank extends GT_MetaTileEntity_MultiblockBase_EM
+ implements ISurvivalConstructable {
+
+ // region variables
+ private final ArrayList<GT_MetaTileEntity_Hatch_OutputDataItems> eStacksDataOutputs = new ArrayList<>();
+ private final ArrayList<IInventory> eDataAccessHatches = new ArrayList<>();
+ private boolean slave = false;
+ // endregion
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.em.databank.hint.0"), // 1 - Classic Hatches or high power
+ // casing
+ translateToLocal("gt.blockmachines.multimachine.em.databank.hint.1"), // 2 - Data Access/Data Bank Master
+ // Hatches or
+ // computer casing
+ };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_dataBank> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_dataBank>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { "BCCCB", "BDDDB", "BDDDB" }, { "BC~CB", "BAAAB", "BDDDB" },
+ { "BCCCB", "BDDDB", "BDDDB" } }))
+ .addElement('A', ofBlock(sBlockCasingsTT, 1))
+ .addElement('B', ofBlock(sBlockCasingsTT, 2))
+ .addElement('C', classicHatches(textureOffset, 1, sBlockCasingsTT, 0))
+ .addElement(
+ 'D',
+ buildHatchAdder(GT_MetaTileEntity_EM_dataBank.class)
+ .atLeast(DataBankHatches.OutboundConnector, DataBankHatches.InboundConnector)
+ .casingIndex(textureOffset + 1)
+ .dot(2)
+ .buildAndChain(DataBankHatches.DataStick.newAny(textureOffset + 1, 2), ofBlock(sBlockCasingsTT, 1)))
+ .build();
+ // endregion
+
+ public GT_MetaTileEntity_EM_dataBank(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_dataBank(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_dataBank(mName);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.databank.name")) // Machine Type: Data Bank
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.0")) // Controller block of
+ // the Data Bank
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.1")) // Used to supply
+ // Assembling Lines
+ // with more Data Sticks
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.2")) // and give multiple
+ // Assembling
+ // Lines access to the same Data
+ // Stick
+ .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex!
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, false)
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.DataAccessHatch"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasing"),
+ 2) // Data Access Hatch: Any Computer Casing
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.dataoutass.tier.07.name"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasing"),
+ 2) // Data Bank Master Connector: Any Computer Casing
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Energy Hatch: Any
+ // High Power Casing
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Maintenance
+ // Hatch: Any High
+ // Power Casing
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ eDataAccessHatches.clear();
+ eStacksDataOutputs.clear();
+ slave = false;
+ return structureCheck_EM("main", 2, 1, 0);
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ if (eDataAccessHatches.size() > 0 && eStacksDataOutputs.size() > 0) {
+ mEUt = -(int) V[slave ? 6 : 4];
+ eAmpereFlow = 1 + (long) eStacksDataOutputs.size() * eDataAccessHatches.size();
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ return SimpleCheckRecipeResult.ofSuccess("providing_data");
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_data");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ ArrayList<ItemStack> stacks = new ArrayList<>();
+ for (IInventory dataAccess : eDataAccessHatches) {
+ int count = dataAccess.getSizeInventory();
+ for (int i = 0; i < count; i++) {
+ ItemStack stack = dataAccess.getStackInSlot(i);
+ if (stack != null) {
+ stacks.add(stack);
+ }
+ }
+ }
+ if (stacks.size() > 0) {
+ ItemStack[] arr = stacks.toArray(nullItem);
+ for (GT_MetaTileEntity_Hatch_OutputDataItems hatch : eStacksDataOutputs) {
+ hatch.q = new InventoryDataPacket(arr);
+ }
+ } else {
+ for (GT_MetaTileEntity_Hatch_OutputDataItems hatch : eStacksDataOutputs) {
+ hatch.q = null;
+ }
+ }
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1],
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1] };
+ }
+
+ public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_hi_freq");
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return activitySound;
+ }
+
+ public final boolean addDataBankHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputDataItems) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eStacksDataOutputs.add((GT_MetaTileEntity_Hatch_OutputDataItems) aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess
+ && !(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputDataItems)) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eDataAccessHatches.add(aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputDataItems) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ slave = true;
+ return eDataAccessHatches.add(aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 2, 1, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stackSize, 2, 1, 0, elementBudget, source, actor, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_dataBank> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ private enum DataBankHatches implements IHatchElement<GT_MetaTileEntity_EM_dataBank> {
+
+ DataStick(GT_MetaTileEntity_Hatch_DataAccess.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_dataBank t) {
+ return t.eDataAccessHatches.size();
+ }
+ },
+ OutboundConnector(GT_MetaTileEntity_Hatch_OutputDataItems.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_dataBank t) {
+ return t.eStacksDataOutputs.size();
+ }
+ },
+ InboundConnector(GT_MetaTileEntity_Hatch_InputDataItems.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_dataBank t) {
+ return t.eDataAccessHatches.size();
+ }
+ };
+
+ private final List<? extends Class<? extends IMetaTileEntity>> mteClasses;
+
+ @SafeVarargs
+ DataBankHatches(Class<? extends IMetaTileEntity>... mteClasses) {
+ this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses));
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mteClasses;
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GT_MetaTileEntity_EM_dataBank> adder() {
+ return GT_MetaTileEntity_EM_dataBank::addDataBankHatchToMachineList;
+ }
+ }
+
+ @Override
+ public boolean isPowerPassButtonEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isSafeVoidButtonEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedToWorkButtonEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java
new file mode 100644
index 0000000000..577fae6d4b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java
@@ -0,0 +1,315 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.mEUtoRF;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+
+import cofh.api.energy.IEnergyContainerItem;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+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_InputBus;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public class GT_MetaTileEntity_EM_infuser extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable {
+
+ private static final int maxRepairedDamagePerOperation = 1000;
+ private static final long usedEuPerDurability = 1000;
+ private static final int usedUumPerDurability = 1;
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ // 1 - Classic Hatches or High Power Casing
+ translateToLocal("gt.blockmachines.multimachine.em.infuser.hint"), };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_infuser> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_infuser>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "BBB", "BAB", "BBB" }, { "A~A", "AAA", "AAA" },
+ { "BBB", "BAB", "BBB" }, { "CCC", "CCC", "CCC" } }))
+ .addElement('A', ofBlock(sBlockCasingsTT, 4))
+ .addElement('B', ofBlock(sBlockCasingsTT, 7))
+ .addElement(
+ 'C',
+ ofHatchAdderOptional(
+ GT_MetaTileEntity_EM_infuser::addClassicToMachineList,
+ textureOffset,
+ 1,
+ sBlockCasingsTT,
+ 0))
+ .build();
+ // endregion
+
+ public GT_MetaTileEntity_EM_infuser(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ minRepairStatus = (byte) getIdealStatus();
+ eDismantleBoom = true;
+ }
+
+ public GT_MetaTileEntity_EM_infuser(String aName) {
+ super(aName);
+ minRepairStatus = (byte) getIdealStatus();
+ eDismantleBoom = true;
+ }
+
+ private boolean isItemStackFullyCharged(ItemStack stack) {
+ if (stack == null) {
+ return true;
+ }
+ Item item = stack.getItem();
+ if (stack.stackSize == 1) {
+ if (item instanceof IElectricItem) {
+ return ElectricItem.manager.getCharge(stack) >= ((IElectricItem) item).getMaxCharge(stack);
+ } else if (TecTech.hasCOFH && item instanceof IEnergyContainerItem) {
+ return ((IEnergyContainerItem) item).getEnergyStored(stack)
+ >= ((IEnergyContainerItem) item).getMaxEnergyStored(stack);
+ }
+ }
+ return true;
+ }
+
+ private boolean isItemStackFullyRepaired(ItemStack stack) {
+ if (stack == null) {
+ return true;
+ }
+ Item item = stack.getItem();
+ return !item.isRepairable() || item.getMaxDamage(stack) <= 0 || item.getDamage(stack) <= 0;
+ }
+
+ private long doChargeItemStack(IElectricItem item, ItemStack stack) {
+ try {
+ double euDiff = item.getMaxCharge(stack) - ElectricItem.manager.getCharge(stack);
+ long remove = (long) Math.ceil(
+ ElectricItem.manager.charge(stack, Math.min(euDiff, getEUVar()), item.getTier(stack), true, false));
+ setEUVar(getEUVar() - remove);
+ if (getEUVar() < 0) {
+ setEUVar(0);
+ }
+ return remove;
+ } catch (Exception e) {
+ if (DEBUG_MODE) {
+ e.printStackTrace();
+ }
+ }
+ return 0;
+ }
+
+ private long doChargeItemStackRF(IEnergyContainerItem item, ItemStack stack) {
+ try {
+ long RF = Math
+ .min(item.getMaxEnergyStored(stack) - item.getEnergyStored(stack), getEUVar() * mEUtoRF / 100L);
+ RF = item.receiveEnergy(stack, RF > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) RF, false);
+ RF = RF * 100L / mEUtoRF;
+ setEUVar(getEUVar() - RF);
+ if (getEUVar() < 0) {
+ setEUVar(0);
+ }
+ return RF;
+ } catch (Exception e) {
+ if (DEBUG_MODE) {
+ e.printStackTrace();
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_infuser(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ return structureCheck_EM("main", 1, 2, 0);
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ for (GT_MetaTileEntity_Hatch_InputBus inputBus : mInputBusses) {
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue;
+ for (int i = 0; i < inputBus.getSizeInventory(); i++) {
+ ItemStack itemStackInBus = inputBus.getStackInSlot(i);
+ if (itemStackInBus == null) continue;
+ Item item = itemStackInBus.getItem();
+ if (itemStackInBus.stackSize != 1 || item == null) continue;
+ if (isItemStackFullyCharged(itemStackInBus) && isItemStackFullyRepaired(itemStackInBus)) {
+ if (addOutput(itemStackInBus)) {
+ this.depleteInput(itemStackInBus);
+ }
+ } else {
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = 20;
+ return SimpleCheckRecipeResult.ofSuccess("charging");
+ }
+ }
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_chargeable_item");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ boolean itemProcessed = false;
+ startRecipeProcessing();
+ for (GT_MetaTileEntity_Hatch_InputBus inputBus : mInputBusses) {
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue;
+ for (int i = 0; i < inputBus.getSizeInventory(); i++) {
+ ItemStack itemStackInBus = inputBus.getStackInSlot(i);
+ if (itemStackInBus == null) continue;
+ Item item = itemStackInBus.getItem();
+ if (itemStackInBus.stackSize != 1 || item == null) continue;
+ if (isItemStackFullyCharged(itemStackInBus) && isItemStackFullyRepaired(itemStackInBus)) {
+ itemProcessed = true;
+ if (addOutput(itemStackInBus)) {
+ this.depleteInput(itemStackInBus);
+ }
+ } else {
+ if (item.isRepairable()) {
+ FluidStack uum = getStoredFluids().stream()
+ .filter(
+ fluid -> Materials.UUMatter.getFluid(1)
+ .isFluidEqual(fluid))
+ .findAny()
+ .orElse(null);
+ if (uum != null) {
+ int repairedDamage = Math
+ .min(item.getDamage(itemStackInBus), maxRepairedDamagePerOperation);
+ long euCost = repairedDamage * usedEuPerDurability;
+ if (getEUVar() >= euCost && depleteInput(
+ new FluidStack(Materials.UUMatter.mFluid, repairedDamage * usedUumPerDurability))) {
+ item.setDamage(
+ itemStackInBus,
+ Math.max(item.getDamage(itemStackInBus) - repairedDamage, 0));
+ setEUVar(Math.min(getEUVar() - euCost, 0));
+ }
+ }
+ }
+ if (item instanceof IElectricItem) {
+ doChargeItemStack((IElectricItem) item, itemStackInBus);
+ return;
+ } else if (TecTech.hasCOFH && item instanceof IEnergyContainerItem) {
+ doChargeItemStackRF((IEnergyContainerItem) item, itemStackInBus);
+ return;
+ }
+ }
+ }
+ }
+ endRecipeProcessing();
+ if (!itemProcessed) {
+ afterRecipeCheckFailed();
+ }
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ // Machine Type: Energy Infuser
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.infuser.name"))
+ // Controller block of the Energy Infuser
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.0"))
+ // Can be used to charge items (lossless)
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.1"))
+ // Can be fed with UU-Matter to repair items
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.2"))
+ // Stocking Bus is not supported
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.3"))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, false)
+ // Controller: Front 3rd layer center
+ .addController(translateToLocal("tt.keyword.Structure.FrontCenter3rd"))
+ .addOtherStructurePart(
+ // High Power
+ translateToLocal("gt.blockcasingsTT.0.name"),
+ translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing"))
+ // Casing: Layer
+ // 1 and 5
+ .addOtherStructurePart(
+ // Molecular Coil
+ translateToLocal("gt.blockcasingsTT.7.name"),
+ translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil"))
+ // Layer 2 and 4
+ .addOtherStructurePart(
+ // Molecular
+ translateToLocal("gt.blockcasingsTT.4.name"),
+ translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing"))
+ // Casing: Layer
+ // 3 (hollow)
+ // Energy Hatch: Any High Power Casing
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1)
+ // Maintenance Hatch: Any High Power Casing
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1)
+ .toolTipFinisher(CommonValues.TEC_MARK_GENERAL);
+ return tt;
+ }
+
+ public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_whooum");
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return activitySound;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 1, 2, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_infuser> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ @Override
+ public boolean isPowerPassButtonEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isSafeVoidButtonEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedToWorkButtonEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java
new file mode 100644
index 0000000000..fce7913613
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java
@@ -0,0 +1,823 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.github.technus.tectech.util.CommonValues.VN;
+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.Maintenance;
+import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+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 net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+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.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.recipe.TecTechRecipeMaps;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Holder;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_AssemblyLineUtils;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReason;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+@SuppressWarnings("unchecked")
+public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockBase_EM
+ implements ISurvivalConstructable {
+
+ public static final String machine = "EM Machinery";
+ public static final String crafter = "EM Crafting";
+ // region variables
+ private final ArrayList<GT_MetaTileEntity_Hatch_Holder> eHolders = new ArrayList<>();
+ private GT_Recipe.GT_Recipe_AssemblyLine tRecipe;
+ private static final String assembly = "Assembly line";
+ private static final String scanner = "Scanner";
+ private String machineType = assembly;
+ private ItemStack holdItem;
+ private long computationRemaining, computationRequired;
+
+ private static LinkedHashMap<String, String> lServerNames;
+
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.em.research.hint.0"), // 1 - Classic/Data Hatches or
+ // Computer casing
+ translateToLocal("gt.blockmachines.multimachine.em.research.hint.1"), // 2 - Holder Hatch
+ };
+
+ private String clientLocale = "en_US";
+ // endregion
+
+ // region structure
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_research> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_research>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { " ", " A ", " A ", "AAA", "AAA", "AAA", "AAA" },
+ { "AAA", "ACA", "ACA", "ACA", "BCB", "BCB", "BBB" },
+ { " ", " C ", " ", " ", "ACA", "CCC", "DDD" },
+ { " ", " E ", " ", " ", "A~A", "CCC", "DDD" },
+ { " ", " C ", " ", " ", "ACA", "CCC", "DDD" },
+ { "AAA", "ACA", "ACA", "ACA", "BCB", "BCB", "BBB" },
+ { " ", " A ", " A ", "AAA", "AAA", "AAA", "AAA" } }))
+ .addElement('A', ofBlock(sBlockCasingsTT, 1))
+ .addElement('B', ofBlock(sBlockCasingsTT, 2))
+ .addElement('C', ofBlock(sBlockCasingsTT, 3))
+ .addElement(
+ 'D',
+ buildHatchAdder(GT_MetaTileEntity_EM_research.class)
+ .atLeast(Energy.or(HatchElement.EnergyMulti), Maintenance, HatchElement.InputData)
+ .casingIndex(textureOffset + 1)
+ .dot(1)
+ .buildAndChain(ofBlock(sBlockCasingsTT, 1)))
+ .addElement('E', HolderHatchElement.INSTANCE.newAny(textureOffset + 3, 2))
+ .build();
+ // endregion
+
+ public GT_MetaTileEntity_EM_research(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_research(String aName) {
+ super(aName);
+ }
+
+ private void makeStick() {
+ mInventory[1].setTagCompound(new NBTTagCompound());
+ mInventory[1].setStackDisplayName(
+ GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName()) + " Construction Data");
+ GT_Utility.ItemNBT.setBookTitle(
+ mInventory[1],
+ GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName()) + " Construction Data");
+ NBTTagCompound tNBT = mInventory[1].getTagCompound(); // code above makes it not null
+
+ tNBT.setTag("output", tRecipe.mOutput.writeToNBT(new NBTTagCompound()));
+ tNBT.setInteger("time", tRecipe.mDuration);
+ tNBT.setInteger("eu", tRecipe.mEUt);
+ for (int i = 0; i < tRecipe.mInputs.length; i++) {
+ tNBT.setTag(String.valueOf(i), tRecipe.mInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ for (int i = 0; i < tRecipe.mFluidInputs.length; i++) {
+ tNBT.setTag("f" + i, tRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ tNBT.setString(
+ "author",
+ EnumChatFormatting.BLUE + "Tec"
+ + EnumChatFormatting.DARK_BLUE
+ + "Tech"
+ + EnumChatFormatting.WHITE
+ + " Assembling Line Recipe Generator");
+ NBTTagList tNBTList = new NBTTagList();
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Construction plan for " + tRecipe.mOutput.stackSize
+ + ' '
+ + GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName())
+ + ". Needed EU/t: "
+ + tRecipe.mEUt
+ + " Production time: "
+ + tRecipe.mDuration / 20));
+ for (int i = 0; i < tRecipe.mInputs.length; i++) {
+ if (tRecipe.mInputs[i] != null) {
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Input Bus " + (i + 1)
+ + ": "
+ + tRecipe.mInputs[i].stackSize
+ + ' '
+ + GT_LanguageManager.getTranslation(tRecipe.mInputs[i].getDisplayName())));
+ }
+ }
+ for (int i = 0; i < tRecipe.mFluidInputs.length; i++) {
+ if (tRecipe.mFluidInputs[i] != null) {
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Input Hatch " + (i + 1)
+ + ": "
+ + tRecipe.mFluidInputs[i].amount
+ + "L "
+ + GT_LanguageManager.getTranslation(tRecipe.mFluidInputs[i].getLocalizedName())));
+ }
+ }
+ tNBT.setTag("pages", tNBTList);
+ }
+
+ static {
+ try {
+ Class<?> GT_Assemblyline_Server = Class.forName("gregtech.api.util.GT_Assemblyline_Server");
+ lServerNames = (LinkedHashMap<String, String>) GT_Assemblyline_Server.getField("lServerNames")
+ .get(null);
+ } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
+ lServerNames = null;
+ }
+ }
+
+ private void makeStick2() {
+ String s = tRecipe.mOutput.getDisplayName();
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (lServerNames != null) {
+ s = lServerNames.get(tRecipe.mOutput.getDisplayName());
+ if (s == null) {
+ s = tRecipe.mOutput.getDisplayName();
+ }
+ } else {
+ s = tRecipe.mOutput.getDisplayName();
+ }
+ }
+ mInventory[1].setTagCompound(new NBTTagCompound());
+ mInventory[1].setStackDisplayName(s + " Construction Data");
+ GT_Utility.ItemNBT.setBookTitle(mInventory[1], s + " Construction Data");
+
+ NBTTagCompound tNBT = mInventory[1].getTagCompound();
+
+ tNBT.setTag("output", tRecipe.mOutput.writeToNBT(new NBTTagCompound()));
+ tNBT.setInteger("time", tRecipe.mDuration);
+ tNBT.setInteger("eu", tRecipe.mEUt);
+ for (int i = 0; i < tRecipe.mInputs.length; i++) {
+ tNBT.setTag("" + i, tRecipe.mInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ for (int i = 0; i < tRecipe.mOreDictAlt.length; i++) {
+ if (tRecipe.mOreDictAlt[i] != null && tRecipe.mOreDictAlt[i].length > 0) {
+ tNBT.setInteger("a" + i, tRecipe.mOreDictAlt[i].length);
+ for (int j = 0; j < tRecipe.mOreDictAlt[i].length; j++) {
+ tNBT.setTag("a" + i + ":" + j, tRecipe.mOreDictAlt[i][j].writeToNBT(new NBTTagCompound()));
+ }
+ }
+ }
+ for (int i = 0; i < tRecipe.mFluidInputs.length; i++) {
+ tNBT.setTag("f" + i, tRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ tNBT.setString(
+ "author",
+ EnumChatFormatting.BLUE + "Tec"
+ + EnumChatFormatting.DARK_BLUE
+ + "Tech"
+ + EnumChatFormatting.WHITE
+ + ' '
+ + machineType
+ + " Recipe Generator");
+ NBTTagList tNBTList = new NBTTagList();
+ s = tRecipe.mOutput.getDisplayName();
+ if (getBaseMetaTileEntity().isServerSide()) {
+ s = lServerNames.get(tRecipe.mOutput.getDisplayName());
+ if (s == null) {
+ s = tRecipe.mOutput.getDisplayName();
+ }
+ }
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Construction plan for " + tRecipe.mOutput.stackSize
+ + " "
+ + s
+ + ". Needed EU/t: "
+ + tRecipe.mEUt
+ + " Production time: "
+ + (tRecipe.mDuration / 20)));
+ for (int i = 0; i < tRecipe.mInputs.length; i++) {
+ if (tRecipe.mOreDictAlt[i] != null) {
+ int count = 0;
+ StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": ");
+ for (ItemStack tStack : tRecipe.mOreDictAlt[i]) {
+ if (tStack != null) {
+ s = tStack.getDisplayName();
+ if (getBaseMetaTileEntity().isServerSide()) {
+ s = 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 (tRecipe.mInputs[i] != null) {
+ s = tRecipe.mInputs[i].getDisplayName();
+ if (getBaseMetaTileEntity().isServerSide()) {
+ s = lServerNames.get(tRecipe.mInputs[i].getDisplayName());
+ if (s == null) {
+ s = tRecipe.mInputs[i].getDisplayName();
+ }
+ }
+ tNBTList.appendTag(
+ new NBTTagString("Input Bus " + (i + 1) + ": " + tRecipe.mInputs[i].stackSize + " " + s));
+ }
+ }
+ for (int i = 0; i < tRecipe.mFluidInputs.length; i++) {
+ if (tRecipe.mFluidInputs[i] != null) {
+ s = tRecipe.mFluidInputs[i].getLocalizedName();
+ if (getBaseMetaTileEntity().isServerSide()) {
+ s = lServerNames.get(tRecipe.mFluidInputs[i].getLocalizedName());
+ if (s == null) {
+ s = tRecipe.mFluidInputs[i].getLocalizedName();
+ }
+ }
+ tNBTList.appendTag(
+ new NBTTagString("Input Hatch " + (i + 1) + ": " + tRecipe.mFluidInputs[i].amount + "L " + s));
+ }
+ }
+ tNBT.setTag("pages", tNBTList);
+
+ mInventory[1].setTagCompound(tNBT);
+ }
+
+ private boolean iterateRecipes() {
+ for (GT_Recipe ttRecipe : TecTechRecipeMaps.researchStationFakeRecipes.getAllRecipes()) {
+ if (GT_Utility.areStacksEqual(ttRecipe.mInputs[0], holdItem, true)) {
+ computationRequired = computationRemaining = ttRecipe.mDuration * 20L;
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ eRequiredData = (short) (ttRecipe.mSpecialValue >>> 16);
+ eAmpereFlow = (short) (ttRecipe.mSpecialValue & 0xFFFF);
+ mEUt = Math.min(ttRecipe.mEUt, -ttRecipe.mEUt);
+ eHolders.get(0)
+ .getBaseMetaTileEntity()
+ .setActive(true);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_research(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ for (GT_MetaTileEntity_Hatch_Holder rack : filterValidMTEs(eHolders)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ eHolders.clear();
+
+ if (!structureCheck_EM("main", 1, 3, 4)) {
+ return false;
+ }
+
+ for (GT_MetaTileEntity_Hatch_Holder rack : filterValidMTEs(eHolders)) {
+ rack.getBaseMetaTileEntity()
+ .setActive(iGregTechTileEntity.isActive());
+ }
+ return eHolders.size() == 1;
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ ItemStack controllerStack = getControllerSlot();
+ tRecipe = null;
+ if (!eHolders.isEmpty() && eHolders.get(0).mInventory[0] != null) {
+ holdItem = eHolders.get(0).mInventory[0].copy();
+ if (ItemList.Tool_DataStick.isStackEqual(controllerStack, false, true)) {
+ switch (machineType) {
+ case scanner -> {
+ for (GT_Recipe.GT_Recipe_AssemblyLine assRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) {
+ if (GT_Utility.areStacksEqual(assRecipe.mResearchItem, holdItem, true)) {
+ boolean failScanner = true;
+ for (GT_Recipe scannerRecipe : scannerFakeRecipes.getAllRecipes()) {
+ if (GT_Utility.areStacksEqual(scannerRecipe.mInputs[0], holdItem, true)) {
+ failScanner = false;
+ break;
+ }
+ }
+ if (failScanner) {
+ return SimpleCheckRecipeResult.ofFailure("wrongRequirements");
+ }
+ this.tRecipe = assRecipe;
+ // Scanner mode should consume item first
+ eHolders.get(0).mInventory[0] = null;
+ mInventory[1] = null;
+ // Set property
+ computationRequired = computationRemaining = assRecipe.mResearchTime;
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ eRequiredData = 1;
+ eAmpereFlow = 1;
+ mEUt = -524288;
+ eHolders.get(0)
+ .getBaseMetaTileEntity()
+ .setActive(true);
+ return SimpleCheckRecipeResult.ofSuccess("scanning");
+ }
+ }
+ }
+ case assembly -> {
+ for (GT_Recipe.GT_Recipe_AssemblyLine assRecipe : TecTechRecipeMaps.researchableALRecipeList) {
+ if (GT_Utility.areStacksEqual(assRecipe.mResearchItem, holdItem, true)) {
+ tRecipe = assRecipe;
+ // if found
+ if (iterateRecipes()) return SimpleCheckRecipeResult.ofSuccess("researching");
+ }
+ }
+ }
+ }
+ } else {
+ return CheckRecipeResultRegistry.NO_DATA_STICKS;
+ }
+ }
+ holdItem = null;
+ computationRequired = computationRemaining = 0;
+ for (GT_MetaTileEntity_Hatch_Holder r : eHolders) {
+ r.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_research_item");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ if (!eHolders.isEmpty()) {
+ switch (machineType) {
+ case assembly -> {
+ if (tRecipe != null && ItemList.Tool_DataStick.isStackEqual(mInventory[1], false, true)) {
+ eHolders.get(0)
+ .getBaseMetaTileEntity()
+ .setActive(false);
+ eHolders.get(0).mInventory[0] = null;
+ if (lServerNames == null) {
+ makeStick();
+ } else {
+ try {
+ makeStick2();
+ } catch (NoSuchFieldError e) {
+ makeStick();
+ }
+ }
+ }
+ }
+ case scanner -> {
+ mInventory[1] = ItemList.Tool_DataStick.get(1);
+ GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(mInventory[1], tRecipe);
+ eHolders.get(0)
+ .getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+ }
+ computationRequired = computationRemaining = 0;
+ tRecipe = null;
+ holdItem = null;
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.research.name")) // Machine Type: Research
+ // Station
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.0")) // Controller block of
+ // the Research Station
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.1")) // Used to scan Data
+ // Sticks for
+ // Assembling Line Recipes
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.2")) // Needs to be fed with
+ // computation to work
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.3")) // Does not consume the
+ // item until
+ // the Data Stick is written
+ .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex!
+ .addSeparator()
+ .beginStructureBlock(3, 7, 7, false)
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.holder.tier.09.name"),
+ translateToLocal("tt.keyword.Structure.CenterPillar"),
+ 2) // Object Holder: Center of the front pillar
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.DataConnector"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"),
+ 1) // Optical Connector: Any Computer Casing on the backside of the main body
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"), 1) // Energy Hatch:
+ // Any Computer
+ // Casing on the
+ // backside of
+ // the main body
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"), 1) // Maintenance
+ // Hatch:
+ // Any
+ // Computer
+ // Casing on
+ // the
+ // backside
+ // of the
+ // main body
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { translateToLocalFormatted("tt.keyphrase.Energy_Hatches", clientLocale) + ":",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ (mEUt <= 0 ? translateToLocalFormatted("tt.keyphrase.Probably_uses", clientLocale) + ": "
+ : translateToLocalFormatted("tt.keyphrase.Probably_makes", clientLocale) + ": ")
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(Math.abs(mEUt))
+ + EnumChatFormatting.RESET
+ + " EU/t "
+ + translateToLocalFormatted("tt.keyword.at", clientLocale)
+ + " "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(eAmpereFlow)
+ + EnumChatFormatting.RESET
+ + " A",
+ translateToLocalFormatted("tt.keyphrase.Tier_Rating", clientLocale) + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[getMaxEnergyInputTier_EM()]
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.GREEN
+ + VN[getMinEnergyInputTier_EM()]
+ + EnumChatFormatting.RESET
+ + " "
+ + translateToLocalFormatted("tt.keyphrase.Amp_Rating", clientLocale)
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(eMaxAmpereFlow)
+ + EnumChatFormatting.RESET
+ + " A",
+ translateToLocalFormatted("tt.keyword.Problems", clientLocale) + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + translateToLocalFormatted("tt.keyword.Efficiency", clientLocale)
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ translateToLocalFormatted("tt.keyword.PowerPass", clientLocale) + ": "
+ + EnumChatFormatting.BLUE
+ + ePowerPass
+ + EnumChatFormatting.RESET
+ + " "
+ + translateToLocalFormatted("tt.keyword.SafeVoid", clientLocale)
+ + ": "
+ + EnumChatFormatting.BLUE
+ + eSafeVoid,
+ translateToLocalFormatted("tt.keyphrase.Computation_Available", clientLocale) + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(eAvailableData)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(eRequiredData)
+ + EnumChatFormatting.RESET,
+ translateToLocalFormatted("tt.keyphrase.Computation_Remaining", clientLocale) + ":",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(computationRemaining / 20L)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(computationRequired / 20L) };
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3],
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3] };
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ for (GT_MetaTileEntity_Hatch_Holder r : eHolders) {
+ r.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+
+ @Override
+ protected void extraExplosions_EM() {
+ for (MetaTileEntity tTileEntity : eHolders) {
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(V[9]);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("eComputationRemaining", computationRemaining);
+ aNBT.setLong("eComputationRequired", computationRequired);
+ aNBT.setString("eMachineType", machineType);
+ if (holdItem != null) {
+ aNBT.setTag("eHold", holdItem.writeToNBT(new NBTTagCompound()));
+ } else {
+ aNBT.removeTag("eHold");
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ computationRemaining = aNBT.getLong("eComputationRemaining");
+ computationRequired = aNBT.getLong("eComputationRequired");
+ machineType = aNBT.hasKey("eMachineType") ? aNBT.getString("eMachineType") : assembly;
+ if (aNBT.hasKey("eHold")) {
+ holdItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("eHold"));
+ } else {
+ holdItem = null;
+ }
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ for (GT_MetaTileEntity_Hatch_Holder r : eHolders) {
+ r.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ computationRequired = computationRemaining = 0;
+ tRecipe = null;
+ holdItem = null;
+ }
+
+ @Override
+ public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (computationRemaining > 0) {
+ tRecipe = null;
+ if (holdItem != null) {
+ if (ItemList.Tool_DataStick.isStackEqual(mInventory[1], false, true)) {
+ for (GT_Recipe.GT_Recipe_AssemblyLine tRecipe : TecTechRecipeMaps.researchableALRecipeList) {
+ if (GT_Utility.areStacksEqual(tRecipe.mResearchItem, holdItem, true)) {
+ this.tRecipe = tRecipe;
+ break;
+ }
+ }
+ }
+ }
+ if (tRecipe == null) {
+ holdItem = null;
+ computationRequired = computationRemaining = 0;
+ mMaxProgresstime = 0;
+ mEfficiencyIncrease = 0;
+ for (GT_MetaTileEntity_Hatch_Holder r : eHolders) {
+ r.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (computationRemaining <= 0) {
+ computationRemaining = 0;
+ mProgresstime = mMaxProgresstime;
+ return true;
+ } else {
+ computationRemaining -= eAvailableData;
+ mProgresstime = 1;
+ return super.onRunningTick(aStack);
+ }
+ }
+
+ public final boolean addHolderToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Holder) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eHolders.add((GT_MetaTileEntity_Hatch_Holder) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ super.onRightclick(aBaseMetaTileEntity, aPlayer);
+
+ if (!aBaseMetaTileEntity.isClientSide() && aPlayer instanceof EntityPlayerMP) {
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ } else {
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ switch (machineType) {
+ case scanner -> machineType = assembly;
+ case assembly -> machineType = scanner;
+ }
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation(
+ "gt.blockmachines.multimachine.em.research.mode." + machineType.replace(" ", "_")));
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ tag.setBoolean("hasProblems", (getIdealStatus() - getRepairStatus()) > 0);
+ tag.setFloat("efficiency", mEfficiency / 100.0F);
+ tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0);
+ tag.setString("machineType", machineType);
+ tag.setLong("computation", (computationRequired - computationRemaining) / 20L);
+ tag.setLong("computationRequired", computationRequired / 20L);
+ }
+
+ @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")
+ + "%");
+ currentTip.add("Mode: " + tag.getString("machineType"));
+ currentTip.add(
+ String.format(
+ "Computation: %,d / %,d",
+ tag.getInteger("computation"),
+ tag.getInteger("computationRequired")));
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 1, 3, 4, stackSize, hintsOnly);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stackSize, 1, 3, 4, elementBudget, source, actor, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_research> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ private enum HolderHatchElement implements IHatchElement<GT_MetaTileEntity_EM_research> {
+
+ INSTANCE;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Holder.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GT_MetaTileEntity_EM_research> adder() {
+ return GT_MetaTileEntity_EM_research::addHolderToMachineList;
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_research t) {
+ return t.eHolders.size();
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java
new file mode 100644
index 0000000000..b408e63af4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java
@@ -0,0 +1,291 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_HIGH;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_LOW;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public class GT_MetaTileEntity_EM_switch extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable {
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ "1 - Classic/Data Hatches or Computer casing", // 1 - Classic/Data Hatches or Computer casing
+ };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_switch> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_switch>builder()
+ .addShape(
+ "main",
+ transpose(new String[][] { { "BBB", "BBB", "BBB" }, { "B~B", "BAB", "BBB" }, { "BBB", "BBB", "BBB" } }))
+ .addElement('A', ofBlock(sBlockCasingsTT, 3))
+ .addElement(
+ 'B',
+ ofHatchAdderOptional(
+ GT_MetaTileEntity_EM_switch::addClassicToMachineList,
+ textureOffset + 1,
+ 1,
+ sBlockCasingsTT,
+ 1))
+ .build();
+ // endregion
+
+ // region parameters
+ private static final INameFunction<GT_MetaTileEntity_EM_switch> ROUTE_NAME = (base,
+ p) -> (p.parameterId() == 0 ? translateToLocal("tt.keyword.Destination") + " "
+ : translateToLocal("tt.keyword.Weight") + " ") + p.hatchId();
+ private static final IStatusFunction<GT_MetaTileEntity_EM_switch> WEI_STATUS = (base, p) -> {
+ double v = p.get();
+ if (Double.isNaN(v)) return STATUS_WRONG;
+ if (v < 0) return STATUS_TOO_LOW;
+ if (v == 0) return STATUS_LOW;
+ if (Double.isInfinite(v)) return STATUS_HIGH;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_EM_switch> DST_STATUS = (base, p) -> {
+ if (base.weight[p.hatchId()].getStatus(false).isOk) {
+ double v = p.get();
+ if (Double.isNaN(v)) return STATUS_WRONG;
+ v = (int) v;
+ if (v <= 0) return STATUS_TOO_LOW;
+ return STATUS_OK;
+ }
+ return STATUS_NEUTRAL;
+ };
+ protected Parameters.Group.ParameterIn[] dst;
+ protected Parameters.Group.ParameterIn[] weight;
+ // endregion
+
+ public GT_MetaTileEntity_EM_switch(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_switch(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_switch(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ return structureCheck_EM("main", 1, 1, 0);
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ short thingsActive = 0;
+ for (GT_MetaTileEntity_Hatch_InputData di : eInputData) {
+ if (di.q != null) {
+ thingsActive++;
+ }
+ }
+
+ if (thingsActive > 0) {
+ thingsActive += eOutputData.size();
+ mEUt = -(int) V[7];
+ eAmpereFlow = 1 + (thingsActive >> 2);
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ return SimpleCheckRecipeResult.ofSuccess("routing");
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_routing");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ if (!eOutputData.isEmpty()) {
+ double total = 0;
+ double weight;
+ for (int i = 0; i < 10; i++) { // each param pair
+ weight = this.weight[i].get();
+ if (weight > 0 && dst[i].get() >= 0) {
+ total += weight; // Total weighted div
+ }
+ }
+
+ Vec3Impl pos = new Vec3Impl(
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+
+ QuantumDataPacket pack = new QuantumDataPacket(0L).unifyTraceWith(pos);
+ if (pack == null) {
+ return;
+ }
+ for (GT_MetaTileEntity_Hatch_InputData hatch : eInputData) {
+ if (hatch.q == null || hatch.q.contains(pos)) {
+ continue;
+ }
+ pack = pack.unifyPacketWith(hatch.q);
+ if (pack == null) {
+ return;
+ }
+ }
+
+ long remaining = pack.getContent();
+
+ double dest;
+ for (int i = 0; i < 10; i++) {
+ dest = dst[i].get();
+ weight = this.weight[i].get();
+ if (weight > 0 && dest >= 0) {
+ int outIndex = (int) dest - 1;
+ if (outIndex < 0 || outIndex >= eOutputData.size()) {
+ continue;
+ }
+ GT_MetaTileEntity_Hatch_OutputData out = eOutputData.get(outIndex);
+ if (Double.isInfinite(total)) {
+ if (Double.isInfinite(weight)) {
+ out.q = new QuantumDataPacket(remaining).unifyTraceWith(pack);
+ break;
+ }
+ } else {
+ long part = (long) Math.floor(pack.getContent() * weight / total);
+ if (part > 0) {
+ remaining -= part;
+ if (remaining > 0) {
+ out.q = new QuantumDataPacket(part).unifyTraceWith(pack);
+ } else if (part + remaining > 0) {
+ out.q = new QuantumDataPacket(part + remaining).unifyTraceWith(pack);
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.switch.name")) // Machine Type: Network
+ // Switch With QoS
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.0")) // Controller block of the
+ // Network
+ // Switch With QoS
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.1")) // Used to route and
+ // distribute computation
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.2")) // Needs a Parametrizer to
+ // be configured
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, false)
+ .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center
+ .addCasingInfoMin(translateToLocal("gt.blockcasingsTT.1.name"), 0, false) // 0x Computer Casing
+ // (minimum)
+ .addOtherStructurePart(
+ translateToLocal("gt.blockcasingsTT.3.name"),
+ translateToLocal("tt.keyword.Structure.Center")) // Advanced Computer Casing: Center
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.DataConnector"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasing"),
+ 2) // Data Connector: Any Computer Casing
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.param.tier.05.name"),
+ translateToLocal("tt.keyword.Structure.AnyComputerCasing"),
+ 2) // Parametrizer: Any Computer Casing
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasing"), 1) // Energy Hatch: Any
+ // Computer Casing
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasing"), 1) // Maintenance
+ // Hatch: Any
+ // Computer Casing
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1],
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1] };
+ }
+
+ public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_hi_freq");
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return activitySound;
+ }
+
+ @Override
+ protected void parametersInstantiation_EM() {
+ dst = new Parameters.Group.ParameterIn[10];
+ weight = new Parameters.Group.ParameterIn[10];
+ for (int i = 0; i < 10; i++) {
+ Parameters.Group hatch = parametrization.getGroup(i);
+ dst[i] = hatch.makeInParameter(0, i, ROUTE_NAME, DST_STATUS);
+ weight[i] = hatch.makeInParameter(1, 0, ROUTE_NAME, WEI_STATUS);
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 1, 1, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_switch> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java
new file mode 100644
index 0000000000..d6ab5fa6eb
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java
@@ -0,0 +1,221 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.GregTech_API.sBlockCasings1;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public class GT_MetaTileEntity_EM_transformer extends GT_MetaTileEntity_MultiblockBase_EM
+ implements ISurvivalConstructable {
+
+ @Override
+ public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (!hasMaintenanceChecks) turnOffMaintenance();
+ if (!mMachine) {
+ aBaseMetaTileEntity.disableWorking();
+ }
+ }
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.em.transformer.hint"), // 1 - Energy IO Hatches or High
+ // Power Casing
+ };
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_transformer> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_transformer>builder()
+ .addShape(
+ "main",
+ new String[][] { { "111", "1~1", "111", }, { "111", "101", "111", }, { "111", "111", "111", }, })
+ .addElement('0', ofBlock(sBlockCasings1, 15))
+ .addElement(
+ '1',
+ buildHatchAdder(GT_MetaTileEntity_EM_transformer.class).atLeast(Energy, EnergyMulti, Dynamo, DynamoMulti)
+ .casingIndex(textureOffset)
+ .dot(1)
+ .buildAndChain(onElementPass(t -> t.casingCount++, ofBlock(sBlockCasingsTT, 0))))
+ .build();
+ private int casingCount = 0;
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_transformer> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+ // endregion
+
+ public GT_MetaTileEntity_EM_transformer(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ turnOffMaintenance();
+ eDismantleBoom = true;
+ }
+
+ public GT_MetaTileEntity_EM_transformer(String aName) {
+ super(aName);
+ turnOffMaintenance();
+ eDismantleBoom = true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_transformer(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ casingCount = 0;
+ return structureCheck_EM("main", 1, 1, 0) && casingCount >= 5;
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ if (ePowerPass) {
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = 20;
+ } else {
+ mEfficiencyIncrease = 0;
+ mMaxProgresstime = 0;
+ }
+ eAmpereFlow = 0;
+ mEUt = 0;
+ return ePowerPass ? SimpleCheckRecipeResult.ofSuccess("routing")
+ : SimpleCheckRecipeResult.ofFailure("no_routing");
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.transformer.name")) // Machine Type:
+ // Transformer
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.0")) // Controller block of
+ // the
+ // Active Transformer
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.1")) // Can transform to
+ // and from any
+ // voltage
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.2")) // Only 0.004% power
+ // loss, HAYO!
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.3")) // Will explode if
+ // broken while
+ // running
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, false)
+ .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center
+ .addCasingInfoMin(translateToLocal("gt.blockcasingsTT.0.name"), 5, false) // 5x High Power Casing
+ // (minimum)
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.SuperconductingCoilBlock"),
+ translateToLocal("tt.keyword.Structure.Center")) // SuperconductingCoilBlock: Center
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Energy Hatch: Any
+ // High Power Casing
+ .addDynamoHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Dynamo Hatch: Any
+ // High Power Casing
+ .toolTipFinisher(CommonValues.TEC_MARK_GENERAL);
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][0],
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][0] };
+ }
+
+ public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_noise");
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return activitySound;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean doRandomMaintenanceDamage() {
+ return true;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if ((aTick & 31) == 31) {
+ ePowerPass = aBaseMetaTileEntity.isAllowedToWork();
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 1, 1, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stackSize, 1, 1, 0, elementBudget, source, actor, false, true);
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ @Override
+ public boolean isPowerPassButtonEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isSafeVoidButtonEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedToWorkButtonEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java
new file mode 100644
index 0000000000..4ae61796a5
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java
@@ -0,0 +1,348 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.loader.MainLoader.microwaving;
+import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_HIGH;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings4;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
+import static net.minecraft.util.AxisAlignedBB.getBoundingBox;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+
+/**
+ * Created by danie_000 on 17.12.2016.
+ */
+public class GT_MetaTileEntity_TM_microwave extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable {
+
+ // region variables
+ private boolean hasBeenPausedThisCycle = false;
+ // endregion
+
+ // region structure
+ // use multi A energy inputs, use less power the longer it runs
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.tm.microwave.hint.0"), // 1 - Classic Hatches or Clean
+ // Stainless Steel
+ // Casing
+ translateToLocal("gt.blockmachines.multimachine.tm.microwave.hint.1"), // Also acts like a hopper so give it
+ // an Output
+ // Bus
+ };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_TM_microwave> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_TM_microwave>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { "AAAAA", "A---A", "A---A", "A---A", "AAAAA" },
+ { "AAAAA", "A---A", "A---A", "A---A", "AAAAA" }, { "AA~AA", "A---A", "A---A", "A---A", "AAAAA" },
+ { "ABBBA", "BAAAB", "BAAAB", "BAAAB", "ABBBA" } }))
+ .addElement('A', ofBlock(sBlockCasings4, 1))
+ .addElement(
+ 'B',
+ ofHatchAdderOptional(GT_MetaTileEntity_TM_microwave::addClassicToMachineList, 49, 1, sBlockCasings4, 1))
+ .build();
+ // endregion
+
+ // region parameters
+ protected Parameters.Group.ParameterIn powerSetting, timerSetting;
+ protected Parameters.Group.ParameterOut timerValue, remainingTime;
+ private static final INameFunction<GT_MetaTileEntity_TM_microwave> POWER_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgi.0"); // Power setting
+ private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgi.1"); // Timer setting
+
+ private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_VALUE_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgo.0"); // Timer value
+ private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_REMAINING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgo.1"); // Timer remaining
+ private static final IStatusFunction<GT_MetaTileEntity_TM_microwave> POWER_STATUS = (base, p) -> LedStatus
+ .fromLimitsInclusiveOuterBoundary(p.get(), 300, 1000, 1000, Double.POSITIVE_INFINITY);
+ private static final IStatusFunction<GT_MetaTileEntity_TM_microwave> TIMER_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value <= 0) return STATUS_TOO_LOW;
+ if (value > 3000) return STATUS_TOO_HIGH;
+ return STATUS_OK;
+ };
+ // endregion
+
+ public GT_MetaTileEntity_TM_microwave(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_TM_microwave(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TM_microwave(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ return structureCheck_EM("main", 2, 2, 0);
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing_EM() {
+ hasBeenPausedThisCycle = false;
+ if ((int) powerSetting.get() < 300 || timerSetting.get() <= 0 || timerSetting.get() > 3000) {
+ return SimpleCheckRecipeResult.ofFailure("invalid_timer");
+ }
+ if (remainingTime.get() <= 0) {
+ remainingTime.set(timerSetting.get());
+ timerValue.set(0);
+ }
+ mEUt = -((int) powerSetting.get() >> 1);
+ eAmpereFlow = 1;
+ mMaxProgresstime = 20;
+ mEfficiencyIncrease = 10000;
+ return SimpleCheckRecipeResult.ofSuccess("microwaving");
+ }
+
+ @Override
+ public void outputAfterRecipe_EM() {
+ if (hasBeenPausedThisCycle) {
+ return; // skip timer and actions if paused
+ }
+ timerValue.set(timerValue.get() + 1);
+ remainingTime.set(timerSetting.get() - timerValue.get());
+ IGregTechTileEntity mte = getBaseMetaTileEntity();
+ Vec3Impl xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -1, 2));
+ double xPos = mte.getXCoord() + 0.5f + xyzOffsets.get0();
+ double yPos = mte.getYCoord() + 0.5f + xyzOffsets.get1();
+ double zPos = mte.getZCoord() + 0.5f + xyzOffsets.get2();
+ AxisAlignedBB aabb = getBoundingBox(-2, -2, -2, 2, 2, 2).offset(xPos, yPos, zPos);
+ xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -4, 0));
+ Vec3Impl xyzExpansion = getExtendedFacing().getWorldOffset(new Vec3Impl(1, 0, 1))
+ .abs();
+ int power = (int) powerSetting.get();
+ int damagingFactor = Math.min(power >> 6, 8) + Math.min(power >> 8, 24)
+ + Math.min(power >> 12, 48)
+ + (power >> 18);
+
+ ArrayList<ItemStack> itemsToOutput = new ArrayList<>();
+ HashSet<Entity> tickedStuff = new HashSet<>();
+
+ boolean inside = true;
+ do {
+ for (Object entity : mte.getWorld()
+ .getEntitiesWithinAABBExcludingEntity(null, aabb)) {
+ if (entity instanceof Entity) {
+ if (tickedStuff.add((Entity) entity)) {
+ if (inside && entity instanceof EntityItem) {
+ GT_Recipe tRecipe = RecipeMaps.microwaveRecipes.findRecipe(
+ mte,
+ null,
+ true,
+ 128,
+ null,
+ null,
+ new ItemStack[] { ((EntityItem) entity).getEntityItem() });
+ if (tRecipe == null || tRecipe.mInputs[0].stackSize != 1) {
+ itemsToOutput.add(((EntityItem) entity).getEntityItem());
+ } else {
+ ItemStack newStuff = tRecipe.getOutput(0)
+ .copy();
+ newStuff.stackSize = ((EntityItem) entity).getEntityItem().stackSize;
+ itemsToOutput.add(newStuff);
+ }
+ ((EntityItem) entity).delayBeforeCanPickup = 2;
+ ((EntityItem) entity).setDead();
+ } else if (entity instanceof EntityLivingBase) {
+ if (!GT_Utility.isWearingFullElectroHazmat((EntityLivingBase) entity)) {
+ ((EntityLivingBase) entity).attackEntityFrom(microwaving, damagingFactor);
+ }
+ }
+ }
+ }
+ }
+ aabb.offset(xyzOffsets.get0(), xyzOffsets.get1(), xyzOffsets.get2());
+ aabb = aabb.expand(xyzExpansion.get0() * 1.5, xyzExpansion.get1() * 1.5, xyzExpansion.get2() * 1.5);
+ inside = false;
+ damagingFactor >>= 1;
+ } while (damagingFactor > 0);
+
+ mOutputItems = itemsToOutput.toArray(nullItem);
+
+ if (remainingTime.get() <= 0) {
+ mte.getWorld()
+ .playSoundEffect(xPos, yPos, zPos, Reference.MODID + ":microwave_ding", 1, 1);
+ stopMachine();
+ }
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.tm.microwave.name")) // Machine Type:
+ // Microwave Grinder
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.0")) // Controller block of
+ // the
+ // Microwave Grinder
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.1")) // Starts a timer when
+ // enabled
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.2")) // While the timer is
+ // running
+ // anything inside the machine
+ // will take damage
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.3")) // The machine will also
+ // collect
+ // any items inside of it
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.4")) // Can be configured
+ // with a Parametrizer
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.5")) // (Do not insert a
+ // Wither)
+ .addSeparator()
+ .beginStructureBlock(5, 4, 5, true)
+ .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center
+ .addCasingInfoMin(translateToLocal("tt.keyword.Structure.StainlessSteelCasing"), 60, false) // 60x
+ // Stainless
+ // Steel
+ // Casing (minimum)
+ .addOtherStructurePart(
+ translateToLocal("tt.keyword.Structure.DataConnector"),
+ translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"),
+ 2) // Output Bus: Any outer casing on the bottom layer
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.param.tier.05.name"),
+ translateToLocal("tt.keyword.Structure.Optional") + " "
+ + translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"),
+ 2) // Parametrizer: (optional) Any outer casing on the bottom layer
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), 1) // Energy Hatch: Any
+ // outer casing on
+ // the bottom layer
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), 1) // Maintenance
+ // Hatch: Any
+ // outer casing
+ // on the
+ // bottom layer
+ .toolTipFinisher(CommonValues.THETA_MOVEMENT);
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49],
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE
+ : Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE) };
+ } else if (side == facing.getOpposite()) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49],
+ aActive ? Textures.BlockIcons.casingTexturePages[0][52]
+ : Textures.BlockIcons.casingTexturePages[0][53] };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49] };
+ }
+
+ @Override
+ protected void parametersInstantiation_EM() {
+ Parameters.Group hatch_0 = parametrization.getGroup(0, true);
+ powerSetting = hatch_0.makeInParameter(0, 1000, POWER_SETTING_NAME, POWER_STATUS);
+ timerSetting = hatch_0.makeInParameter(1, 360, TIMER_SETTING_NAME, TIMER_STATUS);
+
+ timerValue = hatch_0.makeOutParameter(0, 0, TIMER_VALUE_NAME, TIMER_STATUS);
+ remainingTime = hatch_0.makeOutParameter(1, 360, TIMER_REMAINING_NAME, TIMER_STATUS);
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ remainingTime.set(timerSetting.get());
+ timerValue.set(0);
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (eSafeVoid) {
+ hasBeenPausedThisCycle = true;
+ }
+ return hasBeenPausedThisCycle || super.onRunningTick(aStack); // consume eu and other resources if not paused
+ }
+
+ // TODO Why is the basetype 1??
+ @Override
+ public byte getTileEntityBaseType() {
+ return 1;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 2, 2, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_TM_microwave> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ @Override
+ public boolean isPowerPassButtonEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isSafeVoidButtonEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedToWorkButtonEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java
new file mode 100644
index 0000000000..d3fa0401e6
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java
@@ -0,0 +1,1080 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.generateTeslaNodeMap;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.powerTeslaNodeMap;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.Param;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_HIGH;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_LOW;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_HIGH;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG;
+import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WTF;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static java.lang.Math.min;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.loader.NetworkDispatcher;
+import com.github.technus.tectech.mechanics.spark.RendererMessage;
+import com.github.technus.tectech.mechanics.spark.ThaumSpark;
+import com.github.technus.tectech.mechanics.tesla.ITeslaConnectable;
+import com.github.technus.tectech.mechanics.tesla.ITeslaConnectableSimple;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Capacitor;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.MultimapBuilder;
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.ItemStackPredicate;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+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.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.common.blocks.GT_Item_Machines;
+
+public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_MultiblockBase_EM
+ implements ISurvivalConstructable, ITeslaConnectable {
+
+ // Interface fields
+ private final Multimap<Integer, ITeslaConnectableSimple> teslaNodeMap = MultimapBuilder.treeKeys()
+ .linkedListValues()
+ .build();
+ private final HashSet<ThaumSpark> sparkList = new HashSet<>();
+ private int sparkCount = 10;
+
+ // region variables
+ private static final int transferRadiusTowerFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_TOWER; // Default
+ // is 32
+ private static final int transferRadiusTransceiverFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_TRANSCEIVER; // Default
+ // is
+ // 16
+ private static final int transferRadiusCoverUltimateFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_COVER; // Default
+ // is
+ // 16
+ private static final int plasmaRangeMultiT1 = TecTech.configTecTech.TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1; // Default
+ // is 2
+ private static final int plasmaRangeMultiT2 = TecTech.configTecTech.TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2; // Default
+ // is 4
+ private static final int heliumUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM; // Default is
+ // 100
+ private static final int nitrogenUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN; // Default
+ // is 50
+ private static final int radonUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON; // Default is 50
+ private static final boolean visualEffect = TecTech.configTecTech.TESLA_VISUAL_EFFECT; // Default is true
+ // Default is {1, 1, 1}
+ private static final int[] plasmaTierLoss = new int[] { TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T0,
+ TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T1, TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T2 };
+ private static final float overDriveLoss = TecTech.configTecTech.TESLA_MULTI_LOSS_FACTOR_OVERDRIVE; // Default is
+ // 0.25F;
+ private static final boolean doFluidOutput = TecTech.configTecTech.TESLA_MULTI_GAS_OUTPUT; // Default is false
+
+ // Face icons
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+
+ private int mTier = 0; // Determines max voltage (LV to ZPM)
+ private int plasmaTier = 0; // 0 is None, 1 is Helium or Nitrogen, 2 is Radon (Does not match actual plasma tiers)
+
+ private FluidStack[] mOutputFluidsQueue; // Used to buffer the fluid outputs, so the tesla takes a second to 'cool'
+ // any plasma it
+ // would output as a gas
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_Capacitor> eCapacitorHatches = new ArrayList<>(); // Capacitor
+ // hatches which
+ // determine the
+ // max voltage
+ // tier and count
+ // of amps
+
+ private long energyCapacity = 0; // Total energy storage limited by capacitors
+ private long outputVoltageMax = 0; // Tesla voltage output limited by capacitors
+ private int vTier = -1; // Tesla voltage tier limited by capacitors
+ private long outputCurrentMax = 0; // Tesla current output limited by capacitors
+
+ // outputVoltage and current after settings
+ private long outputVoltage;
+ private long outputCurrent;
+
+ // Prevents unnecessary offset calculation, saving on lag
+ private byte oldRotation = -1;
+ private ForgeDirection oldOrientation = ForgeDirection.UNKNOWN;
+ // Location of the center of the sphere on top of the tower, used as the Thaumcraft lightning and origin
+ public Vec3Impl posTop = Vec3Impl.NULL_VECTOR;
+ // endregion
+
+ // region structure
+ private static final String[] description = new String[] {
+ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":",
+ translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.hint.0"), // 1 - Classic Hatches, Capacitor
+ // Hatches or Tesla
+ // Base Casing
+ translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.hint.1"), // 2 - ""Titanium frames""
+ };
+
+ private static final IStructureDefinition<GT_MetaTileEntity_TM_teslaCoil> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_TM_teslaCoil>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { " ", " ", " BBB ", " BBB ", " BBB ", " ", " " },
+ { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " },
+ { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " },
+ { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " },
+ { " ", " ", " BBB ", " BCB ", " BBB ", " ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " ", " ", " C ", " ", " ", " " },
+ { " ", " DDD ", " D D ", " D C D ", " D D ", " DDD ", " " },
+ { " EE~EE ", "EAAAAAE", "EADDDAE", "EADADAE", "EADDDAE", "EAAAAAE", " EEEEE " } }))
+ .addElement('A', ofBlock(sBlockCasingsBA0, 6))
+ .addElement('B', ofBlock(sBlockCasingsBA0, 7))
+ .addElement('C', ofBlock(sBlockCasingsBA0, 8))
+ .addElement(
+ 'D',
+ ofBlocksTiered(
+ (block, meta) -> block != sBlockCasingsBA0 ? null
+ : meta <= 5 ? Integer.valueOf(meta) : meta == 9 ? 6 : null,
+ IntStream.range(0, 7)
+ .map(tier -> tier == 6 ? 9 : tier)
+ .mapToObj(meta -> Pair.of(sBlockCasingsBA0, meta))
+ .collect(Collectors.toList()),
+ -1,
+ (t, v) -> t.mTier = v,
+ t -> t.mTier))
+ .addElement(
+ 'E',
+ buildHatchAdder(GT_MetaTileEntity_TM_teslaCoil.class)
+ .atLeast(
+ CapacitorHatchElement.INSTANCE,
+ EnergyMulti,
+ Energy,
+ DynamoMulti,
+ Dynamo,
+ InputHatch,
+ OutputHatch,
+ Param,
+ Maintenance)
+ .dot(1)
+ .casingIndex(textureOffset + 16 + 6)
+ .buildAndChain(sBlockCasingsBA0, 6))
+ .addElement('F', new IStructureElement<GT_MetaTileEntity_TM_teslaCoil>() {
+
+ private IIcon[] mIcons;
+
+ @Override
+ public boolean check(GT_MetaTileEntity_TM_teslaCoil 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;
+ return tPipeBase.getMetaTileEntity() instanceof GT_MetaPipeEntity_Frame;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean spawnHint(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ if (mIcons == null) {
+ mIcons = new IIcon[6];
+ Arrays
+ .fill(mIcons, Materials._NULL.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon());
+ }
+ StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, Materials._NULL.mRGBa);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ ItemStack tFrameStack = GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1);
+ 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));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z,
+ ItemStack trigger, IItemSource source, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ if (check(t, world, x, y, z)) return PlaceResult.SKIP;
+ ItemStack tFrameStack = source
+ .takeOne(s -> GT_Item_Machines.getMetaTileEntity(s) instanceof GT_MetaPipeEntity_Frame, true);
+ if (tFrameStack == null) return PlaceResult.REJECT;
+ return StructureUtility.survivalPlaceBlock(
+ tFrameStack,
+ ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS,
+ null,
+ false,
+ world,
+ x,
+ y,
+ z,
+ source,
+ actor,
+ chatter);
+ }
+ })
+ .build();
+ // endregion
+
+ // region parameters
+ protected Parameters.Group.ParameterIn popogaSetting, histLowSetting, histHighSetting, transferRadiusTowerSetting,
+ transferRadiusTransceiverSetting, transferRadiusCoverUltimateSetting, outputVoltageSetting,
+ outputCurrentSetting, sortTimeMinSetting, overDriveSetting;
+ protected Parameters.Group.ParameterOut popogaDisplay, transferRadiusTowerDisplay, transferRadiusTransceiverDisplay,
+ transferRadiusCoverUltimateDisplay, outputVoltageDisplay, outputCurrentDisplay, energyCapacityDisplay,
+ energyStoredDisplay, energyFractionDisplay, sortTimeDisplay;
+
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_LOW_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0"); // Hysteresis low setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_HIGH_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1"); // Hysteresis high setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2"); // Tesla Towers transfer radius
+ // setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3"); // Tesla Transceiver transfer
+ // radius setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_SETTING_NAME = (
+ base, p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4"); // Tesla Ultimate Cover
+ // transfer radius
+ // setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5"); // Output voltage setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_CURRENT_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6"); // Output current setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_MIN_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7"); // Scan time Min setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OVERDRIVE_SETTING_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8"); // Overdrive setting
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> POPOGA_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9"); // Unused
+
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0"); // Tesla Towers transfer radius
+ // display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1"); // Tesla Transceiver transfer
+ // radius display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_DISPLAY_NAME = (
+ base, p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2"); // Tesla Ultimate Cover
+ // transfer radius
+ // display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3"); // Output voltage display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_CURRENT_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4"); // Output current display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_CAPACITY_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5"); // Energy Capacity display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_STORED_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6"); // Energy Stored display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_FRACTION_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7"); // Energy Fraction display
+ private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_DISPLAY_NAME = (base,
+ p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8"); // Scan time display
+
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_LOW_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) {
+ return STATUS_WRONG;
+ }
+ if (value <= 0.05) return STATUS_TOO_LOW;
+ if (value > base.histHighSetting.get()) return STATUS_TOO_HIGH;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_HIGH_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ if (value <= base.histLowSetting.get()) return STATUS_TOO_LOW;
+ if (value > 0.95) return STATUS_TOO_HIGH;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value < 0) return STATUS_TOO_LOW;
+ if (value > transferRadiusTowerFromConfig) return STATUS_HIGH;
+ if (value < transferRadiusTowerFromConfig) return STATUS_LOW;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_STATUS = (base,
+ p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value < 0) return STATUS_TOO_LOW;
+ if (value > transferRadiusTransceiverFromConfig) return STATUS_HIGH;
+ if (value < transferRadiusTransceiverFromConfig) return STATUS_LOW;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_STATUS = (base,
+ p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value < 0) return STATUS_TOO_LOW;
+ if (value > transferRadiusCoverUltimateFromConfig) return STATUS_HIGH;
+ if (value < transferRadiusCoverUltimateFromConfig) return STATUS_LOW;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_OR_CURRENT_STATUS = (base,
+ p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (long) value;
+ if (value == -1) return STATUS_OK;
+ if (value <= 0) return STATUS_TOO_LOW;
+ return STATUS_OK;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_MIN_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value < 100) return STATUS_TOO_LOW;
+ if (value == 100) return STATUS_OK;
+ return STATUS_HIGH;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> OVERDRIVE_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value < 0) return STATUS_TOO_LOW;
+ if (value == 0) return STATUS_LOW;
+ return STATUS_HIGH;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> POPOGA_STATUS = (base, p) -> {
+ if (base.getBaseMetaTileEntity()
+ .getWorld()
+ .isThundering()) {
+ return STATUS_WTF;
+ }
+ return STATUS_NEUTRAL;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (int) value;
+ if (value == 0) return STATUS_HIGH;
+ return STATUS_LOW;
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> POWER_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ value = (long) value;
+ if (value > 0) {
+ return STATUS_OK;
+ } else {
+ return STATUS_LOW;
+ }
+ };
+ private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_STATUS = (base, p) -> {
+ double value = p.get();
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ if (base.energyFractionDisplay.get() > base.histHighSetting.get()) {
+ return STATUS_HIGH;
+ } else if (base.energyFractionDisplay.get() < base.histLowSetting.get()) {
+ return STATUS_LOW;
+ } else {
+ return STATUS_OK;
+ }
+ };
+ // endregion
+
+ public GT_MetaTileEntity_TM_teslaCoil(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_TM_teslaCoil(String aName) {
+ super(aName);
+ }
+
+ private float getRangeMulti(int mTier, int vTier) {
+ // By Default:
+ // Helium and Nitrogen Plasmas will double the range
+ // Radon will quadruple the range
+ int plasmaBoost;
+ switch (plasmaTier) {
+ case 2:
+ plasmaBoost = plasmaRangeMultiT2;
+ break;
+ case 1:
+ plasmaBoost = plasmaRangeMultiT1;
+ break;
+ default:
+ plasmaBoost = 1;
+ }
+
+ // Over-tiered coils will add +25% range
+ if (vTier > mTier) {
+ return 1.25F * plasmaBoost;
+ }
+ return 1F * plasmaBoost;
+ }
+
+ private void checkPlasmaBoost() {
+ // If there's fluid in the queue, try to output it
+ // That way it takes at least a second to 'process' the plasma
+ if (mOutputFluidsQueue != null) {
+ mOutputFluids = mOutputFluidsQueue;
+ mOutputFluidsQueue = null;
+ }
+
+ for (GT_MetaTileEntity_Hatch_Input fluidHatch : mInputHatches) {
+ if (fluidHatch.mFluid != null) {
+ if (fluidHatch.mFluid.isFluidEqual(Materials.Helium.getPlasma(1))
+ && fluidHatch.mFluid.amount >= heliumUse) {
+ fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - heliumUse;
+ if (doFluidOutput) {
+ mOutputFluidsQueue = new FluidStack[] { Materials.Helium.getGas(heliumUse) };
+ }
+ plasmaTier = 1;
+ return;
+ } else if (fluidHatch.mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1))
+ && fluidHatch.mFluid.amount >= nitrogenUse) {
+ fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - nitrogenUse;
+ if (doFluidOutput) {
+ mOutputFluidsQueue = new FluidStack[] { Materials.Nitrogen.getGas(nitrogenUse) };
+ }
+ plasmaTier = 1;
+ return;
+ } else if (fluidHatch.mFluid.isFluidEqual(Materials.Radon.getPlasma(1))
+ && fluidHatch.mFluid.amount >= radonUse) {
+ fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - radonUse;
+ if (doFluidOutput) {
+ mOutputFluidsQueue = new FluidStack[] { Materials.Radon.getGas(radonUse) };
+ }
+ plasmaTier = 2;
+ return;
+ }
+ }
+ }
+ plasmaTier = 0;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TM_teslaCoil(mName);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) {
+ cap.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ eCapacitorHatches.clear();
+
+ mTier = -1;
+
+ if (structureCheck_EM("main", 3, 16, 0)) {
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) {
+ cap.getBaseMetaTileEntity()
+ .setActive(iGregTechTileEntity.isActive());
+ }
+
+ // Only recalculate offsets on orientation or rotation change
+ if (oldRotation != getExtendedFacing().ordinal()
+ || oldOrientation != iGregTechTileEntity.getFrontFacing()) {
+ oldRotation = (byte) getExtendedFacing().ordinal();
+ oldOrientation = iGregTechTileEntity.getFrontFacing();
+
+ Vec3Impl posBMTE = new Vec3Impl(
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+
+ // Calculate coordinates of the middle bottom
+ posTop = getExtendedFacing().getWorldOffset(new Vec3Impl(0, 0, 2))
+ .add(posBMTE);
+
+ // Calculate coordinates of the top sphere
+ posTop = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -14, 2))
+ .add(posBMTE);
+ }
+ // Generate node map
+ if (!getBaseMetaTileEntity().isClientSide()) {
+ teslaSimpleNodeSetAdd(this);
+ generateTeslaNodeMap(this);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ checkPlasmaBoost();
+
+ if (!histHighSetting.getStatus(false).isOk || !histLowSetting.getStatus(false).isOk)
+ return SimpleCheckRecipeResult.ofFailure("invalid_hysteresis");
+ if (!transferRadiusTowerSetting.getStatus(false).isOk || !transferRadiusTransceiverSetting.getStatus(false).isOk
+ || !transferRadiusCoverUltimateSetting.getStatus(false).isOk)
+ return SimpleCheckRecipeResult.ofFailure("invalid_transfer_radius");
+ if (!outputVoltageSetting.getStatus(false).isOk)
+ return SimpleCheckRecipeResult.ofFailure("invalid_voltage_setting");
+ if (!outputCurrentSetting.getStatus(false).isOk)
+ return SimpleCheckRecipeResult.ofFailure("invalid_current_setting");
+ if (!sortTimeMinSetting.getStatus(false).isOk) return SimpleCheckRecipeResult.ofFailure("invalid_time_setting");
+ if (!overDriveSetting.getStatus(false).isOk)
+ return SimpleCheckRecipeResult.ofFailure("invalid_overdrive_setting");
+
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = 20;
+ vTier = -1;
+ long[] capacitorData;
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) {
+ if (cap.getCapacitors()[0] > vTier) {
+ vTier = (int) cap.getCapacitors()[0];
+ }
+ }
+
+ energyCapacity = 0;
+ outputCurrentMax = 0;
+
+ if (vTier < 0) {
+ // Returning true to allow for 'passive running'
+ outputVoltageMax = 0;
+ return SimpleCheckRecipeResult.ofSuccess("routing");
+ } else if (vTier > mTier && getEUVar() > 0) {
+ explodeMultiblock();
+ }
+
+ outputVoltageMax = V[vTier + 1];
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) {
+ cap.getBaseMetaTileEntity()
+ .setActive(true);
+ capacitorData = cap.getCapacitors();
+ if (capacitorData[0] < vTier) {
+ if (getEUVar() > 0 && capacitorData[0] != 0) {
+ cap.getBaseMetaTileEntity()
+ .setToFire();
+ }
+ eCapacitorHatches.remove(cap);
+ } else {
+ outputCurrentMax += capacitorData[1];
+ energyCapacity += capacitorData[2];
+ }
+ }
+ return SimpleCheckRecipeResult.ofSuccess("routing");
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.name")) // Machine Type: Tesla
+ // Tower
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.0")) // Controller block of
+ // the Tesla Tower
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.1")) // Used to transmit
+ // power to Tesla
+ // Coil Covers and Tesla
+ // Transceivers
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.2")) // Can be fed with
+ // Helium/Nitrogen/Radon Plasma to
+ // increase the range
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.3")) // Transmitted voltage
+ // depends on
+ // the used Tesla Capacitor tier
+ .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.4")) // Primary Tesla
+ // Windings need to
+ // be at least the same tier as
+ // the Tesla Capacitor
+ .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex!
+ .addSeparator()
+ .beginStructureBlock(7, 17, 7, false)
+ .addOtherStructurePart(
+ translateToLocal("gt.blockmachines.hatch.capacitor.tier.03.name"),
+ translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"),
+ 1) // Capacitor Hatch: Any outer Tesla Base Casing
+ .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"), 1) // Energy Hatch:
+ // Any outer Tesla
+ // Base Casing
+ .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"), 1) // Maintenance
+ // Hatch: Any
+ // outer Tesla
+ // Base Casing
+ .toolTipFinisher(CommonValues.THETA_MOVEMENT);
+ return tt;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_TOWER");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_TOWER_ACTIVE");
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][16 + 6],
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][16 + 6] };
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ if (!getBaseMetaTileEntity().isClientSide()) {
+ teslaSimpleNodeSetRemove(this);
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) {
+ cap.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+ }
+
+ @Override
+ public void onUnload() {
+ if (!getBaseMetaTileEntity().isClientSide()) {
+ teslaSimpleNodeSetRemove(this);
+ }
+ }
+
+ @Override
+ protected void parametersInstantiation_EM() {
+ Parameters.Group hatch_0 = parametrization.getGroup(0, true);
+ Parameters.Group hatch_1 = parametrization.getGroup(1, true);
+ Parameters.Group hatch_2 = parametrization.getGroup(2, true);
+ Parameters.Group hatch_3 = parametrization.getGroup(3, true);
+ Parameters.Group hatch_4 = parametrization.getGroup(4, true);
+ Parameters.Group hatch_5 = parametrization.getGroup(5, true);
+ Parameters.Group hatch_6 = parametrization.getGroup(6, true);
+ Parameters.Group hatch_7 = parametrization.getGroup(7, true);
+ Parameters.Group hatch_8 = parametrization.getGroup(8, true);
+ Parameters.Group hatch_9 = parametrization.getGroup(9, true);
+
+ histLowSetting = hatch_0.makeInParameter(0, 0.25, HYSTERESIS_LOW_SETTING_NAME, HYSTERESIS_LOW_STATUS);
+ popogaSetting = hatch_0.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ histHighSetting = hatch_1.makeInParameter(0, 0.75, HYSTERESIS_HIGH_SETTING_NAME, HYSTERESIS_HIGH_STATUS);
+ popogaSetting = hatch_1.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ transferRadiusTowerSetting = hatch_2.makeInParameter(
+ 0,
+ transferRadiusTowerFromConfig,
+ TRANSFER_RADIUS_TOWER_SETTING_NAME,
+ TRANSFER_RADIUS_TOWER_STATUS);
+ popogaSetting = hatch_2.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ transferRadiusTransceiverSetting = hatch_3.makeInParameter(
+ 0,
+ transferRadiusTransceiverFromConfig,
+ TRANSFER_RADIUS_TRANSCEIVER_SETTING_NAME,
+ TRANSFER_RADIUS_TRANSCEIVER_STATUS);
+ transferRadiusCoverUltimateSetting = hatch_3.makeInParameter(
+ 1,
+ transferRadiusCoverUltimateFromConfig,
+ TRANSFER_RADIUS_COVER_ULTIMATE_SETTING_NAME,
+ TRANSFER_RADIUS_COVER_ULTIMATE_STATUS);
+ outputVoltageSetting = hatch_4
+ .makeInParameter(0, -1, OUTPUT_VOLTAGE_SETTING_NAME, OUTPUT_VOLTAGE_OR_CURRENT_STATUS);
+ popogaSetting = hatch_4.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ outputCurrentSetting = hatch_5
+ .makeInParameter(0, -1, OUTPUT_CURRENT_SETTING_NAME, OUTPUT_VOLTAGE_OR_CURRENT_STATUS);
+ popogaSetting = hatch_5.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaSetting = hatch_6.makeInParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaSetting = hatch_6.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ sortTimeMinSetting = hatch_7.makeInParameter(0, 100, SCAN_TIME_MIN_SETTING_NAME, SCAN_TIME_MIN_STATUS);
+ popogaSetting = hatch_7.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ overDriveSetting = hatch_8.makeInParameter(0, 0, OVERDRIVE_SETTING_NAME, OVERDRIVE_STATUS);
+ popogaSetting = hatch_8.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaSetting = hatch_9.makeInParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaSetting = hatch_9.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+
+ popogaDisplay = hatch_0.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_0.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_1.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_1.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ transferRadiusTowerDisplay = hatch_2
+ .makeOutParameter(0, 0, TRANSFER_RADIUS_TOWER_DISPLAY_NAME, TRANSFER_RADIUS_TOWER_STATUS);
+ popogaDisplay = hatch_2.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ transferRadiusTransceiverDisplay = hatch_3
+ .makeOutParameter(0, 0, TRANSFER_RADIUS_TRANSCEIVER_DISPLAY_NAME, TRANSFER_RADIUS_TRANSCEIVER_STATUS);
+ transferRadiusCoverUltimateDisplay = hatch_3
+ .makeOutParameter(1, 0, TRANSFER_RADIUS_COVER_ULTIMATE_DISPLAY_NAME, TRANSFER_RADIUS_COVER_ULTIMATE_STATUS);
+ outputVoltageDisplay = hatch_4.makeOutParameter(0, 0, OUTPUT_VOLTAGE_DISPLAY_NAME, POWER_STATUS);
+ popogaDisplay = hatch_4.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ outputCurrentDisplay = hatch_5.makeOutParameter(0, 0, OUTPUT_CURRENT_DISPLAY_NAME, POWER_STATUS);
+ energyCapacityDisplay = hatch_5.makeOutParameter(1, 0, ENERGY_CAPACITY_DISPLAY_NAME, ENERGY_STATUS);
+ energyStoredDisplay = hatch_6.makeOutParameter(0, 0, ENERGY_STORED_DISPLAY_NAME, ENERGY_STATUS);
+ energyFractionDisplay = hatch_6.makeOutParameter(1, 0, ENERGY_FRACTION_DISPLAY_NAME, ENERGY_STATUS);
+ sortTimeDisplay = hatch_7.makeOutParameter(0, 0, SCAN_TIME_DISPLAY_NAME, SCAN_TIME_STATUS);
+ popogaDisplay = hatch_7.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_8.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_8.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_9.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS);
+ popogaDisplay = hatch_9.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("eEnergyCapacity", energyCapacity);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ energyCapacity = aNBT.getLong("eEnergyCapacity");
+ teslaSimpleNodeSetAdd(this);
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ for (GT_MetaTileEntity_Hatch_Capacitor cap : eCapacitorHatches) {
+ cap.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+
+ ePowerPass = false;
+ setEUVar(0);
+ energyStoredDisplay.set(0);
+ energyFractionDisplay.set(0);
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ // Hysteresis based ePowerPass setting
+ float energyFrac = (float) getEUVar() / energyCapacity;
+
+ energyCapacityDisplay.set(energyCapacity);
+ energyStoredDisplay.set(getEUVar());
+ energyFractionDisplay.set(energyFrac);
+
+ if (!ePowerPass && energyFrac > histHighSetting.get()) {
+ ePowerPass = true;
+ } else if (ePowerPass && energyFrac < histLowSetting.get()) {
+ ePowerPass = false;
+ }
+
+ // Power Limit Settings
+ if (outputVoltageSetting.get() > 0) {
+ outputVoltage = min(outputVoltageMax, (long) outputVoltageSetting.get());
+ } else {
+ outputVoltage = outputVoltageMax;
+ }
+ outputVoltageDisplay.set(outputVoltage);
+
+ if (outputCurrentSetting.get() > 0) {
+ outputCurrent = min(outputCurrentMax, (long) outputCurrentSetting.get());
+ } else {
+ outputCurrent = outputCurrentMax;
+ }
+
+ // Range calculation and display
+ int transferRadiusTower = getTeslaTransmissionRange();
+ transferRadiusTowerDisplay.set(transferRadiusTower);
+ transferRadiusTransceiverDisplay.set(transferRadiusTower * 2);
+ transferRadiusCoverUltimateDisplay.set(transferRadiusTower);
+
+ // Power transfer
+ outputCurrentDisplay.set(powerTeslaNodeMap(this));
+
+ // TODO Encapsulate the spark sender
+ sparkCount--;
+ if (sparkCount == 0 && visualEffect) {
+ IGregTechTileEntity mte = getBaseMetaTileEntity();
+ sparkCount = 10;
+ if (!sparkList.isEmpty()) {
+ NetworkDispatcher.INSTANCE.sendToAllAround(
+ new RendererMessage.RendererData(sparkList),
+ mte.getWorld().provider.dimensionId,
+ mte.getXCoord(),
+ mte.getYCoord(),
+ mte.getZCoord(),
+ 256);
+ sparkList.clear();
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ // Setting the power here so that the tower looses all it's charge once disabled
+ // This also stops it from exploding
+ return getBaseMetaTileEntity().isActive() ? energyCapacity * 2 : 0;
+ }
+
+ @Override
+ public long getEUVar() {
+ // Same reason as maxEUStore, set to 1 instead of zero so it doesn't drain constantly
+ return getBaseMetaTileEntity().isActive() ? super.getEUVar() : 1;
+ }
+
+ private boolean addCapacitorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Capacitor) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eCapacitorHatches.add((GT_MetaTileEntity_Hatch_Capacitor) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_TM_teslaCoil> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM("main", 3, 16, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stackSize, 3, 16, 0, elementBudget, source, actor, false, true);
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return description;
+ }
+
+ @Override
+ public byte getTeslaReceptionCapability() {
+ return 0;
+ }
+
+ @Override
+ public float getTeslaReceptionCoefficient() {
+ return 0;
+ }
+
+ @Override
+ public Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap() {
+ return teslaNodeMap;
+ }
+
+ @Override
+ public HashSet<ThaumSpark> getSparkList() {
+ return sparkList;
+ }
+
+ @Override
+ public byte getTeslaTransmissionCapability() {
+ return 1;
+ }
+
+ @Override
+ public int getTeslaTransmissionRange() {
+ return (int) (transferRadiusTowerSetting.get() * getRangeMulti(mTier, vTier));
+ }
+
+ @Override
+ public boolean isOverdriveEnabled() {
+ return overDriveSetting.get() > 0;
+ }
+
+ @Override
+ public int getTeslaEnergyLossPerBlock() {
+ return plasmaTierLoss[plasmaTier];
+ }
+
+ @Override
+ public float getTeslaOverdriveLossCoefficient() {
+ return overDriveLoss;
+ }
+
+ @Override
+ public long getTeslaOutputVoltage() {
+ return outputVoltage;
+ }
+
+ @Override
+ public long getTeslaOutputCurrent() {
+ return outputCurrent;
+ }
+
+ @Override
+ public boolean teslaDrainEnergy(long teslaVoltageDrained) {
+ if (getEUVar() < teslaVoltageDrained) {
+ return false;
+ }
+
+ setEUVar(getEUVar() - teslaVoltageDrained);
+ return true;
+ }
+
+ @Override
+ public boolean isTeslaReadyToReceive() {
+ return !this.ePowerPass;
+ }
+
+ @Override
+ public long getTeslaStoredEnergy() {
+ return getEUVar();
+ }
+
+ @Override
+ public Vec3Impl getTeslaPosition() {
+ return posTop;
+ }
+
+ @Override
+ public Integer getTeslaDimension() {
+ return this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId;
+ }
+
+ @Override
+ public boolean teslaInjectEnergy(long teslaVoltageInjected) {
+ if (this.getEUVar() + teslaVoltageInjected <= (this.maxEUStore() / 2)) {
+ this.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(teslaVoltageInjected, true);
+ return true;
+ }
+ return false;
+ }
+
+ private enum CapacitorHatchElement implements IHatchElement<GT_MetaTileEntity_TM_teslaCoil> {
+
+ INSTANCE;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Capacitor.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GT_MetaTileEntity_TM_teslaCoil> adder() {
+ return GT_MetaTileEntity_TM_teslaCoil::addCapacitorToMachineList;
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_TM_teslaCoil gt_metaTileEntity_tm_teslaCoil) {
+ return gt_metaTileEntity_tm_teslaCoil.eCapacitorHatches.size();
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java
new file mode 100644
index 0000000000..20a9582521
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java
@@ -0,0 +1,2823 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.loader.TecTechConfig.POWERLESS_MODE;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT;
+import static com.github.technus.tectech.util.CommonValues.RECIPE_AT;
+import static com.github.technus.tectech.util.CommonValues.TEC_MARK_GENERAL;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static com.github.technus.tectech.util.CommonValues.VN;
+import static com.github.technus.tectech.util.TT_Utility.getTier;
+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.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static java.lang.Math.min;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+import org.lwjgl.opengl.GL11;
+
+import com.github.technus.tectech.Reference;
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Uncertainty;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.google.common.collect.Iterables;
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+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.math.Pos2d;
+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.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+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 com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+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.modularui.IBindPlayerInventoryUI;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_HatchElementBuilder;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.api.util.shutdown.SimpleShutDownReason;
+import gregtech.common.GT_Pollution;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+
+/**
+ * Created by danie_000 on 27.10.2016.
+ */
+public abstract class GT_MetaTileEntity_MultiblockBase_EM
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_MultiblockBase_EM>
+ implements IAlignment, IBindPlayerInventoryUI {
+ // region Client side variables (static - one per class)
+
+ // Front icon holders - static so it is default one for my blocks
+ // just add new static ones in your class and and override getTexture
+ protected static Textures.BlockIcons.CustomIcon ScreenOFF;
+ protected static Textures.BlockIcons.CustomIcon ScreenON;
+
+ /** Base ID for the LED window popup. LED 1 I0 will have ID 100, LED 1 I1 101... */
+ protected static int LED_WINDOW_BASE_ID = 100;
+
+ // Sound resource - same as with screen but override getActivitySound
+ public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_lo_freq");
+
+ @SideOnly(Side.CLIENT)
+ private SoundLoop activitySoundLoop;
+ // endregion
+
+ // region HATCHES ARRAYS - they hold info about found hatches, add hatches to them... (auto structure magic does it
+ // tho)
+
+ // HATCHES!!!, should be added and removed in check machine
+ protected ArrayList<GT_MetaTileEntity_Hatch_Param> eParamHatches = new ArrayList<>();
+ protected ArrayList<GT_MetaTileEntity_Hatch_Uncertainty> eUncertainHatches = new ArrayList<>();
+ // multi amp hatches in/out
+ protected ArrayList<GT_MetaTileEntity_Hatch_EnergyMulti> eEnergyMulti = new ArrayList<>();
+ protected ArrayList<GT_MetaTileEntity_Hatch_DynamoMulti> eDynamoMulti = new ArrayList<>();
+ // data hatches
+ protected ArrayList<GT_MetaTileEntity_Hatch_InputData> eInputData = new ArrayList<>();
+ protected ArrayList<GT_MetaTileEntity_Hatch_OutputData> eOutputData = new ArrayList<>();
+
+ // endregion
+
+ // region parameters
+ public final Parameters parametrization;
+ // endregion
+
+ // region Control variables
+
+ // should explode on dismatle?, set it in constructor, if true machine will explode if invalidated structure while
+ // active
+ protected boolean eDismantleBoom = false;
+
+ // what is the amount of A required
+ public long eAmpereFlow = 1; // analogue of EU/t but for amperes used (so eu/t is actually eu*A/t) USE ONLY POSITIVE
+ // NUMBERS!
+
+ // set to what you need it to be in check recipe
+ // data required to operate
+ protected long eRequiredData = 0;
+
+ // Counter for the computation timeout. Will be initialized one to the max time and then only decreased.
+ protected int eComputationTimeout = MAX_COMPUTATION_TIMEOUT;
+
+ // Max timeout of computation in ticks
+ protected static int MAX_COMPUTATION_TIMEOUT = 100;
+
+ // are parameters correct - change in check recipe/output/update params etc. (maintenance status boolean)
+ protected boolean eParameters = true;
+
+ // what type of certainty inconvenience is used - can be used as in Computer - more info in uncertainty hatch
+ protected byte eCertainMode = 0, eCertainStatus = 0;
+
+ // minimal repair status to make the machine even usable (how much unfixed fixed stuff is needed)
+ // if u need to force some things to be fixed - u might need to override doRandomMaintenanceDamage
+ protected byte minRepairStatus = 3;
+
+ // whether there is a maintenance hatch in the multi and whether checks are necessary (for now only used in a
+ // transformer)
+ protected boolean hasMaintenanceChecks = true;
+
+ // is power pass cover present
+ public boolean ePowerPassCover = false;
+
+ // functionality toggles - changed by buttons in gui also
+ public boolean ePowerPass = false, eSafeVoid = false;
+
+ // endregion
+
+ // region READ ONLY unless u really need to change it
+
+ // max amperes machine can take in after computing it to the lowest tier (exchange packets to min tier count)
+ protected long eMaxAmpereFlow = 0, eMaxAmpereGen = 0;
+
+ // What is the max and minimal tier of eu hatches installed
+ private long maxEUinputMin = 0, maxEUinputMax = 0, maxEUoutputMin = 0, maxEUoutputMax = 0;
+
+ // read only unless you are making computation generator - read computer class
+ protected long eAvailableData = 0; // data being available
+
+ // just some info - private so hidden
+ private boolean explodedThisTick = false;
+
+ /** Flag if the new long power variable should be used */
+ protected boolean useLongPower = false;
+
+ // Locale-aware formatting of numbers.
+ protected static NumberFormatMUI numberFormat;
+ static {
+ numberFormat = new NumberFormatMUI();
+ numberFormat.setMaximumFractionDigits(8);
+ }
+
+ // endregion
+
+ protected GT_MetaTileEntity_MultiblockBase_EM(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ parametrization = new Parameters(this);
+ parametersInstantiation_EM();
+ parametrization.setToDefaults(true, true);
+ }
+
+ protected GT_MetaTileEntity_MultiblockBase_EM(String aName) {
+ super(aName);
+ parametrization = new Parameters(this);
+ parametersInstantiation_EM();
+ parametrization.setToDefaults(true, true);
+ }
+
+ // region SUPER STRUCT
+
+ /**
+ * Gets structure
+ *
+ * @return STATIC INSTANCE OF STRUCTURE
+ */
+ public abstract IStructureDefinition<? extends GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM();
+
+ @SuppressWarnings("unchecked")
+ private IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM_Internal() {
+ return (IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM>) getStructure_EM();
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM> getStructureDefinition() {
+ return getStructure_EM_Internal();
+ }
+
+ public final boolean structureCheck_EM(String piece, int horizontalOffset, int verticalOffset, int depthOffset) {
+ IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity();
+ return getStructure_EM_Internal().check(
+ this,
+ piece,
+ baseMetaTileEntity.getWorld(),
+ getExtendedFacing(),
+ baseMetaTileEntity.getXCoord(),
+ baseMetaTileEntity.getYCoord(),
+ baseMetaTileEntity.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ !mMachine);
+ }
+
+ public final boolean structureBuild_EM(String piece, int horizontalOffset, int verticalOffset, int depthOffset,
+ ItemStack trigger, boolean hintsOnly) {
+ IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity();
+ return getStructure_EM_Internal().buildOrHints(
+ this,
+ trigger,
+ piece,
+ baseMetaTileEntity.getWorld(),
+ getExtendedFacing(),
+ baseMetaTileEntity.getXCoord(),
+ baseMetaTileEntity.getYCoord(),
+ baseMetaTileEntity.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ hintsOnly);
+ }
+ // endregion
+
+ // region METHODS TO OVERRIDE - general functionality, recipe check, output
+
+ /**
+ * Check structure here, also add hatches
+ *
+ * @param iGregTechTileEntity - the tile entity
+ * @param itemStack - what is in the controller input slot
+ * @return is structure valid
+ */
+ protected boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ return false;
+ }
+
+ /**
+ * Checks Recipes (when all machine is complete and can work)
+ * <p>
+ * can get/set Parameters here also
+ *
+ * @deprecated Use {@link #createProcessingLogic()} ()} or {@link #checkProcessing_EM()}
+ *
+ * @param itemStack item in the controller
+ * @return is recipe is valid
+ */
+ @Deprecated
+ public boolean checkRecipe_EM(ItemStack itemStack) {
+ return false;
+ }
+
+ @NotNull
+ protected CheckRecipeResult checkProcessing_EM() {
+ if (processingLogic == null) {
+ return checkRecipe_EM(getControllerSlot()) ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.NO_RECIPE;
+ }
+ return super.checkProcessing();
+ }
+
+ /**
+ * Put EM stuff from outputEM into EM output hatches here or do other stuff - it is basically on recipe succeded
+ * <p>
+ * based on "machine state" do output, this must move to outputEM to EM output hatches and can also modify output
+ * items/fluids/EM, remaining EM is NOT overflowed. (Well it can be overflowed if machine didn't finished,
+ * soft-hammered/disabled/not enough EU) Setting available data processing
+ */
+ public void outputAfterRecipe_EM() {}
+ // endregion
+
+ // region tooltip and scanner result
+
+ public ArrayList<String> getFullLedDescriptionIn(int hatchNo, int paramID) {
+ ArrayList<String> list = new ArrayList<>();
+ list.add(
+ EnumChatFormatting.WHITE + "ID: "
+ + EnumChatFormatting.AQUA
+ + hatchNo
+ + EnumChatFormatting.YELLOW
+ + ":"
+ + EnumChatFormatting.AQUA
+ + paramID
+ + EnumChatFormatting.YELLOW
+ + ":"
+ + EnumChatFormatting.AQUA
+ + "I "
+ + parametrization.getStatusIn(hatchNo, paramID).name.get());
+ list.add(
+ EnumChatFormatting.WHITE + "Value: "
+ + EnumChatFormatting.AQUA
+ + numberFormat.format(parametrization.getIn(hatchNo, paramID)));
+ try {
+ list.add(parametrization.groups[hatchNo].parameterIn[paramID].getBrief());
+ } catch (NullPointerException | IndexOutOfBoundsException e) {
+ list.add("Unused");
+ }
+ return list;
+ }
+
+ public ArrayList<String> getFullLedDescriptionOut(int hatchNo, int paramID) {
+ ArrayList<String> list = new ArrayList<>();
+ list.add(
+ EnumChatFormatting.WHITE + "ID: "
+ + EnumChatFormatting.AQUA
+ + hatchNo
+ + EnumChatFormatting.YELLOW
+ + ":"
+ + EnumChatFormatting.AQUA
+ + paramID
+ + EnumChatFormatting.YELLOW
+ + ":"
+ + EnumChatFormatting.AQUA
+ + "O "
+ + parametrization.getStatusOut(hatchNo, paramID).name.get());
+ list.add(
+ EnumChatFormatting.WHITE + "Value: "
+ + EnumChatFormatting.AQUA
+ + numberFormat.format(parametrization.getOut(hatchNo, paramID)));
+ try {
+ list.add(parametrization.groups[hatchNo].parameterOut[paramID].getBrief());
+ } catch (NullPointerException | IndexOutOfBoundsException e) {
+ list.add("Unused");
+ }
+ return list;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addInfo("Nothing special just override me")
+ .toolTipFinisher(TEC_MARK_GENERAL);
+ return tt;
+ }
+
+ /**
+ * scanner gives it
+ */
+ @Override
+ public String[] getInfoData() { // TODO Do it
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { "Progress:",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ "Energy Hatches:",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ (getPowerFlow() * eAmpereFlow <= 0 ? "Probably uses: " : "Probably makes: ") + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(Math.abs(getPowerFlow()))
+ + EnumChatFormatting.RESET
+ + " EU/t at "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(eAmpereFlow)
+ + EnumChatFormatting.RESET
+ + " A",
+ "Tier Rating: " + EnumChatFormatting.YELLOW
+ + VN[getMaxEnergyInputTier_EM()]
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.GREEN
+ + VN[getMinEnergyInputTier_EM()]
+ + EnumChatFormatting.RESET
+ + " Amp Rating: "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(eMaxAmpereFlow)
+ + EnumChatFormatting.RESET
+ + " A",
+ "Problems: " + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " Efficiency: "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ "PowerPass: " + EnumChatFormatting.BLUE
+ + ePowerPass
+ + EnumChatFormatting.RESET
+ + " SafeVoid: "
+ + EnumChatFormatting.BLUE
+ + eSafeVoid,
+ "Computation: " + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(eAvailableData)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(eRequiredData)
+ + EnumChatFormatting.RESET };
+ }
+
+ /**
+ * should it work with scanner? HELL YES
+ */
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ // endregion
+
+ // region GUI/SOUND/RENDER
+
+ /**
+ * add more textures
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_CONTROLLER");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_CONTROLLER_ACTIVE");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ /**
+ * actually use textures
+ */
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][4],
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][4] };
+ }
+
+ /**
+ * should return your activity sound
+ */
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySound() {
+ return activitySound;
+ }
+
+ /**
+ * plays the sounds auto magically
+ */
+ @SideOnly(Side.CLIENT)
+ protected void soundMagic(ResourceLocation activitySound) {
+ if (getBaseMetaTileEntity().isActive()) {
+ if (activitySoundLoop == null) {
+ activitySoundLoop = new SoundLoop(activitySound, getBaseMetaTileEntity(), false, true);
+ Minecraft.getMinecraft()
+ .getSoundHandler()
+ .playSound(activitySoundLoop);
+ }
+ } else {
+ if (activitySoundLoop != null) {
+ activitySoundLoop = null;
+ }
+ }
+ }
+
+ // endregion
+
+ // region Methods to maybe override (if u implement certain stuff)
+
+ /**
+ * is the thing inside controller a valid item to make the machine work
+ */
+ @Override
+ public boolean isCorrectMachinePart(ItemStack itemStack) {
+ return true;
+ }
+
+ /**
+ * how much damage to apply to thing in controller - not sure how it does it
+ */
+ @Override
+ public int getDamageToComponent(ItemStack itemStack) {
+ return 0;
+ }
+
+ /**
+ * called when removing from map - not when unloading? //todo check
+ */
+ @Override
+ public void onRemoval() {
+ try {
+ if (ePowerPass && getEUVar() > V[3]
+ || eDismantleBoom && mMaxProgresstime > 0 && areChunksAroundLoaded_EM()) {
+ explodeMultiblock();
+ }
+ } catch (Exception e) {
+ if (DEBUG_MODE) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * prevents spontaneous explosions when the chunks unloading would cause them should cover 3 chunks radius
+ */
+ protected boolean areChunksAroundLoaded_EM() {
+ if (this.isValid() && getBaseMetaTileEntity().isServerSide()) {
+ IGregTechTileEntity base = getBaseMetaTileEntity();
+ return base.getWorld()
+ .doChunksNearChunkExist(base.getXCoord(), base.getYCoord(), base.getZCoord(), 3);
+ // todo check if it is actually checking if chunks are loaded
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * instantiate parameters in CONSTRUCTOR! CALLED ONCE on creation, don't call it in your classes
+ */
+ protected void parametersInstantiation_EM() {}
+
+ /**
+ * It is automatically called OFTEN update status of parameters in guis (and "machine state" if u wish) Called
+ * before check recipe, before outputting, and every second the machine is complete
+ * <p>
+ * good place to update parameter statuses, default implementation handles it well
+ *
+ * @param machineBusy is machine doing stuff
+ */
+ protected void parametersStatusesWrite_EM(boolean machineBusy) { // todo unimplement?
+ if (!machineBusy) {
+ for (Parameters.Group.ParameterIn parameterIn : parametrization.parameterInArrayList) {
+ if (parameterIn != null) {
+ parameterIn.updateStatus();
+ }
+ }
+ } else {
+ for (Parameters.Group hatch : parametrization.groups) {
+ if (hatch != null && hatch.updateWhileRunning) {
+ for (Parameters.Group.ParameterIn in : hatch.parameterIn) {
+ if (in != null) {
+ in.updateStatus();
+ }
+ }
+ }
+ }
+ }
+ for (Parameters.Group.ParameterOut parameterOut : parametrization.parameterOutArrayList) {
+ if (parameterOut != null) {
+ parameterOut.updateStatus();
+ }
+ }
+ }
+
+ /**
+ * For extra types of hatches initiation, LOOK HOW IT IS CALLED! in onPostTick
+ *
+ * @param mMachine was the machine considered complete at that point in onPostTick
+ */
+ protected void hatchInit_EM(boolean mMachine) {}
+
+ /**
+ * called when the multiblock is exploding - if u want to add more EXPLOSIONS, for ex. new types of hatches also
+ * have to explode
+ */
+ protected void extraExplosions_EM() {} // For that extra hatches explosions, and maybe some MOORE EXPLOSIONS
+
+ /**
+ * Get Available data, Override only on data outputters should return mAvailableData that is set in check recipe
+ *
+ * @return available data
+ */
+ protected long getAvailableData_EM() {
+ long result = 0;
+ IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity();
+ Vec3Impl pos = new Vec3Impl(
+ baseMetaTileEntity.getXCoord(),
+ baseMetaTileEntity.getYCoord(),
+ baseMetaTileEntity.getZCoord());
+ for (GT_MetaTileEntity_Hatch_InputData in : eInputData) {
+ if (in.q != null) {
+ Long value = in.q.contentIfNotInTrace(pos);
+ if (value != null) {
+ result += value;
+ }
+ }
+ }
+ return result;
+ }
+
+ protected long getPowerFlow() {
+ return useLongPower ? lEUt : mEUt;
+ }
+
+ protected void setPowerFlow(long lEUt) {
+ if (useLongPower) {
+ this.lEUt = lEUt;
+ } else {
+ mEUt = (int) Math.min(Integer.MAX_VALUE, lEUt);
+ }
+ }
+
+ @Override
+ protected long getActualEnergyUsage() {
+ return -(useLongPower ? lEUt : mEUt) * eAmpereFlow * 10_000 / Math.max(1_000, mEfficiency);
+ }
+
+ /**
+ * Extra hook on cyclic updates (not really needed for machines smaller than 1 chunk) BUT NEEDED WHEN - machine
+ * blocks are not touching each other or they don't implement IMachineBlockUpdateable (ex. air,stone,weird TE's)
+ */
+ protected boolean cyclicUpdate_EM() {
+ return mUpdate <= -1000; // set to false to disable cyclic update
+ // default is once per 50s; mUpdate is decremented every tick
+ }
+
+ /**
+ * get pollution per tick
+ *
+ * @param itemStack what is in controller
+ * @return how much pollution is produced
+ */
+ @Override
+ public int getPollutionPerTick(ItemStack itemStack) {
+ return 0;
+ }
+
+ /**
+ * EM pollution per tick
+ *
+ * @param itemStack - item in controller
+ * @return how much excess matter is there
+ */
+ public float getExcessMassPerTick_EM(ItemStack itemStack) {
+ return 0f;
+ }
+
+ /**
+ * triggered if machine is not allowed to work after completing a recipe, override to make it not shutdown for
+ * instance (like turbines). bu just replacing it with blank - active transformer is doing it
+ * <p>
+ * CALLED DIRECTLY when soft hammered to offline state - usually should stop the machine unless some other mechanics
+ * should do it
+ */
+ protected void notAllowedToWork_stopMachine_EM() {
+ stopMachine();
+ }
+
+ /**
+ * store data
+ */
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("eMaxGenEUmin", maxEUoutputMin);
+ aNBT.setLong("eMaxGenEUmax", maxEUoutputMax);
+ aNBT.setLong("eGenRating", eMaxAmpereGen);
+ aNBT.setLong("eMaxEUmin", maxEUinputMin);
+ aNBT.setLong("eMaxEUmax", maxEUinputMax);
+ aNBT.setLong("eRating", eAmpereFlow);
+ aNBT.setLong("eMaxA", eMaxAmpereFlow);
+ aNBT.setLong("eDataR", eRequiredData);
+ aNBT.setLong("eDataA", eAvailableData);
+ aNBT.setByte("eCertainM", eCertainMode);
+ aNBT.setByte("eCertainS", eCertainStatus);
+ aNBT.setByte("eMinRepair", minRepairStatus);
+ aNBT.setBoolean("eParam", eParameters);
+ aNBT.setBoolean("ePass", ePowerPass);
+ aNBT.setBoolean("ePowerPassCover", ePowerPassCover);
+ aNBT.setBoolean("eVoid", eSafeVoid);
+ aNBT.setBoolean("eBoom", eDismantleBoom);
+ aNBT.setBoolean("eOK", mMachine);
+ // Ensures compatibility
+ if (mOutputItems != null) {
+ aNBT.setInteger("mOutputItemsLength", mOutputItems.length);
+ for (int i = 0; i < mOutputItems.length; i++) {
+ if (mOutputItems[i] != null) {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ mOutputItems[i].writeToNBT(tNBT);
+ aNBT.setTag("mOutputItem" + i, tNBT);
+ }
+ }
+ }
+
+ // Ensures compatibility
+ 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.setInteger("eOutputStackCount", 0);
+ aNBT.removeTag("outputEM");
+
+ NBTTagCompound paramI = new NBTTagCompound();
+ for (int i = 0; i < parametrization.iParamsIn.length; i++) {
+ paramI.setDouble(Integer.toString(i), parametrization.iParamsIn[i]);
+ }
+ aNBT.setTag("eParamsInD", paramI);
+
+ NBTTagCompound paramO = new NBTTagCompound();
+ for (int i = 0; i < parametrization.iParamsOut.length; i++) {
+ paramO.setDouble(Integer.toString(i), parametrization.iParamsOut[i]);
+ }
+ aNBT.setTag("eParamsOutD", paramO);
+
+ NBTTagCompound paramIs = new NBTTagCompound();
+ for (int i = 0; i < parametrization.eParamsInStatus.length; i++) {
+ paramIs.setByte(Integer.toString(i), parametrization.eParamsInStatus[i].getOrdinalByte());
+ }
+ aNBT.setTag("eParamsInS", paramIs);
+
+ NBTTagCompound paramOs = new NBTTagCompound();
+ for (int i = 0; i < parametrization.eParamsOutStatus.length; i++) {
+ paramOs.setByte(Integer.toString(i), parametrization.eParamsOutStatus[i].getOrdinalByte());
+ }
+ aNBT.setTag("eParamsOutS", paramOs);
+ }
+
+ /**
+ * load data
+ */
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ maxEUoutputMin = aNBT.getLong("eMaxGenEUmin");
+ maxEUoutputMax = aNBT.getLong("eMaxGenEUmax");
+ eMaxAmpereGen = aNBT.getLong("eGenRating");
+ maxEUinputMin = aNBT.getLong("eMaxEUmin");
+ maxEUinputMax = aNBT.getLong("eMaxEUmax");
+ eAmpereFlow = aNBT.hasKey("eRating") ? aNBT.getLong("eRating") : 1;
+ eMaxAmpereFlow = aNBT.getLong("eMaxA");
+ eRequiredData = aNBT.getLong("eDataR");
+ eAvailableData = aNBT.getLong("eDataA");
+ eCertainMode = aNBT.getByte("eCertainM");
+ eCertainStatus = aNBT.getByte("eCertainS");
+ minRepairStatus = aNBT.hasKey("eMinRepair") ? aNBT.getByte("eMinRepair") : 3;
+ eParameters = !aNBT.hasKey("eParam") || aNBT.getBoolean("eParam");
+ ePowerPass = aNBT.getBoolean("ePass");
+ ePowerPassCover = aNBT.getBoolean("ePowerPassCover");
+ eSafeVoid = aNBT.getBoolean("eVoid");
+ eDismantleBoom = aNBT.getBoolean("eBoom");
+ mMachine = aNBT.getBoolean("eOK");
+
+ // Ensures compatibility
+ 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);
+ }
+ }
+
+ // Ensures compatibility
+ 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);
+ }
+ }
+
+ if (aNBT.hasKey("eParamsIn") && aNBT.hasKey("eParamsOut") && aNBT.hasKey("eParamsB")) {
+ NBTTagCompound paramI = aNBT.getCompoundTag("eParamsIn");
+ NBTTagCompound paramO = aNBT.getCompoundTag("eParamsOut");
+ NBTTagCompound paramB = aNBT.getCompoundTag("eParamsB");
+ for (int i = 0; i < 10; i++) {
+ if (paramB.getBoolean(Integer.toString(i))) {
+ parametrization.iParamsIn[i] = Float.intBitsToFloat(paramI.getInteger(Integer.toString(i)));
+ parametrization.iParamsOut[i] = Float.intBitsToFloat(paramO.getInteger(Integer.toString(i)));
+ } else {
+ parametrization.iParamsIn[i] = paramI.getInteger(Integer.toString(i));
+ parametrization.iParamsOut[i] = paramO.getInteger(Integer.toString(i));
+ }
+ }
+ } else {
+ NBTTagCompound paramI = aNBT.getCompoundTag("eParamsInD");
+ for (int i = 0; i < parametrization.iParamsIn.length; i++) {
+ parametrization.iParamsIn[i] = paramI.getDouble(Integer.toString(i));
+ }
+ NBTTagCompound paramO = aNBT.getCompoundTag("eParamsOutD");
+ for (int i = 0; i < parametrization.iParamsOut.length; i++) {
+ parametrization.iParamsOut[i] = paramO.getDouble(Integer.toString(i));
+ }
+ }
+
+ NBTTagCompound paramIs = aNBT.getCompoundTag("eParamsInS");
+ for (int i = 0; i < parametrization.eParamsInStatus.length; i++) {
+ parametrization.eParamsInStatus[i] = LedStatus.getStatus(paramIs.getByte(Integer.toString(i)));
+ }
+
+ NBTTagCompound paramOs = aNBT.getCompoundTag("eParamsOutS");
+ for (int i = 0; i < parametrization.eParamsOutStatus.length; i++) {
+ parametrization.eParamsOutStatus[i] = LedStatus.getStatus(paramOs.getByte(Integer.toString(i)));
+ }
+ }
+
+ /**
+ * Override if needed but usually call super method at start! On machine stop - NOT called directly when soft
+ * hammered to offline state! - it SHOULD cause a full stop like power failure does
+ */
+ @Override
+ 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()));
+ }
+ for (GT_MetaTileEntity_Hatch_OutputData data : eOutputData) {
+ data.q = null;
+ }
+
+ mOutputItems = null;
+ mOutputFluids = null;
+ mEfficiency = 0;
+ mEfficiencyIncrease = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ eAvailableData = 0;
+ hatchesStatusUpdate_EM();
+ getBaseMetaTileEntity().disableWorking();
+ getBaseMetaTileEntity().setShutDownReason(reason);
+ getBaseMetaTileEntity().setShutdownStatus(true);
+ if (reason.wasCritical()) {
+ sendSound(INTERRUPT_SOUND_INDEX);
+ }
+ }
+
+ /**
+ * After recipe check failed helper method so i don't have to set that params to nothing at all times
+ */
+ protected void afterRecipeCheckFailed() {
+
+ for (GT_MetaTileEntity_Hatch_OutputData data : eOutputData) {
+ data.q = null;
+ }
+
+ mOutputItems = null;
+ mOutputFluids = null;
+ mEfficiency = 0;
+ mEfficiencyIncrease = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ eAvailableData = 0;
+ }
+
+ /**
+ * cyclic check even when not working, called LESS frequently
+ */
+ private boolean cyclicUpdate() {
+ if (cyclicUpdate_EM()) {
+ mUpdate = 0;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * mining level...
+ */
+ @Override
+ public byte getTileEntityBaseType() {
+ return 3;
+ }
+
+ // endregion
+
+ // region internal
+
+ /**
+ * internal check machine
+ */
+ @Override
+ public final boolean checkMachine(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+ return checkMachine_EM(iGregTechTileEntity, itemStack);
+ }
+
+ /**
+ * internal check recipe
+ */
+ @Override
+ public final boolean checkRecipe(ItemStack itemStack) { // do recipe checks, based on "machine content and state"
+ hatchesStatusUpdate_EM();
+ startRecipeProcessing();
+ boolean result = checkRecipe_EM(itemStack); // if had no - set default params
+ endRecipeProcessing();
+ hatchesStatusUpdate_EM();
+ return result;
+ }
+
+ @NotNull
+ @Override
+ public final CheckRecipeResult checkProcessing() {
+ hatchesStatusUpdate_EM();
+ CheckRecipeResult result = checkProcessing_EM();
+ hatchesStatusUpdate_EM();
+ return result;
+ }
+
+ /**
+ * callback for updating parameters and new hatches
+ */
+ protected void hatchesStatusUpdate_EM() {
+ if (getBaseMetaTileEntity().isClientSide()) {
+ return;
+ }
+ boolean busy = mMaxProgresstime > 0;
+ if (busy) { // write from buffer to hatches only
+ for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) {
+ if (hatch.param < 0) {
+ continue;
+ }
+ int hatchId = hatch.param;
+ if (parametrization.groups[hatchId] != null && parametrization.groups[hatchId].updateWhileRunning) {
+ parametrization.iParamsIn[hatchId] = hatch.value0D;
+ parametrization.iParamsIn[hatchId + 10] = hatch.value1D;
+ }
+ hatch.input0D = parametrization.iParamsOut[hatchId];
+ hatch.input1D = parametrization.iParamsOut[hatchId + 10];
+ }
+ } else { // if has nothing to do update all
+ for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) {
+ if (hatch.param < 0) {
+ continue;
+ }
+ int hatchId = hatch.param;
+ parametrization.iParamsIn[hatchId] = hatch.value0D;
+ parametrization.iParamsIn[hatchId + 10] = hatch.value1D;
+ hatch.input0D = parametrization.iParamsOut[hatchId];
+ hatch.input1D = parametrization.iParamsOut[hatchId + 10];
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Uncertainty uncertainty : eUncertainHatches) {
+ eCertainStatus = uncertainty.update(eCertainMode);
+ }
+ eAvailableData = getAvailableData_EM();
+ parametersStatusesWrite_EM(busy);
+ }
+
+ @Deprecated
+ public final int getAmountOfOutputs() {
+ throw new NoSuchMethodError("Deprecated Do not use");
+ }
+ // endregion
+
+ // region TICKING functions
+
+ public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) {}
+
+ @Override
+ public final void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ isFacingValid(aBaseMetaTileEntity.getFrontFacing());
+ if (getBaseMetaTileEntity().isClientSide()) {
+ StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity);
+ }
+ onFirstTick_EM(aBaseMetaTileEntity);
+ }
+
+ /**
+ * called every tick the machines is active
+ */
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ return onRunningTickCheck(aStack);
+ }
+
+ public boolean onRunningTickCheck_EM(ItemStack aStack) {
+ if (eRequiredData > eAvailableData) {
+ if (!checkComputationTimeout()) {
+ if (energyFlowOnRunningTick_EM(aStack, false)) {
+ stopMachine(SimpleShutDownReason.ofCritical("computation_loss"));
+ }
+ return false;
+ }
+ }
+ return energyFlowOnRunningTick_EM(aStack, true);
+ }
+
+ public boolean onRunningTickCheck(ItemStack aStack) {
+ if (eRequiredData > eAvailableData) {
+ if (!checkComputationTimeout()) {
+ if (energyFlowOnRunningTick(aStack, false)) {
+ stopMachine(SimpleShutDownReason.ofCritical("computation_loss"));
+ }
+ return false;
+ }
+ }
+ return energyFlowOnRunningTick(aStack, true);
+ }
+
+ /**
+ * CAREFUL!!! it calls most of the callbacks, like everything else in here
+ */
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ explodedThisTick = false;
+ if (mEfficiency < 0) {
+ mEfficiency = 0;
+ }
+
+ if (--mUpdate == 0 || --mStartUpCheck == 0
+ || cyclicUpdate()
+ || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) {
+ clearHatches_EM();
+
+ if (aBaseMetaTileEntity instanceof BaseTileEntity) {
+ ((BaseTileEntity) aBaseMetaTileEntity).ignoreUnloadedChunks = mMachine;
+ }
+ mMachine = checkMachine(aBaseMetaTileEntity, mInventory[1]);
+
+ if (!mMachine) {
+ if (ePowerPass && getEUVar() > V[3]
+ || eDismantleBoom && mMaxProgresstime > 0 && areChunksAroundLoaded_EM()) {
+ explodeMultiblock();
+ }
+ }
+
+ if (eUncertainHatches.size() > 1) {
+ mMachine = false;
+ }
+
+ if (mMachine) {
+ setupHatches_EM();
+
+ setupEnergyHatchesVariables_EM();
+
+ if (getEUVar() > maxEUStore()) {
+ setEUVar(maxEUStore());
+ }
+ } else {
+ maxEUinputMin = 0;
+ maxEUinputMax = 0;
+ eMaxAmpereFlow = 0;
+ setEUVar(0);
+ }
+ hatchInit_EM(mMachine);
+ }
+
+ if (mStartUpCheck < 0) { // E
+ if (mMachine) { // S
+ byte Tick = (byte) (aTick % 20);
+ if (MULTI_CHECK_AT == Tick) {
+ maintenance_EM();
+ }
+
+ if (getRepairStatus() >= minRepairStatus) { // S
+ if (MULTI_CHECK_AT == Tick) {
+ hatchesStatusUpdate_EM();
+ }
+
+ dischargeController_EM(aBaseMetaTileEntity);
+ chargeController_EM(aBaseMetaTileEntity);
+
+ if (mMaxProgresstime > 0 && doRandomMaintenanceDamage()) { // Start
+ if (onRunningTick(mInventory[1])) { // Compute EU
+ if (!polluteEnvironment(getPollutionPerTick(mInventory[1]))) {
+ stopMachine(ShutDownReasonRegistry.POLLUTION_FAIL);
+ }
+
+ if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { // progress increase
+ // and done
+ hatchesStatusUpdate_EM();
+
+ outputAfterRecipe_EM();
+
+ addClassicOutputs_EM();
+
+ updateSlots();
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mEfficiencyIncrease = 0;
+
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ if (checkRecipe()) {
+ mEfficiency = Math.max(
+ 0,
+ min(
+ mEfficiency + mEfficiencyIncrease,
+ getMaxEfficiency(mInventory[1])
+ - (getIdealStatus() - getRepairStatus()) * 1000));
+ } else {
+ afterRecipeCheckFailed();
+ }
+ updateSlots();
+ } else {
+ notAllowedToWork_stopMachine_EM();
+ }
+ }
+ } // else {//failed to consume power/resources - inside on running tick
+ // stopMachine();
+ // }
+ } else if (RECIPE_AT == Tick || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) {
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ if (checkRecipe()) {
+ mEfficiency = Math.max(
+ 0,
+ min(
+ mEfficiency + mEfficiencyIncrease,
+ getMaxEfficiency(mInventory[1])
+ - (getIdealStatus() - getRepairStatus()) * 1000));
+ } else {
+ afterRecipeCheckFailed();
+ }
+ updateSlots();
+ } // else notAllowedToWork_stopMachine_EM(); //it is already stopped here
+ }
+ } else { // not repaired
+ stopMachine(ShutDownReasonRegistry.NO_REPAIR);
+ }
+ } else { // not complete
+ stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE);
+ }
+ }
+
+ aBaseMetaTileEntity.setErrorDisplayID(
+ aBaseMetaTileEntity.getErrorDisplayID() & -512 | (mWrench ? 0 : 1)
+ | (mScrewdriver ? 0 : 2)
+ | (mSoftHammer ? 0 : 4)
+ | (mHardHammer ? 0 : 8)
+ | (mSolderingTool ? 0 : 16)
+ | (mCrowbar ? 0 : 32)
+ | (mMachine ? 0 : 64)
+ | (eCertainStatus == 0 ? 0 : 128)
+ | (eParameters ? 0 : 256));
+ aBaseMetaTileEntity.setActive(mMaxProgresstime > 0);
+ boolean active = aBaseMetaTileEntity.isActive() && mPollution > 0;
+ setMufflers(active);
+ } else {
+ soundMagic(getActivitySound());
+ }
+ }
+
+ protected void addClassicOutputs_EM() {
+ if (mOutputItems != null) {
+ for (ItemStack tStack : mOutputItems) {
+ if (tStack != null) {
+ addOutput(tStack);
+ }
+ }
+ }
+ mOutputItems = null;
+
+ if (mOutputFluids != null) {
+ if (mOutputFluids.length == 1) {
+ for (FluidStack tStack : mOutputFluids) {
+ if (tStack != null) {
+ addOutput(tStack);
+ }
+ }
+ } else if (mOutputFluids.length > 1) {
+ addFluidOutputs(mOutputFluids);
+ }
+ }
+ mOutputFluids = null;
+ }
+
+ protected void maintenance_EM() {
+ if (GT_MetaTileEntity_MultiBlockBase.disableMaintenance) {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ } else {
+ 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;
+ }
+ }
+ }
+
+ protected void clearHatches_EM() {
+ mDualInputHatches.clear();
+ mInputHatches.clear();
+ mInputBusses.clear();
+ mOutputHatches.clear();
+ mOutputBusses.clear();
+ mDynamoHatches.clear();
+ mEnergyHatches.clear();
+ mMufflerHatches.clear();
+ mMaintenanceHatches.clear();
+
+ for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eOutputData)) {
+ hatch_data.id = -1;
+ }
+ for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eInputData)) {
+ hatch_data.id = -1;
+ }
+
+ for (GT_MetaTileEntity_Hatch_Uncertainty hatch : filterValidMTEs(eUncertainHatches)) {
+ hatch.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) {
+ hatch.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+
+ eUncertainHatches.clear();
+ eEnergyMulti.clear();
+ eParamHatches.clear();
+ eDynamoMulti.clear();
+ eOutputData.clear();
+ eInputData.clear();
+ }
+
+ protected void setupHatches_EM() {
+ short id = 1;
+
+ for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eOutputData)) {
+ hatch_data.id = id++;
+ }
+ id = 1;
+ for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eInputData)) {
+ hatch_data.id = id++;
+ }
+
+ for (GT_MetaTileEntity_Hatch_Uncertainty hatch : filterValidMTEs(eUncertainHatches)) {
+ hatch.getBaseMetaTileEntity()
+ .setActive(true);
+ }
+ for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) {
+ hatch.getBaseMetaTileEntity()
+ .setActive(true);
+ }
+ }
+
+ protected void setupEnergyHatchesVariables_EM() {
+ if (!mEnergyHatches.isEmpty() || !eEnergyMulti.isEmpty()
+ || !mDynamoHatches.isEmpty()
+ || !eDynamoMulti.isEmpty()) {
+ maxEUinputMin = V[15];
+ maxEUinputMax = V[0];
+ maxEUoutputMin = V[15];
+ maxEUoutputMax = V[0];
+ for (GT_MetaTileEntity_Hatch_Energy hatch : filterValidMTEs(mEnergyHatches)) {
+ if (hatch.maxEUInput() < maxEUinputMin) {
+ maxEUinputMin = hatch.maxEUInput();
+ }
+ if (hatch.maxEUInput() > maxEUinputMax) {
+ maxEUinputMax = hatch.maxEUInput();
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti hatch : filterValidMTEs(eEnergyMulti)) {
+ if (hatch.maxEUInput() < maxEUinputMin) {
+ maxEUinputMin = hatch.maxEUInput();
+ }
+ if (hatch.maxEUInput() > maxEUinputMax) {
+ maxEUinputMax = hatch.maxEUInput();
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Dynamo hatch : filterValidMTEs(mDynamoHatches)) {
+ if (hatch.maxEUOutput() < maxEUoutputMin) {
+ maxEUoutputMin = hatch.maxEUOutput();
+ }
+ if (hatch.maxEUOutput() > maxEUoutputMax) {
+ maxEUoutputMax = hatch.maxEUOutput();
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_DynamoMulti hatch : filterValidMTEs(eDynamoMulti)) {
+ if (hatch.maxEUOutput() < maxEUoutputMin) {
+ maxEUoutputMin = hatch.maxEUOutput();
+ }
+ if (hatch.maxEUOutput() > maxEUoutputMax) {
+ maxEUoutputMax = hatch.maxEUOutput();
+ }
+ }
+ eMaxAmpereFlow = 0;
+ eMaxAmpereGen = 0;
+ // counts only full amps
+ for (GT_MetaTileEntity_Hatch_Energy hatch : filterValidMTEs(mEnergyHatches)) {
+ eMaxAmpereFlow += hatch.maxEUInput() / maxEUinputMin;
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti hatch : filterValidMTEs(eEnergyMulti)) {
+ eMaxAmpereFlow += hatch.maxEUInput() / maxEUinputMin * hatch.Amperes;
+ }
+ for (GT_MetaTileEntity_Hatch_Dynamo hatch : filterValidMTEs(mDynamoHatches)) {
+ eMaxAmpereGen += hatch.maxEUOutput() / maxEUoutputMin;
+ }
+ for (GT_MetaTileEntity_Hatch_DynamoMulti hatch : filterValidMTEs(eDynamoMulti)) {
+ eMaxAmpereGen += hatch.maxEUOutput() / maxEUoutputMin * hatch.Amperes;
+ }
+ } else {
+ maxEUinputMin = 0;
+ maxEUinputMax = 0;
+ eMaxAmpereFlow = 0;
+ maxEUoutputMin = 0;
+ maxEUoutputMax = 0;
+ eMaxAmpereGen = 0;
+ }
+ }
+
+ protected void dischargeController_EM(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (ePowerPass && getEUVar() > getMinimumStoredEU()) {
+ powerPass(aBaseMetaTileEntity);
+ }
+ }
+
+ protected final void powerPass(IGregTechTileEntity aBaseMetaTileEntity) {
+ long euVar;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ euVar = tHatch.maxEUOutput() * tHatch.maxAmperesOut();
+ if (tHatch.getBaseMetaTileEntity()
+ .getStoredEU() <= tHatch.maxEUStore() - euVar
+ && aBaseMetaTileEntity
+ .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.maxAmperesOut()), false)) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) {
+ euVar = tHatch.maxEUOutput() * tHatch.maxAmperesOut();
+ if (tHatch.getBaseMetaTileEntity()
+ .getStoredEU() <= tHatch.maxEUStore() - euVar
+ && aBaseMetaTileEntity
+ .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.maxAmperesOut()), false)) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ }
+ }
+ }
+
+ protected final void powerPass_EM(IGregTechTileEntity aBaseMetaTileEntity) {
+ long euVar;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ euVar = tHatch.maxEUOutput();
+ if (tHatch.getBaseMetaTileEntity()
+ .getStoredEU() <= tHatch.maxEUStore() - euVar
+ && aBaseMetaTileEntity.decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, 1), false)) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) {
+ euVar = tHatch.maxEUOutput() * tHatch.Amperes;
+ if (tHatch.getBaseMetaTileEntity()
+ .getStoredEU() <= tHatch.maxEUStore() - euVar
+ && aBaseMetaTileEntity
+ .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.Amperes), false)) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ }
+ }
+ }
+
+ protected void chargeController_EM(IGregTechTileEntity aBaseMetaTileEntity) {
+ powerInput();
+ }
+
+ protected final void powerInput() {
+ long euVar;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ if (getEUVar() > getMinimumStoredEU()) {
+ break;
+ }
+ euVar = Math.min(tHatch.maxEUInput() * tHatch.maxAmperesIn(), tHatch.getEUVar());
+ if (tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(euVar, false)) {
+ setEUVar(getEUVar() + euVar);
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) {
+ if (getEUVar() > getMinimumStoredEU()) {
+ break;
+ }
+ euVar = Math.min(tHatch.maxEUInput() * tHatch.maxAmperesIn(), tHatch.getEUVar());
+ if (tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(euVar, false)) {
+ setEUVar(getEUVar() + euVar);
+ }
+ }
+ }
+
+ protected final void powerInput_EM() {
+ long euVar;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ if (getEUVar() > getMinimumStoredEU()) {
+ break;
+ }
+ euVar = tHatch.maxEUInput();
+ if (tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(euVar, false)) {
+ setEUVar(getEUVar() + euVar);
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) {
+ if (getEUVar() > getMinimumStoredEU()) {
+ break;
+ }
+ euVar = tHatch.maxEUInput() * tHatch.Amperes;
+ if (tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(euVar, false)) {
+ setEUVar(getEUVar() + euVar);
+ }
+ }
+ }
+
+ // endregion
+
+ // region EFFICIENCY AND FIXING LIMITS
+
+ @Override
+ public int getMaxEfficiency(ItemStack itemStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getIdealStatus() {
+ return super.getIdealStatus() + 2;
+ }
+
+ @Override
+ public int getRepairStatus() {
+ return super.getRepairStatus() + (eCertainStatus == 0 ? 1 : 0) + (eParameters ? 1 : 0);
+ }
+
+ // endregion
+
+ // region ENERGY!!!!
+
+ // new method
+ public boolean energyFlowOnRunningTick_EM(ItemStack aStack, boolean allowProduction) {
+ long euFlow = getPowerFlow() * eAmpereFlow; // quick scope sign
+ if (allowProduction && euFlow > 0) {
+ addEnergyOutput_EM(getPowerFlow() * (long) mEfficiency / getMaxEfficiency(aStack), eAmpereFlow);
+ } else if (euFlow < 0) {
+ if (POWERLESS_MODE) {
+ return true;
+ }
+ if (!drainEnergyInput_EM(
+ getPowerFlow(),
+ getPowerFlow() * getMaxEfficiency(aStack) / Math.max(1000L, mEfficiency),
+ eAmpereFlow)) {
+ criticalStopMachine();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) {
+ long euFlow = getPowerFlow() * eAmpereFlow; // quick scope sign
+ if (allowProduction && euFlow > 0) {
+ addEnergyOutput_EM(getPowerFlow() * (long) mEfficiency / getMaxEfficiency(aStack), eAmpereFlow);
+ } else if (euFlow < 0) {
+ if (POWERLESS_MODE) {
+ return true;
+ }
+ if (!drainEnergyInput(
+ getPowerFlow() * getMaxEfficiency(aStack) / Math.max(1000L, mEfficiency),
+ eAmpereFlow)) {
+ criticalStopMachine();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(maxEUinputMin * (eMaxAmpereFlow << 3), maxEUoutputMin * (eMaxAmpereGen << 3));
+ }
+
+ @Override
+ public final long getMinimumStoredEU() {
+ return maxEUStore() >> 1;
+ }
+
+ @Override
+ public final long maxAmperesIn() {
+ return 0L;
+ }
+
+ @Override
+ public final long maxAmperesOut() {
+ return 0L;
+ }
+
+ @Deprecated
+ @Override
+ public final boolean addEnergyOutput(long eu) {
+ return addEnergyOutput_EM(eu, 1);
+ }
+
+ public boolean addEnergyOutput_EM(long EU, long Amperes) {
+ if (EU < 0) {
+ EU = -EU;
+ }
+ if (Amperes < 0) {
+ Amperes = -Amperes;
+ }
+ long euVar = EU * Amperes;
+ long diff;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ if (tHatch.maxEUOutput() < EU) {
+ explodeMultiblock();
+ }
+ diff = tHatch.maxEUStore() - tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (diff > 0) {
+ if (euVar > diff) {
+ tHatch.setEUVar(tHatch.maxEUStore());
+ euVar -= diff;
+ } else if (euVar <= diff) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ return true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) {
+ if (tHatch.maxEUOutput() < EU) {
+ explodeMultiblock();
+ }
+ diff = tHatch.maxEUStore() - tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (diff > 0) {
+ if (euVar > diff) {
+ tHatch.setEUVar(tHatch.maxEUStore());
+ euVar -= diff;
+ } else if (euVar <= diff) {
+ tHatch.setEUVar(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU() + euVar);
+ return true;
+ }
+ }
+ }
+ setEUVar(min(getEUVar() + euVar, maxEUStore()));
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public final boolean drainEnergyInput(long eu) {
+ return drainEnergyInput_EM(0, eu, 1);
+ }
+
+ public boolean drainEnergyInput_EM(long EUtTierVoltage, long EUtEffective, long Amperes) {
+ long EUuse = EUtEffective * Amperes;
+ if (EUuse == 0) {
+ return true;
+ }
+ if (maxEUinputMin == 0) {
+ return false;
+ }
+ if (EUuse < 0) {
+ EUuse = -EUuse;
+ }
+ if (EUuse > getEUVar() || // not enough power
+ (EUtTierVoltage == 0 ? EUuse > getMaxInputEnergy() : (EUtTierVoltage > maxEUinputMax) || // TIER IS
+ // BASED ON
+ // BEST HATCH!
+ // not total
+ // EUtEffective
+ // input
+ (EUtTierVoltage * Amperes - 1) / maxEUinputMin + 1 > eMaxAmpereFlow)) { // EUuse==0? --> (EUuse
+ // - 1) / maxEUinputMin
+ // + 1 = 1! //if
+ // not too much A
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.debug("L1 " + EUuse + ' ' + getEUVar() + ' ' + (EUuse > getEUVar()));
+ TecTech.LOGGER.debug("L2 " + EUtEffective + ' ' + maxEUinputMax + ' ' + (EUtEffective > maxEUinputMax));
+ TecTech.LOGGER.debug("L3 " + Amperes + ' ' + getMaxInputEnergy());
+ TecTech.LOGGER.debug(
+ "L4 " + ((EUuse - 1) / maxEUinputMin + 1)
+ + ' '
+ + eMaxAmpereFlow
+ + ' '
+ + ((EUuse - 1) / maxEUinputMin + 1 > eMaxAmpereFlow));
+ }
+ return false;
+ }
+ // sub eu
+ setEUVar(getEUVar() - EUuse);
+ return true;
+ }
+
+ public boolean drainEnergyInput(long EUtEffective, long Amperes) {
+ long EUuse = EUtEffective * Amperes;
+ if (EUuse == 0) {
+ return true;
+ }
+ if (maxEUinputMin == 0) {
+ return false;
+ }
+ if (EUuse < 0) {
+ EUuse = -EUuse;
+ }
+ // not enough power
+ if (EUuse > getEUVar() || EUuse > getMaxInputEnergy()) { // EUuse==0? --> (EUuse - 1) / maxEUinputMin + 1 = 1!
+ // //if not too much
+ // A
+ return false;
+ }
+ // sub eu
+ setEUVar(getEUVar() - EUuse);
+ return true;
+ }
+
+ // new method
+ public final boolean overclockAndPutValuesIn_EM(long EU, int time) { // TODO revise
+ if (EU == 0L) {
+ setPowerFlow(0);
+ mMaxProgresstime = time;
+ return true;
+ }
+ long tempEUt = Math.max(EU, V[1]);
+ long tempTier = maxEUinputMax >> 2;
+ while (tempEUt < tempTier) {
+ tempEUt <<= 2;
+ time >>= 1;
+ EU = time == 0 ? EU >> 1 : EU << 2; // U know, if the time is less than 1 tick make the machine use less
+ // power
+ }
+ if (EU > Integer.MAX_VALUE || EU < Integer.MIN_VALUE) {
+ setPowerFlow(Integer.MAX_VALUE - 1);
+ mMaxProgresstime = Integer.MAX_VALUE - 1;
+ return false;
+ }
+ setPowerFlow(EU);
+ mMaxProgresstime = time == 0 ? 1 : time;
+ return true;
+ } // Use in EM check recipe return statement if you want overclocking
+
+ /**
+ * Use {@link #getMaxInputVoltage()}
+ */
+ @Deprecated
+ public final long getMaxInputVoltageSum() {
+ return getMaxInputVoltage();
+ }
+
+ /**
+ * Use {@link #getMaxInputEu()}
+ */
+ @Deprecated
+ public final long getMaxInputEnergy() {
+ return getMaxInputEu();
+ }
+
+ /**
+ * Use {@link #getMaxInputEu()}
+ */
+ @Deprecated
+ public final long getMaxInputEnergy_EM() {
+ return getMaxInputEu();
+ }
+
+ // new Method
+ public final int getMaxEnergyInputTier_EM() {
+ return getTier(maxEUinputMax);
+ }
+
+ // new Method
+ public final int getMinEnergyInputTier_EM() {
+ return getTier(maxEUinputMin);
+ }
+
+ public final long getMaxAmpereFlowAtMinTierOfEnergyHatches() {
+ return eAmpereFlow;
+ }
+
+ @Override
+ public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() {
+ List<GT_MetaTileEntity_Hatch> list = new ArrayList<>();
+ list.addAll(mEnergyHatches);
+ list.addAll(eEnergyMulti);
+ return list;
+ }
+
+ @Override
+ public List<GT_MetaTileEntity_Hatch> getExoticEnergyHatches() {
+ List<GT_MetaTileEntity_Hatch> list = new ArrayList<>();
+ list.addAll(eEnergyMulti);
+ return list;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public final void explodeMultiblock() {
+ if (explodedThisTick) {
+ return;
+ }
+ explodedThisTick = true;
+ if (!TecTech.configTecTech.BOOM_ENABLE) {
+ TecTech.proxy.broadcast(
+ "Multi Explode BOOM! " + getBaseMetaTileEntity().getXCoord()
+ + ' '
+ + getBaseMetaTileEntity().getYCoord()
+ + ' '
+ + getBaseMetaTileEntity().getZCoord());
+ StackTraceElement[] ste = Thread.currentThread()
+ .getStackTrace();
+ TecTech.proxy.broadcast("Multi Explode BOOM! " + ste[2].toString());
+ return;
+ }
+ extraExplosions_EM();
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), 600000);
+ mInventory[1] = null;
+ @SuppressWarnings("unchecked")
+ Iterable<MetaTileEntity> allHatches = Iterables.concat(
+ mInputBusses,
+ mOutputBusses,
+ mInputHatches,
+ mOutputHatches,
+ mDynamoHatches,
+ mMufflerHatches,
+ mEnergyHatches,
+ mMaintenanceHatches,
+ eParamHatches,
+ eEnergyMulti,
+ eUncertainHatches,
+ eDynamoMulti,
+ eInputData,
+ eOutputData);
+ for (MetaTileEntity tTileEntity : allHatches) {
+ if (tTileEntity != null && tTileEntity.getBaseMetaTileEntity() != null) {
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(V[9]);
+ }
+ }
+ getBaseMetaTileEntity().doExplosion(V[15]);
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ if (!TecTech.configTecTech.BOOM_ENABLE) {
+ TecTech.proxy.broadcast(
+ "Multi DoExplosion BOOM! " + getBaseMetaTileEntity().getXCoord()
+ + ' '
+ + getBaseMetaTileEntity().getYCoord()
+ + ' '
+ + getBaseMetaTileEntity().getZCoord());
+ StackTraceElement[] ste = Thread.currentThread()
+ .getStackTrace();
+ TecTech.proxy.broadcast("Multi DoExplosion BOOM! " + ste[2].toString());
+ return;
+ }
+ explodeMultiblock();
+ super.doExplosion(aExplosionPower);
+ } // Redirecting to explodemultiblock
+ // endregion
+
+ // region adder methods
+ @Override
+ public final 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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ }
+ if (aMetaTileEntity instanceof IDualInputHatch) {
+ return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ 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);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) {
+ return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) {
+ return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) {
+ return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) {
+ return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) {
+ return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) {
+ return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ public final boolean addClassicToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ }
+ if (aMetaTileEntity instanceof IDualInputHatch) {
+ return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ 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);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) {
+ return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) {
+ return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) {
+ return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) {
+ return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) {
+ return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) {
+ return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ public final boolean addElementalToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ }
+
+ return false;
+ }
+
+ public final boolean addElementalMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+
+ return false;
+ }
+
+ @Override
+ public final 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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity);
+ }
+
+ return false;
+ }
+
+ @Override
+ public final boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof IDualInputHatch) {
+ ((IDualInputHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity);
+ }
+
+ return false;
+ }
+
+ @Override
+ public final boolean addOutputToMachineList(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 mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity);
+ }
+
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public final 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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public final 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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ // New Method
+ public final boolean addEnergyIOToMachineList(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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addElementalInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addElementalOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addParametrizerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addUncertainToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public final 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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addClassicMaintenanceToMachineList(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) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ // NEW METHOD
+ public final boolean addDataConnectorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity);
+ }
+ return false;
+ }
+ // endregion
+
+ protected static <T extends GT_MetaTileEntity_MultiblockBase_EM> IStructureElement<T> classicHatches(
+ int casingIndex, int dot, Block casingBlock, int casingMeta) {
+ return GT_HatchElementBuilder.<T>builder()
+ .atLeast(
+ InputBus,
+ InputHatch,
+ OutputHatch,
+ OutputBus,
+ Maintenance,
+ Muffler,
+ HatchElement.EnergyMulti,
+ HatchElement.DynamoMulti,
+ HatchElement.InputData,
+ HatchElement.OutputData,
+ HatchElement.Uncertainty)
+ .casingIndex(casingIndex)
+ .dot(dot)
+ .buildAndChain(casingBlock, casingMeta);
+ }
+
+ protected static <T extends GT_MetaTileEntity_MultiblockBase_EM> IStructureElement<T> allHatches(int casingIndex,
+ int dot, Block casingBlock, int casingMeta) {
+ return GT_HatchElementBuilder.<T>builder()
+ .atLeast(
+ InputBus,
+ InputHatch,
+ OutputHatch,
+ OutputBus,
+ Maintenance,
+ Muffler,
+ HatchElement.EnergyMulti,
+ HatchElement.DynamoMulti,
+ HatchElement.InputData,
+ HatchElement.OutputData,
+ HatchElement.Uncertainty)
+ .casingIndex(casingIndex)
+ .dot(dot)
+ .buildAndChain(casingBlock, casingMeta);
+ }
+
+ public enum HatchElement implements IHatchElement<GT_MetaTileEntity_MultiblockBase_EM> {
+
+ Param(GT_MetaTileEntity_MultiblockBase_EM::addParametrizerToMachineList, GT_MetaTileEntity_Hatch_Param.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eParamHatches.size();
+ }
+ },
+ Uncertainty(GT_MetaTileEntity_MultiblockBase_EM::addUncertainToMachineList,
+ GT_MetaTileEntity_Hatch_Uncertainty.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eUncertainHatches.size();
+ }
+ },
+ EnergyMulti(GT_MetaTileEntity_MultiblockBase_EM::addEnergyInputToMachineList,
+ GT_MetaTileEntity_Hatch_EnergyMulti.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eEnergyMulti.size();
+ }
+ },
+ DynamoMulti(GT_MetaTileEntity_MultiblockBase_EM::addDynamoToMachineList,
+ GT_MetaTileEntity_Hatch_DynamoMulti.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eDynamoMulti.size();
+ }
+ },
+ InputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList,
+ GT_MetaTileEntity_Hatch_InputData.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eInputData.size();
+ }
+ },
+ OutputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList,
+ GT_MetaTileEntity_Hatch_OutputData.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiblockBase_EM t) {
+ return t.eOutputData.size();
+ }
+ },;
+
+ private final List<Class<? extends IMetaTileEntity>> mteClasses;
+ private final IGT_HatchAdder<GT_MetaTileEntity_MultiblockBase_EM> adder;
+
+ @SafeVarargs
+ HatchElement(IGT_HatchAdder<GT_MetaTileEntity_MultiblockBase_EM> 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_EM> adder() {
+ return adder;
+ }
+ }
+
+ /**
+ * Check if the computation timeout is still active
+ *
+ * @return True if the timeout is still active or false if the machine should fail
+ */
+ protected boolean checkComputationTimeout() {
+ if (eComputationTimeout > 0) {
+ return --eComputationTimeout > 0;
+ }
+ return false;
+ }
+
+ // region ModularUI
+
+ @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());
+ }
+
+ public boolean isPowerPassButtonEnabled() {
+ return true;
+ }
+
+ public boolean isSafeVoidButtonEnabled() {
+ return true;
+ }
+
+ public boolean isAllowedToWorkButtonEnabled() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK)
+ .setSize(18, 18)
+ .setPos(173, 74));
+ }
+
+ private static byte LEDCounter = 0;
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (doesBindPlayerInventory()) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
+ .setPos(4, 4)
+ .setSize(190, 91));
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY)
+ .setPos(4, 4)
+ .setSize(190, 171));
+ }
+ final SlotWidget inventorySlot = new SlotWidget(new BaseSlot(inventoryHandler, 1) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return getInventoryStackLimit();
+ }
+ });
+ if (doesBindPlayerInventory()) {
+ builder
+ .widget(
+ inventorySlot.setBackground(getGUITextureSet().getItemSlot(), TecTechUITextures.OVERLAY_SLOT_MESH)
+ .setPos(173, 167))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL)
+ .setPos(173, 185)
+ .setSize(18, 6));
+ }
+
+ final DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTexts(screenElements, inventorySlot);
+ builder.widget(screenElements.setPos(7, 8));
+
+ Widget powerPassButton = createPowerPassButton();
+ builder.widget(powerPassButton)
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> ePowerPass, val -> ePowerPass = val))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> ePowerPassCover, val -> ePowerPassCover = val));
+ Widget safeVoidButton = createSafeVoidButton();
+ builder.widget(safeVoidButton)
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> eSafeVoid, val -> eSafeVoid = val));
+ Widget powerSwitchButton = createPowerSwitchButton();
+ builder.widget(powerSwitchButton)
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> {
+ if (val) getBaseMetaTileEntity().enableWorking();
+ else getBaseMetaTileEntity().disableWorking();
+ }));
+
+ builder.widget(new DrawableWidget() {
+
+ @Override
+ public void draw(float partialTicks) {
+ super.draw(partialTicks);
+ LEDCounter = (byte) ((1 + LEDCounter) % 6);
+ }
+ }.setDrawable(TecTechUITextures.PICTURE_PARAMETER_BLANK)
+ .setPos(5, doesBindPlayerInventory() ? 96 : 176)
+ .setSize(166, 12));
+ for (int hatch = 0; hatch < 10; hatch++) {
+ for (int param = 0; param < 2; param++) {
+ int ledID = hatch + param * 10;
+ buildContext
+ .addSyncedWindow(LED_WINDOW_BASE_ID + ledID, (player) -> createLEDConfigurationWindow(ledID));
+ addParameterLED(builder, hatch, param, true);
+ addParameterLED(builder, hatch, param, false);
+ }
+ }
+
+ if (doesBindPlayerInventory()) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_MONITOR_MULTIMACHINE)
+ .setPos(173, 96)
+ .setSize(18, 18));
+ for (int i = 0; i < 9; i++) {
+ final int index = i;
+ builder.widget(new DrawableWidget().setDrawable(() -> {
+ UITexture valid = TecTechUITextures.PICTURE_UNCERTAINTY_VALID[index];
+ UITexture invalid = TecTechUITextures.PICTURE_UNCERTAINTY_INVALID[index];
+ switch (eCertainMode) {
+ case 1: // ooo oxo ooo
+ if (index == 4) return eCertainStatus == 0 ? valid : invalid;
+ break;
+ case 2: // ooo xox ooo
+ if (index == 3) return (eCertainStatus & 1) == 0 ? valid : invalid;
+ if (index == 5) return (eCertainStatus & 2) == 0 ? valid : invalid;
+ break;
+ case 3: // oxo xox oxo
+ if (index == 1) return (eCertainStatus & 1) == 0 ? valid : invalid;
+ if (index == 3) return (eCertainStatus & 2) == 0 ? valid : invalid;
+ if (index == 5) return (eCertainStatus & 4) == 0 ? valid : invalid;
+ if (index == 7) return (eCertainStatus & 8) == 0 ? valid : invalid;
+ break;
+ case 4: // xox ooo xox
+ if (index == 0) return (eCertainStatus & 1) == 0 ? valid : invalid;
+ if (index == 2) return (eCertainStatus & 2) == 0 ? valid : invalid;
+ if (index == 6) return (eCertainStatus & 4) == 0 ? valid : invalid;
+ if (index == 8) return (eCertainStatus & 8) == 0 ? valid : invalid;
+ break;
+ case 5: // xox oxo xox
+ if (index == 0) return (eCertainStatus & 1) == 0 ? valid : invalid;
+ if (index == 2) return (eCertainStatus & 2) == 0 ? valid : invalid;
+ if (index == 4) return (eCertainStatus & 4) == 0 ? valid : invalid;
+ if (index == 6) return (eCertainStatus & 8) == 0 ? valid : invalid;
+ if (index == 8) return (eCertainStatus & 16) == 0 ? valid : invalid;
+ break;
+ }
+ return null;
+ })
+ .setPos(174 + (index % 3) * 6, 97 + (index / 3) * 6)
+ .setSize(4, 4));
+ }
+ builder.widget(new FakeSyncWidget.ByteSyncer(() -> eCertainMode, val -> eCertainMode = val))
+ .widget(new FakeSyncWidget.ByteSyncer(() -> eCertainStatus, val -> eCertainStatus = val));
+ }
+ }
+
+ protected ButtonWidget createPowerPassButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isPowerPassButtonEnabled() || ePowerPassCover) {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ ePowerPass = !ePowerPass;
+ if (!isAllowedToWorkButtonEnabled()) { // TRANSFORMER HACK
+ if (ePowerPass) {
+ getBaseMetaTileEntity().enableWorking();
+ } else {
+ getBaseMetaTileEntity().disableWorking();
+ }
+ }
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_STANDARD_16x16);
+ if (!isPowerPassButtonEnabled() && !ePowerPassCover) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_DISABLED);
+ } else {
+ if (ePowerPass) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_OFF);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(174, doesBindPlayerInventory() ? 116 : 140)
+ .setSize(16, 16);
+ if (isPowerPassButtonEnabled()) {
+ button.addTooltip("Power Pass")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ }
+ return (ButtonWidget) button;
+ }
+
+ protected ButtonWidget createSafeVoidButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isSafeVoidButtonEnabled()) {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ eSafeVoid = !eSafeVoid;
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_STANDARD_16x16);
+ if (!isSafeVoidButtonEnabled()) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_DISABLED);
+ } else {
+ if (eSafeVoid) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_OFF);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(174, doesBindPlayerInventory() ? 132 : 156)
+ .setSize(16, 16);
+ if (isSafeVoidButtonEnabled()) {
+ button.addTooltip("Safe Void")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ }
+ return (ButtonWidget) button;
+ }
+
+ protected ButtonWidget createPowerSwitchButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isAllowedToWorkButtonEnabled()) {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ getBaseMetaTileEntity().disableWorking();
+ } else {
+ getBaseMetaTileEntity().enableWorking();
+ }
+ }
+ })
+ .setPlayClickSound(false)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_STANDARD_16x16);
+ if (!isAllowedToWorkButtonEnabled()) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED);
+ } else {
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(174, doesBindPlayerInventory() ? 148 : 172)
+ .setSize(16, 16);
+ if (isAllowedToWorkButtonEnabled()) {
+ button.addTooltip("Power Switch")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ }
+ return (ButtonWidget) button;
+ }
+
+ private ModularWindow createLEDConfigurationWindow(int ledID) {
+ return ModularWindow.builder(100, 40)
+ .setBackground(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
+ .setPos(
+ (screenSize, mainWindow) -> new Pos2d(
+ (screenSize.width / 2 - mainWindow.getSize().width / 2) - 110,
+ (screenSize.height / 2 - mainWindow.getSize().height / 2)))
+ .widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(85, 3))
+ .widget(
+ new NumericWidget().setGetter(() -> parametrization.iParamsIn[ledID])
+ .setSetter(val -> parametrization.iParamsIn[ledID] = val)
+ .setIntegerOnly(false)
+ .modifyNumberFormat(format -> format.setMaximumFractionDigits(8))
+ .setTextColor(Color.LIGHT_BLUE.normal)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setFocusOnGuiOpen(true)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setPos(5, 20)
+ .setSize(90, 15))
+ .widget(
+ new TextWidget((ledID % 10) + ":" + (ledID / 10) + ":I").setDefaultColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .setPos(5, 5))
+ .build();
+ }
+
+ private void addParameterLED(ModularWindow.Builder builder, int hatch, int param, boolean input) {
+ final int parameterIndex = hatch + param * 10;
+ final int posIndex = hatch * 2 + param;
+ ButtonWidget ledWidget = new ButtonWidget() {
+
+ @Override
+ public void draw(float partialTicks) {
+ IDrawable texture = null;
+ final LedStatus status = input ? parametrization.eParamsInStatus[parameterIndex]
+ : parametrization.eParamsOutStatus[parameterIndex];
+ switch (status) {
+ case STATUS_WTF: {
+ int c = LEDCounter;
+ if (c > 4) {
+ c = TecTech.RANDOM.nextInt(5);
+ }
+ switch (c) {
+ case 0:
+ texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex];
+ break;
+ case 1:
+ texture = TecTechUITextures.PICTURE_PARAMETER_CYAN[posIndex];
+ break;
+ case 2:
+ texture = TecTechUITextures.PICTURE_PARAMETER_GREEN[posIndex];
+ break;
+ case 3:
+ texture = TecTechUITextures.PICTURE_PARAMETER_ORANGE[posIndex];
+ break;
+ case 4:
+ texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex];
+ break;
+ }
+ break;
+ }
+ case STATUS_WRONG: // fallthrough
+ if (LEDCounter < 2) {
+ texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex];
+ break;
+ } else if (LEDCounter < 4) {
+ texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex];
+ break;
+ }
+ case STATUS_OK: // ok
+ texture = TecTechUITextures.PICTURE_PARAMETER_GREEN[posIndex];
+ break;
+ case STATUS_TOO_LOW: // too low blink
+ if (LEDCounter < 3) {
+ texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex];
+ break;
+ }
+ case STATUS_LOW: // too low
+ texture = TecTechUITextures.PICTURE_PARAMETER_CYAN[posIndex];
+ break;
+ case STATUS_TOO_HIGH: // too high blink
+ if (LEDCounter < 3) {
+ texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex];
+ break;
+ }
+ case STATUS_HIGH: // too high
+ texture = TecTechUITextures.PICTURE_PARAMETER_ORANGE[posIndex];
+ break;
+ case STATUS_NEUTRAL:
+ if (LEDCounter < 3) {
+ GL11.glColor4f(.85f, .9f, .95f, .5F);
+ } else {
+ GL11.glColor4f(.8f, .9f, 1f, .5F);
+ }
+ texture = TecTechUITextures.PICTURE_PARAMETER_GRAY;
+ break;
+ case STATUS_UNDEFINED:
+ if (LEDCounter < 3) {
+ GL11.glColor4f(.5f, .1f, .15f, .5F);
+ } else {
+ GL11.glColor4f(0f, .1f, .2f, .5F);
+ }
+ texture = TecTechUITextures.PICTURE_PARAMETER_GRAY;
+ break;
+ case STATUS_UNUSED:
+ default:
+ // no-op
+ break;
+ }
+ setBackground(texture);
+ super.draw(partialTicks);
+ GL11.glColor4f(1f, 1f, 1f, 1f);
+ }
+ }.setOnClick((clickData, widget) -> {
+ if (!widget.isClient() && input
+ && parametrization.eParamsInStatus[parameterIndex] != LedStatus.STATUS_UNUSED) {
+ // We don't use CloseAllButMain here in case MB implementation adds their own window
+ for (int i = 0; i < parametrization.eParamsInStatus.length; i++) {
+ if (widget.getContext()
+ .isWindowOpen(LED_WINDOW_BASE_ID + i)) {
+ widget.getContext()
+ .closeWindow(LED_WINDOW_BASE_ID + i);
+ }
+ }
+ widget.getContext()
+ .openSyncedWindow(LED_WINDOW_BASE_ID + parameterIndex);
+ }
+ });
+ builder.widget(ledWidget.dynamicTooltip(() -> {
+ if (input) {
+ return getFullLedDescriptionIn(hatch, param);
+ } else {
+ return getFullLedDescriptionOut(hatch, param);
+ }
+ })
+ .setPos(12 + posIndex * 8, (doesBindPlayerInventory() ? 97 : 177) + (input ? 0 : 1) * 6)
+ .setSize(6, 4));
+ if (input) {
+ builder
+ .widget(
+ new FakeSyncWidget.ByteSyncer(
+ () -> parametrization.eParamsInStatus[parameterIndex].getOrdinalByte(),
+ val -> parametrization.eParamsInStatus[parameterIndex] = LedStatus.getStatus(val))
+ .setOnClientUpdate(val -> ledWidget.notifyTooltipChange()))
+ .widget(
+ new FakeSyncWidget.DoubleSyncer(
+ () -> parametrization.iParamsIn[parameterIndex],
+ val -> parametrization.iParamsIn[parameterIndex] = val)
+ .setOnClientUpdate(val -> ledWidget.notifyTooltipChange()));
+ } else {
+ builder
+ .widget(
+ new FakeSyncWidget.ByteSyncer(
+ () -> parametrization.eParamsOutStatus[parameterIndex].getOrdinalByte(),
+ val -> parametrization.eParamsOutStatus[parameterIndex] = LedStatus.getStatus(val))
+ .setOnClientUpdate(val -> ledWidget.notifyTooltipChange()))
+ .widget(
+ new FakeSyncWidget.DoubleSyncer(
+ () -> parametrization.iParamsOut[parameterIndex],
+ val -> parametrization.iParamsOut[parameterIndex] = val)
+ .setOnClientUpdate(val -> ledWidget.notifyTooltipChange()));
+ }
+ }
+
+ // endregion
+
+ protected void turnOffMaintenance() {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ hasMaintenanceChecks = false;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java
new file mode 100644
index 0000000000..11867c067a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java
@@ -0,0 +1,6 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+public interface INameFunction<T extends GT_MetaTileEntity_MultiblockBase_EM> {
+
+ String apply(T t, Parameters.IParameter iParameter);
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java
new file mode 100644
index 0000000000..37d5664d20
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java
@@ -0,0 +1,6 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+public interface IStatusFunction<T extends GT_MetaTileEntity_MultiblockBase_EM> {
+
+ LedStatus apply(T t, Parameters.IParameter iParameter);
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java
new file mode 100644
index 0000000000..e99739b69e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java
@@ -0,0 +1,64 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+import java.util.function.Supplier;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import com.github.technus.tectech.TecTech;
+
+public enum LedStatus {
+
+ STATUS_UNUSED(() -> EnumChatFormatting.DARK_GRAY + "Unused", true), //
+ STATUS_TOO_LOW(() -> EnumChatFormatting.BLUE + "Too Low", false), //
+ STATUS_LOW(() -> EnumChatFormatting.AQUA + "Low", true), //
+ STATUS_WRONG(() -> EnumChatFormatting.DARK_PURPLE + "Wrong", false), //
+ STATUS_OK(() -> EnumChatFormatting.GREEN + "Valid", true), //
+ STATUS_TOO_HIGH(() -> EnumChatFormatting.RED + "Too High", false), //
+ STATUS_HIGH(() -> EnumChatFormatting.GOLD + "High", true), //
+ STATUS_UNDEFINED(() -> EnumChatFormatting.GRAY + "Unknown", false),
+ STATUS_NEUTRAL(() -> EnumChatFormatting.WHITE + "Neutral", true),
+ STATUS_WTF(() -> LedStatus.values()[TecTech.RANDOM.nextInt(9)].name.get(), false);
+
+ public final Supplier<String> name;
+ public final boolean isOk;
+
+ LedStatus(Supplier<String> name, boolean ok) {
+ this.name = name;
+ this.isOk = ok;
+ }
+
+ public byte getOrdinalByte() {
+ return (byte) ordinal();
+ }
+
+ public static LedStatus getStatus(byte value) {
+ try {
+ return LedStatus.values()[value];
+ } catch (Exception e) {
+ return STATUS_UNDEFINED;
+ }
+ }
+
+ public static LedStatus[] makeArray(int count, LedStatus defaultValue) {
+ LedStatus[] statuses = new LedStatus[count];
+ for (int i = 0; i < count; i++) {
+ statuses[i] = defaultValue;
+ }
+ return statuses;
+ }
+
+ public static LedStatus fromLimitsInclusiveOuterBoundary(double value, double min, double low, double high,
+ double max, double... excludedNumbers) {
+ if (value < min) return STATUS_TOO_LOW;
+ if (value > max) return STATUS_TOO_HIGH;
+
+ if (value < low) return STATUS_LOW;
+ if (value > high) return STATUS_HIGH;
+ for (double val : excludedNumbers) {
+ if (val == value) return STATUS_WRONG;
+ }
+ if (Double.isNaN(value)) return STATUS_WRONG;
+ return STATUS_OK;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java
new file mode 100644
index 0000000000..5b2c73b593
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java
@@ -0,0 +1,327 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+import java.util.ArrayList;
+
+/**
+ * Instantiate parameters as field in parametersInstantiation_EM();
+ */
+public class Parameters {
+
+ private static final IStatusFunction<?> LED_STATUS_FUNCTION_DEFAULT = (b, p) -> LedStatus.STATUS_UNDEFINED;
+ private static final INameFunction<?> NAME_FUNCTION_DEFAULT = (b, p) -> "Undefined";
+
+ final Group[] groups = new Group[10];
+
+ double[] iParamsIn = new double[20]; // number I from parametrizers
+ double[] iParamsOut = new double[20]; // number O to parametrizers
+ final ArrayList<Group.ParameterIn> parameterInArrayList = new ArrayList<>();
+ final ArrayList<Group.ParameterOut> parameterOutArrayList = new ArrayList<>();
+
+ // package private for use in gui
+ LedStatus[] eParamsInStatus = LedStatus.makeArray(20, LedStatus.STATUS_UNUSED); // LED status for I
+ LedStatus[] eParamsOutStatus = LedStatus.makeArray(20, LedStatus.STATUS_UNUSED); // LED status for O
+
+ double getIn(int hatchNo, int parameterId) {
+ return iParamsIn[hatchNo + 10 * parameterId];
+ }
+
+ double getOut(int hatchNo, int parameterId) {
+ return iParamsOut[hatchNo + 10 * parameterId];
+ }
+
+ LedStatus getStatusIn(int hatchNo, int parameterId) {
+ return eParamsInStatus[hatchNo + 10 * parameterId];
+ }
+
+ LedStatus getStatusOut(int hatchNo, int parameterId) {
+ return eParamsOutStatus[hatchNo + 10 * parameterId];
+ }
+
+ private final GT_MetaTileEntity_MultiblockBase_EM parent;
+
+ Parameters(GT_MetaTileEntity_MultiblockBase_EM parent) {
+ this.parent = parent;
+ }
+
+ public boolean trySetParameters(int hatch, double parameter0, double parameter1) {
+ Group p = groups[hatch];
+ if (parent.mMaxProgresstime <= 0 || (p != null && p.updateWhileRunning)) {
+ iParamsIn[hatch] = parameter0;
+ iParamsIn[hatch + 10] = parameter1;
+ return true;
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unused") // Used in GTNH-Intergalactic, do not delete.
+ public boolean trySetParameters(int hatchNo, int parameterId, double parameter) {
+ Group p = groups[hatchNo];
+ if (parent.mMaxProgresstime <= 0 || (p != null && p.updateWhileRunning)) {
+ iParamsIn[hatchNo + 10 * parameterId] = parameter;
+ return true;
+ }
+ return false;
+ }
+
+ public void setToDefaults(int hatch, boolean defaultIn, boolean defaultOut) {
+ Group p = groups[hatch];
+ if (p == null) {
+ if (defaultIn) {
+ iParamsIn[hatch] = 0;
+ iParamsIn[hatch + 10] = 0;
+ }
+ if (defaultOut) {
+ iParamsOut[hatch] = 0;
+ iParamsOut[hatch + 10] = 0;
+ }
+ } else {
+ p.setToDefaults(defaultIn, defaultOut);
+ }
+ }
+
+ public void setToDefaults(boolean defaultIn, boolean defaultOut) {
+ for (int hatch = 0; hatch < 10; hatch++) {
+ setToDefaults(hatch, defaultIn, defaultOut);
+ }
+ }
+
+ public Group getGroup(int hatchNo, boolean updateWhileRunning) {
+ return groups[hatchNo] != null ? groups[hatchNo] : new Group(hatchNo, updateWhileRunning);
+ }
+
+ public Group getGroup(int hatchNo) {
+ return groups[hatchNo] != null ? groups[hatchNo] : new Group(hatchNo, false);
+ }
+
+ public interface IParameter {
+
+ double get();
+
+ double getDefault();
+
+ void updateStatus();
+
+ LedStatus getStatus(boolean update);
+
+ int id();
+
+ int hatchId();
+
+ int parameterId();
+
+ String getBrief();
+ }
+
+ /**
+ * most likely used locally in parametersInstantiation_EM()
+ */
+ public class Group {
+
+ private final int hatchNo;
+ public final ParameterIn[] parameterIn = new ParameterIn[2];
+ public final ParameterOut[] parameterOut = new ParameterOut[2];
+ public boolean updateWhileRunning;
+
+ private Group(int hatchNo, boolean updateWhileRunning) {
+ if (hatchNo < 0 || hatchNo >= 10) {
+ throw new IllegalArgumentException("Hatch id must be in 0 to 9 range");
+ }
+ this.hatchNo = hatchNo;
+ this.updateWhileRunning = updateWhileRunning;
+ groups[hatchNo] = this;
+ }
+
+ public ParameterIn makeInParameter(int paramID, double defaultValue, INameFunction<?> name,
+ IStatusFunction<?> status) {
+ return new ParameterIn(paramID, defaultValue, name, status);
+ }
+
+ public ParameterOut makeOutParameter(int paramID, double defaultValue, INameFunction<?> name,
+ IStatusFunction<?> status) {
+ return new ParameterOut(paramID, defaultValue, name, status);
+ }
+
+ public void setToDefaults(boolean defaultIn, boolean defaultOut) {
+ if (defaultIn) {
+ if (this.parameterIn[0] != null) {
+ this.parameterIn[0].setDefault();
+ } else {
+ iParamsIn[hatchNo] = 0;
+ }
+ if (this.parameterIn[1] != null) {
+ this.parameterIn[1].setDefault();
+ } else {
+ iParamsIn[hatchNo + 10] = 0;
+ }
+ }
+ if (defaultOut) {
+ if (this.parameterOut[0] != null) {
+ this.parameterOut[0].setDefault();
+ } else {
+ iParamsOut[hatchNo] = 0;
+ }
+ if (this.parameterOut[1] != null) {
+ this.parameterOut[1].setDefault();
+ } else {
+ iParamsOut[hatchNo + 10] = 0;
+ }
+ }
+ }
+
+ /**
+ * Make a field out of this...
+ */
+ public class ParameterOut implements IParameter {
+
+ public final int id;
+ public final double defaultValue;
+ IStatusFunction status;
+ INameFunction name;
+
+ private ParameterOut(int paramID, double defaultValue, INameFunction<?> name, IStatusFunction<?> status) {
+ this.name = name == null ? NAME_FUNCTION_DEFAULT : name;
+ if (paramID < 0 || paramID > 2) {
+ throw new IllegalArgumentException("Parameter id must be in 0 to 1 range");
+ }
+ if (parameterOut[paramID] != null) {
+ throw new IllegalArgumentException("Parameter id already occupied");
+ }
+ this.id = hatchNo + 10 * paramID;
+ this.defaultValue = defaultValue;
+ this.status = status == null ? LED_STATUS_FUNCTION_DEFAULT : status;
+ parameterOutArrayList.add(this);
+ parameterOut[paramID] = this;
+ }
+
+ void setDefault() {
+ set(defaultValue);
+ }
+
+ @Override
+ public double get() {
+ return iParamsOut[id];
+ }
+
+ @Override
+ public double getDefault() {
+ return defaultValue;
+ }
+
+ public void set(double value) {
+ iParamsOut[id] = value;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void updateStatus() {
+ eParamsOutStatus[id] = status.apply(parent, this);
+ }
+
+ @Override
+ public LedStatus getStatus(boolean update) {
+ if (update) {
+ updateStatus();
+ }
+ return eParamsOutStatus[id];
+ }
+
+ @Override
+ public String getBrief() {
+ return name.apply(parent, this);
+ }
+
+ @Override
+ public int id() {
+ return id;
+ }
+
+ @Override
+ public int hatchId() {
+ return id % 10;
+ }
+
+ @Override
+ public int parameterId() {
+ return id / 10;
+ }
+ }
+
+ /**
+ * Make a field out of this...
+ */
+ public class ParameterIn implements IParameter {
+
+ public final int id;
+ public final double defaultValue;
+ IStatusFunction status;
+ INameFunction name;
+
+ private ParameterIn(int paramID, double defaultValue, INameFunction<?> name, IStatusFunction<?> status) {
+ this.name = name == null ? NAME_FUNCTION_DEFAULT : name;
+ this.id = hatchNo + 10 * paramID;
+ if (paramID < 0 || paramID > 2) {
+ throw new IllegalArgumentException("Parameter id must be in 0 to 1 range");
+ }
+ if (parameterIn[paramID] != null) {
+ throw new IllegalArgumentException("Parameter id already occupied");
+ }
+ this.defaultValue = defaultValue;
+ this.status = status == null ? LED_STATUS_FUNCTION_DEFAULT : status;
+ parameterInArrayList.add(this);
+ parameterIn[paramID] = this;
+ }
+
+ void setDefault() {
+ set(defaultValue);
+ }
+
+ @Override
+ public double get() {
+ return iParamsIn[id];
+ }
+
+ void set(double value) {
+ iParamsIn[id] = value;
+ }
+
+ @Override
+ public double getDefault() {
+ return defaultValue;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void updateStatus() {
+ eParamsInStatus[id] = status.apply(parent, this);
+ }
+
+ @Override
+ public LedStatus getStatus(boolean update) {
+ if (update) {
+ updateStatus();
+ }
+ return eParamsInStatus[id];
+ }
+
+ @Override
+ public String getBrief() {
+ return name.apply(parent, this);
+ }
+
+ @Override
+ public int id() {
+ return id;
+ }
+
+ @Override
+ public int hatchId() {
+ return id % 10;
+ }
+
+ @Override
+ public int parameterId() {
+ return id / 10;
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java
new file mode 100644
index 0000000000..591f7d3be5
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java
@@ -0,0 +1,59 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base;
+
+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;
+
+@SideOnly(Side.CLIENT)
+public class SoundLoop extends MovingSound {
+
+ private final boolean whileActive;
+ private final boolean whileInactive;
+ private final int worldID;
+ private boolean fadeMe = false;
+
+ public 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 = 0.0625f;
+ }
+
+ @Override
+ public void update() {
+ if (donePlaying) {
+ return;
+ }
+ if (fadeMe) {
+ volume -= 0.0625f;
+ if (volume <= 0) {
+ volume = 0;
+ donePlaying = true;
+ }
+ } else if (volume < 1) {
+ volume += 0.0625f;
+ }
+ 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)) {
+ donePlaying = true;
+ return;
+ }
+ fadeMe |= ((IGregTechTileEntity) tile).isActive() ? whileActive : whileInactive;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java
new file mode 100644
index 0000000000..6e5597516b
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java
@@ -0,0 +1,25 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.base.render;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.common.render.GT_RenderedTexture;
+
+public class TT_RenderedExtendedFacingTexture extends GT_RenderedTexture {
+
+ public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa, boolean allowAlpha, boolean glow,
+ boolean stdOrient, boolean extFacing) {
+ super(aIcon, aRGBa, allowAlpha, glow, stdOrient, extFacing);
+ }
+
+ public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) {
+ this(aIcon, aRGBa, aAllowAlpha, false, false, true);
+ }
+
+ public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa) {
+ this(aIcon, aRGBa, true);
+ }
+
+ public TT_RenderedExtendedFacingTexture(IIconContainer aIcon) {
+ this(aIcon, Dyes._NULL.mRGBa);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java
new file mode 100644
index 0000000000..004fc2b40a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java
@@ -0,0 +1,497 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+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.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+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.math.Size;
+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.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+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 com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+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_UITextures;
+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.util.GT_StructureUtility;
+
+public class GT_MetaTileEntity_EM_BaseModule extends GT_MetaTileEntity_MultiblockBase_EM {
+
+ protected final int tier = getTier();
+ protected boolean isConnected = false;
+ protected double overclockTimeFactor = 2d;
+ protected boolean isUpgrade83Unlocked = false;
+ protected boolean isMultiStepPlasmaCapable = false;
+ protected boolean isMagmatterCapable = false;
+ private boolean isVoltageConfigUnlocked = false;
+ protected UUID userUUID;
+ protected int machineHeat = 0;
+ protected int overclockHeat = 0;
+ protected int maximumParallel = 0;
+ protected int plasmaTier = 0;
+ protected float processingSpeedBonus = 0;
+ protected float energyDiscount = 0;
+ protected long processingVoltage = 2_000_000_000;
+ protected BigInteger powerTally = BigInteger.ZERO;
+ protected long recipeTally = 0;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final int VOLTAGE_WINDOW_ID = 9;
+ private static final int TEXTURE_INDEX = 960;
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_BaseModule> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_EM_BaseModule>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ new String[][] { { " ", " BBB ", " BBBBB ", " BB~BB ", " BBBBB ", " BBB ", " " },
+ { " CCC ", " CFFFC ", "CFFFFFC", "CFFFFFC", "CFFFFFC", " CFFFC ", " CCC " },
+ { " ", " ", " E ", " EAE ", " E ", " ", " " },
+ { " ", " ", " E ", " EAE ", " E ", " ", " " },
+ { " ", " ", " E ", " EAE ", " E ", " ", " " },
+ { " ", " ", " E ", " EAE ", " E ", " ", " " },
+ { " ", " ", " ", " D ", " ", " ", " " },
+ { " ", " ", " ", " D ", " ", " ", " " },
+ { " ", " ", " ", " D ", " ", " ", " " },
+ { " ", " ", " ", " D ", " ", " ", " " },
+ { " ", " ", " ", " D ", " ", " ", " " },
+ { " ", " ", " ", " G ", " ", " ", " " } })
+ .addElement('A', ofBlock(GregTech_API.sSolenoidCoilCasings, 9))
+ .addElement(
+ 'B',
+ GT_StructureUtility.ofHatchAdderOptional(
+ GT_MetaTileEntity_EM_BaseModule::addClassicToMachineList,
+ TEXTURE_INDEX,
+ 1,
+ GodforgeCasings,
+ 0))
+ .addElement('C', ofBlock(GodforgeCasings, 0))
+ .addElement('D', ofBlock(GodforgeCasings, 1))
+ .addElement('E', ofBlock(GodforgeCasings, 2))
+ .addElement('F', ofBlock(GodforgeCasings, 3))
+ .addElement('G', ofBlock(GodforgeCasings, 4))
+ .build();
+
+ public GT_MetaTileEntity_EM_BaseModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_BaseModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_BaseModule(mName);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && isConnected) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aTick % 400 == 0) fixAllIssues();
+ if (mEfficiency < 0) mEfficiency = 0;
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Override
+ public boolean drainEnergyInput(long EUtEffective, long Amperes) {
+ long EU_drain = EUtEffective * Amperes;
+ if (EU_drain == 0L) {
+ return true;
+ } else {
+ if (EU_drain > 0L) {
+ EU_drain = -EU_drain;
+ }
+ return addEUToGlobalEnergyMap(userUUID, EU_drain);
+ }
+ }
+
+ public void connect() {
+ isConnected = true;
+ }
+
+ public void disconnect() {
+ isConnected = false;
+ }
+
+ public void setHeat(int heat) {
+ machineHeat = heat;
+ }
+
+ public int getHeat() {
+ return machineHeat;
+ }
+
+ public void setHeatForOC(int heat) {
+ overclockHeat = heat;
+ }
+
+ public int getHeatForOC() {
+ return overclockHeat;
+ }
+
+ public void setMaxParallel(int parallel) {
+ maximumParallel = parallel;
+ }
+
+ public int getMaxParallel() {
+ return maximumParallel;
+ }
+
+ public void setSpeedBonus(float bonus) {
+ processingSpeedBonus = bonus;
+ }
+
+ public float getSpeedBonus() {
+ return processingSpeedBonus;
+ }
+
+ public void setEnergyDiscount(float discount) {
+ energyDiscount = discount;
+ }
+
+ public float getEnergyDiscount() {
+ return energyDiscount;
+ }
+
+ public void setUpgrade83(boolean unlocked) {
+ isUpgrade83Unlocked = unlocked;
+ }
+
+ public void setOverclockTimeFactor(double factor) {
+ overclockTimeFactor = factor;
+ }
+
+ public double getOverclockTimeFactor() {
+ return overclockTimeFactor;
+ }
+
+ public void setMultiStepPlasma(boolean isCapable) {
+ isMultiStepPlasmaCapable = isCapable;
+ }
+
+ public void setProcessingVoltage(long Voltage) {
+ processingVoltage = Voltage;
+ }
+
+ public long getProcessingVoltage() {
+ return processingVoltage;
+ }
+
+ public void setMagmatterCapable(boolean isCapable) {
+ isMagmatterCapable = isCapable;
+ }
+
+ public float getHeatEnergyDiscount() {
+ return isUpgrade83Unlocked ? 0.92f : 0.95f;
+ }
+
+ public void setPlasmaTier(int tier) {
+ plasmaTier = tier;
+ }
+
+ public int getPlasmaTier() {
+ return plasmaTier;
+ }
+
+ public void setVoltageConfig(boolean unlocked) {
+ isVoltageConfigUnlocked = unlocked;
+ }
+
+ public void setPowerTally(BigInteger amount) {
+ powerTally = amount;
+ }
+
+ public BigInteger getPowerTally() {
+ return powerTally;
+ }
+
+ public void addToPowerTally(BigInteger amount) {
+ powerTally = powerTally.add(amount);
+ }
+
+ public void setRecipeTally(long amount) {
+ recipeTally = amount;
+ }
+
+ public long getRecipeTally() {
+ return recipeTally;
+ }
+
+ public void addToRecipeTally(long amount) {
+ recipeTally += amount;
+ }
+
+ protected void fixAllIssues() {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ }
+
+ public int getTier() {
+ return tier;
+ }
+
+ @Override
+ public long getMaxInputVoltage() {
+ return gregtech.api.enums.GT_Values.V[tier];
+ }
+
+ @Override
+ public IStructureDefinition<? extends GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ fixAllIssues();
+ return structureCheck_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) {
+ userUUID = processInitialSettings(aBaseMetaTileEntity);
+ }
+ }
+
+ @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);
+
+ buildContext.addSyncedWindow(VOLTAGE_WINDOW_ID, this::createVoltageWindow);
+
+ builder.widget(
+ TextWidget.dynamicText(this::connectionStatus)
+ .setDefaultColor(EnumChatFormatting.BLACK)
+ .setPos(75, 94)
+ .setSize(100, 10));
+
+ builder.widget(createPowerSwitchButton(builder))
+ .widget(createVoidExcessButton(builder))
+ .widget(createInputSeparationButton(builder))
+ .widget(createBatchModeButton(builder))
+ .widget(createLockToSingleRecipeButton(builder))
+ .widget(createVoltageButton(builder));
+ }
+
+ protected Widget createVoltageButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isVoltageConfigUnlocked) {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(VOLTAGE_WINDOW_ID);
+ }
+ }
+ })
+ .setPlayClickSound(isVoltageConfigUnlocked)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isVoltageConfigUnlocked) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_DISABLED);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .addTooltip(translateToLocal("fog.button.voltageconfig.tooltip.01"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 129)
+ .setSize(16, 16)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> isVoltageConfigUnlocked, val -> isVoltageConfigUnlocked = val),
+ builder);
+ if (!isVoltageConfigUnlocked) {
+ button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.voltageconfig.tooltip.02"));
+ }
+ return button;
+ }
+
+ protected ModularWindow createVoltageWindow(final EntityPlayer player) {
+ final int WIDTH = 158;
+ final int HEIGHT = 52;
+ 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.BottomRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
+ .add(WIDTH - 3, 0)
+ .subtract(0, 10)));
+ builder.widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.voltageinfo")
+ .setPos(3, 4)
+ .setSize(150, 20))
+ .widget(
+ new NumericWidget().setSetter(val -> processingVoltage = (long) val)
+ .setGetter(() -> processingVoltage)
+ .setBounds(2_000_000_000, Long.MAX_VALUE)
+ .setDefaultValue(2_000_000_000)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(150, 18)
+ .setPos(4, 25)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .attachSyncer(
+ new FakeSyncWidget.LongSyncer(this::getProcessingVoltage, this::setProcessingVoltage),
+ builder));
+ return builder.build();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO)
+ .setSize(18, 18)
+ .setPos(172, 67));
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean willExplodeInRain() {
+ return false;
+ }
+
+ private Text connectionStatus() {
+ String status = EnumChatFormatting.RED
+ + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.false");
+ if (isConnected) {
+ status = EnumChatFormatting.GREEN + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.true");
+ }
+ return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus") + " " + status);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setBoolean("isConnected", isConnected);
+ NBT.setBoolean("isVoltageConfigUnlocked", isVoltageConfigUnlocked);
+ NBT.setLong("processingVoltage", processingVoltage);
+ NBT.setLong("recipeTally", recipeTally);
+ NBT.setByteArray("powerTally", powerTally.toByteArray());
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+ isConnected = NBT.getBoolean("isConnected");
+ isVoltageConfigUnlocked = NBT.getBoolean("isVoltageConfigUnlocked");
+ processingVoltage = NBT.getLong("processingVoltage");
+ recipeTally = NBT.getLong("recipeTally");
+ powerTally = new BigInteger(NBT.getByteArray("powerTally"));
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_MODULE_ACTIVE");
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/SCREEN_OFF");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX),
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX) };
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java
new file mode 100644
index 0000000000..7e5c0d0b94
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java
@@ -0,0 +1,529 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterItemMap;
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaFluidMap;
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaItemMap;
+import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes;
+import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.github.technus.tectech.util.CommonValues;
+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.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.MaterialsUEVplus;
+import gregtech.api.enums.TierEU;
+import gregtech.api.gui.modularui.GT_UITextures;
+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.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_ExoticModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private int numberOfFluids = 0;
+ private int numberOfItems = 0;
+ private long wirelessEUt = 0;
+ private long EUt = 0;
+ private long actualParallel = 0;
+ private boolean recipeInProgress = false;
+ private boolean magmatterMode = false;
+ private FluidStack[] randomizedFluidInput = new FluidStack[] {};
+ private ItemStack[] randomizedItemInput = new ItemStack[] {};
+ List<FluidStack> inputPlasmas = new ArrayList<>();
+ private GT_Recipe plasmaRecipe = null;
+ private static RecipeMap<RecipeMapBackend> tempRecipeMap = RecipeMapBuilder.of("bye")
+ .maxIO(0, 0, 7, 2)
+ .disableRegisterNEI()
+ .build();
+ private static final RecipeMap<RecipeMapBackend> emptyRecipeMap = RecipeMapBuilder.of("hey")
+ .maxIO(0, 0, 7, 2)
+ .disableRegisterNEI()
+ .build();
+ private static final int NUMBER_OF_INPUTS = 7;
+
+ public GT_MetaTileEntity_EM_ExoticModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_ExoticModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_ExoticModule(mName);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (!recipeInProgress) {
+ actualParallel = getMaxParallel();
+ FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000 * actualParallel);
+ tempRecipeMap = emptyRecipeMap;
+ if (magmatterMode) {
+ randomizedItemInput = getRandomItemInputs(exoticModuleMagmatterItemMap, 1);
+ numberOfItems = 1;
+ numberOfFluids = 2;
+ int timeAmount = getRandomIntInRange(1, 50);
+ int spaceAmount = getRandomIntInRange(51, 100);
+ randomizedFluidInput = new FluidStack[] { MaterialsUEVplus.Time.getMolten(timeAmount * 1000L),
+ MaterialsUEVplus.Space.getMolten(spaceAmount * 1000L) };
+ inputPlasmas = new ArrayList<>(
+ Arrays.asList(
+ convertItemToPlasma(randomizedItemInput, (spaceAmount - timeAmount) * actualParallel)));
+ inputPlasmas.add(MaterialsUEVplus.Time.getMolten(timeAmount * actualParallel));
+ inputPlasmas.add(MaterialsUEVplus.Space.getMolten(spaceAmount * actualParallel));
+ outputFluid = MaterialsUEVplus.MagMatter.getMolten(144 * actualParallel);
+ } else {
+ numberOfFluids = getRandomIntInRange(0, NUMBER_OF_INPUTS);
+ numberOfItems = NUMBER_OF_INPUTS - numberOfFluids;
+ randomizedFluidInput = getRandomFluidInputs(exoticModulePlasmaFluidMap, numberOfFluids);
+ randomizedItemInput = getRandomItemInputs(exoticModulePlasmaItemMap, numberOfItems);
+
+ if (numberOfFluids != 0) {
+ for (FluidStack fluidStack : randomizedFluidInput) {
+ fluidStack.amount = 1000 * getRandomIntInRange(1, 64);
+ }
+ }
+
+ if (numberOfItems != 0) {
+ for (ItemStack itemStack : randomizedItemInput) {
+ itemStack.stackSize = getRandomIntInRange(1, 64);
+ }
+ }
+
+ inputPlasmas = new ArrayList<>(
+ Arrays.asList(convertItemToPlasma(randomizedItemInput, actualParallel)));
+ inputPlasmas.addAll(Arrays.asList(convertFluidToPlasma(randomizedFluidInput, actualParallel)));
+ }
+ plasmaRecipe = new GT_Recipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ inputPlasmas.toArray(new FluidStack[0]),
+ new FluidStack[] { outputFluid },
+ 10 * SECONDS * (int) actualParallel,
+ (int) TierEU.RECIPE_MAX,
+ 0);
+
+ tempRecipeMap.add(plasmaRecipe);
+ }
+ return tempRecipeMap.getAllRecipes()
+ .parallelStream();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ if (!recipeInProgress) {
+ maxParallel = 1;
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ tempRecipeMap = emptyRecipeMap;
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+
+ if (numberOfFluids != 0) {
+ for (FluidStack fluidStack : randomizedFluidInput) {
+ dumpFluid(
+ mOutputHatches,
+ new FluidStack(
+ fluidStack.getFluid(),
+ (int) (fluidStack.amount / 1000 * actualParallel)),
+ false);
+ }
+ }
+
+ if (numberOfItems != 0) {
+ long multiplier = actualParallel;
+ if (magmatterMode) {
+ multiplier = 1;
+ }
+ for (ItemStack itemStack : randomizedItemInput) {
+ int stacksize = (int) (itemStack.stackSize * multiplier);
+ ItemStack tmpItem = itemStack.copy();
+ // split itemStacks > 64
+ while (stacksize >= 64) {
+ tmpItem.stackSize = 64;
+ addOutput(tmpItem);
+ stacksize -= 64;
+ }
+ tmpItem.stackSize = stacksize;
+ addOutput(tmpItem);
+
+ }
+ }
+
+ recipeInProgress = true;
+ }
+ if (new HashSet<>(Arrays.asList(inputFluids)).containsAll(inputPlasmas)) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ return SimpleCheckRecipeResult.ofFailure("waiting_for_inputs");
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ addToPowerTally(
+ BigInteger.valueOf(calculatedEut)
+ .multiply(BigInteger.valueOf(duration)));
+ addToRecipeTally(calculatedParallels);
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ tempRecipeMap = emptyRecipeMap;
+ recipeInProgress = false;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
+ .setDurationDecreasePerOC(getOverclockTimeFactor());
+ }
+
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setSpeedBonus(getSpeedBonus());
+ logic.setEuModifier(getEnergyDiscount());
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return godforgeExoticMatterRecipes;
+ }
+
+ private FluidStack[] getRandomFluidInputs(HashMap<FluidStack, Integer> fluidMap, int numberOfFluids) {
+ int cumulativeWeight = 0;
+
+ List<Map.Entry<FluidStack, Integer>> fluidEntryList = new ArrayList<>(fluidMap.entrySet());
+
+ List<Integer> cumulativeWeights = new ArrayList<>();
+ for (Map.Entry<FluidStack, Integer> entry : fluidEntryList) {
+ cumulativeWeight += entry.getValue();
+ cumulativeWeights.add(cumulativeWeight);
+ }
+
+ List<FluidStack> pickedFluids = new ArrayList<>();
+ for (int i = 0; i < numberOfFluids; i++) {
+ int randomWeight = getRandomIntInRange(1, cumulativeWeight);
+ // Find the corresponding FluidStack based on randomWeight
+ for (int j = 0; j < cumulativeWeights.size(); j++) {
+ if (randomWeight <= cumulativeWeights.get(j)) {
+ FluidStack pickedFluid = fluidEntryList.get(j)
+ .getKey();
+ // prevent duplicates
+ if (pickedFluids.contains(pickedFluid)) {
+ i--;
+ break;
+ }
+ pickedFluids.add(pickedFluid);
+ break;
+ }
+ }
+ }
+
+ return pickedFluids.toArray(new FluidStack[0]);
+
+ }
+
+ private ItemStack[] getRandomItemInputs(HashMap<ItemStack, Integer> itemMap, int numberOfItems) {
+ int cumulativeWeight = 0;
+
+ List<Map.Entry<ItemStack, Integer>> itemEntryList = new ArrayList<>(itemMap.entrySet());
+
+ List<Integer> cumulativeWeights = new ArrayList<>();
+ for (Map.Entry<ItemStack, Integer> entry : itemEntryList) {
+ cumulativeWeight += entry.getValue();
+ cumulativeWeights.add(cumulativeWeight);
+ }
+
+ List<ItemStack> pickedItems = new ArrayList<>();
+ for (int i = 0; i < numberOfItems; i++) {
+ int randomWeight = getRandomIntInRange(1, cumulativeWeight);
+ // Find the corresponding ItemStack based on randomWeight
+ for (int j = 0; j < cumulativeWeights.size(); j++) {
+ if (randomWeight <= cumulativeWeights.get(j)) {
+ ItemStack pickedItem = itemEntryList.get(j)
+ .getKey();
+ // prevent duplicates
+ if (pickedItems.contains(pickedItem)) {
+ i--;
+ break;
+ }
+ pickedItems.add(pickedItem);
+ break;
+ }
+ }
+ }
+ return pickedItems.toArray(new ItemStack[0]);
+
+ }
+
+ private FluidStack[] convertItemToPlasma(ItemStack[] items, long multiplier) {
+ List<FluidStack> plasmas = new ArrayList<>();
+
+ for (ItemStack itemStack : items) {
+ String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(itemStack)[0]);
+ // substring 8 because dustTiny is 8 characters long and there is no other possible oreDict
+ String strippedOreDict = dict.substring(8);
+ plasmas.add(
+ FluidRegistry.getFluidStack(
+ "plasma." + strippedOreDict.toLowerCase(),
+ (int) (INGOTS * multiplier * itemStack.stackSize)));
+ }
+
+ return plasmas.toArray(new FluidStack[0]);
+ }
+
+ private FluidStack[] convertFluidToPlasma(FluidStack[] fluids, long multiplier) {
+ List<FluidStack> plasmas = new ArrayList<>();
+
+ for (FluidStack fluidStack : fluids) {
+ String[] fluidName = fluidStack.getUnlocalizedName()
+ .split("\\.");
+ plasmas.add(
+ FluidRegistry.getFluidStack(
+ "plasma." + fluidName[fluidName.length - 1],
+ (int) (multiplier * fluidStack.amount)));
+ }
+
+ return plasmas.toArray(new FluidStack[0]);
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+
+ NBT.setBoolean("recipeInProgress", recipeInProgress);
+ NBT.setBoolean("magmatterMode", magmatterMode);
+
+ // Store damage values/stack sizes of input plasmas
+ NBTTagCompound fluidStackListNBTTag = new NBTTagCompound();
+ fluidStackListNBTTag.setLong("numberOfPlasmas", inputPlasmas.size());
+
+ int indexFluids = 0;
+ for (FluidStack fluidStack : inputPlasmas) {
+ // Save fluid amount to NBT
+ fluidStackListNBTTag.setLong(indexFluids + "fluidAmount", fluidStack.amount);
+
+ // Save FluidStack to NBT
+ NBT.setTag(indexFluids + "fluidStack", fluidStack.writeToNBT(new NBTTagCompound()));
+
+ indexFluids++;
+ }
+
+ NBT.setTag("inputPlasmas", fluidStackListNBTTag);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+
+ recipeInProgress = NBT.getBoolean("recipeInProgress");
+ magmatterMode = NBT.getBoolean("magmatterMode");
+
+ // Load damage values/fluid amounts of input plasmas and convert back to fluids
+ NBTTagCompound tempFluidTag = NBT.getCompoundTag("inputPlasmas");
+
+ // Iterate over all stored fluids
+ for (int indexFluids = 0; indexFluids < tempFluidTag.getLong("numberOfPlasmas"); indexFluids++) {
+
+ // Load fluid amount from NBT
+ int fluidAmount = tempFluidTag.getInteger(indexFluids + "fluidAmount");
+
+ // Load FluidStack from NBT
+ FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(NBT.getCompoundTag(indexFluids + "fluidStack"));
+
+ inputPlasmas.add(new FluidStack(fluidStack, fluidAmount));
+ }
+ FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000);
+
+ if (magmatterMode) {
+ outputFluid = MaterialsUEVplus.MagMatter.getMolten(144);
+ }
+
+ tempRecipeMap.add(
+ new GT_Recipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ inputPlasmas.toArray(new FluidStack[0]),
+ new FluidStack[] { outputFluid },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 0));
+
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(magmatterSwitch(builder));
+
+ }
+
+ protected ButtonWidget magmatterSwitch(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isMagmatterCapable) {
+ magmatterMode = !magmatterMode;
+ }
+ })
+ .setPlayClickSound(isMagmatterCapable)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isMagmatterModeOn()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (isMagmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isMagmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ }
+ if (!isMagmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isMagmatterModeOn, this::setMagmatterMode), builder)
+ .addTooltip(translateToLocal("fog.button.magmattermode.tooltip.01"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 91)
+ .setSize(16, 16)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> isMagmatterCapable, this::setMagmatterCapable),
+ builder);
+ if (!isMagmatterCapable) {
+ button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.magmattermode.tooltip.02"));
+ }
+ return (ButtonWidget) button;
+ }
+
+ public boolean isMagmatterModeOn() {
+ return magmatterMode;
+ }
+
+ private void setMagmatterMode(boolean enabled) {
+ magmatterMode = enabled;
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Exotic Matter Producer")
+ .addInfo("Controller block of the Quark Gluon Plasma Module")
+ .addInfo("Uses a Star to to turn Items into Quark Gluon Plasma")
+ .addSeparator()
+ .beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1)
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1)
+ .toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount()));
+ str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor()));
+ return str.toArray(new String[0]);
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java
new file mode 100644
index 0000000000..cfd0548f9e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java
@@ -0,0 +1,227 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static gregtech.api.util.GT_OreDictUnificator.getAssociation;
+import static gregtech.api.util.GT_ParallelHelper.addFluidsLong;
+import static gregtech.api.util.GT_ParallelHelper.addItemsLong;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_MoltenModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private int currentParallel = 0;
+
+ public GT_MetaTileEntity_EM_MoltenModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_MoltenModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_MoltenModule(mName);
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private FluidStack[] meltableItems;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+
+ if (recipe.mSpecialValue > getHeat()) {
+ return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+
+ meltableItems = new FluidStack[recipe.mOutputs.length];
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null) {
+ continue;
+ }
+ // if this is null it has to be a gt++ material
+ ItemData data = getAssociation(item);
+ Materials mat = data == null ? null : data.mMaterial.mMaterial;
+ if (mat != null) {
+ if (mat.mStandardMoltenFluid != null) {
+ meltableItems[i] = mat.getMolten(INGOTS);
+ } else if (mat.mFluid != null) {
+ meltableItems[i] = mat.getFluid(BUCKETS);
+ }
+ } else {
+ String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(item)[0]);
+ // substring 8 because ingotHot is 8 characters long
+ String strippedOreDict = dict.substring(8);
+ meltableItems[i] = FluidRegistry
+ .getFluidStack("molten." + strippedOreDict.toLowerCase(), INGOTS);
+ }
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setMachineHeat(getHeatForOC())
+ .setHeatDiscountMultiplier(getHeatEnergyDiscount())
+ .setDurationDecreasePerOC(getOverclockTimeFactor());
+
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
+ }
+ addToPowerTally(
+ BigInteger.valueOf(calculatedEut)
+ .multiply(BigInteger.valueOf(duration)));
+ addToRecipeTally(calculatedParallels);
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe).setCustomItemOutputCalculation(currentParallel -> {
+ ArrayList<ItemStack> outputItems = new ArrayList<>();
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null || meltableItems[i] != null) {
+ continue;
+ }
+ ItemStack itemToAdd = item.copy();
+ addItemsLong(outputItems, itemToAdd, (long) item.stackSize * currentParallel);
+ }
+ return outputItems.toArray(new ItemStack[0]);
+ })
+ .setCustomFluidOutputCalculation(currentParallel -> {
+ ArrayList<FluidStack> fluids = new ArrayList<>();
+
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ FluidStack fluid = meltableItems[i];
+ if (fluid == null) {
+ continue;
+ }
+ FluidStack fluidToAdd = fluid.copy();
+ long fluidAmount = (long) fluidToAdd.amount * recipe.mOutputs[i].stackSize
+ * currentParallel;
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+
+ for (int i = 0; i < recipe.mFluidOutputs.length; i++) {
+ FluidStack fluid = recipe.getFluidOutput(i);
+ if (fluid == null) {
+ continue;
+ }
+ FluidStack fluidToAdd = fluid.copy();
+ addFluidsLong(fluids, fluidToAdd, (long) fluidToAdd.amount * currentParallel);
+ }
+ return fluids.toArray(new FluidStack[0]);
+ });
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ logic.setEuModifier(getEnergyDiscount());
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat()));
+ str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC()));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount()));
+ str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Blast Furnace")
+ .addInfo("Controller block of the Molten Module")
+ .addInfo("Uses a Star to to melt Metals")
+ .addSeparator()
+ .beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1)
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1)
+ .toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java
new file mode 100644
index 0000000000..8143c6fea4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java
@@ -0,0 +1,226 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.util.CommonValues;
+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.screen.ModularWindow;
+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.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_PlasmaModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private int currentParallel = 0;
+ private boolean debug = true;
+ private int inputMaxParallel = 0;
+
+ public GT_MetaTileEntity_EM_PlasmaModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_PlasmaModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_PlasmaModule(mName);
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ if (recipe.mSpecialValue > getPlasmaTier()
+ || Objects.equals(recipe.mSpecialItems.toString(), "true") && !isMultiStepPlasmaCapable) {
+ return SimpleCheckRecipeResult.ofFailure("missing_upgrades");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ addToPowerTally(
+ BigInteger.valueOf(calculatedEut)
+ .multiply(BigInteger.valueOf(duration)));
+ addToRecipeTally(calculatedParallels);
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
+ .setDurationDecreasePerOC(getOverclockTimeFactor());
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ logic.setEuModifier(getEnergyDiscount());
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ if (debug) {
+ builder.widget(createTestButton(builder))
+ .widget(createTestButton2())
+ .widget(createTestButton3());
+ }
+ }
+
+ protected Widget createTestButton(IWidgetBuilder<?> builder) {
+ return new ButtonWidget()
+ .setOnClick((clickData, widget) -> isMultiStepPlasmaCapable = !isMultiStepPlasmaCapable)
+ .setPlayClickSoundResource(
+ () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation
+ : SoundResource.GUI_BUTTON_DOWN.resourceLocation)
+ .setBackground(() -> {
+ if (isMultiStepPlasmaCapable) {
+ 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("multi-step")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 100)
+ .setSize(16, 16);
+ }
+
+ protected Widget createTestButton2() {
+ return new TextFieldWidget().setSetterInt(this::setPlasmaTier)
+ .setGetterInt(this::getPlasmaTier)
+ .setNumbers(0, 2)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setPos(3, 18)
+ .addTooltip("fusion tier")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setSize(16, 16)
+ .setPos(174, 80)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD);
+ }
+
+ protected Widget createTestButton3() {
+ return new TextFieldWidget().setSetterInt(val -> inputMaxParallel = val)
+ .setGetterInt(() -> inputMaxParallel)
+ .setNumbers(0, Integer.MAX_VALUE)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setPos(3, 18)
+ .addTooltip("parallel")
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setSize(70, 16)
+ .setPos(174, 60)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return godforgePlasmaRecipes;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount()));
+ str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Plasma Fabricator")
+ .addInfo("Controller block of the Plasma Module")
+ .addInfo("Uses a Star to to turn Metals into Plasma")
+ .addSeparator()
+ .beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1)
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1)
+ .toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java
new file mode 100644
index 0000000000..ee77d7cc95
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java
@@ -0,0 +1,228 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.util.CommonValues;
+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.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.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_SmeltingModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private long currentParallel = 0;
+ private boolean furnaceMode = false;
+
+ public GT_MetaTileEntity_EM_SmeltingModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_SmeltingModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_SmeltingModule(mName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes);
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+
+ if (recipe.mSpecialValue > getHeat()) {
+ return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
+ }
+ addToPowerTally(
+ BigInteger.valueOf(calculatedEut)
+ .multiply(BigInteger.valueOf(duration)));
+ if (!furnaceMode) {
+ addToRecipeTally(calculatedParallels);
+ }
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setMachineHeat(getHeatForOC())
+ .setHeatDiscountMultiplier(getHeatEnergyDiscount())
+ .setDurationDecreasePerOC(getOverclockTimeFactor());
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ logic.setEuModifier(getEnergyDiscount());
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(furnaceSwitch(builder));
+
+ }
+
+ protected ButtonWidget furnaceSwitch(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> furnaceMode = !furnaceMode)
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isFurnaceModeOn()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK);
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS);
+
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isFurnaceModeOn, this::setFurnaceMode), builder)
+ .addTooltip(translateToLocal("fog.button.furnacemode.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 91)
+ .setSize(16, 16);
+ return (ButtonWidget) button;
+ }
+
+ private boolean isFurnaceModeOn() {
+ return furnaceMode;
+ }
+
+ private void setFurnaceMode(boolean enabled) {
+ furnaceMode = enabled;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setBoolean("furnaceMode", furnaceMode);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+ furnaceMode = NBT.getBoolean("furnaceMode");
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat()));
+ str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC()));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount()));
+ str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Blast Furnace, Furnace")
+ .addInfo("Controller block of the Smelting Module")
+ .addInfo("Uses a Star to Smelt Metals")
+ .addSeparator()
+ .beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1)
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1)
+ .toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java
new file mode 100644
index 0000000000..6ba5dd753c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java
@@ -0,0 +1,52 @@
+package com.github.technus.tectech.thing.metaTileEntity.pipe;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_PipeBlock_Data extends GT_MetaTileEntity_Pipe_Data {
+
+ public GT_MetaTileEntity_PipeBlock_Data(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PipeBlock_Data(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_PipeBlock_Data(mName);
+ }
+
+ @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 float getThickNess() {
+ return 1f;
+ }
+
+ @Override
+ public float getExplosionResistance(ForgeDirection side) {
+ return 1000.0f;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(
+ super.getDescription(),
+ EnumChatFormatting.DARK_AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.pipe.desc.4"));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java
new file mode 100644
index 0000000000..469c5b786a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java
@@ -0,0 +1,52 @@
+package com.github.technus.tectech.thing.metaTileEntity.pipe;
+
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_PipeBlock_Energy extends GT_MetaTileEntity_Pipe_Energy {
+
+ public GT_MetaTileEntity_PipeBlock_Energy(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PipeBlock_Energy(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_PipeBlock_Energy(mName);
+ }
+
+ @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 float getThickNess() {
+ return 1f;
+ }
+
+ @Override
+ public float getExplosionResistance(ForgeDirection side) {
+ return 1000.0f;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(
+ super.getDescription(),
+ EnumChatFormatting.DARK_AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.pipe.desc.4"));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java
new file mode 100644
index 0000000000..b9428fcc1c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java
@@ -0,0 +1,316 @@
+package com.github.technus.tectech.thing.metaTileEntity.pipe;
+
+import static gregtech.api.enums.Dyes.MACHINE_METAL;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+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 com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.loader.NetworkDispatcher;
+import com.github.technus.tectech.mechanics.pipe.IActivePipe;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe;
+import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage;
+import com.github.technus.tectech.util.CommonValues;
+
+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.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.common.GT_Client;
+
+/**
+ * Created by Tec on 26.02.2017.
+ */
+public class GT_MetaTileEntity_Pipe_Data extends MetaPipeEntity implements IConnectsToDataPipe, IActivePipe {
+
+ private static Textures.BlockIcons.CustomIcon EMpipe;
+ private static Textures.BlockIcons.CustomIcon EMbar, EMbarActive;
+ public byte connectionCount = 0;
+
+ private boolean active;
+
+ public GT_MetaTileEntity_Pipe_Data(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0);
+ }
+
+ public GT_MetaTileEntity_Pipe_Data(String aName) {
+ super(aName, 0);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Pipe_Data(mName);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ EMpipe = new Textures.BlockIcons.CustomIcon("iconsets/EM_DATA");
+ EMbar = new Textures.BlockIcons.CustomIcon("iconsets/EM_BAR");
+ EMbarActive = new Textures.BlockIcons.CustomIcon("iconsets/EM_BAR_ACTIVE");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int colorIndex, boolean aConnected, boolean aRedstone) {
+ return new ITexture[] { new GT_RenderedTexture(EMpipe),
+ new GT_RenderedTexture(
+ getActive() ? EMbarActive : EMbar,
+ Dyes.getModulation(colorIndex, MACHINE_METAL.getRGBA())) };
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound nbtTagCompound) {
+ active = nbtTagCompound.getBoolean("eActive");
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound nbtTagCompound) {
+ nbtTagCompound.setBoolean("eActive", active);
+ }
+
+ @Override
+ public boolean renderInside(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return 4;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.pipe.datastream.desc.0"), // Advanced
+ // data
+ // transmission
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.pipe.datastream.desc.1"), // Don't stare at the beam!
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.datastream.desc.2"), // Must be
+ // painted to
+ // work
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.datastream.desc.3") // Do not cross or
+ // split
+ };
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ NetworkDispatcher.INSTANCE.sendToServer(new PipeActivityMessage.PipeActivityQuery(this));
+ }
+ onPostTick(aBaseMetaTileEntity, 31);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if ((aTick & 31) == 31) {
+ if (TecTech.RANDOM.nextInt(15) == 0) {
+ NetworkDispatcher.INSTANCE.sendToAllAround(
+ new PipeActivityMessage.PipeActivityData(this),
+ aBaseMetaTileEntity.getWorld().provider.dimensionId,
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(),
+ 256);
+ }
+ if (active) {
+ active = false;
+ }
+ mConnections = 0;
+ connectionCount = 0;
+ byte myColor = aBaseMetaTileEntity.getColorization();
+ if (aBaseMetaTileEntity.getColorization() < 0) {
+ return;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final ForgeDirection oppositeSide = side.getOpposite();
+ TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side);
+ if (tTileEntity instanceof IConnectsToDataPipe) {
+ byte tColor = ((IConnectsToDataPipe) tTileEntity).getColorization();
+ if (tColor != myColor) {
+ continue;
+ }
+ if (((IConnectsToDataPipe) tTileEntity).canConnectData(oppositeSide)) {
+ mConnections |= 1 << side.ordinal();
+ connectionCount++;
+ }
+ } else if (tTileEntity instanceof IGregTechTileEntity) {
+ IMetaTileEntity meta = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity();
+ if (meta instanceof IConnectsToDataPipe) {
+ byte tColor = ((IConnectsToDataPipe) meta).getColorization();
+ if (tColor != myColor) {
+ continue;
+ }
+ if (((IConnectsToDataPipe) meta).canConnectData(oppositeSide)) {
+ mConnections |= 1 << side.ordinal();
+ connectionCount++;
+ }
+ }
+ }
+ }
+ }
+ } else if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) {
+ aBaseMetaTileEntity.issueTextureUpdate();
+ }
+ }
+
+ @Override
+ public boolean canConnectData(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public IConnectsToDataPipe getNext(IConnectsToDataPipe source) {
+ if (connectionCount != 2) {
+ return null;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if ((mConnections & 1 << side.ordinal()) == 0) {
+ continue; // if not connected continue
+ }
+ TileEntity next = getBaseMetaTileEntity().getTileEntityAtSide(side);
+ if (next instanceof IConnectsToDataPipe && next != source) {
+ if (((IConnectsToDataPipe) next).isDataInputFacing(side.getOpposite())) {
+ return (IConnectsToDataPipe) next;
+ }
+ } else if (next instanceof IGregTechTileEntity) {
+ IMetaTileEntity meta = ((IGregTechTileEntity) next).getMetaTileEntity();
+ if (meta instanceof IConnectsToDataPipe connecsToPipe && meta != source) {
+ if (meta instanceof GT_MetaTileEntity_Pipe_Data pipeData && pipeData.connectionCount == 2) {
+ pipeData.markUsed();
+ return connecsToPipe;
+ }
+ if (connecsToPipe.isDataInputFacing(side.getOpposite())) {
+ return connecsToPipe;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ float tSpace = (1f - 0.375f) / 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;
+ }
+
+ byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections;
+ if ((tConn & 1 << ForgeDirection.DOWN.ordinal()) != 0) {
+ tSide0 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.UP.ordinal()) != 0) {
+ tSide1 = 1f;
+ }
+ if ((tConn & 1 << ForgeDirection.NORTH.ordinal()) != 0) {
+ tSide2 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.SOUTH.ordinal()) != 0) {
+ tSide3 = 1f;
+ }
+ if ((tConn & 1 << ForgeDirection.WEST.ordinal()) != 0) {
+ tSide4 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.EAST.ordinal()) != 0) {
+ tSide5 = 1f;
+ }
+
+ return AxisAlignedBB
+ .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3);
+ }
+
+ @Override
+ public float getThickNess() {
+ if (GT_Mod.instance.isClientSide() && GT_Client.hideValue == 1) {
+ return 0.0625F;
+ }
+ return 0.375f;
+ }
+
+ @Override
+ public boolean isDataInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public byte getColorization() {
+ return getBaseMetaTileEntity().getColorization();
+ }
+
+ @Override
+ public void markUsed() {
+ this.active = true;
+ }
+
+ @Override
+ public void setActive(boolean state) {
+ if (state != active) {
+ active = state;
+ getBaseMetaTileEntity().issueTextureUpdate();
+ }
+ }
+
+ @Override
+ public boolean getActive() {
+ return active;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java
new file mode 100644
index 0000000000..264bc77d4a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java
@@ -0,0 +1,285 @@
+package com.github.technus.tectech.thing.metaTileEntity.pipe;
+
+import static gregtech.api.enums.Dyes.MACHINE_METAL;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+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 com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.loader.NetworkDispatcher;
+import com.github.technus.tectech.mechanics.pipe.IActivePipe;
+import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel;
+import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage;
+import com.github.technus.tectech.util.CommonValues;
+
+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.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IColoredTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.common.GT_Client;
+
+public class GT_MetaTileEntity_Pipe_Energy extends MetaPipeEntity implements IConnectsToEnergyTunnel, IActivePipe {
+
+ static Textures.BlockIcons.CustomIcon EMcandy, EMCandyActive;
+ private static Textures.BlockIcons.CustomIcon EMpipe;
+ public byte connectionCount = 0;
+
+ private boolean active;
+
+ public GT_MetaTileEntity_Pipe_Energy(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0);
+ }
+
+ public GT_MetaTileEntity_Pipe_Energy(String aName) {
+ super(aName, 0);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) {
+ return new GT_MetaTileEntity_Pipe_Energy(mName);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ EMcandy = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY");
+ EMCandyActive = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY_ACTIVE");
+ EMpipe = new Textures.BlockIcons.CustomIcon("iconsets/EM_LASER");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int colorIndex, boolean aConnected, boolean aRedstone) {
+ return new ITexture[] { new GT_RenderedTexture(EMpipe),
+ new GT_RenderedTexture(
+ getActive() ? EMCandyActive : EMcandy,
+ Dyes.getModulation(colorIndex, MACHINE_METAL.getRGBA())) };
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound nbtTagCompound) {
+ active = nbtTagCompound.getBoolean("eActive");
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound nbtTagCompound) {
+ nbtTagCompound.setBoolean("eActive", active);
+ }
+
+ @Override
+ public boolean renderInside(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return 4;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.pipe.energystream.desc.0"), // Laser
+ // tunneling
+ // device.
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("gt.blockmachines.pipe.energystream.desc.1"), // Bright Vacuum!!!
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.2"), // Must be
+ // painted to
+ // work
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.3") // Do not split
+ // or turn
+ };
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (getBaseMetaTileEntity().isClientSide()) {
+ NetworkDispatcher.INSTANCE.sendToServer(new PipeActivityMessage.PipeActivityQuery(this));
+ }
+ onPostTick(aBaseMetaTileEntity, 31);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if ((aTick & 31) == 31) {
+ if (TecTech.RANDOM.nextInt(15) == 0) {
+ NetworkDispatcher.INSTANCE.sendToAllAround(
+ new PipeActivityMessage.PipeActivityData(this),
+ aBaseMetaTileEntity.getWorld().provider.dimensionId,
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(),
+ 256);
+ }
+ if (active) {
+ active = false;
+ }
+ mConnections = 0;
+ connectionCount = 0;
+ if (aBaseMetaTileEntity.getColorization() < 0) {
+ return;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final ForgeDirection oppositeSide = side.getOpposite();
+ // if (!aBaseMetaTileEntity.getCoverBehaviorAtSide(b0).alwaysLookConnected(b0,
+ // aBaseMetaTileEntity.getCoverIDAtSide(b0), aBaseMetaTileEntity.getCoverDataAtSide(b0),
+ // aBaseMetaTileEntity)) {
+ TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side);
+ if (tTileEntity instanceof IColoredTileEntity) {
+ // if (aBaseMetaTileEntity.getColorization() >= 0) {
+ byte tColor = ((IColoredTileEntity) tTileEntity).getColorization();
+ if (tColor != aBaseMetaTileEntity.getColorization()) {
+ continue;
+ }
+ // }
+ }
+ if (tTileEntity instanceof PowerLogicHost) {
+ PowerLogic logic = ((PowerLogicHost) tTileEntity).getPowerLogic(oppositeSide);
+ if (logic != null && logic.canUseLaser()) {
+ mConnections |= 1 << side.ordinal();
+ connectionCount++;
+ continue;
+ }
+ }
+ if (tTileEntity instanceof IConnectsToEnergyTunnel
+ && ((IConnectsToEnergyTunnel) tTileEntity).canConnect(oppositeSide)) {
+ mConnections |= 1 << side.ordinal();
+ connectionCount++;
+ } else if (tTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() instanceof IConnectsToEnergyTunnel) {
+ if (((IConnectsToEnergyTunnel) ((IGregTechTileEntity) tTileEntity).getMetaTileEntity())
+ .canConnect(oppositeSide)) {
+ mConnections |= 1 << side.ordinal();
+ connectionCount++;
+ }
+ }
+ }
+ }
+
+ } else if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) {
+ aBaseMetaTileEntity.issueTextureUpdate();
+ }
+ }
+
+ @Override
+ public void setActive(boolean state) {
+ if (state != active) {
+ active = state;
+ getBaseMetaTileEntity().issueTextureUpdate();
+ }
+ }
+
+ @Override
+ public boolean getActive() {
+ return active;
+ }
+
+ @Override
+ public void markUsed() {
+ this.active = true;
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ float tSpace = (1f - 0.5f) / 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;
+ }
+
+ byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections;
+ if ((tConn & 1 << ForgeDirection.DOWN.ordinal()) != 0) {
+ tSide0 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.UP.ordinal()) != 0) {
+ tSide1 = 1f;
+ }
+ if ((tConn & 1 << ForgeDirection.NORTH.ordinal()) != 0) {
+ tSide2 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.SOUTH.ordinal()) != 0) {
+ tSide3 = 1f;
+ }
+ if ((tConn & 1 << ForgeDirection.WEST.ordinal()) != 0) {
+ tSide4 = 0f;
+ }
+ if ((tConn & 1 << ForgeDirection.EAST.ordinal()) != 0) {
+ tSide5 = 1f;
+ }
+
+ return AxisAlignedBB
+ .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3);
+ }
+
+ @Override
+ public float getThickNess() {
+ if (GT_Mod.instance.isClientSide() && GT_Client.hideValue == 1) {
+ return 0.0625F;
+ }
+ return 0.5f;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java
new file mode 100644
index 0000000000..f8ed346fa9
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java
@@ -0,0 +1,271 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT;
+import static com.github.technus.tectech.util.CommonValues.VN;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.function.Consumer;
+
+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.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.TextWidget;
+
+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.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.objects.GT_RenderedTexture;
+
+public class GT_MetaTileEntity_BuckConverter extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets, IAddGregtechLogo {
+
+ private static GT_RenderedTexture BUCK, BUCK_ACTIVE;
+ public int EUT = 0, AMP = 0;
+ private static NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ public GT_MetaTileEntity_BuckConverter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.machine.tt.buck.desc.0"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.buck.desc.1"), });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_BuckConverter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BuckConverter(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ BUCK = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/BUCK"));
+ BUCK_ACTIVE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/BUCK_ACTIVE"));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1],
+ side == facing ? (aActive ? BUCK_ACTIVE : BUCK)
+ : (side == facing.getOpposite() ? OVERLAYS_ENERGY_IN_POWER_TT[mTier]
+ : (aActive ? OVERLAYS_ENERGY_OUT_POWER_TT[mTier] : OVERLAYS_ENERGY_IN_POWER_TT[mTier])) };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("eEUT", EUT);
+ aNBT.setInteger("eAMP", AMP);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ EUT = aNBT.getInteger("eEUT");
+ AMP = aNBT.getInteger("eAMP");
+ getBaseMetaTileEntity().setActive((long) AMP * EUT >= 0);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @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 isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getBackFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return getBaseMetaTileEntity().isActive() && side != getBaseMetaTileEntity().getFrontFacing()
+ && side != getBaseMetaTileEntity().getBackFacing();
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return getBaseMetaTileEntity().isActive() ? Math.min(Math.abs(AMP), 64) : 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return CommonValues.V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return getBaseMetaTileEntity().isActive() ? Math.min(Math.abs(EUT), maxEUInput()) : 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return CommonValues.V[mTier] << 4;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return CommonValues.V[mTier] << 2;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY)
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+
+ @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(() -> "EUT: " + numberFormat.format(EUT))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 8))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "TIER: " + VN[TT_Utility.getTier(Math.abs(EUT))])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 16))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "AMP: " + numberFormat.format(AMP))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 24))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "SUM: " + numberFormat.format((long) AMP * EUT))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 32));
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT -= val, 512, 64, 7, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT /= val, 512, 64, 7, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP -= val, 512, 64, 7, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP /= val, 512, 64, 7, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT -= val, 16, 1, 25, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT /= val, 16, 2, 25, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP -= val, 16, 1, 25, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP /= val, 16, 2, 25, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT += val, 16, 1, 133, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT *= val, 16, 2, 133, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP += val, 16, 1, 133, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP *= val, 16, 2, 133, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT += val, 512, 64, 151, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT *= val, 512, 64, 151, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP += val, 512, 64, 151, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP *= val, 512, 64, 151, 58);
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int changeNumberShift, int changeNumber, int xPos, int yPos) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ setter.accept(clickData.shift ? changeNumberShift : changeNumber);
+ getBaseMetaTileEntity().setActive((long) AMP * EUT >= 0);
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java
new file mode 100644
index 0000000000..9e2a5ced60
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java
@@ -0,0 +1,246 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.function.Consumer;
+
+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.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.TextWidget;
+
+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.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.objects.GT_RenderedTexture;
+import gregtech.common.GT_Pollution;
+
+/**
+ * Created by Tec on 23.03.2017.
+ */
+public class GT_MetaTileEntity_DebugPollutor extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets, IAddGregtechLogo {
+
+ private static GT_RenderedTexture POLLUTOR;
+ public int pollution = 0;
+ private static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ public GT_MetaTileEntity_DebugPollutor(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.0"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.1"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_DebugPollutor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DebugPollutor(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ POLLUTOR = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/POLLUTOR"));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1],
+ (side == facing) ? POLLUTOR : OVERLAYS_ENERGY_OUT_LASER_TT[mTier] };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("ePollution", pollution);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ pollution = aNBT.getInteger("ePollution");
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (pollution > 0) {
+ GT_Pollution.addPollution(aBaseMetaTileEntity, pollution);
+ }
+ } else if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aBaseMetaTileEntity.getFrontFacing()) {
+ TecTech.proxy.em_particle(aBaseMetaTileEntity, side);
+ TecTech.proxy.pollutor_particle(aBaseMetaTileEntity, side);
+ }
+ }
+ }
+ }
+
+ @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 isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY)
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+
+ @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(() -> "Pollution: " + numberFormat.format(pollution))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 8));
+
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ val -> pollution -= val,
+ 512,
+ 64,
+ 7,
+ 4);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ val -> pollution /= val,
+ 512,
+ 64,
+ 7,
+ 22);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> pollution -= val, 16, 1, 25, 4);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL,
+ val -> pollution /= val,
+ 16,
+ 2,
+ 25,
+ 22);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> pollution += val, 16, 1, 133, 4);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL,
+ val -> pollution *= val,
+ 16,
+ 2,
+ 133,
+ 22);
+
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE,
+ val -> pollution += val,
+ 512,
+ 64,
+ 151,
+ 4);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE,
+ val -> pollution *= val,
+ 512,
+ 64,
+ 151,
+ 22);
+
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int changeNumberShift, int changeNumber, int xPos, int yPos) {
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? changeNumberShift : changeNumber))
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java
new file mode 100644
index 0000000000..342ca69864
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java
@@ -0,0 +1,392 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT;
+import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT;
+import static com.github.technus.tectech.util.CommonValues.VN;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.function.Consumer;
+import java.util.function.IntConsumer;
+import java.util.function.IntSupplier;
+
+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.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel;
+import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel;
+import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+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.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+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.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.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Created by Tec on 23.03.2017.
+ */
+public class GT_MetaTileEntity_DebugPowerGenerator extends GT_MetaTileEntity_TieredMachineBlock
+ implements IConnectsToEnergyTunnel, IAddUIWidgets, IAddGregtechLogo {
+
+ public static GT_RenderedTexture GENNY;
+ private boolean LASER = false;
+ public int EUT = 0, AMP = 0;
+ public boolean producing = true;
+ private static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ public GT_MetaTileEntity_DebugPowerGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.genny.desc.0"),
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.genny.desc.3"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.genny.desc.1"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.genny.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_DebugPowerGenerator(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DebugPowerGenerator(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ LASER = !LASER;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(StatCollector.translateToLocal("tt.chat.debug.generator"), LASER ? "ON" : "OFF"));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ GENNY = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/GENNY"));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1],
+ side != facing
+ ? LASER ? (aActive ? OVERLAYS_ENERGY_OUT_LASER_TT[mTier] : OVERLAYS_ENERGY_IN_LASER_TT[mTier])
+ : (aActive ? OVERLAYS_ENERGY_OUT_POWER_TT[mTier] : OVERLAYS_ENERGY_IN_POWER_TT[mTier])
+ : GENNY };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("eEUT", EUT);
+ aNBT.setInteger("eAMP", AMP);
+ aNBT.setBoolean("eLaser", LASER);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ EUT = aNBT.getInteger("eEUT");
+ AMP = aNBT.getInteger("eAMP");
+ LASER = aNBT.getBoolean("eLaser");
+ producing = (long) AMP * EUT >= 0;
+ getBaseMetaTileEntity().setActive(producing);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.setActive(producing);
+ if (!LASER) {
+ if (aBaseMetaTileEntity.isActive()) {
+ setEUVar(maxEUStore());
+ } else {
+ setEUVar(0);
+ }
+ } else {
+ byte Tick = (byte) (aTick % 20);
+ if (aBaseMetaTileEntity.isActive() && TRANSFER_AT == Tick) {
+ setEUVar(maxEUStore());
+ moveAround(aBaseMetaTileEntity);
+ } else if (TRANSFER_AT == Tick) {
+ setEUVar(0);
+ }
+ }
+ }
+ }
+
+ @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 isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return !LASER;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return !LASER;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return !producing && side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return producing && side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return producing ? 0 : Math.abs(AMP);
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return producing ? Math.abs(AMP) : 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return producing ? 0 : Integer.MAX_VALUE;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return producing ? Math.abs(EUT) : 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return LASER ? Math.abs((long) EUT * AMP * 24) : Math.abs((long) EUT * AMP) << 2;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return Math.abs((long) EUT * AMP);
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity();
+ }
+
+ public int getEUT() {
+ return EUT;
+ }
+
+ public void setEUT(int EUT) {
+ this.EUT = EUT;
+ }
+
+ public int getAMP() {
+ return AMP;
+ }
+
+ public void setAMP(int AMP) {
+ this.AMP = AMP;
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side) {
+ return LASER && side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ private void moveAround(IGregTechTileEntity aBaseMetaTileEntity) {
+ for (final ForgeDirection face : ForgeDirection.VALID_DIRECTIONS) {
+ if (face == aBaseMetaTileEntity.getFrontFacing()) continue;
+ final ForgeDirection opposite = face.getOpposite();
+ for (short dist = 1; dist < 1000; dist++) {
+ IGregTechTileEntity tGTTileEntity = aBaseMetaTileEntity
+ .getIGregTechTileEntityAtSideAndDistance(face, dist);
+ if (tGTTileEntity != null) {
+ IMetaTileEntity aMetaTileEntity = tGTTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity != null) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyTunnel
+ && opposite == tGTTileEntity.getFrontFacing()) {
+ if (maxEUOutput() > ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) {
+ aMetaTileEntity.doExplosion(maxEUOutput());
+ } else {
+ long diff = Math.min(
+ AMP * 20L * maxEUOutput(),
+ Math.min(
+ ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUStore()
+ - aMetaTileEntity.getBaseMetaTileEntity()
+ .getStoredEU(),
+ aBaseMetaTileEntity.getStoredEU()));
+ ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).setEUVar(
+ aMetaTileEntity.getBaseMetaTileEntity()
+ .getStoredEU() + diff);
+ }
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy) {
+ if (((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).connectionCount < 2) {} else {
+ ((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).markUsed();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY)
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+
+ @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(() -> "TIER: " + VN[TT_Utility.getTier(Math.abs(EUT))])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 22))
+
+ .widget(
+ new TextWidget().setStringSupplier(() -> "SUM: " + numberFormat.format((long) AMP * EUT))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 46));
+
+ addLabelledIntegerTextField(builder, "EUT: ", 24, this::getEUT, this::setEUT, 46, 8);
+ addLabelledIntegerTextField(builder, "AMP: ", 24, this::getAMP, this::setAMP, 46, 34);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT -= val, 512, 64, 7, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT /= val, 512, 64, 7, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP -= val, 512, 64, 7, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP /= val, 512, 64, 7, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT -= val, 16, 1, 25, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT /= val, 16, 2, 25, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP -= val, 16, 1, 25, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP /= val, 16, 2, 25, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT += val, 16, 1, 133, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT *= val, 16, 2, 133, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP += val, 16, 1, 133, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP *= val, 16, 2, 133, 58);
+
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT += val, 512, 64, 151, 4);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT *= val, 512, 64, 151, 22);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP += val, 512, 64, 151, 40);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP *= val, 512, 64, 151, 58);
+ }
+
+ private void addLabelledIntegerTextField(ModularWindow.Builder builder, String label, int labelWidth,
+ IntSupplier getter, IntConsumer setter, int xPos, int yPos) {
+ builder.widget(
+ new TextWidget(label).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(xPos, yPos))
+ .widget(
+ new NumericWidget().setGetter(getter::getAsInt)
+ .setSetter(val -> setter.accept((int) val))
+ .setTextColor(COLOR_TEXT_WHITE.get())
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2))
+ .setPos(xPos + labelWidth, yPos - 1)
+ .setSize(56, 10));
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int changeNumberShift, int changeNumber, int xPos, int yPos) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ setter.accept(clickData.shift ? changeNumberShift : changeNumber);
+ producing = (long) AMP * EUT >= 0;
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java
new file mode 100644
index 0000000000..519ea19641
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java
@@ -0,0 +1,300 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.function.Consumer;
+
+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.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+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.TextWidget;
+
+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.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.objects.GT_RenderedTexture;
+
+/**
+ * Created by Tec on 23.03.2017.
+ */
+public class GT_MetaTileEntity_DebugStructureWriter extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets, IAddGregtechLogo {
+
+ private static GT_RenderedTexture MARK;
+ public short[] numbers = new short[6];
+ public boolean size = false;
+ public String[] result = new String[] { "Undefined" };
+
+ public GT_MetaTileEntity_DebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.writer.desc.0"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.writer.desc.1"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.writer.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_DebugStructureWriter(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DebugStructureWriter(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ MARK = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/MARK"));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1],
+ side != facing ? new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE) : MARK };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ aNBT.setShort("eData" + i, numbers[i]);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ numbers[i] = aNBT.getShort("eData" + i);
+ }
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ aBaseMetaTileEntity.disableWorking();
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+
+ 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],
+ false);
+ TecTech.LOGGER.info(pseudoJavaCode);
+ result = pseudoJavaCode.split("\\n");
+ aBaseMetaTileEntity.disableWorking();
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ 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],
+ false);
+ TecTech.LOGGER.info(pseudoJavaCode);
+ result = pseudoJavaCode.split("\\n");
+ aBaseMetaTileEntity.disableWorking();
+ }
+
+ @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 boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return result;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY)
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+
+ @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(() -> size ? "Structure size" : "My position")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 8))
+ .widget(
+ new TextWidget().setStringSupplier(() -> size ? "(Changing scan size)" : "(Moving origin)")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 16))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "A: " + numbers[size ? 3 : 0])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 24))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "B: " + numbers[size ? 4 : 1])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 32))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "C: " + numbers[size ? 5 : 2])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 40));
+
+ 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, 16, 151);
+ }
+
+ private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift,
+ int addNumber, int xPos) {
+ addChangeNumberButton(
+ builder,
+ overlay,
+ val -> numbers[size ? 3 : 0] += val,
+ addNumberShift,
+ addNumber,
+ xPos,
+ 4);
+ addChangeNumberButton(
+ builder,
+ overlay,
+ val -> numbers[size ? 4 : 1] += val,
+ addNumberShift,
+ addNumber,
+ xPos,
+ 22);
+ addChangeNumberButton(
+ builder,
+ overlay,
+ val -> numbers[size ? 5 : 2] += val,
+ addNumberShift,
+ addNumber,
+ xPos,
+ 40);
+ builder.widget(
+ new ButtonWidget().setOnClick((clickData, widget) -> { size = !size; })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, 58));
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int changeNumberShift, int changeNumber, int xPos, int yPos) {
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick(
+ (clickData, widget) -> { setter.accept(clickData.shift ? changeNumberShift : changeNumber); })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java
new file mode 100644
index 0000000000..8728a5d04f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java
@@ -0,0 +1,239 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.util.CommonValues.RECIPE_AT;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+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.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Created by Tec on 23.03.2017.
+ */
+public class GT_MetaTileEntity_OwnerDetector extends GT_MetaTileEntity_TieredMachineBlock {
+
+ private static GT_RenderedTexture OWNER_ONLINE, OWNER_OFFLINE;
+ private String uuid;
+ private boolean interdimensional = true;
+
+ public GT_MetaTileEntity_OwnerDetector(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { CommonValues.TEC_MARK_GENERAL,
+ translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.0"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.1"),
+ EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.2") });
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_OwnerDetector(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OwnerDetector(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ OWNER_ONLINE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/OWNER_ONLINE"));
+ OWNER_OFFLINE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/OWNER_OFFLINE"));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], aActive ? OWNER_ONLINE : OWNER_OFFLINE };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setString("eUUID", uuid);
+ aNBT.setBoolean("eInterDim", interdimensional);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ uuid = aNBT.getString("eUUID");
+ interdimensional = aNBT.getBoolean("eInterDim");
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (uuid == null || uuid.length() == 0) {
+ String name = aBaseMetaTileEntity.getOwnerName();
+ if (!("Player".equals(name))) {
+ uuid = TecTech.proxy.getUUID(name);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && aTick % 20 == RECIPE_AT) {
+ boolean detected = TecTech.proxy.isOnlineUUID(uuid) || (uuid != null && uuid.length() > 0
+ && TecTech.proxy.isOnlineName(aBaseMetaTileEntity.getOwnerName()));
+ aBaseMetaTileEntity.setActive(detected);
+ aBaseMetaTileEntity.setGenericRedstoneOutput(detected);
+ byte value = (byte) (detected ? 15 : 0);
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, value);
+ }
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ String clientLocale;
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ interdimensional ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ interdimensional ? translateToLocalFormatted("tt.keyphrase.Running_interdimensional_scan", clientLocale)
+ : translateToLocalFormatted("tt.keyphrase.Running_local_dimension_scan", clientLocale));
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return interdimensional ? 1 : 0;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1;
+ }
+
+ @Override
+ public boolean hasSidedRedstoneOutputBehavior() {
+ return true;
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java
new file mode 100644
index 0000000000..90114ea0f8
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java
@@ -0,0 +1,73 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_MULTI_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_MULTI_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+
+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;
+
+public class GT_MetaTileEntity_TT_Transformer extends GT_MetaTileEntity_Transformer {
+
+ public GT_MetaTileEntity_TT_Transformer(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "");
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_TT_Transformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TT_Transformer(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[12][17][];
+ for (byte b = -1; b < 16; b++) {
+ rTextures[0][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] };
+ rTextures[1][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] };
+ rTextures[2][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] };
+ rTextures[3][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] };
+ rTextures[4][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] };
+ rTextures[5][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] };
+ rTextures[6][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_MULTI_TT[mTier] };
+ rTextures[7][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_MULTI_TT[mTier] };
+ rTextures[8][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_IN_MULTI_TT[mTier] };
+ rTextures[9][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] };
+ rTextures[10][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] };
+ rTextures[11][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1],
+ OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] {
+ translateToLocal("gt.blockmachines.tt.transformer.tier." + (mTier > 9 ? "" : "0") + mTier + ".desc"),
+ CommonValues.TEC_MARK_GENERAL };
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java
new file mode 100644
index 0000000000..e19ac1bf7d
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java
@@ -0,0 +1,404 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.generateTeslaNodeMap;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.powerTeslaNodeMap;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd;
+import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_MULTI_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_TT;
+import static com.github.technus.tectech.thing.metaTileEntity.Textures.TESLA_TRANSCEIVER_TOP_BA;
+import static com.github.technus.tectech.util.CommonValues.V;
+import static java.lang.Math.round;
+import static net.minecraft.util.StatCollector.translateToLocal;
+import static net.minecraft.util.StatCollector.translateToLocalFormatted;
+
+import java.util.Arrays;
+import java.util.HashSet;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.loader.NetworkDispatcher;
+import com.github.technus.tectech.mechanics.spark.RendererMessage;
+import com.github.technus.tectech.mechanics.spark.ThaumSpark;
+import com.github.technus.tectech.mechanics.tesla.ITeslaConnectable;
+import com.github.technus.tectech.mechanics.tesla.ITeslaConnectableSimple;
+import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.TT_Utility;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.MultimapBuilder;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import eu.usrv.yamcore.auxiliary.PlayerChatHelper;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer;
+
+public class GT_MetaTileEntity_TeslaCoil extends GT_MetaTileEntity_BasicBatteryBuffer implements ITeslaConnectable {
+
+ // Interface fields
+ private final Multimap<Integer, ITeslaConnectableSimple> teslaNodeMap = MultimapBuilder.treeKeys()
+ .linkedListValues()
+ .build();
+ private final HashSet<ThaumSpark> sparkList = new HashSet<>();
+ private int sparkCount = 10;
+
+ private static final int transferRadiusMax = TecTech.configTecTech.TESLA_SINGLE_RANGE; // Default is 20
+ private static final int perBlockLoss = TecTech.configTecTech.TESLA_SINGLE_LOSS_PER_BLOCK; // Default is 1
+ private static final float overDriveLoss = TecTech.configTecTech.TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE; // Default is
+ // 0.25F
+ private static final int transferRadiusMin = 4; // Minimum user configurable
+ private int transferRadius = transferRadiusMax; // Default transferRadius setting
+
+ public boolean powerPassToggle = false; // Power Pass for public viewing
+ private static final int histSteps = 20; // Hysteresis Resolution
+ private int histSettingLow = 3; // Hysteresis Low Limit
+ private int histSettingHigh = 15; // Hysteresis High Limit
+ private static final int histLowLimit = 1; // How low can you configure it?
+ private static final int histHighLimit = 19; // How high can you configure it?
+ private float histLow = (float) histSettingLow / histSteps; // Power pass is disabled if power is under this
+ // fraction
+ private float histHigh = (float) histSettingHigh / histSteps; // Power pass is enabled if power is over this
+ // fraction
+
+ private final long outputVoltage = V[mTier];
+ private boolean overdriveToggle = false;
+
+ private String clientLocale = "en_US";
+
+ public GT_MetaTileEntity_TeslaCoil(int aID, String aName, String aNameRegional, int aTier, int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, "", aSlotCount);
+ TT_Utility.setTier(aTier, this);
+ }
+
+ public GT_MetaTileEntity_TeslaCoil(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures,
+ int aSlotCount) {
+ super(aName, aTier, aDescription, aTextures, aSlotCount);
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] jargon = new String[] { CommonValues.THETA_MOVEMENT,
+ translateToLocal("gt.blockmachines.machine.tt.tesla.desc.0"), // Your Tesla I/O machine of choice
+ EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.machine.tt.tesla.desc.1") // Lightning
+ // stoves for the
+ // rich
+ };
+ String[] sDesc = super.getDescription();
+ sDesc = Arrays.copyOfRange(sDesc, 1, sDesc.length); // Removes first element from array
+ return ArrayUtils.addAll(jargon, sDesc);
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (overdriveToggle) {
+ overdriveToggle = false;
+ PlayerChatHelper
+ .SendInfo(aPlayer, translateToLocalFormatted("tt.keyphrase.Overdrive_disengaged", clientLocale));
+ } else {
+ overdriveToggle = true;
+ PlayerChatHelper
+ .SendInfo(aPlayer, translateToLocalFormatted("tt.keyphrase.Overdrive_engaged", clientLocale));
+ }
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ if (histSettingHigh < histHighLimit) {
+ histSettingHigh++;
+ } else {
+ histSettingHigh = histSettingLow + 1;
+ }
+ histHigh = (float) histSettingHigh / histSteps;
+ PlayerChatHelper.SendInfo(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Hysteresis_high_set_to", clientLocale) + " "
+ + round(histHigh * 100F)
+ + "%");
+ } else {
+ if (histSettingLow > histLowLimit) {
+ histSettingLow--;
+ } else {
+ histSettingLow = histSettingHigh - 1;
+ }
+ histLow = (float) histSettingLow / histSteps;
+ PlayerChatHelper.SendInfo(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Hysteresis_low_set_to", clientLocale) + " "
+ + round(histLow * 100F)
+ + "%");
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ if (transferRadius > transferRadiusMin) {
+ transferRadius--;
+ }
+ } else {
+ if (transferRadius < transferRadiusMax) {
+ transferRadius++;
+ }
+ }
+ PlayerChatHelper.SendInfo(
+ aPlayer,
+ translateToLocalFormatted("tt.keyphrase.Tesla_radius_set_to", clientLocale) + " " + transferRadius + "m");
+ return false;
+ }
+
+ // Cheeky skrub stuff to get machine to switch powerPass on soft mallet
+ @Override
+ public boolean hasAlternativeModeText() {
+ return true;
+ }
+
+ @Override
+ public String getAlternativeModeText() {
+ // Hysteresis based ePowerPass Config
+ long energyMax = getStoredEnergy()[1];
+ long energyStored = getStoredEnergy()[0];
+ float energyFrac = (float) energyStored / energyMax;
+
+ // ePowerPass hist toggle
+ if (energyFrac > histHigh) {
+ powerPassToggle = true;
+ } else if (energyFrac < histLow) {
+ powerPassToggle = false;
+ } else {
+ powerPassToggle = !powerPassToggle;
+ }
+
+ // And after this cheeky-ness, toss the string XD
+ return powerPassToggle ? translateToLocalFormatted("tt.keyphrase.Sending_power", clientLocale) + "!"
+ : translateToLocalFormatted("tt.keyphrase.Receiving_power", clientLocale) + "!";
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection side) {
+ return side != ForgeDirection.UP;
+ } // Prevents output at the top side
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; ++i) {
+ rTextures[0][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1] };
+ rTextures[1][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1], TESLA_TRANSCEIVER_TOP_BA };
+ rTextures[2][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1],
+ this.mInventory.length == 16 ? OVERLAYS_ENERGY_OUT_POWER_TT[this.mTier]
+ : (this.mInventory.length > 4 ? OVERLAYS_ENERGY_OUT_MULTI_TT[this.mTier]
+ : OVERLAYS_ENERGY_OUT_TT[this.mTier]) };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ return this.mTextures[side == facing ? 2 : side == ForgeDirection.UP ? 1 : 0][colorIndex + 1];
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TeslaCoil(mName, mTier, mDescriptionArray, mTextures, mInventory.length);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (!aBaseMetaTileEntity.isClientSide()) {
+ teslaSimpleNodeSetAdd(this);
+ generateTeslaNodeMap(this);
+ }
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ if (!this.getBaseMetaTileEntity()
+ .isClientSide()) {
+ teslaSimpleNodeSetRemove(this);
+ }
+ }
+
+ @Override
+ public void onUnload() {
+ if (!this.getBaseMetaTileEntity()
+ .isClientSide()) {
+ teslaSimpleNodeSetRemove(this);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ teslaSimpleNodeSetAdd(this);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return;
+ }
+
+ // Hysteresis based ePowerPass Config
+ long energyMax = getStoredEnergy()[1];
+ long energyStored = getStoredEnergy()[0];
+ float energyFrac = (float) energyStored / energyMax;
+
+ // ePowerPass hist toggle
+ if (!powerPassToggle && energyFrac > histHigh) {
+ powerPassToggle = true;
+ } else if (powerPassToggle && energyFrac < histLow) {
+ powerPassToggle = false;
+ }
+
+ // Send Power
+ powerTeslaNodeMap(this);
+
+ // TODO Encapsulate the spark sender
+ sparkCount--;
+ if (sparkCount == 0) {
+ sparkCount = 10;
+ if (!sparkList.isEmpty()) {
+ NetworkDispatcher.INSTANCE.sendToAllAround(
+ new RendererMessage.RendererData(sparkList),
+ aBaseMetaTileEntity.getWorld().provider.dimensionId,
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(),
+ 256);
+ sparkList.clear();
+ }
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ try {
+ EntityPlayerMP player = (EntityPlayerMP) aPlayer;
+ clientLocale = (String) FieldUtils.readField(player, "translator", true);
+ } catch (Exception e) {
+ clientLocale = "en_US";
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ }
+ return true;
+ }
+
+ @Override
+ public byte getTeslaReceptionCapability() {
+ return 1;
+ }
+
+ @Override
+ public float getTeslaReceptionCoefficient() {
+ return 1;
+ }
+
+ @Override
+ public Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap() {
+ return teslaNodeMap;
+ }
+
+ @Override
+ public HashSet<ThaumSpark> getSparkList() {
+ return sparkList;
+ }
+
+ @Override
+ public byte getTeslaTransmissionCapability() {
+ return 2;
+ }
+
+ @Override
+ public int getTeslaTransmissionRange() {
+ return transferRadius;
+ }
+
+ @Override
+ public boolean isOverdriveEnabled() {
+ return overdriveToggle;
+ }
+
+ @Override
+ public int getTeslaEnergyLossPerBlock() {
+ return perBlockLoss;
+ }
+
+ @Override
+ public float getTeslaOverdriveLossCoefficient() {
+ return overDriveLoss;
+ }
+
+ @Override
+ public long getTeslaOutputVoltage() {
+ return outputVoltage;
+ }
+
+ @Override
+ public long getTeslaOutputCurrent() {
+ return mBatteryCount;
+ }
+
+ @Override
+ public boolean teslaDrainEnergy(long teslaVoltageDrained) {
+ if (getEUVar() < teslaVoltageDrained) {
+ return false;
+ }
+
+ setEUVar(getEUVar() - teslaVoltageDrained);
+ return true;
+ }
+
+ @Override
+ public boolean isTeslaReadyToReceive() {
+ return !this.powerPassToggle;
+ }
+
+ @Override
+ public long getTeslaStoredEnergy() {
+ return getEUVar();
+ }
+
+ @Override
+ public Vec3Impl getTeslaPosition() {
+ return new Vec3Impl(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord());
+ }
+
+ @Override
+ public Integer getTeslaDimension() {
+ return this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId;
+ }
+
+ @Override
+ public boolean teslaInjectEnergy(long teslaVoltageInjected) {
+ return this.getBaseMetaTileEntity()
+ .injectEnergyUnits(ForgeDirection.UP, teslaVoltageInjected, 1L) > 0L;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java
new file mode 100644
index 0000000000..97facf1046
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java
@@ -0,0 +1,49 @@
+package com.github.technus.tectech.thing.metaTileEntity.single;
+
+import static com.github.technus.tectech.util.CommonValues.V;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import com.github.technus.tectech.util.CommonValues;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_WetTransformer extends GT_MetaTileEntity_TT_Transformer {
+
+ public GT_MetaTileEntity_WetTransformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_WetTransformer(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] {
+ translateToLocal("gt.blockmachines.wetransformer.tier." + (mTier > 9 ? "" : "0") + mTier + ".desc"),
+ "Accepts 16A and outputs 64A", CommonValues.TEC_MARK_GENERAL };
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier + 1];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier + 1] * 128L;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? 64 : 16;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? 16 : 64;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java b/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java
diff --git a/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java b/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java
new file mode 100644
index 0000000000..ac24686d6a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java
@@ -0,0 +1,143 @@
+package com.github.technus.tectech.thing.tileEntity;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.Reference;
+
+import ic2.api.energy.event.EnergyTileUnloadEvent;
+import ic2.core.IC2;
+import ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric;
+import ic2.core.init.MainConfig;
+import ic2.core.util.ConfigUtil;
+
+/**
+ * Created by danie_000 on 30.09.2017.
+ */
+public class ReactorSimTileEntity extends TileEntityNuclearReactorElectric {
+
+ private boolean hadRedstone = true;
+
+ @Override
+ public void onLoaded() {
+ super.onLoaded();
+ if (IC2.platform.isSimulating() && addedToEnergyNet) {
+ MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this));
+ // this.addedToEnergyNet = false;
+ }
+ }
+
+ @Override
+ public void onUnloaded() {
+ addedToEnergyNet = false;
+ super.onUnloaded();
+ }
+
+ @Override
+ public String getInventoryName() {
+ return "Nuclear Reactor Simulator";
+ }
+
+ @Override
+ public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction) {
+ return false;
+ }
+
+ @Override
+ public double getOfferedEnergy() {
+ return 0;
+ }
+
+ @Override
+ public double getReactorEUEnergyOutput() {
+ return getReactorEnergyOutput() * 5.0F
+ * ConfigUtil.getDouble(MainConfig.get(), "balance/energy/generator/nuclear");
+ }
+
+ @Override
+ protected void updateEntityServer() {
+ if (updateTicker++ % getTickRate() == 0) {
+ if (!worldObj.isRemote && worldObj.doChunksNearChunkExist(xCoord, yCoord, zCoord, 2)) {
+ if (hadRedstone && !receiveredstone()) {
+ hadRedstone = false;
+ } else if (!hadRedstone && receiveredstone()) {
+ doUpdates();
+ hadRedstone = true;
+ }
+ markDirty();
+ }
+ }
+ }
+
+ @Override
+ public boolean calculateHeatEffects() {
+ if (heat >= 4000 && IC2.platform.isSimulating()) {
+ float power = (float) heat / (float) maxHeat;
+ if (power >= 1.0F) {
+ explode(); // ding
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ // new method
+ private void doUpdates() {
+ heat = 0;
+ do {
+ dropAllUnfittingStuff();
+ output = 0.0F;
+ maxHeat = 10000;
+ hem = 1.0F;
+ processChambers();
+ } while (!calculateHeatEffects() && output > 0);
+ }
+
+ @Override
+ public void explode() {
+ getWorld().playSoundEffect(xCoord, yCoord, zCoord, Reference.MODID + ":microwave_ding", 1, 1);
+ }
+
+ @Override
+ public void addEmitHeat(int heat) {}
+
+ @Override
+ public boolean isFluidCooled() {
+ return false;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ return null;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/util/CommonValues.java b/src/main/java/com/github/technus/tectech/util/CommonValues.java
new file mode 100644
index 0000000000..8e4539a17a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/CommonValues.java
@@ -0,0 +1,33 @@
+package com.github.technus.tectech.util;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.enums.GT_Values;
+
+/**
+ * Created by danie_000 on 11.01.2017.
+ */
+@SuppressWarnings("SpellCheckingInspection")
+public final class CommonValues {
+
+ public static final String TEC_MARK_SHORT = EnumChatFormatting.BLUE + "Tec" + EnumChatFormatting.DARK_BLUE + "Tech";
+ public static final String TEC_MARK_GENERAL = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Interdimensional";
+ public static final String TEC_MARK_EM = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Elemental Matter";
+ public static final String THETA_MOVEMENT = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Theta Movement";
+ public static final String COSMIC_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Cosmic";
+ public static final String GODFORGE_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Project Godforge";
+
+ public static final byte MOVE_AT = 4; // move stuff around
+ public static final byte RECIPE_AT = 6; // move stuff around
+ // - in case some hatches are not in multiblock structure
+ public static final byte MULTI_CHECK_AT = 12; // multiblock checks its state
+ public static final byte TRANSFER_AT = 16;
+
+ public static final String[] VN = GT_Values.VN;
+ public static final long[] V = GT_Values.V;
+
+ public static final String[] EOH_TIER_FANCY_NAMES = { "Crude", "Primitive", "Stable", "Advanced", "Superb",
+ "Exotic", "Perfect", "Tipler", EnumChatFormatting.BOLD + "Gallifreyan" };
+
+ private CommonValues() {}
+}
diff --git a/src/main/java/com/github/technus/tectech/util/Converter.java b/src/main/java/com/github/technus/tectech/util/Converter.java
new file mode 100644
index 0000000000..d0da11d405
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/Converter.java
@@ -0,0 +1,41 @@
+package com.github.technus.tectech.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public final class Converter {
+
+ private Converter() {}
+
+ public static byte[] writeInts(int[] array) {
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(array.length * 4);
+ DataOutputStream dos = new DataOutputStream(bos);
+ for (int j : array) {
+ dos.writeInt(j);
+ }
+
+ return bos.toByteArray();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static int[] readInts(byte[] array) {
+ try {
+ ByteArrayInputStream bis = new ByteArrayInputStream(array);
+ DataInputStream dataInputStream = new DataInputStream(bis);
+ int size = array.length / Integer.BYTES;
+ int[] res = new int[size];
+ for (int i = 0; i < size; i++) {
+ res[i] = dataInputStream.readInt();
+ }
+ return res;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/util/FluidStackLong.java b/src/main/java/com/github/technus/tectech/util/FluidStackLong.java
new file mode 100644
index 0000000000..abd0134e85
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/FluidStackLong.java
@@ -0,0 +1,29 @@
+package com.github.technus.tectech.util;
+
+import net.minecraftforge.fluids.FluidStack;
+
+public class FluidStackLong {
+
+ public final FluidStack fluidStack;
+ public long amount;
+
+ public FluidStackLong(FluidStack fluidStack, long amount) {
+ this.fluidStack = fluidStack;
+ this.amount = amount;
+ }
+
+ // Copy constructor.
+ public FluidStackLong(FluidStackLong fluidStackLong) {
+ this.fluidStack = fluidStackLong.fluidStack;
+ this.amount = fluidStackLong.amount;
+ }
+
+ public long getFluidAmount() {
+ return amount;
+ }
+
+ public FluidStack getRegularFluidStack(FluidStackLong fluidStackLong, int amount) {
+ return new FluidStack(fluidStackLong.fluidStack, amount);
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/util/GodforgeMath.java b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java
new file mode 100644
index 0000000000..7fda26a29c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java
@@ -0,0 +1,308 @@
+package com.github.technus.tectech.util;
+
+import java.math.BigInteger;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule;
+
+public class GodforgeMath {
+
+ public static int getRandomIntInRange(int min, int max) {
+ return (int) (Math.random() * (max - min)) + min;
+ }
+
+ public static double calculateFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double upgradeFactor = 1;
+ if (godforge.isUpgradeActive(2)) {
+ upgradeFactor = 0.8;
+ }
+ if (godforge.getFuelType() == 0) {
+ return Math
+ .max(godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor, 1);
+ }
+ if (godforge.getFuelType() == 1) {
+ return Math.max(godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor, 1);
+ } else return Math.max(godforge.getFuelFactor() / 25 * upgradeFactor, 1);
+ }
+
+ public static int calculateStartupFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ return (int) Math.max(godforge.getFuelFactor() * 25 * Math.pow(1.2, godforge.getFuelFactor()), 1);
+ }
+
+ public static int calculateMaxFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int fuelCap = 5;
+ if (godforge.isUpgradeActive(27)) {
+ fuelCap = Integer.MAX_VALUE;
+ } else {
+ if (godforge.isUpgradeActive(9)) {
+ fuelCap += godforge.getTotalActiveUpgrades();
+ }
+ if (godforge.isUpgradeActive(3)) {
+ fuelCap *= 1.2;
+ }
+ }
+ return Math.max(fuelCap, 1);
+ }
+
+ public static int calculateEffectiveFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int fuelFactor = godforge.getFuelFactor();
+ if (fuelFactor <= 43) {
+ return fuelFactor;
+ } else {
+ return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4));
+ }
+ }
+
+ public static void calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double logBase = 1.5;
+ int baseHeat = 12601;
+ if (godforge.isUpgradeActive(12)) {
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ logBase = 1.12;
+ } else {
+ logBase = 1.18;
+ }
+ }
+ int recipeHeat = baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000);
+ module.setHeatForOC(calculateOverclockHeat(module, godforge, recipeHeat));
+ module.setHeat(recipeHeat);
+ }
+
+ public static int calculateOverclockHeat(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge, Integer recipeHeat) {
+ int actualHeat;
+ double exponent;
+ if (godforge.isUpgradeActive(20)) {
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ exponent = 0.85;
+ } else {
+ exponent = 0.8;
+ }
+ if (recipeHeat > 30000) {
+ actualHeat = (int) Math.floor(30000 + Math.pow(recipeHeat - 30000, exponent));
+ } else {
+ actualHeat = recipeHeat;
+ }
+ } else if (godforge.isUpgradeActive(17)) {
+ actualHeat = Math.min(recipeHeat, 30000);
+ } else {
+ actualHeat = Math.min(recipeHeat, 15000);
+ }
+ return actualHeat;
+ }
+
+ public static void calculateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double speedBonus = 1;
+
+ if (godforge.isUpgradeActive(1)) {
+ speedBonus = Math.pow(module.getHeat(), -0.01);
+ }
+
+ if (godforge.isUpgradeActive(22)) {
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ speedBonus /= Math.pow(module.getMaxParallel(), 0.02);
+ } else {
+ speedBonus /= Math.pow(module.getMaxParallel(), 0.012);
+ }
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ if (godforge.isUpgradeActive(25)) {
+ speedBonus = Math.sqrt(speedBonus);
+ } else {
+ speedBonus = 1;
+ }
+ }
+
+ module.setSpeedBonus((float) speedBonus);
+ }
+
+ public static void calculateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int baseParallel = 0;
+ float fuelFactorMultiplier = 1;
+ float heatMultiplier = 1;
+ float upgradeAmountMultiplier = 1;
+ int node53 = 1;
+ boolean isMoltenOrSmeltingWithUpgrade = false;
+
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ baseParallel = 1024;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule) {
+ baseParallel = 512;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ baseParallel = 256;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ baseParallel = 36;
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule
+ || (module instanceof GT_MetaTileEntity_EM_SmeltingModule && godforge.isUpgradeActive(16))) {
+ isMoltenOrSmeltingWithUpgrade = true;
+ }
+
+ if (godforge.isUpgradeActive(10)) {
+ node53 = 2;
+ }
+
+ if (godforge.isUpgradeActive(6)) {
+ if (godforge.isUpgradeActive(13)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 3;
+ } else {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 2;
+ }
+ } else {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f;
+ }
+ }
+
+ if (godforge.isUpgradeActive(18)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ heatMultiplier = 1 + module.getHeat() / 15000f;
+ } else {
+ heatMultiplier = 1 + module.getHeat() / 25000f;
+ }
+ }
+
+ if (godforge.isUpgradeActive(21)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f;
+ } else {
+ upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 8f;
+ }
+ }
+
+ int maxParallel = (int) (baseParallel * node53
+ * fuelFactorMultiplier
+ * heatMultiplier
+ * upgradeAmountMultiplier);
+
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ if (godforge.isUpgradeActive(25)) {
+ maxParallel = (int) Math.max(9 * Math.floor(Math.sqrt(maxParallel) / 9), 36);
+ } else {
+ maxParallel = baseParallel;
+ }
+ }
+
+ module.setMaxParallel(maxParallel);
+ }
+
+ public static void calculateEnergyDiscountForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double fillRatioDiscount = 1;
+ double maxBatteryDiscount = 1;
+
+ if (godforge.isUpgradeActive(8)) {
+ maxBatteryDiscount = 1 - (1 - Math.pow(1.001, -0.01 * godforge.getMaxBatteryCharge())) / 20;
+ }
+
+ if (godforge.isUpgradeActive(19)) {
+ double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge()
+ - 0.5;
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15);
+ } else {
+ fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15) * 2 / 3;
+ }
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ if (!godforge.isUpgradeActive(25)) {
+ fillRatioDiscount = 1;
+ maxBatteryDiscount = 1;
+ } else {
+ fillRatioDiscount = Math.sqrt(fillRatioDiscount);
+ maxBatteryDiscount = Math.sqrt(maxBatteryDiscount);
+ }
+ }
+
+ module.setEnergyDiscount((float) (fillRatioDiscount * maxBatteryDiscount));
+ }
+
+ public static void calculateProcessingVoltageForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ long voltage = Integer.MAX_VALUE;
+
+ if (godforge.isUpgradeActive(4)) {
+ voltage += calculateEffectiveFuelFactor(godforge) * 100_000_000L;
+ }
+
+ if (godforge.isUpgradeActive(23)) {
+ voltage *= Math.pow(4, godforge.getRingAmount());
+ }
+
+ module.setProcessingVoltage(voltage);
+ }
+
+ public static void setMiscModuleParameters(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int plasmaTier = 0;
+ double overclockTimeFactor = 2;
+
+ if (godforge.isUpgradeActive(30)) {
+ plasmaTier = 2;
+ } else if (godforge.isUpgradeActive(24)) {
+ plasmaTier = 1;
+ }
+
+ if (godforge.isUpgradeActive(14)) {
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ overclockTimeFactor = 2.3;
+ } else {
+ overclockTimeFactor = 2.15;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule) {
+ if (godforge.isUpgradeActive(25)) {
+ overclockTimeFactor = 2 + Math.pow(overclockTimeFactor - 2, 2);
+ } else {
+ overclockTimeFactor = 2;
+ }
+ }
+ }
+
+ module.setUpgrade83(godforge.isUpgradeActive(19));
+ module.setMultiStepPlasma(godforge.isUpgradeActive(15));
+ module.setPlasmaTier(plasmaTier);
+ module.setMagmatterCapable(godforge.isUpgradeActive(30));
+ module.setVoltageConfig(godforge.isUpgradeActive(28));
+ module.setOverclockTimeFactor(overclockTimeFactor);
+ }
+
+ public static boolean allowModuleConnection(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule && godforge.isUpgradeActive(5)) {
+ return true;
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule && godforge.isUpgradeActive(7)) {
+ return true;
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_ExoticModule && godforge.isUpgradeActive(11)) {
+ return true;
+ }
+
+ return module instanceof GT_MetaTileEntity_EM_SmeltingModule;
+ }
+
+ public static void queryMilestoneStats(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ godforge.addTotalPowerConsumed(module.getPowerTally());
+ module.setPowerTally(BigInteger.ZERO);
+ godforge.addTotalRecipesProcessed(module.getRecipeTally());
+ module.setRecipeTally(0);
+
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/util/ItemStackLong.java b/src/main/java/com/github/technus/tectech/util/ItemStackLong.java
new file mode 100644
index 0000000000..94b5dcb88a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/ItemStackLong.java
@@ -0,0 +1,28 @@
+package com.github.technus.tectech.util;
+
+import net.minecraft.item.ItemStack;
+
+public class ItemStackLong {
+
+ public final ItemStack itemStack;
+ public long stackSize;
+
+ public ItemStackLong(ItemStack itemStack, long stackSize) {
+ this.itemStack = itemStack;
+ this.stackSize = stackSize;
+ }
+
+ // Copy constructor.
+ public ItemStackLong(ItemStackLong itemStackLong) {
+ this.itemStack = itemStackLong.itemStack;
+ this.stackSize = itemStackLong.stackSize;
+ }
+
+ public long getStackSize() {
+ return stackSize;
+ }
+
+ public long compareTo(ItemStackLong itemStackLong) {
+ return (stackSize - itemStackLong.stackSize);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/util/TT_Utility.java b/src/main/java/com/github/technus/tectech/util/TT_Utility.java
new file mode 100644
index 0000000000..0428c6cedf
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/TT_Utility.java
@@ -0,0 +1,192 @@
+package com.github.technus.tectech.util;
+
+import java.lang.reflect.Field;
+import java.math.BigInteger;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+
+/**
+ * Created by Tec on 21.03.2017.
+ */
+public final class TT_Utility {
+
+ private TT_Utility() {}
+
+ private static final StringBuilder STRING_BUILDER = new StringBuilder();
+ private static final Map<Locale, Formatter> FORMATTER_MAP = new HashMap<>();
+
+ private static Formatter getFormatter() {
+ STRING_BUILDER.setLength(0);
+ return FORMATTER_MAP.computeIfAbsent(
+ Locale.getDefault(Locale.Category.FORMAT),
+ locale -> new Formatter(STRING_BUILDER, locale));
+ }
+
+ public static String formatNumberExp(double value) {
+ return getFormatter().format("%+.5E", value)
+ .toString();
+ }
+
+ // Formats to standard form.
+ public static String toStandardForm(long number) {
+ if (number == 0) {
+ return "0";
+ }
+
+ int exponent = (int) Math.floor(Math.log10(Math.abs(number)));
+ double mantissa = number / Math.pow(10, exponent);
+
+ // Round the mantissa to two decimal places
+ mantissa = Math.round(mantissa * 100.0) / 100.0;
+
+ return mantissa + "*10^" + exponent;
+ }
+
+ public static String toStandardForm(BigInteger number) {
+ BigInteger abs = number.abs();
+ if (abs.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0) {
+ return toStandardForm(number.longValue());
+ }
+ String strNum = abs.toString();
+ int exponent = strNum.length() - 1;
+ return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "*10^" + exponent;
+
+ }
+
+ public static String toExponentForm(BigInteger number) {
+ BigInteger abs = number.abs();
+ String strNum = abs.toString();
+ int exponent = strNum.length() - 1;
+ return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "e" + exponent;
+
+ }
+
+ public static int bitStringToInt(String bits) {
+ if (bits == null) {
+ return 0;
+ }
+ if (bits.length() > 32) {
+ throw new NumberFormatException("Too long!");
+ }
+ return Integer.parseInt(bits, 2);
+ }
+
+ public static int hexStringToInt(String hex) {
+ if (hex == null) {
+ return 0;
+ }
+ if (hex.length() > 8) {
+ throw new NumberFormatException("Too long!");
+ }
+ return Integer.parseInt(hex, 16);
+ }
+
+ public static double stringToDouble(String str) {
+ if (str == null) {
+ return 0;
+ }
+ return Double.parseDouble(str);
+ }
+
+ public static String longBitsToShortString(long number) {
+ StringBuilder result = new StringBuilder(71);
+
+ for (int i = 63; i >= 0; i--) {
+ long mask = 1L << i;
+ result.append((number & mask) != 0 ? ":" : ".");
+
+ if (i % 8 == 0) {
+ result.append('|');
+ }
+ }
+ result.replace(result.length() - 1, result.length(), "");
+
+ return result.toString();
+ }
+
+ public static float map(float x, float in_min, float in_max, float out_min, float out_max) {
+ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+ }
+
+ public static String getUniqueIdentifier(ItemStack is) {
+ return GameRegistry.findUniqueIdentifierFor(is.getItem()).modId + ':' + is.getUnlocalizedName();
+ }
+
+ public static byte getTier(long l) {
+ byte b = -1;
+
+ do {
+ ++b;
+ if (b >= CommonValues.V.length) {
+ return b;
+ }
+ } while (l > CommonValues.V[b]);
+
+ return b;
+ }
+
+ public static void setTier(int tier, Object me) {
+ try {
+ Field field = GT_MetaTileEntity_TieredMachineBlock.class.getField("mTier");
+ field.setAccessible(true);
+ field.set(me, (byte) tier);
+ } catch (Exception e) {
+ // e.printStackTrace();
+ }
+ }
+
+ @Deprecated
+ public static double receiveDouble(double previousValue, int startIndex, int index, int value) {
+ return Double.longBitsToDouble(receiveLong(Double.doubleToLongBits(previousValue), startIndex, index, value));
+ }
+
+ public static long receiveLong(long previousValue, int startIndex, int index, int value) {
+ value &= 0xFFFF;
+ switch (index - startIndex) {
+ case 0 -> {
+ previousValue &= 0xFFFF_FFFF_FFFF_0000L;
+ previousValue |= value;
+ }
+ case 1 -> {
+ previousValue &= 0xFFFF_FFFF_0000_FFFFL;
+ previousValue |= (long) value << 16;
+ }
+ case 2 -> {
+ previousValue &= 0xFFFF_0000_FFFF_FFFFL;
+ previousValue |= (long) value << 32;
+ }
+ case 3 -> {
+ previousValue &= 0x0000_FFFF_FFFF_FFFFL;
+ previousValue |= (long) value << 48;
+ }
+ }
+ return previousValue;
+ }
+
+ @Deprecated
+ public static float receiveFloat(float previousValue, int startIndex, int index, int value) {
+ return Float.intBitsToFloat(receiveInteger(Float.floatToIntBits(previousValue), startIndex, index, value));
+ }
+
+ public static int receiveInteger(int previousValue, int startIndex, int index, int value) {
+ value &= 0xFFFF;
+ switch (index - startIndex) {
+ case 0 -> {
+ previousValue &= 0xFFFF_0000;
+ previousValue |= value;
+ }
+ case 1 -> {
+ previousValue &= 0x0000_FFFF;
+ previousValue |= value << 16;
+ }
+ }
+ return previousValue;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/TAE.java b/src/main/java/gregtech/api/enums/TAE.java
new file mode 100644
index 0000000000..246b2006ea
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TAE.java
@@ -0,0 +1,145 @@
+package gregtech.api.enums;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import gregtech.api.interfaces.ITexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+
+public class TAE {
+
+ // TAE stands for Texture Array Expansion.
+
+ public static int gtPPLastUsedIndex = 64;
+ public static int secondaryIndex = 0;
+
+ public static HashMap<Integer, GTPP_CopiedBlockTexture> mTAE = new HashMap<>();
+ private static final HashSet<Integer> mFreeSlots = new HashSet<>(64);
+
+ static {
+ for (int i = 64; i < 128; i++) {
+ mFreeSlots.add(i);
+ }
+ Logger.INFO("Initialising TAE.");
+ }
+
+ /**
+ *
+ * @param aPage - The Texture page (0-3)
+ * @param aID - The ID on the specified page (0-15)
+ * @param GTPP_CopiedBlockTexture - The Texture to register
+ * @return - Did it register correctly?
+ */
+ public static boolean registerTexture(int aPage, int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ int aRealID = aID + (aPage * 16);
+ return registerTexture(64 + aRealID, GTPP_CopiedBlockTexture);
+ }
+
+ public static boolean registerTexture(int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ if (mFreeSlots.contains(aID)) {
+ mFreeSlots.remove(aID);
+ mTAE.put(aID, GTPP_CopiedBlockTexture);
+ return true;
+ } else {
+ CORE.crash("Tried to register texture with ID " + aID + " to TAE, but it is already in use.");
+ return false; // Dead Code
+ }
+ }
+
+ public static void finalizeTAE() {
+ String aFreeSpaces = "";
+ String aPageAndSlotFree = "";
+ AutoMap<Integer> aTemp = new AutoMap<>(mFreeSlots);
+ for (int i = 0; i < mFreeSlots.size(); i++) {
+ int j = aTemp.get(i);
+ aFreeSpaces += j;
+ aPageAndSlotFree += getPageFromIndex(j);
+ if (i != (mFreeSlots.size() - 1)) {
+ aFreeSpaces += ", ";
+ aPageAndSlotFree += ", ";
+ }
+ }
+ Logger.INFO("Free Indexes within TAE: " + aFreeSpaces);
+ Logger.INFO("Free Page slots within TAE: " + aPageAndSlotFree);
+ Logger.INFO("Filling them with ERROR textures.");
+ for (int aFreeSlot : aTemp.values()) {
+ registerTexture(aFreeSlot, new GTPP_CopiedBlockTexture(ModBlocks.blockCasingsTieredGTPP, 1, 15));
+ }
+ Logger.INFO("Finalising TAE.");
+ for (int aKeyTae : mTAE.keySet()) {
+ Textures.BlockIcons.setCasingTextureForId(aKeyTae, mTAE.get(aKeyTae));
+ }
+ Logger.INFO("Finalised TAE.");
+ }
+
+ private static boolean registerTextures(GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ try {
+ // Handle page 2.
+ Logger.INFO("[TAE} Registering Texture, Last used casing ID is " + gtPPLastUsedIndex + ".");
+ if (gtPPLastUsedIndex >= 128) {
+ Field x = ReflectionUtils.getField(Textures.BlockIcons.class, "casingTexturePages");
+ if (x != null) {
+ ITexture[][] h = (ITexture[][]) x.get(null);
+ if (h != null) {
+ h[64][secondaryIndex++] = GTPP_CopiedBlockTexture;
+ x.set(null, h);
+ Logger
+ .INFO("[TAE} Registered Texture with ID " + (secondaryIndex - 1) + " in secondary index.");
+ return true;
+ }
+ }
+ }
+
+ // set to page 1.
+ else {
+ Textures.BlockIcons.setCasingTextureForId(gtPPLastUsedIndex, GTPP_CopiedBlockTexture);
+ Logger.INFO("[TAE} Registered Texture with ID " + (gtPPLastUsedIndex) + " in main index.");
+ gtPPLastUsedIndex++;
+ return true;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ Logger.INFO("[TAE} Failed to register texture, Last used casing ID is " + gtPPLastUsedIndex + ".");
+ return false;
+ }
+
+ public static ITexture getTexture(int index) {
+ if (gtPPLastUsedIndex >= 128) {
+ return Textures.BlockIcons.getCasingTextureForId(((64 * 128) + index));
+ }
+ return Textures.BlockIcons.getCasingTextureForId((64 + index));
+ }
+
+ public static int GTPP_INDEX(int ID) {
+
+ if (ID >= 64) {
+ if (gtPPLastUsedIndex >= 128) {
+ return (128 + ID);
+ }
+ }
+ return (64 + ID);
+ }
+
+ public static int getIndexFromPage(int page, int blockMeta) {
+ int id = 64;
+ id += (page == 0 ? 0 : page == 1 ? 16 : page == 2 ? 32 : page == 3 ? 48 : page == 4 ? 64 : 0);
+ id += blockMeta;
+ return id;
+ }
+
+ public static String getPageFromIndex(int aIndex) {
+ int aPage = 0;
+ int aSlot = 0;
+ int aAdjustedIndex = aIndex > 64 ? (aIndex - 64) : aIndex;
+ aPage = aAdjustedIndex / 16;
+ aSlot = aAdjustedIndex - (16 * aPage);
+ return "[" + aIndex + " | " + aPage + ", " + aSlot + "]";
+ }
+}
diff --git a/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java b/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java
new file mode 100644
index 0000000000..7a6e609f93
--- /dev/null
+++ b/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java
@@ -0,0 +1,23 @@
+package gregtech.api.util;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.objects.overclockdescriber.FusionOverclockDescriber;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class AdvancedFusionOverclockDescriber extends FusionOverclockDescriber {
+
+ public AdvancedFusionOverclockDescriber(byte energyTier, long capableStartup) {
+ super(energyTier, capableStartup);
+ }
+
+ @Override
+ protected int getEUtIncreasePerOC() {
+ return 2;
+ }
+
+ protected int getDurationDecreasePerOC() {
+ return 2;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/FishPondFakeRecipe.java b/src/main/java/gregtech/api/util/FishPondFakeRecipe.java
new file mode 100644
index 0000000000..dc579ebd9b
--- /dev/null
+++ b/src/main/java/gregtech/api/util/FishPondFakeRecipe.java
@@ -0,0 +1,80 @@
+package gregtech.api.util;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomFishable;
+import net.minecraftforge.common.FishingHooks;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class FishPondFakeRecipe {
+
+ public static ArrayList<WeightedRandomFishable> fish = new ArrayList<>();
+ public static ArrayList<WeightedRandomFishable> junk = new ArrayList<>();
+ public static ArrayList<WeightedRandomFishable> treasure = new ArrayList<>();
+
+ @SuppressWarnings("unchecked")
+ public static boolean generateFishPondRecipes() {
+
+ try {
+ fish = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "fish")
+ .get(null);
+ junk = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "junk")
+ .get(null);
+ treasure = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "treasure")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ Logger.INFO("Error generating Fish Pond Recipes. [1]");
+ e.printStackTrace();
+ }
+
+ AutoMap<ArrayList<WeightedRandomFishable>> mega = new AutoMap<>();
+ mega.put(fish);
+ mega.put(junk);
+ mega.put(treasure);
+
+ int mType = 14;
+ for (ArrayList<WeightedRandomFishable> f : mega.values()) {
+ for (WeightedRandomFishable weightedRandomFishable : f) {
+ if (weightedRandomFishable != null) {
+ WeightedRandomFishable u = weightedRandomFishable;
+ try {
+ ItemStack t = (ItemStack) ReflectionUtils
+ .getField(WeightedRandomFishable.class, "field_150711_b")
+ .get(u);
+ addNewFishPondLoot(mType, new ItemStack[] { t }, new int[] { 10000 });
+ } catch (IllegalArgumentException | IllegalAccessException e1) {
+ Logger.INFO("Error generating Fish Pond Recipes. [2]");
+ e1.printStackTrace();
+ }
+ }
+ }
+ mType++;
+ }
+
+ return true;
+ }
+
+ public static void addNewFishPondLoot(int circuit, ItemStack[] outputItems, int[] chances) {
+ GT_Recipe x = new GT_Recipe(
+ true,
+ new ItemStack[] { CI.getNumberedCircuit(circuit) },
+ outputItems,
+ null,
+ chances,
+ new FluidStack[] { null },
+ new FluidStack[] { null },
+ 100, // 1 Tick
+ 0, // No Eu produced
+ 0);
+ Logger.INFO("Fishing [" + circuit + "]: " + ItemUtils.getArrayStackNames(outputItems));
+ GTPPRecipeMaps.fishPondRecipes.addRecipe(x, false, false, false);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GasSpargingRecipe.java b/src/main/java/gregtech/api/util/GasSpargingRecipe.java
new file mode 100644
index 0000000000..667cc78d85
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GasSpargingRecipe.java
@@ -0,0 +1,103 @@
+package gregtech.api.util;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.data.ArrayUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class GasSpargingRecipe implements Comparable<GasSpargingRecipe> {
+
+ public final FluidStack mInputGas;
+ public final FluidStack mInputSpentFuel;
+ public final FluidStack mOutputSpargedFuel;
+ public final int[] mMaxOutputQuantity;
+ public final FluidStack[] mFluidInputs;
+ public final FluidStack[] mFluidOutputs;
+ public final int mDuration;
+ public final int mEUt;
+
+ public GasSpargingRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel, FluidStack aSpargedFuel,
+ FluidStack[] aOutputs, int[] aMaxOutputQuantity) {
+ mInputGas = aSpargeGas;
+ mInputSpentFuel = aSpentFuel;
+ mOutputSpargedFuel = aSpargedFuel;
+ mFluidInputs = new FluidStack[] { mInputGas, mInputSpentFuel };
+ aOutputs = ArrayUtils.insertElementAtIndex(aOutputs, 0, aSpargeGas);
+ aOutputs = ArrayUtils.insertElementAtIndex(aOutputs, 1, aSpargedFuel);
+ mFluidOutputs = aOutputs;
+ mMaxOutputQuantity = aMaxOutputQuantity;
+ mDuration = 500;
+ mEUt = MaterialUtils.getVoltageForTier(5);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof GasSpargingRecipe i) {
+ if (this.mInputGas.equals(i.mInputGas) && this.mInputSpentFuel.equals(i.mInputSpentFuel)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getMaxOutput(int aIndex) {
+ if (aIndex == 0) {
+ return mInputGas.amount * 100;
+ } else if (aIndex == 1) {
+ return mOutputSpargedFuel.amount * 100;
+ }
+ aIndex -= 2;
+ if ((aIndex < 0) || (aIndex >= this.mMaxOutputQuantity.length)) {
+ return 10000;
+ }
+ return this.mMaxOutputQuantity[aIndex];
+ }
+
+ public boolean isValid() {
+ if (mInputGas == null || mInputGas.amount <= 0
+ || mInputSpentFuel == null
+ || mInputSpentFuel.amount <= 0
+ || mFluidOutputs == null
+ || mFluidOutputs.length < 1
+ || mMaxOutputQuantity == null
+ || mMaxOutputQuantity.length < 1
+ || mFluidOutputs.length != mMaxOutputQuantity.length) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean containsInputs(FluidStack aSpargeGas, FluidStack aSpentFuel) {
+ if (aSpargeGas != null && aSpargeGas.getFluid()
+ .equals(this.mInputGas.getFluid())) {
+ if (aSpentFuel != null && aSpentFuel.getFluid()
+ .equals(this.mInputSpentFuel.getFluid())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int compareTo(GasSpargingRecipe o) {
+ if (o.mFluidOutputs.length > this.mFluidOutputs.length) {
+ return 1;
+ } else if (o.mFluidOutputs.length == this.mFluidOutputs.length) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
+ public String[] getRecipeInfo() {
+ AutoMap<String> result = new AutoMap<>();
+ result.put("Input " + ItemUtils.getArrayStackNames(mFluidInputs));
+ result.put("Output " + ItemUtils.getArrayStackNames(mFluidOutputs));
+ result.put("Duration: " + mDuration);
+ result.put("EU/t: " + mEUt);
+ String s[] = result.toArray();
+ return s;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java b/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java
new file mode 100644
index 0000000000..6dcc7721e0
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java
@@ -0,0 +1,45 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class GasSpargingRecipeMap extends AutoMap<GasSpargingRecipe> {
+
+ public static final AutoMap<GasSpargingRecipe> mRecipes = new AutoMap<>();
+ public static final String mUnlocalizedName = "gtpp.recipe.lftr.sparging";
+ public static final String mNEIName = mUnlocalizedName;
+ public static final String mNEIDisplayName = "LFTR Gas Sparging";
+ public static final String mNEIGUIPath = GregTech.getResourcePath("textures", "gui/basicmachines/FissionFuel.png");
+
+ public static boolean addRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel, FluidStack aSpargedFuel,
+ FluidStack[] aOutputs, int[] aMaxOutputs) {
+ if (aSpargeGas == null || aSpargeGas.amount <= 0
+ || aSpentFuel == null
+ || aSpentFuel.amount <= 0
+ || aSpargedFuel == null
+ || aSpargedFuel.amount <= 0
+ || aOutputs == null
+ || aOutputs.length < 1
+ || aMaxOutputs == null
+ || aMaxOutputs.length < 1
+ || aOutputs.length != aMaxOutputs.length) {
+ return false;
+ }
+ int aMapSize = mRecipes.size();
+ GasSpargingRecipe aRecipe = new GasSpargingRecipe(aSpargeGas, aSpentFuel, aSpargedFuel, aOutputs, aMaxOutputs);
+ mRecipes.put(aRecipe);
+ return mRecipes.size() > aMapSize;
+ }
+
+ public static GasSpargingRecipe findRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel) {
+ for (GasSpargingRecipe aRecipe : mRecipes) {
+ if (aRecipe.containsInputs(aSpargeGas, aSpentFuel)) {
+ return aRecipe;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/HotFuel.java b/src/main/java/gregtech/api/util/HotFuel.java
new file mode 100644
index 0000000000..6054a57b84
--- /dev/null
+++ b/src/main/java/gregtech/api/util/HotFuel.java
@@ -0,0 +1,40 @@
+package gregtech.api.util;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+
+public class HotFuel {
+
+ public static void addNewHotFuel(FluidStack aInput1, FluidStack aOutput1, ItemStack[] outputItems, int[] chances,
+ int aSpecialValue) {
+ GTPPRecipeMaps.thermalBoilerRecipes.addRecipe(
+ true,
+ null,
+ outputItems,
+ null,
+ chances,
+ new FluidStack[] { aInput1 },
+ new FluidStack[] { aOutput1 },
+ 1, // 1 Tick
+ 0, // No Eu produced
+ aSpecialValue // Magic Number
+ );
+ }
+
+ public static void addNewHotFuel(FluidStack aInput1, FluidStack aOutput1, FluidStack aOutput2, int aSpecialValue) {
+ GTPPRecipeMaps.thermalBoilerRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ new FluidStack[] { aInput1 },
+ new FluidStack[] { aOutput1, aOutput2 },
+ 20, // 1 Second
+ 0, // No Eu produced
+ aSpecialValue // Magic Number
+ );
+ }
+}
diff --git a/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java b/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java
new file mode 100644
index 0000000000..e3baa9ac90
--- /dev/null
+++ b/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java
@@ -0,0 +1,136 @@
+package gregtech.api.util;
+
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.semiFluidFuels;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class SemiFluidFuelHandler {
+
+ public static boolean addSemiFluidFuel(ItemStack aFuelItem, int aFuelValue) {
+ FluidStack p = FluidContainerRegistry.getFluidForFilledItem(aFuelItem);
+ if (p != null && aFuelValue > 0) {
+ return addSemiFluidFuel(p, aFuelValue);
+ } else {
+ Logger.INFO("Fuel value for " + aFuelItem.getDisplayName() + " is <= 0, ignoring.");
+ }
+ return false;
+ }
+
+ public static boolean addSemiFluidFuel(FluidStack aFuel, int aFuelValue) {
+ FluidStack p = aFuel;
+ if (p != null && aFuelValue > 0) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { p },
+ null,
+ 0,
+ 0,
+ aFuelValue);
+ if (aRecipe.mSpecialValue > 0) {
+ Logger.INFO(
+ "Added " + aRecipe.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + (aRecipe.mSpecialValue * 1000)
+ + "EU per 1000L.");
+ semiFluidFuels.add(aRecipe);
+ return true;
+ }
+ } else {
+ Logger.INFO("Fuel value for " + p != null ? p.getLocalizedName() : "NULL Fluid" + " is <= 0, ignoring.");
+ }
+ return false;
+ }
+
+ public static boolean generateFuels() {
+ final FluidStack aCreosote = FluidUtils.getFluidStack("creosote", 1000);
+ final FluidStack aHeavyFuel = FluidUtils.getFluidStack("liquid_heavy_fuel", 1000);
+ final FluidStack aHeavyOil = FluidUtils.getFluidStack("liquid_heavy_oil", 1000);
+ final HashMap<Integer, Pair<FluidStack, Integer>> aFoundFluidsFromItems = new HashMap<>();
+ // Find Fluids From items
+ for (final GT_Recipe r : RecipeMaps.denseLiquidFuels.getAllRecipes()) {
+
+ GT_Recipe g = r.copy();
+
+ if (g != null && g.mEnabled && g.mInputs.length > 0 && g.mInputs[0] != null) {
+ for (ItemStack i : g.mInputs) {
+ FluidStack f = FluidContainerRegistry.getFluidForFilledItem(i);
+ if (f != null) {
+ Pair<FluidStack, Integer> aData = new Pair<>(f, g.mSpecialValue);
+ aFoundFluidsFromItems.put(aData.hashCode(), aData);
+ }
+ }
+ } else if (g != null && g.mEnabled && g.mFluidInputs.length > 0 && g.mFluidInputs[0] != null) {
+ boolean aContainsCreosote = false;
+ for (FluidStack f : g.mFluidInputs) {
+ if (f.isFluidEqual(aCreosote)) {
+ aContainsCreosote = true;
+ }
+ }
+ g.mSpecialValue *= aContainsCreosote ? 6 : 3;
+ Logger.INFO(
+ "Added " + g.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + g.mSpecialValue
+ + "EU per 1000L.");
+ semiFluidFuels.add(g);
+ }
+ }
+ for (Pair<FluidStack, Integer> p : aFoundFluidsFromItems.values()) {
+ if (p != null) {
+ int aFuelValue = p.getValue();
+ if (p.getKey()
+ .isFluidEqual(aCreosote)) {
+ aFuelValue *= 6;
+ } else if (p.getKey()
+ .isFluidEqual(aHeavyFuel)
+ || p.getKey()
+ .isFluidEqual(aHeavyOil)) {
+ aFuelValue *= 1.5;
+ } else {
+ aFuelValue *= 2;
+ }
+
+ if (aFuelValue <= (128 * 3)) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { p.getKey() },
+ null,
+ 0,
+ 0,
+ aFuelValue);
+ if (aRecipe.mSpecialValue > 0) {
+ Logger.INFO(
+ "Added " + aRecipe.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + (aRecipe.mSpecialValue * 1000)
+ + "EU per 1000L.");
+ semiFluidFuels.add(aRecipe);
+ }
+ } else {
+ Logger.INFO(
+ "Boosted Fuel value for " + p.getKey()
+ .getLocalizedName() + " exceeds 512k, ignoring.");
+ }
+ }
+ }
+ return !semiFluidFuels.getAllRecipes()
+ .isEmpty();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/GTplusplus.java b/src/main/java/gtPlusPlus/GTplusplus.java
new file mode 100644
index 0000000000..b024e0e88a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/GTplusplus.java
@@ -0,0 +1,395 @@
+package gtPlusPlus;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Names;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustomCapes;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.launchwrapper.Launch;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLMissingMappingsEvent;
+import cpw.mods.fml.common.event.FMLMissingMappingsEvent.MissingMapping;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.event.FMLServerStoppingEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.FishPondFakeRecipe;
+import gregtech.api.util.SemiFluidFuelHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.commands.CommandEnableDebugWhileRunning;
+import gtPlusPlus.core.commands.CommandMath;
+import gtPlusPlus.core.common.CommonProxy;
+import gtPlusPlus.core.config.ConfigHandler;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.handler.PacketHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.LocaleUtils;
+import gtPlusPlus.plugin.manager.Core_Manager;
+import gtPlusPlus.xmod.gregtech.common.Meta_GT_Proxy;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_BlastSmelterGT_GTNH;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MultisUsingFluidInsteadOfCells;
+import gtPlusPlus.xmod.thaumcraft.commands.CommandDumpAspects;
+
+@Mod(
+ modid = Names.G_T_PLUS_PLUS,
+ name = CORE.name,
+ version = CORE.VERSION,
+ dependencies = "required-after:Forge;" + " after:TConstruct;"
+ + " after:dreamcraft;"
+ + " after:IC2;"
+ + " required-after:gregtech;"
+ + " after:Forestry;"
+ + " after:MagicBees;"
+ + " after:CoFHCore;"
+ + " after:Railcraft;"
+ + " after:CompactWindmills;"
+ + " after:ForbiddenMagic;"
+ + " after:ExtraUtilities;"
+ + " after:Thaumcraft;"
+ + " after:EnderIO;"
+ + " after:tectech;"
+ + " after:OpenBlocks;"
+ + " after:IC2NuclearControl;"
+ + " after:TGregworks;"
+ + " after:StevesCarts;"
+ + " required-after:gtnhlib@[0.0.10,);")
+public class GTplusplus implements ActionListener {
+
+ public enum INIT_PHASE {
+
+ SUPER(null),
+ PRE_INIT(SUPER),
+ INIT(PRE_INIT),
+ POST_INIT(INIT),
+ SERVER_START(POST_INIT),
+ STARTED(SERVER_START);
+
+ private boolean mIsPhaseActive = false;
+ private final INIT_PHASE mPrev;
+
+ INIT_PHASE(INIT_PHASE aPreviousPhase) {
+ mPrev = aPreviousPhase;
+ }
+
+ public final synchronized boolean isPhaseActive() {
+ return mIsPhaseActive;
+ }
+
+ public final synchronized void setPhaseActive(boolean aIsPhaseActive) {
+ if (mPrev != null && mPrev.isPhaseActive()) {
+ mPrev.setPhaseActive(false);
+ }
+ mIsPhaseActive = aIsPhaseActive;
+ if (CURRENT_LOAD_PHASE != this) {
+ CURRENT_LOAD_PHASE = this;
+ }
+ }
+ }
+
+ public static INIT_PHASE CURRENT_LOAD_PHASE = INIT_PHASE.SUPER;
+
+ // Mod Instance
+ @Mod.Instance(Names.G_T_PLUS_PLUS)
+ public static GTplusplus instance;
+
+ // GT++ Proxy Instances
+ @SidedProxy(clientSide = "gtPlusPlus.core.proxy.ClientProxy", serverSide = "gtPlusPlus.core.proxy.ServerProxy")
+ public static CommonProxy proxy;
+
+ // Loads Textures
+ @SideOnly(value = Side.CLIENT)
+ public static void loadTextures() {
+ Logger.INFO("Loading some textures on the client.");
+ // Tools
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtTools.ANGLE_GRINDER.getTextureFile()
+ .getResourcePath());
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtTools.ELECTRIC_SNIPS.getTextureFile()
+ .getResourcePath());
+
+ // Blocks
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtBlock.Casing_Machine_Dimensional.getTextureFile()
+ .getResourcePath());
+ }
+
+ public GTplusplus() {
+ super();
+ INIT_PHASE.SUPER.setPhaseActive(true);
+ }
+
+ // Pre-Init
+ @Mod.EventHandler
+ public void preInit(final FMLPreInitializationEvent event) {
+ INIT_PHASE.PRE_INIT.setPhaseActive(true);
+ // Load all class objects within the plugin package.
+ Core_Manager.veryEarlyInit();
+ PacketHandler.init();
+
+ if (!Utils.isServer()) {
+ enableCustomCapes = true;
+ }
+
+ // Give this a go mate.
+ setupMaterialBlacklist();
+
+ // Handle GT++ Config
+ ConfigHandler.handleConfigFile(event);
+
+ // Check for Dev
+ CORE.DEVENV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
+
+ proxy.preInit(event);
+ Logger.INFO("Setting up our own GT_Proxy.");
+ Meta_GT_Proxy.preInit();
+ Core_Manager.preInit();
+ }
+
+ // Init
+ @Mod.EventHandler
+ public void init(final FMLInitializationEvent event) {
+ INIT_PHASE.INIT.setPhaseActive(true);
+ proxy.init(event);
+ proxy.registerNetworkStuff();
+ Meta_GT_Proxy.init();
+ Core_Manager.init();
+ // Used by foreign players to generate .lang files for translation.
+ if (CORE.ConfigSwitches.dumpItemAndBlockData) {
+ LocaleUtils.generateFakeLocaleFile();
+ }
+ }
+
+ // Post-Init
+ @Mod.EventHandler
+ public void postInit(final FMLPostInitializationEvent event) {
+ INIT_PHASE.POST_INIT.setPhaseActive(true);
+ proxy.postInit(event);
+ BookHandler.runLater();
+ Meta_GT_Proxy.postInit();
+ Core_Manager.postInit();
+
+ Logger.INFO("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ Logger.INFO(
+ "| Recipes succesfully Loaded: " + RegistrationHandler.recipesSuccess
+ + " | Failed: "
+ + RegistrationHandler.recipesFailed
+ + " |");
+ Logger.INFO("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ Logger.INFO("Finally, we are finished. Have some cripsy bacon as a reward.");
+
+ // Log free GT++ Meta IDs
+ if (CORE.DEVENV) {
+ // 750 - 999 are reserved for Alkalus.
+ for (int i = 750; i < 1000; i++) {
+ if (gregtech.api.GregTech_API.METATILEENTITIES[i] == null) {
+ Logger.INFO("MetaID " + i + " is free.");
+ }
+ }
+ // 30000 - 31999 are reserved for Alkalus.
+ for (int i = 30000; i < 32000; i++) {
+ if (gregtech.api.GregTech_API.METATILEENTITIES[i] == null) {
+ Logger.INFO("MetaID " + i + " is free.");
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public synchronized void serverStarting(final FMLServerStartingEvent event) {
+ INIT_PHASE.SERVER_START.setPhaseActive(true);
+ event.registerServerCommand(new CommandMath());
+ event.registerServerCommand(new CommandEnableDebugWhileRunning());
+ if (Thaumcraft.isModLoaded()) {
+ event.registerServerCommand(new CommandDumpAspects());
+ }
+ Core_Manager.serverStart();
+ INIT_PHASE.STARTED.setPhaseActive(true);
+ }
+
+ @Mod.EventHandler
+ public synchronized void serverStopping(final FMLServerStoppingEvent event) {
+ Core_Manager.serverStop();
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {}
+
+ /**
+ * This {@link EventHandler} is called after the {@link FMLPostInitializationEvent} stages of all loaded mods
+ * executes successfully. {@link #onLoadComplete(FMLLoadCompleteEvent)} exists to inject recipe generation after
+ * Gregtech and all other mods are entirely loaded and initialized.
+ *
+ * @param event - The {@link EventHandler} object passed through from FML to {@link #GTplusplus()}'s
+ * {@link #instance}.
+ */
+ @Mod.EventHandler
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ proxy.onLoadComplete(event);
+ generateGregtechRecipeMaps();
+ }
+
+ protected void generateGregtechRecipeMaps() {
+
+ int[] mInvalidCount = new int[] { 0, 0, 0, 0, 0, 0, 0 };
+
+ RecipeGen_BlastSmelterGT_GTNH.generateGTNHBlastSmelterRecipesFromEBFList();
+ FishPondFakeRecipe.generateFishPondRecipes();
+ SemiFluidFuelHandler.generateFuels();
+
+ mInvalidCount[0] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.centrifugeRecipes, GTPPRecipeMaps.centrifugeNonCellRecipes);
+ mInvalidCount[1] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.electrolyzerRecipes, GTPPRecipeMaps.electrolyzerNonCellRecipes);
+ mInvalidCount[2] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.vacuumFreezerRecipes, GTPPRecipeMaps.advancedFreezerRecipes);
+ mInvalidCount[3] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.mixerRecipes, GTPPRecipeMaps.mixerNonCellRecipes);
+ mInvalidCount[4] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ GTPPRecipeMaps.chemicalDehydratorNonCellRecipes);
+ mInvalidCount[5] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.coldTrapRecipes,
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes);
+ mInvalidCount[6] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes);
+ }
+
+ private static void setupMaterialBlacklist() {
+ Material.invalidMaterials.put(Materials._NULL);
+ Material.invalidMaterials.put(Materials.Clay);
+ Material.invalidMaterials.put(Materials.Phosphorus);
+ Material.invalidMaterials.put(Materials.Steel);
+ Material.invalidMaterials.put(Materials.Bronze);
+ Material.invalidMaterials.put(Materials.Hydrogen);
+ // Infused TC stuff
+ Material.invalidMaterials.put(Materials.InfusedAir);
+ Material.invalidMaterials.put(Materials.InfusedEarth);
+ Material.invalidMaterials.put(Materials.InfusedFire);
+ Material.invalidMaterials.put(Materials.InfusedWater);
+ // EIO Materials
+ Material.invalidMaterials.put(Materials.SoulSand);
+ Material.invalidMaterials.put(Materials.EnderPearl);
+ Material.invalidMaterials.put(Materials.EnderEye);
+ Material.invalidMaterials.put(Materials.Redstone);
+ Material.invalidMaterials.put(Materials.Glowstone);
+ Material.invalidMaterials.put(Materials.Soularium);
+ Material.invalidMaterials.put(Materials.PhasedIron);
+
+ }
+
+ private static final HashMap<String, Item> sMissingItemMappings = new HashMap<>();
+ private static final HashMap<String, Block> sMissingBlockMappings = new HashMap<>();
+
+ private static void processMissingMappings() {
+ sMissingItemMappings.put("miscutils:Ammonium", GameRegistry.findItem(GTPlusPlus.ID, "itemCellAmmonium"));
+ sMissingItemMappings.put("miscutils:Hydroxide", GameRegistry.findItem(GTPlusPlus.ID, "itemCellHydroxide"));
+ sMissingItemMappings.put(
+ "miscutils:BerylliumHydroxide",
+ GameRegistry.findItem(GTPlusPlus.ID, "itemCellmiscutils:BerylliumHydroxide"));
+ sMissingItemMappings.put("miscutils:Bromine", GameRegistry.findItem(GTPlusPlus.ID, "itemCellBromine"));
+ sMissingItemMappings.put("miscutils:Krypton", GameRegistry.findItem(GTPlusPlus.ID, "itemCellKrypton"));
+ sMissingItemMappings.put(
+ "miscutils:itemCellZirconiumTetrafluoride",
+ GameRegistry.findItem(GTPlusPlus.ID, "ZirconiumTetrafluoride"));
+ sMissingItemMappings
+ .put("miscutils:Li2BeF4", GameRegistry.findItem(GTPlusPlus.ID, "itemCellLithiumTetrafluoroberyllate"));
+
+ // Cryolite
+ sMissingBlockMappings.put("miscutils:oreCryolite", GameRegistry.findBlock(GTPlusPlus.ID, "oreCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustTinyCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustTinyCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustSmallCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustSmallCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:dustPureCryolite", GameRegistry.findItem(GTPlusPlus.ID, "dustPureCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:dustImpureCryolite", GameRegistry.findItem(GTPlusPlus.ID, "dustImpureCryoliteF"));
+ sMissingItemMappings.put("miscutils:crushedCryolite", GameRegistry.findItem(GTPlusPlus.ID, "crushedCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:crushedPurifiedCryolite", GameRegistry.findItem(GTPlusPlus.ID, "crushedPurifiedCryoliteF"));
+ sMissingItemMappings.put(
+ "miscutils:crushedCentrifugedCryolite",
+ GameRegistry.findItem(GTPlusPlus.ID, "crushedCentrifugedCryoliteF"));
+ sMissingItemMappings.put("miscutils:oreCryolite", GameRegistry.findItem(GTPlusPlus.ID, "oreCryoliteF"));
+
+ // Fluorite
+ sMissingBlockMappings.put("miscutils:oreFluorite", GameRegistry.findBlock(GTPlusPlus.ID, "oreFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustTinyFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustTinyFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustSmallFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustSmallFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:dustPureFluorite", GameRegistry.findItem(GTPlusPlus.ID, "dustPureFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:dustImpureFluorite", GameRegistry.findItem(GTPlusPlus.ID, "dustImpureFluoriteF"));
+ sMissingItemMappings.put("miscutils:crushedFluorite", GameRegistry.findItem(GTPlusPlus.ID, "crushedFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:crushedPurifiedFluorite", GameRegistry.findItem(GTPlusPlus.ID, "crushedPurifiedFluoriteF"));
+ sMissingItemMappings.put(
+ "miscutils:crushedCentrifugedFluorite",
+ GameRegistry.findItem(GTPlusPlus.ID, "crushedCentrifugedFluoriteF"));
+ sMissingItemMappings.put("miscutils:oreFluorite", GameRegistry.findItem(GTPlusPlus.ID, "oreFluoriteF"));
+ }
+
+ @Mod.EventHandler
+ public void missingMapping(FMLMissingMappingsEvent event) {
+ processMissingMappings();
+ for (MissingMapping mapping : event.getAll()) {
+ if (mapping.name.startsWith("Australia:")) {
+ mapping.ignore();
+ continue;
+ }
+ if (mapping.type == GameRegistry.Type.ITEM) {
+ Item aReplacement = sMissingItemMappings.get(mapping.name);
+ if (aReplacement != null) {
+ remap(aReplacement, mapping);
+ }
+
+ } else if (mapping.type == GameRegistry.Type.BLOCK) {
+ Block aReplacement = sMissingBlockMappings.get(mapping.name);
+ if (aReplacement != null) {
+ remap(aReplacement, mapping);
+ }
+
+ }
+ }
+ }
+
+ private static void remap(Item item, FMLMissingMappingsEvent.MissingMapping mapping) {
+ mapping.remap(item);
+ Logger.INFO("Remapping item " + mapping.name + " to " + GTPlusPlus.ID + ":" + item.getUnlocalizedName());
+ }
+
+ private static void remap(Block block, FMLMissingMappingsEvent.MissingMapping mapping) {
+ mapping.remap(block);
+ Logger.INFO("Remapping block " + mapping.name + " to " + GTPlusPlus.ID + ":" + block.getUnlocalizedName());
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java b/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java
new file mode 100644
index 0000000000..d2a1e34f99
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.api.interfaces;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public interface ILazyCoverable extends ICoverable {
+
+ @Override
+ default byte getColorization() {
+ return 0;
+ }
+
+ @Override
+ default byte setColorization(byte arg0) {
+ return 0;
+ }
+
+ @Override
+ default byte getInputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default byte getStrongestRedstone() {
+ return 0;
+ }
+
+ @Override
+ default boolean getRedstone() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ default boolean getRedstone(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ default boolean isUniversalEnergyStored(long arg0) {
+ return false;
+ }
+
+ @Override
+ default long getUniversalEnergyStored() {
+ return 0;
+ }
+
+ @Override
+ default long getUniversalEnergyCapacity() {
+ return 0;
+ }
+
+ @Override
+ default long getStoredSteam() {
+ return 0;
+ }
+
+ @Override
+ default long getSteamCapacity() {
+ return 0;
+ }
+
+ @Override
+ default boolean increaseStoredSteam(long arg0, boolean arg2) {
+ return false;
+ }
+
+ @Override
+ default byte getOutputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default void setOutputRedstoneSignal(ForgeDirection side, byte strength) {}
+
+ @Override
+ default byte getStrongOutputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default void setStrongOutputRedstoneSignal(ForgeDirection side, byte arg1) {}
+
+ @Override
+ default byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntity(int arg0, int arg1, int arg2) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityOffset(int arg0, int arg1, int arg2) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int arg1) {
+ return null;
+ }
+
+ @Override
+ default byte getMetaID(int arg0, int arg1, int arg2) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDOffset(int arg0, int arg1, int arg2) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDAtSide(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDAtSideAndDistance(ForgeDirection side, int arg1) {
+ return 0;
+ }
+
+ @Override
+ default boolean isDead() {
+ return false;
+ }
+
+ @Override
+ default void setLightValue(byte arg0) {}
+}
diff --git a/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java b/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java
new file mode 100644
index 0000000000..d70a19925e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.api.interfaces;
+
+import gtPlusPlus.api.objects.Logger;
+
+public interface IPlugin {
+
+ /**
+ * @return A {@link String} object which returns the {@link IPlugin}'s name.
+ */
+ public String getPluginName();
+
+ /**
+ * @return A {@link String} object which returns the {@link IPlugin}'s short name. This String should only contain 4
+ * Characters.
+ */
+ public String getPluginAbbreviation();
+
+ /**
+ * @param message - A {@link String} object which holds a message to be logged to console.
+ */
+ default void log(String message) {
+ Logger.INFO("[" + getPluginAbbreviation() + "] " + message);
+ }
+
+ /**
+ * @param message - A {@link String} object which holds a warning/error message to be logged to console.
+ */
+ default void logDebug(String message) {
+ Logger.WARNING("[" + getPluginAbbreviation() + "] " + message);
+ }
+
+ public boolean preInit();
+
+ public boolean init();
+
+ public boolean postInit();
+
+ public boolean serverStart();
+
+ public boolean serverStop();
+}
diff --git a/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java b/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java
new file mode 100644
index 0000000000..a6179ce2bf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+
+public interface ITexturedBlock extends ITexturedTileEntity {
+
+ ITexture[] getTexture(ForgeDirection side);
+
+ @Override
+ ITexture[] getTexture(Block block, ForgeDirection side);
+}
diff --git a/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java b/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java
new file mode 100644
index 0000000000..f059ef8a5f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java
@@ -0,0 +1,6 @@
+package gtPlusPlus.api.interfaces;
+
+public interface ITileTooltip {
+
+ int getTooltipID();
+}
diff --git a/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java b/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java
new file mode 100644
index 0000000000..f00287404b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java
@@ -0,0 +1,7 @@
+package gtPlusPlus.api.interfaces;
+
+public interface RunnableWithInfo<V> extends Runnable {
+
+ V getInfoData();
+
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/Logger.java b/src/main/java/gtPlusPlus/api/objects/Logger.java
new file mode 100644
index 0000000000..0178bb141a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/Logger.java
@@ -0,0 +1,162 @@
+package gtPlusPlus.api.objects;
+
+import org.apache.logging.log4j.LogManager;
+
+import cpw.mods.fml.common.FMLLog;
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+
+public class Logger {
+
+ public Logger() {}
+
+ // Logging Functions
+ public static final org.apache.logging.log4j.Logger modLogger = Logger.makeLogger();
+
+ // Generate GT++ Logger
+ public static org.apache.logging.log4j.Logger makeLogger() {
+ final org.apache.logging.log4j.Logger gtPlusPlusLogger = LogManager.getLogger("GT++");
+ return gtPlusPlusLogger;
+ }
+
+ private static final boolean enabled = !AsmConfig.disableAllLogging;
+
+ public static final org.apache.logging.log4j.Logger getLogger() {
+ return modLogger;
+ }
+
+ // Non-Dev Comments
+ public static void INFO(final String s) {
+ if (enabled) {
+ modLogger.info(s);
+ }
+ }
+
+ // Non-Dev Comments
+ public static void MACHINE_INFO(String s, Object... args) {
+ if (enabled) {
+ boolean localPlayer = CORE_Preloader.DEV_ENVIRONMENT;
+ if (CORE.ConfigSwitches.MACHINE_INFO || localPlayer) {
+ final String name1 = gtPlusPlus.core.util.reflect.ReflectionUtils.getMethodName(2);
+ modLogger.info("Machine Info: " + s + " | " + name1, args);
+ }
+ }
+ }
+
+ // Developer Comments
+ public static void WARNING(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ modLogger.warn(s);
+ }
+ }
+ }
+
+ // Errors
+ public static void ERROR(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ modLogger.fatal(s);
+ }
+ }
+ }
+
+ // Developer Logger
+ public static void SPECIFIC_WARNING(final String whatToLog, final String msg, final int line) {
+ if (enabled) {
+ // if (!CORE_Preloader.DEBUG_MODE){
+ FMLLog.warning("GT++ |" + line + "| " + whatToLog + " | " + msg);
+ // }
+ }
+ }
+
+ // ASM Comments
+ public static void LOG_ASM(final String s) {
+ if (enabled) {
+ FMLRelaunchLog.info("[Special ASM Logging] ", s);
+ }
+ }
+
+ /**
+ * Special Loggers
+ */
+
+ /**
+ * Special Logger for Bee related content
+ */
+ public static void BEES(final String s) {
+ modLogger.info("[Bees] " + s);
+ }
+
+ /**
+ * Special Logger for Debugging Bee related content
+ */
+ public static void DEBUG_BEES(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Debug][Bees] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Materials related content
+ */
+ public static void MATERIALS(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Materials] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Debugging Materials related content
+ */
+ public static void DEBUG_MATERIALS(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Debug][Materials] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Reflection related content
+ */
+ public static void REFLECTION(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Reflection] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Darkworld related content
+ */
+ public static void WORLD(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[WorldGen] " + s);
+ }
+ }
+ }
+
+ public static void RECIPE(String string) {
+ if (enabled) {
+ if (
+ /* CORE_Preloader.DEV_ENVIRONMENT || */ CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Recipe] " + string);
+ }
+ }
+ }
+
+ public static void SPACE(final String s) {
+ if (enabled) {
+ modLogger.info("[Space] " + s);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java b/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java
new file mode 100644
index 0000000000..a3551326c2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java
@@ -0,0 +1,364 @@
+package gtPlusPlus.api.objects.data;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+
+public class AutoMap<V> implements Iterable<V>, Cloneable, Serializable, Collection<V>, Queue<V>, List<V> {
+
+ /**
+ * The Internal Map
+ */
+ protected final Map<Integer, V> mInternalMap;
+
+ protected final Map<String, Integer> mInternalNameMap;
+
+ /**
+ * The Internal ID
+ */
+ private int mInternalID = 0;
+
+ private static final long serialVersionUID = 3771412318075131790L;
+
+ public AutoMap() {
+ this(new LinkedHashMap<>());
+ }
+
+ public Map<Integer, V> getMap() {
+ return mInternalMap;
+ }
+
+ public AutoMap(Map<Integer, V> defaultMapType) {
+ mInternalMap = defaultMapType;
+ mInternalNameMap = new LinkedHashMap<>();
+ }
+
+ /**
+ * Generates an AutoMap from the List.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(List<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Set.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(Set<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Collection.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(Collection<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Array.
+ *
+ * @param aArray - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(V[] aArray) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aArray != null && aArray.length > 0) {
+ for (V obj : aArray) {
+ add(obj);
+ }
+ }
+ }
+
+ @Override
+ public Iterator<V> iterator() {
+ return values().iterator();
+ }
+
+ public synchronized boolean setValue(V object) {
+ int mOriginalID = this.mInternalID;
+ put(object);
+ if (this.mInternalMap.get(mOriginalID)
+ .equals(object) || mOriginalID > this.mInternalID) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public synchronized V put(V object) {
+ return set(object);
+ }
+
+ @Override
+ public synchronized boolean add(V object) {
+ return set(object) != null;
+ }
+
+ public synchronized V set(V object) {
+ if (object == null) {
+ return null;
+ }
+ mInternalNameMap.put("" + object.hashCode(), (mInternalID + 1));
+ return mInternalMap.put(mInternalID++, object);
+ }
+
+ @Override
+ public synchronized V get(int id) {
+ return mInternalMap.get(id);
+ }
+
+ public synchronized Collection<V> values() {
+ return mInternalMap.values();
+ }
+
+ @Override
+ public synchronized int size() {
+ return mInternalMap.size();
+ }
+
+ public synchronized int hashCode() {
+ return mInternalMap.hashCode();
+ }
+
+ public synchronized boolean containsKey(int key) {
+ return mInternalMap.containsKey(key);
+ }
+
+ public synchronized boolean containsValue(V value) {
+ return mInternalMap.containsValue(value);
+ }
+
+ @Override
+ public synchronized boolean isEmpty() {
+ return mInternalMap.isEmpty();
+ }
+
+ @Override
+ public synchronized void clear() {
+ this.mInternalID = 0;
+ this.mInternalMap.clear();
+ this.mInternalNameMap.clear();
+ return;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public V[] toArray() {
+ V[] toR = (V[]) java.lang.reflect.Array.newInstance(
+ mInternalMap.get(0)
+ .getClass(),
+ mInternalMap.size());
+ for (int i = 0; i < mInternalMap.size(); i++) {
+ toR[i] = mInternalMap.get(i);
+ }
+ return toR;
+ }
+
+ public final synchronized int getInternalID() {
+ return mInternalID;
+ }
+
+ @Override
+ public final synchronized boolean remove(Object value) {
+ value.getClass();
+ if (this.mInternalMap.containsValue(value)) {
+ return this.mInternalMap.remove(mInternalNameMap.get("" + value.hashCode()), value);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ for (V g : this.mInternalMap.values()) {
+ if (g.equals(o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <V> V[] toArray(V[] a) {
+ return (V[]) toArray();
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> c) {
+ boolean aTrue = true;
+ for (Object g : c) {
+ if (!this.contains(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends V> c) {
+ boolean aTrue = true;
+ for (V g : c) {
+ if (!this.add(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> c) {
+ boolean aTrue = true;
+ for (Object g : c) {
+ if (!this.remove(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> c) {
+ AutoMap<?> aTempAllocation = new AutoMap<>();
+ boolean aTrue = false;
+ aTempAllocation = this;
+ aTempAllocation.removeAll(c);
+ aTempAllocation.clear();
+ aTrue = aTempAllocation.isEmpty();
+ aTempAllocation.clear();
+ return aTrue;
+ }
+
+ @Override
+ public boolean offer(V e) {
+ return add(e);
+ }
+
+ @Override
+ public V remove() {
+ V y = this.get(0);
+ if (remove(y)) return y;
+ else return null;
+ }
+
+ @Override
+ public V poll() {
+ if (this.mInternalMap.isEmpty()) {
+ return null;
+ }
+ return remove();
+ }
+
+ @Override
+ public V element() {
+ if (this.mInternalMap.isEmpty()) {
+ return null;
+ }
+ return this.get(0);
+ }
+
+ @Override
+ public V peek() {
+ return element();
+ }
+
+ @Override
+ public boolean addAll(int index, Collection<? extends V> c) {
+ for (V y : c) {
+ add(y);
+ }
+ return true;
+ }
+
+ @Override
+ public V set(int index, V element) {
+ return mInternalMap.put(index, element);
+ }
+
+ @Override
+ public void add(int index, V element) {
+ add(element);
+ }
+
+ @Override
+ public V remove(int index) {
+ V h = mInternalMap.get(index);
+ set(index, null);
+ return h;
+ }
+
+ @Override
+ public int indexOf(Object o) {
+ int aCount = 0;
+ for (V of : mInternalMap.values()) {
+ if (of != o) {
+ aCount++;
+ continue;
+ } else {
+ return aCount;
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public int lastIndexOf(Object o) {
+ // TODO
+ return indexOf(o);
+ }
+
+ @Override
+ public ListIterator<V> listIterator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ListIterator<V> listIterator(int index) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<V> subList(int fromIndex, int toIndex) {
+ AutoMap<V> aNewSubList = new AutoMap<>();
+ for (int slot = fromIndex; slot <= toIndex; slot++) {
+ V obj = mInternalMap.get(slot);
+ if (obj == null) {
+ continue;
+ } else {
+ aNewSubList.put(obj);
+ }
+ }
+ return aNewSubList;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/Pair.java b/src/main/java/gtPlusPlus/api/objects/data/Pair.java
new file mode 100644
index 0000000000..93bf075c8f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/Pair.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.api.objects.data;
+
+import java.io.Serializable;
+
+import com.google.common.base.Objects;
+
+public class Pair<K, V> implements Serializable {
+
+ /**
+ * SVUID
+ */
+ private static final long serialVersionUID = 1250550491092812443L;
+
+ private final K key;
+ private final V value;
+
+ public Pair(final K key, final V value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public final K getKey() {
+ return this.key;
+ }
+
+ public final V getValue() {
+ return this.value;
+ }
+
+ @Override
+ public int hashCode() {
+ Integer aCode = Objects.hashCode(getKey(), getValue());
+ return aCode != null ? aCode : super.hashCode();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/Quad.java b/src/main/java/gtPlusPlus/api/objects/data/Quad.java
new file mode 100644
index 0000000000..a2597061e0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/Quad.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Quad<K, V, C, R> {
+
+ private final K key;
+ private final V value;
+ private final C value2;
+ private final R value3;
+
+ public Quad(final K key, final V value, final C value2, final R value3) {
+ this.key = key;
+ this.value = value;
+ this.value2 = value2;
+ this.value3 = value3;
+ }
+
+ public final K getKey() {
+ return this.key;
+ }
+
+ public final V getValue_1() {
+ return this.value;
+ }
+
+ public final C getValue_2() {
+ return this.value2;
+ }
+
+ public final R getValue_3() {
+ return this.value3;
+ }
+
+ public final List values() {
+ List<Object> aVals = new ArrayList<>();
+ aVals.add(key);
+ aVals.add(value);
+ aVals.add(value2);
+ aVals.add(value3);
+ return aVals;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/Triplet.java b/src/main/java/gtPlusPlus/api/objects/data/Triplet.java
new file mode 100644
index 0000000000..625ec630aa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/Triplet.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.api.objects.data;
+
+public class Triplet<K, V, C> {
+
+ private final K key;
+ private final V value;
+ private final C count;
+
+ public Triplet(final K key, final V value, final C value2) {
+ this.key = key;
+ this.value = value;
+ this.count = value2;
+ }
+
+ public final K getValue_1() {
+ return this.key;
+ }
+
+ public final V getValue_2() {
+ return this.value;
+ }
+
+ public final C getValue_3() {
+ return this.count;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java b/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java
new file mode 100644
index 0000000000..ea12972af4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class TypeCounter<V> implements Set<V> {
+
+ private Map<String, InternalTypeCounterObject<V>> mInternalMap = new LinkedHashMap<>();
+ private String mHighestValueKey;
+ private int mHighestValue = 0;
+ private final Class mClass;
+
+ public TypeCounter(Class o) {
+ Logger.WARNING("Created new TypeCounter for " + o.getName());
+ mClass = o;
+ }
+
+ public static class InternalTypeCounterObject<Z> {
+
+ private final Z mObject;
+ private int mCounter = 0;
+
+ public InternalTypeCounterObject(Z o) {
+ mObject = o;
+ }
+
+ public String hash() {
+ return String.valueOf(mObject.hashCode());
+ }
+
+ public Z get() {
+ return mObject;
+ }
+
+ public void add() {
+ mCounter++;
+ }
+
+ public int count() {
+ return mCounter;
+ }
+ }
+
+ @Override
+ public boolean add(V arg0) {
+ return add(arg0, null);
+ }
+
+ public boolean add(V arg0, String aKeyName) {
+ String aKey = aKeyName != null ? aKeyName : arg0.toString();
+ InternalTypeCounterObject<V> aValue = mInternalMap.get(aKey);
+ if (aValue == null) {
+ aValue = new InternalTypeCounterObject<>((V) arg0);
+ Logger.WARNING("Adding new key to map: " + aKey);
+ }
+ aValue.add();
+ int a = aValue.count();
+ if (a > mHighestValue) {
+ mHighestValue = a;
+ mHighestValueKey = aKey;
+ Logger.WARNING("New Highest Count - " + aKey + ":" + a);
+ }
+ mInternalMap.put(aKey, aValue);
+ Logger.WARNING(aKey + ":" + a);
+ return true;
+ }
+
+ @Override
+ public boolean addAll(Collection arg0) {
+ boolean aReturn = true;
+ for (Object o : arg0) {
+ if (mClass.isInstance(o)) {
+ V j = (V) o;
+ boolean b = add(j);
+ if (!b) {
+ aReturn = false;
+ }
+ }
+ }
+ return aReturn;
+ }
+
+ @Override
+ public void clear() {
+ mInternalMap.clear();
+ }
+
+ @Override
+ public boolean contains(Object arg0) {
+ return mInternalMap.containsKey(arg0.toString());
+ }
+
+ @Override
+ public boolean containsAll(Collection arg0) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return mInternalMap.isEmpty();
+ }
+
+ @Override
+ public Iterator iterator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean remove(Object arg0) {
+ InternalTypeCounterObject<V> aValue = mInternalMap.remove(arg0.toString());
+ if (aValue != null) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean removeAll(Collection arg0) {
+ boolean aReturn = true;
+ for (Object o : arg0) {
+ boolean a = remove(o);
+ if (!a) {
+ aReturn = false;
+ }
+ }
+ return aReturn;
+ }
+
+ @Override
+ public boolean retainAll(Collection arg0) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int size() {
+ return this.mInternalMap.size();
+ }
+
+ @Override
+ public Object[] toArray() {
+ Object[] aArray = new Object[this.mInternalMap.size()];
+ int aPos = 0;
+ for (String k : this.mInternalMap.keySet()) {
+ if (k != null) {
+ InternalTypeCounterObject<V> aVal = this.mInternalMap.get(k);
+ aArray[aPos++] = new Pair<>(k, aVal);
+ }
+ }
+ return aArray;
+ }
+
+ @Override
+ public V[] toArray(Object[] a) {
+ Object[] aArray = new Object[a.length];
+ int aPos = 0;
+ for (Object k : a) {
+ if (k != null) {
+ aArray[aPos++] = k;
+ }
+ }
+ return (V[]) aArray;
+ }
+
+ public V getResults() {
+ InternalTypeCounterObject<V> x = mInternalMap.get(mHighestValueKey);
+ return x.get();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java b/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java
new file mode 100644
index 0000000000..5d99097169
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeMap;
+
+import gregtech.api.objects.XSTR;
+
+public class WeightedCollection<E> implements Map<Integer, E> {
+
+ private NavigableMap<Integer, E> map = new TreeMap<>();
+ private Random random;
+ private int total = 0;
+
+ public WeightedCollection() {
+ this(new XSTR());
+ }
+
+ public WeightedCollection(Random random) {
+ this.random = random;
+ }
+
+ public E add(int weight, E object) {
+ if (weight <= 0) return null;
+ total += weight;
+ return map.put(total, object);
+ }
+
+ private E next() {
+ int value = random.nextInt(total) + 1; // Can also use floating-point weights
+ return map.ceilingEntry(value)
+ .getValue();
+ }
+
+ @Override
+ public int size() {
+ return map.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return map.containsKey(key);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return map.containsValue(value);
+ }
+
+ public E get() {
+ return next();
+ }
+
+ @Override
+ public E get(Object key) {
+ return next();
+ }
+
+ @Override
+ public void putAll(Map m) {
+ map.putAll(m);
+ }
+
+ @Override
+ public void clear() {
+ map.clear();
+ this.total = 0;
+ }
+
+ @Override
+ public Set keySet() {
+ return map.keySet();
+ }
+
+ @Override
+ public Collection values() {
+ return map.values();
+ }
+
+ @Override
+ public Set entrySet() {
+ return map.entrySet();
+ }
+
+ @Override
+ public E put(Integer key, E value) {
+ return add(key, value);
+ }
+
+ @Override
+ public E remove(Object key) {
+ return map.remove(key);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java b/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java
new file mode 100644
index 0000000000..199d20e06a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.api.objects.data.weakref;
+
+import java.util.WeakHashMap;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class WeakAutoMap<T> extends AutoMap<T> {
+
+ private static final long serialVersionUID = 8328345351801363386L;
+
+ public WeakAutoMap() {
+ super(new WeakHashMap<>());
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java b/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java
new file mode 100644
index 0000000000..e516f12ddd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+
+/**
+ * Generates an AABB around an entity.
+ *
+ * @author Alkalus
+ *
+ */
+public class AABB {
+
+ private final AxisAlignedBB mAabb;
+ private final World mWorld;
+
+ /**
+ * Creates a AxisAlignedBB based around an Entity.
+ *
+ * @param aEntity - The Entity to work with.
+ * @param x - Maximum X from origin.
+ * @param y - Maximum Y from origin.
+ * @param z - Maximum Z from origin.
+ */
+ public AABB(Entity aEntity, int x, int y, int z) {
+ if (aEntity == null) {
+ mAabb = null;
+ mWorld = null;
+ } else {
+ mWorld = aEntity.worldObj;
+ BlockPos aEntityLocation = EntityUtils.findBlockPosUnderEntity(aEntity);
+ int xMin, xMax, yMin, yMax, zMin, zMax;
+ xMin = aEntityLocation.xPos;
+ yMin = aEntityLocation.yPos;
+ zMin = aEntityLocation.zPos;
+ xMax = aEntityLocation.xPos + x;
+ yMax = aEntityLocation.yPos + y;
+ zMax = aEntityLocation.zPos + z;
+ mAabb = AxisAlignedBB.getBoundingBox(xMin, yMin, zMin, xMax, yMax, zMax);
+ }
+ }
+
+ /**
+ * Used to get the AxisAlignedBB from this class.
+ *
+ * @return
+ */
+ public AxisAlignedBB get() {
+ return mAabb;
+ }
+
+ /**
+ * Used to determine if this object is valid or not.
+ *
+ * @return
+ */
+ public boolean valid() {
+ return mAabb != null && mWorld != null;
+ }
+
+ public World world() {
+ return mWorld;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java b/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java
new file mode 100644
index 0000000000..13f12503f0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java
@@ -0,0 +1,185 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+public class BTF_FluidTank extends FluidTank {
+
+ public FluidStack mFluid;
+
+ public BTF_FluidTank(int capacity) {
+ super(capacity);
+ }
+
+ /**
+ * Let's replace the Default handling with GT's own handling code, because it's probably better, right?
+ *
+ * @author Alkalus/GregoriusT
+ */
+ @Override
+ public FluidStack getFluid() {
+ return this.getDrainableStack();
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return this.getDrainableStack() != null ? this.getDrainableStack().amount : 0;
+ }
+
+ @Override
+ public NBTTagCompound writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ if (this.mFluid != null) {
+ aNBT.setTag("mFluid", this.mFluid.writeToNBT(new NBTTagCompound()));
+ }
+ return aNBT;
+ }
+
+ @Override
+ public FluidTank readFromNBT(NBTTagCompound aNBT) {
+ this.mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ return this;
+ }
+
+ /*
+ * public abstract boolean isLiquidInput(byte arg0); public abstract boolean isLiquidOutput(byte arg0); public
+ * abstract boolean doesFillContainers(); public abstract boolean doesEmptyContainers();
+ */
+
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return true;
+ }
+
+ public FluidStack getFillableStack() {
+ return this.mFluid;
+ }
+
+ public FluidStack setFillableStack(FluidStack aFluid) {
+ this.mFluid = aFluid;
+ return this.mFluid;
+ }
+
+ public FluidStack getDrainableStack() {
+ return this.mFluid;
+ }
+
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ this.mFluid = aFluid;
+ return this.mFluid;
+ }
+
+ public boolean isFluidChangingAllowed() {
+ return true;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid != null && aFluid.getFluid()
+ .getID() > 0 && aFluid.amount > 0 && this.canTankBeFilled() && this.isFluidInputAllowed(aFluid)) {
+ if (this.getFillableStack() != null && this.getFillableStack()
+ .getFluid()
+ .getID() > 0) {
+ if (!this.getFillableStack()
+ .isFluidEqual(aFluid)) {
+ return 0;
+ } else {
+ int space = this.getCapacity() - this.getFillableStack().amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ FluidStack arg9999 = this.getFillableStack();
+ arg9999.amount += aFluid.amount;
+ }
+
+ return aFluid.amount;
+ } else {
+ if (doFill) {
+ this.getFillableStack().amount = this.getCapacity();
+ }
+
+ return space;
+ }
+ }
+ } else if (aFluid.amount <= this.getCapacity()) {
+ if (doFill) {
+ this.setFillableStack(aFluid.copy());
+ }
+
+ return aFluid.amount;
+ } else {
+ if (doFill) {
+ this.setFillableStack(aFluid.copy());
+ this.getFillableStack().amount = this.getCapacity();
+ }
+
+ return this.getCapacity();
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ if (this.getDrainableStack() != null && this.canTankBeEmptied()) {
+ if (this.getDrainableStack().amount <= 0 && this.isFluidChangingAllowed()) {
+ this.setDrainableStack((FluidStack) null);
+ return null;
+ } else {
+ int used = maxDrain;
+ if (this.getDrainableStack().amount < maxDrain) {
+ used = this.getDrainableStack().amount;
+ }
+
+ if (doDrain) {
+ FluidStack arg9999 = this.getDrainableStack();
+ arg9999.amount -= used;
+ }
+
+ FluidStack drained = this.getDrainableStack()
+ .copy();
+ drained.amount = used;
+ if (this.getDrainableStack().amount <= 0 && this.isFluidChangingAllowed()) {
+ this.setDrainableStack((FluidStack) null);
+ }
+
+ return drained;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public int getCapacity() {
+ return super.getCapacity();
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(this);
+ }
+
+ @Override
+ public void setFluid(FluidStack fluid) {
+ setFillableStack(fluid);
+ }
+
+ @Override
+ public void setCapacity(int capacity) {
+ super.setCapacity(capacity);
+ }
+
+ public FluidStack drain(FluidStack aFluid, boolean doDrain) {
+ return drain(aFluid.amount, doDrain);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java b/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java
new file mode 100644
index 0000000000..fc71869d9e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java
@@ -0,0 +1,231 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import gtPlusPlus.core.tileentities.base.TileEntityBase;
+import gtPlusPlus.core.util.data.ArrayUtils;
+
+public class BTF_Inventory implements ISidedInventory {
+
+ public final ItemStack[] mInventory;
+ public final TileEntityBase mTile;
+
+ public BTF_Inventory(int aSlots, TileEntityBase tile) {
+ this.mInventory = new ItemStack[aSlots];
+ this.mTile = tile;
+ }
+
+ public ItemStack[] getRealInventory() {
+ purgeNulls();
+ return this.mInventory;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.mInventory.length;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ return aIndex >= 0 && aIndex < this.mInventory.length ? this.mInventory[aIndex] : null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (aIndex >= 0 && aIndex < this.mInventory.length) {
+ this.mInventory[aIndex] = aStack;
+ }
+ }
+
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public boolean setStackToZeroInsteadOfNull(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return isValidSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ ItemStack tStack = this.getStackInSlot(aIndex);
+ ItemStack rStack = GT_Utility.copy(new Object[] { tStack });
+ if (tStack != null) {
+ if (tStack.stackSize <= aAmount) {
+ if (this.setStackToZeroInsteadOfNull(aIndex)) {
+ tStack.stackSize = 0;
+ } else {
+ this.setInventorySlotContents(aIndex, (ItemStack) null);
+ }
+ } else {
+ rStack = tStack.splitStack(aAmount);
+ if (tStack.stackSize == 0 && !this.setStackToZeroInsteadOfNull(aIndex)) {
+ this.setInventorySlotContents(aIndex, (ItemStack) null);
+ }
+ }
+ }
+
+ return rStack;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ ArrayList<Integer> tList = new ArrayList<>();
+ CoverInfo coverInfo = this.mTile.getCoverInfoAtSide(side);
+ boolean tSkip = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsIn(-2);
+
+ for (int rArray = 0; rArray < this.getSizeInventory(); ++rArray) {
+ if (this.isValidSlot(rArray)
+ && (tSkip || coverInfo.letsItemsOut(rArray) || coverInfo.letsItemsIn(rArray))) {
+ tList.add(rArray);
+ }
+ }
+
+ int[] arg6 = new int[tList.size()];
+
+ for (int i = 0; i < arg6.length; ++i) {
+ arg6[i] = tList.get(i);
+ }
+
+ return arg6;
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return this.isValidSlot(aIndex) && aStack != null
+ && aIndex < this.mInventory.length
+ && (this.mInventory[aIndex] == null || GT_Utility.areStacksEqual(aStack, this.mInventory[aIndex]))
+ && this.allowPutStack(this.mTile, aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return this.isValidSlot(aIndex) && aStack != null
+ && aIndex < this.mInventory.length
+ && this.allowPullStack(this.mTile, aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ public boolean allowPullStack(TileEntityBase mTile2, int aIndex, ForgeDirection side, ItemStack aStack) {
+ return aIndex >= 0 && aIndex < this.getSizeInventory();
+ }
+
+ public boolean allowPutStack(TileEntityBase aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return (aIndex >= 0 && aIndex < this.getSizeInventory())
+ && (this.mInventory[aIndex] == null || GT_Utility.areStacksEqual(this.mInventory[aIndex], aStack));
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int i) {
+ return null;
+ }
+
+ @Override
+ public final boolean hasCustomInventoryName() {
+ return mTile != null ? mTile.hasCustomInventoryName() : false;
+ }
+
+ @Override
+ public void markDirty() {
+ if (mTile != null) {
+ purgeNulls();
+ mTile.markDirty();
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer entityplayer) {
+ return true;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public final String getInventoryName() {
+ return this.mTile != null ? mTile.getInventoryName() : "";
+ }
+
+ public boolean isFull() {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ ItemStack slot = mInventory[s];
+ if (slot == null || slot.stackSize != slot.getMaxStackSize()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean isEmpty() {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ ItemStack slot = mInventory[s];
+ if (slot == null) {
+ continue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean addItemStack(ItemStack aInput) {
+ if (aInput != null & (isEmpty() || !isFull())) {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ if (mInventory != null && mInventory[s] != null) {
+ ItemStack slot = mInventory[s];
+ if (slot == null || (slot != null && GT_Utility.areStacksEqual(aInput, slot)
+ && slot.stackSize != slot.getItem()
+ .getItemStackLimit(slot))) {
+ if (slot == null) {
+ slot = aInput.copy();
+ } else {
+ slot.stackSize++;
+ }
+ this.setInventorySlotContents(s, slot);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public final void purgeNulls() {
+ ItemStack[] aTemp = ArrayUtils.removeNulls(this.mInventory);
+ for (int g = 0; g < this.getSizeInventory(); g++) {
+ if (aTemp.length < this.getSizeInventory()) {
+ if (g <= aTemp.length - 1) {
+ this.mInventory[g] = aTemp[g];
+ } else {
+ this.mInventory[g] = null;
+ }
+ } else {
+ this.mInventory[g] = aTemp[g];
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java b/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java
new file mode 100644
index 0000000000..3853f61793
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java
@@ -0,0 +1,245 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class BlockPos implements Serializable {
+
+ private static final long serialVersionUID = -7271947491316682006L;
+ public final int xPos;
+ public final int yPos;
+ public final int zPos;
+ public final int dim;
+ public final transient World world;
+
+ public static BlockPos generateBlockPos(String sUUID) {
+ String[] s2 = sUUID.split("@");
+ return new BlockPos(s2);
+ }
+
+ public BlockPos(String[] s) {
+ this(Integer.parseInt(s[1]), Integer.parseInt(s[2]), Integer.parseInt(s[3]), Integer.parseInt(s[0]));
+ }
+
+ public BlockPos(int x, int y, int z) {
+ this(x, y, z, 0);
+ }
+
+ public BlockPos(int x, int y, int z, int dim) {
+ this(x, y, z, DimensionManager.getWorld(dim));
+ }
+
+ public BlockPos(int x, int y, int z, World dim) {
+ this.xPos = x;
+ this.yPos = y;
+ this.zPos = z;
+
+ if (dim != null) {
+ this.dim = dim.provider.dimensionId;
+ this.world = dim;
+ } else {
+ this.dim = 0;
+ this.world = null;
+ }
+ }
+
+ public BlockPos(IGregTechTileEntity b) {
+ this(b.getXCoord(), b.getYCoord(), b.getZCoord(), b.getWorld());
+ }
+
+ public BlockPos(TileEntity b) {
+ this(b.xCoord, b.yCoord, b.zCoord, b.getWorldObj());
+ }
+
+ public String getLocationString() {
+ return "[X: " + this.xPos + "][Y: " + this.yPos + "][Z: " + this.zPos + "][Dim: " + this.dim + "]";
+ }
+
+ public String getUniqueIdentifier() {
+ String S = "" + this.dim + "@" + this.xPos + "@" + this.yPos + "@" + this.zPos;
+ return S;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash += (13 * this.xPos);
+ hash += (19 * this.yPos);
+ hash += (31 * this.zPos);
+ hash += (17 * this.dim);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) {
+ return false;
+ }
+ if (other == this) {
+ return true;
+ }
+ if (!(other instanceof BlockPos otherPoint)) {
+ return false;
+ }
+ return this.xPos == otherPoint.xPos && this.yPos == otherPoint.yPos
+ && this.zPos == otherPoint.zPos
+ && this.dim == otherPoint.dim;
+ }
+
+ public int distanceFrom(BlockPos target) {
+ if (target.dim != this.dim) {
+ return Short.MIN_VALUE;
+ }
+ return distanceFrom(target.xPos, target.yPos, target.zPos);
+ }
+
+ /**
+ *
+ * @param x X coordinate of target.
+ * @param y Y coordinate of target.
+ * @param z Z coordinate of target.
+ * @return square of distance
+ */
+ public int distanceFrom(int x, int y, int z) {
+ int distanceX = this.xPos - x;
+ int distanceY = this.yPos - y;
+ int distanceZ = this.zPos - z;
+ return distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ;
+ }
+
+ public boolean isWithinRange(BlockPos target, int range) {
+ if (target.dim != this.dim) {
+ return false;
+ }
+ return isWithinRange(target.xPos, target.yPos, target.zPos, range);
+ }
+
+ public boolean isWithinRange(int x, int y, int z, int range) {
+ return distanceFrom(x, y, z) <= (range * range);
+ }
+
+ public BlockPos getUp() {
+ return new BlockPos(this.xPos, this.yPos + 1, this.zPos, this.dim);
+ }
+
+ public BlockPos getDown() {
+ return new BlockPos(this.xPos, this.yPos - 1, this.zPos, this.dim);
+ }
+
+ public BlockPos getXPos() {
+ return new BlockPos(this.xPos + 1, this.yPos, this.zPos, this.dim);
+ }
+
+ public BlockPos getXNeg() {
+ return new BlockPos(this.xPos - 1, this.yPos, this.zPos, this.dim);
+ }
+
+ public BlockPos getZPos() {
+ return new BlockPos(this.xPos, this.yPos, this.zPos + 1, this.dim);
+ }
+
+ public BlockPos getZNeg() {
+ return new BlockPos(this.xPos, this.yPos, this.zPos - 1, this.dim);
+ }
+
+ public AutoMap<BlockPos> getSurroundingBlocks() {
+ AutoMap<BlockPos> sides = new AutoMap<>();
+ sides.put(getUp());
+ sides.put(getDown());
+ sides.put(getXPos());
+ sides.put(getXNeg());
+ sides.put(getZPos());
+ sides.put(getZNeg());
+ return sides;
+ }
+
+ public Block getBlockAtPos() {
+ return getBlockAtPos(this);
+ }
+
+ public Block getBlockAtPos(BlockPos pos) {
+ return getBlockAtPos(world, pos);
+ }
+
+ public Block getBlockAtPos(World world, BlockPos pos) {
+ return world.getBlock(pos.xPos, pos.yPos, pos.zPos);
+ }
+
+ public int getMetaAtPos() {
+ return getMetaAtPos(this);
+ }
+
+ public int getMetaAtPos(BlockPos pos) {
+ return getMetaAtPos(world, pos);
+ }
+
+ public int getMetaAtPos(World world, BlockPos pos) {
+ return world.getBlockMetadata(pos.xPos, pos.yPos, pos.zPos);
+ }
+
+ public boolean hasSimilarNeighbour() {
+ return hasSimilarNeighbour(false);
+ }
+
+ /**
+ * @param strict - Does this check Meta Data?
+ * @return - Does this block have a neighbour that is the same?
+ */
+ public boolean hasSimilarNeighbour(boolean strict) {
+ for (BlockPos g : getSurroundingBlocks().values()) {
+ if (getBlockAtPos(g) == getBlockAtPos()) {
+ if (!strict) {
+ return true;
+ } else {
+ if (getMetaAtPos() == getMetaAtPos(g)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public AutoMap<BlockPos> getSimilarNeighbour() {
+ return getSimilarNeighbour(false);
+ }
+
+ /**
+ * @param strict - Does this check Meta Data?
+ * @return - Does this block have a neighbour that is the same?
+ */
+ public AutoMap<BlockPos> getSimilarNeighbour(boolean strict) {
+ AutoMap<BlockPos> sides = new AutoMap<>();
+ for (BlockPos g : getSurroundingBlocks().values()) {
+ if (getBlockAtPos(g) == getBlockAtPos()) {
+ if (!strict) {
+ sides.put(g);
+ } else {
+ if (getMetaAtPos() == getMetaAtPos(g)) {
+ sides.put(g);
+ }
+ }
+ }
+ }
+ return sides;
+ }
+
+ public Set<BlockPos> getValidNeighboursAndSelf() {
+ AutoMap<BlockPos> h = getSimilarNeighbour(true);
+ h.put(this);
+ Set<BlockPos> result = new HashSet<>();
+ for (BlockPos f : h.values()) {
+ result.add(f);
+ }
+ return result;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java b/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java
new file mode 100644
index 0000000000..5620b76895
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class CubicObject<T> {
+
+ public final T NORTH;
+ public final T SOUTH;
+
+ public final T WEST;
+ public final T EAST;
+
+ public final T UP;
+ public final T DOWN;
+
+ public CubicObject(AutoMap<T> aDataSet) {
+ this(aDataSet.get(0), aDataSet.get(1), aDataSet.get(2), aDataSet.get(3), aDataSet.get(4), aDataSet.get(5));
+ }
+
+ public CubicObject(T[] aDataSet) {
+ this(aDataSet[0], aDataSet[1], aDataSet[2], aDataSet[3], aDataSet[4], aDataSet[5]);
+ }
+
+ public CubicObject(T aDOWN, T aUP, T aNORTH, T aSOUTH, T aWEST, T aEAST) {
+ DOWN = aDOWN;
+ UP = aUP;
+ NORTH = aNORTH;
+ SOUTH = aSOUTH;
+ WEST = aWEST;
+ EAST = aEAST;
+ }
+
+ public T get(int ordinalSide) {
+ return get(ForgeDirection.getOrientation(ordinalSide));
+ }
+
+ public T get(ForgeDirection side) {
+ if (side == ForgeDirection.DOWN) {
+ return DOWN;
+ } else if (side == ForgeDirection.UP) {
+ return UP;
+ } else if (side == ForgeDirection.NORTH) {
+ return NORTH;
+ } else if (side == ForgeDirection.SOUTH) {
+ return SOUTH;
+ } else if (side == ForgeDirection.WEST) {
+ return WEST;
+ } else if (side == ForgeDirection.EAST) {
+ return EAST;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java b/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java
new file mode 100644
index 0000000000..c5c903cd1f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java
@@ -0,0 +1,33 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.GregTech_API;
+
+public class FluidGT6 extends Fluid implements Runnable {
+
+ private final short[] mRGBa;
+ public final String mTextureName;
+
+ public FluidGT6(final String aName, final String aTextureName, final short[] aRGBa) {
+ super(aName);
+ this.mRGBa = aRGBa;
+ this.mTextureName = aTextureName;
+ if (GregTech_API.sGTBlockIconload != null) {
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+ }
+
+ @Override
+ public int getColor() {
+ return (Math.max(0, Math.min(255, this.mRGBa[0])) << 16) | (Math.max(0, Math.min(255, this.mRGBa[1])) << 8)
+ | Math.max(0, Math.min(255, this.mRGBa[2]));
+ }
+
+ @Override
+ public void run() {
+ this.setIcons(GregTech_API.sBlockIcons.registerIcon(GTPlusPlus.ID + ":" + "fluids/fluid." + this.mTextureName));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java b/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java
new file mode 100644
index 0000000000..d68ef1a93f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+
+public abstract class ItemPackage implements RunnableWithInfo<String> {
+
+ public ItemPackage() {
+ this(false);
+ }
+
+ public ItemPackage(boolean hasExtraLateRun) {
+ // Register for late run
+ COMPAT_HANDLER.mObjectsToRunInPostInit.put(this);
+ if (hasExtraLateRun) {
+ COMPAT_HANDLER.mObjectsToRunInOnLoadComplete.put(this);
+ }
+ init();
+ }
+
+ @Override
+ public final void run() {
+ generateRecipes();
+ }
+
+ @Override
+ public final String getInfoData() {
+ return errorMessage();
+ }
+
+ public abstract String errorMessage();
+
+ public abstract boolean generateRecipes();
+
+ private void init() {
+ items();
+ blocks();
+ fluids();
+ }
+
+ public abstract void items();
+
+ public abstract void blocks();
+
+ public abstract void fluids();
+
+ /**
+ * Override this to handle GT Recipe map manipulation after they're Baked.
+ *
+ * @param event - the {@link FMLLoadCompleteEvent}.
+ * @return - Did we do anything?
+ */
+ public boolean onLoadComplete(FMLLoadCompleteEvent event) {
+ return false;
+ };
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java b/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java
new file mode 100644
index 0000000000..f5e483b91c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemStackData {
+
+ protected final Item mItem;
+ protected final int mDamage;
+ protected final int mStackSize;
+ protected final NBTTagCompound mNBT;
+ protected final String mUniqueDataTag;
+
+ public ItemStackData(ItemStack aStack) {
+ mItem = aStack.getItem();
+ mDamage = aStack.getItemDamage();
+ mStackSize = aStack.stackSize;
+ mNBT = (aStack.getTagCompound() != null ? aStack.getTagCompound() : new NBTTagCompound());
+ mUniqueDataTag = "" + Item.getIdFromItem(mItem) + "" + mDamage + "" + mStackSize + "" + mNBT.getId();
+ }
+
+ public String getUniqueDataIdentifier() {
+ return this.mUniqueDataTag;
+ }
+
+ public ItemStack getStack() {
+ ItemStack aTemp = ItemUtils.simpleMetaStack(mItem, mDamage, mStackSize);
+ aTemp.setTagCompound(mNBT);
+ return aTemp;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java b/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java
new file mode 100644
index 0000000000..58a7affa90
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.util.HashMap;
+
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gtPlusPlus.core.util.Utils;
+
+/**
+ * A Server Side safe object that can hold {@link IIcon}s.
+ *
+ * @author Alkalus
+ *
+ */
+public class SafeTexture implements Runnable {
+
+ @SideOnly(Side.CLIENT)
+ private static final HashMap<Integer, IIcon> mHashToIconCache = new HashMap<>();
+
+ @SideOnly(Side.CLIENT)
+ private static final HashMap<String, Integer> mPathToHashCash = new HashMap<>();
+
+ private static final HashMap<String, SafeTexture> mTextureObjectCache = new HashMap<>();
+
+ private final int mHash;
+
+ private final String mTextureName;
+
+ private static String getKey(String aTexPath) {
+ String aNameKey = Utils.sanitizeString(aTexPath);
+ aNameKey = aNameKey.replace('/', ' ');
+ aNameKey = aNameKey.toLowerCase();
+ return aNameKey;
+ }
+
+ public static SafeTexture register(String aTexturePath) {
+ String aNameKey = getKey(aTexturePath);
+ SafeTexture g = mTextureObjectCache.get(aNameKey);
+ if (g == null) {
+ g = new SafeTexture(aTexturePath);
+ mTextureObjectCache.put(aNameKey, g);
+ mPathToHashCash.put(aTexturePath, aTexturePath.hashCode());
+ }
+ return g;
+ }
+
+ private SafeTexture(String aTexturePath) {
+ mTextureName = aTexturePath;
+ mHash = getKey(aTexturePath).hashCode();
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon() {
+ return mHashToIconCache.get(mHash);
+ }
+
+ @Override
+ public void run() {
+ mHashToIconCache.put(getKey(mTextureName).hashCode(), GregTech_API.sBlockIcons.registerIcon(mTextureName));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java b/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java
new file mode 100644
index 0000000000..f799623dd6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java
@@ -0,0 +1,251 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ShapedRecipe {
+
+ private static final String CHARS = "abcdefghijklmnop";
+ public ShapedOreRecipe mRecipe;
+
+ ItemStack[] mBlackList = null;
+
+ public ShapedRecipe(Object aInput1, Object aInput2, Object aInput3, Object aInput4, Object aInput5, Object aInput6,
+ Object aInput7, Object aInput8, Object aInput9, ItemStack aOutput) {
+
+ this(new Object[] { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 }, aOutput);
+ }
+
+ public ShapedRecipe(Object[] aInputs, ItemStack aOutput) {
+ String aGridWhole = "";
+ String aGrid[] = new String[3];
+ char[] aChar = new char[9];
+ String[] aLoggingInfo = new String[9];
+
+ if (mBlackList == null) {
+ mBlackList = new ItemStack[] {};
+ }
+
+ // Just to be safe
+ try {
+ int xSlot = 0;
+ int xNull = 0;
+ for (Object u : aInputs) {
+ String mInfo = "";
+ if (u instanceof String) {
+ mInfo = (String) u;
+ Logger.RECIPE("Input slot " + xSlot++ + " contains " + mInfo);
+ } else if (u instanceof ItemStack || u instanceof Item) {
+ if (u instanceof Item) {
+ u = ItemUtils.getSimpleStack((Item) u);
+ }
+ mInfo = ((ItemStack) u).getDisplayName();
+ Logger.RECIPE("Input slot " + xSlot++ + " contains " + mInfo);
+ } else if (u == null) {
+ xNull++;
+ }
+ }
+ Logger.RECIPE("Found " + xNull + " null inputs.");
+ // Check if the output is invalid
+ if (aOutput != null && xNull < 9) {
+
+ for (ItemStack q : mBlackList) {
+ if (q != null) {
+ if (q.isItemEqual(aOutput)) {
+ Logger.RECIPE("Found recipe Alkalus is Debugging.");
+ }
+ }
+ }
+
+ Object[] mVarags2 = null;
+ Logger.RECIPE("Generating Shaped Crafting Recipe for " + aOutput.getDisplayName());
+
+ if (aInputs.length < 9 || aInputs.length > 9) {
+ Logger.RECIPE(
+ "[Fix] Recipe for " + aOutput.getDisplayName()
+ + " has incorrect number of inputs. Size: "
+ + aInputs.length
+ + ".");
+ }
+
+ // Build a Pair for each slot
+ AutoMap<Pair<Character, Object>> aRecipePairs = new AutoMap<>();
+ int aCharSlot = 0;
+ int aMemSlot = 0;
+ int aInfoSlot = 0;
+ for (Object stack : aInputs) {
+ if (stack != null) {
+ String mInfo = "";
+ if (stack instanceof String) {
+ mInfo = (String) stack;
+ } else if (stack instanceof ItemStack || stack instanceof Item) {
+ if (stack instanceof Item) {
+ stack = ItemUtils.getSimpleStack((Item) stack);
+ }
+ mInfo = ((ItemStack) stack).getDisplayName();
+ }
+ aRecipePairs.put(new Pair<>(CHARS.charAt(aCharSlot), stack));
+ Logger.RECIPE(
+ "Storing '" + CHARS.charAt(aCharSlot)
+ + "' with an object of type "
+ + stack.getClass()
+ .getSimpleName()
+ + " and a value of "
+ + mInfo);
+ aChar[aMemSlot++] = CHARS.charAt(aCharSlot);
+ aCharSlot++;
+ aLoggingInfo[aInfoSlot++] = mInfo;
+ } else {
+ aRecipePairs.put(new Pair<>(' ', (ItemStack) null));
+ Logger.RECIPE("Storing ' ' with an object of type null");
+ aChar[aMemSlot++] = ' ';
+ aLoggingInfo[aInfoSlot++] = "Empty";
+ }
+ }
+
+ Logger.RECIPE(aRecipePairs.size() + " Char|Object pairs registered for recipe.");
+ // If we have enough valid slots, iterate them and build a String which represents the entire grid.
+ // If this String is the correct length, we will split it into thirds and build the grid String array.
+ if (aRecipePairs.size() == 9) {
+
+ for (Pair<Character, Object> h : aRecipePairs) {
+ if (h.getKey() != null) {
+ aGridWhole += String.valueOf(h.getKey());
+ Logger.RECIPE("Adding '" + String.valueOf(h.getKey()) + "' to aGridWhole.");
+ }
+ }
+
+ Logger.RECIPE("aGridWhole: " + aGridWhole + " | size: " + aGridWhole.length());
+
+ // Build crafting grid
+ if (aGridWhole.length() == 9) {
+ Logger.RECIPE("aGridWhole size == 9");
+ aGrid[0] = "" + aGridWhole.charAt(0) + aGridWhole.charAt(1) + aGridWhole.charAt(2);
+ aGrid[1] = "" + aGridWhole.charAt(3) + aGridWhole.charAt(4) + aGridWhole.charAt(5);
+ aGrid[2] = "" + aGridWhole.charAt(6) + aGridWhole.charAt(7) + aGridWhole.charAt(8);
+ } else {
+ Logger.RECIPE(
+ "[Fix] Grid length for recipe outputting " + aOutput.getDisplayName() + " is not 9.");
+ }
+
+ // Rebuild the Map without spaces
+ aRecipePairs.clear();
+ aCharSlot = 0;
+
+ // The amount of spaces in the Varags that the Shape strings takes.
+ // Currently they are inserted as a single array into index 0.
+ final int KEY_COUNTER = 1;
+
+ int counter = KEY_COUNTER;
+ for (Object stack : aInputs) {
+ if (stack != null) {
+ String mInfo = "";
+ if (stack instanceof String) {
+ mInfo = (String) stack;
+ } else if (stack instanceof ItemStack || stack instanceof Item) {
+ if (stack instanceof Item) {
+ stack = ItemUtils.getSimpleStack((Item) stack);
+ }
+ mInfo = ((ItemStack) stack).getDisplayName();
+ }
+ aRecipePairs.put(new Pair<>(CHARS.charAt(aCharSlot), stack));
+ Logger.RECIPE(
+ "Registering Pair of '" + CHARS.charAt(aCharSlot)
+ + "' and a "
+ + stack.getClass()
+ .getSimpleName()
+ + " object. Object has a value of "
+ + mInfo);
+ aCharSlot++;
+ counter++;
+ }
+ }
+
+ Logger.RECIPE(
+ "Counter started at " + KEY_COUNTER
+ + ", counter is now at "
+ + counter
+ + ". Trying to create Varag array with a size of "
+ + (KEY_COUNTER + (counter - KEY_COUNTER) * 2));
+ // Counter started at 3, counter is now at 4. Trying to create Varag array with a size of 2
+
+ // Register the shaped grid straight to the varags
+ mVarags2 = new Object[(KEY_COUNTER + (counter - KEY_COUNTER) * 2)];
+ /*
+ * mVarags2[0] = aGrid[0]; mVarags2[1] = aGrid[1]; mVarags2[2] = aGrid[2];
+ */
+ mVarags2[0] = aGrid;
+
+ // Add Each Char, then Item to the varags, sequentially.
+ int counter2 = KEY_COUNTER;
+ for (Pair<Character, Object> r : aRecipePairs) {
+ char c = r.getKey();
+ Object o = r.getValue();
+
+ if (o instanceof ItemStack || o instanceof Item) {
+ if (o instanceof Item) {
+ o = ItemUtils.getSimpleStack((Item) o);
+ }
+ o = ((ItemStack) o).copy();
+ }
+
+ mVarags2[counter2] = (char) c;
+ mVarags2[counter2 + 1] = o;
+ counter2 += 2;
+ }
+
+ Logger.RECIPE("Recipe Summary");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[0] + " = " + aChar[1] + " = " + aChar[2] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[3] + " = " + aChar[4] + " = " + aChar[5] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[6] + " = " + aChar[7] + " = " + aChar[8] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ for (int r = 0; r < 9; r++) {
+ if (aChar[r] != ' ') {
+ Logger.RECIPE("" + aChar[r] + " : " + aLoggingInfo[r]);
+ }
+ }
+
+ } else {
+ Logger.RECIPE(
+ "[Fix] Recipe for " + aOutput.getDisplayName() + " contains a strange number of inputs.");
+ }
+
+ // Try set the recipe for this object.
+ ShapedOreRecipe testRecipe = null;
+ try {
+ testRecipe = new ShapedOreRecipe(aOutput, mVarags2);
+ } catch (Throwable t) {
+ Logger.RECIPE("[Fix][0] Error thrown when making a ShapedOreRecipe object.");
+ t.printStackTrace();
+ }
+ if (testRecipe == null) {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix] Failed to generate a shaped recipe.");
+ } else {
+ this.mRecipe = testRecipe;
+ Logger.RECIPE("Generated a shaped recipe successfully.");
+ }
+ }
+
+ // Output was not valid
+ else {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix] Failed to generate a shaped recipe. Output was not valid.");
+ }
+
+ } catch (Throwable t) {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix][1] Error thrown when making a ShapedOreRecipe object.");
+ t.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java b/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java
new file mode 100644
index 0000000000..beede78173
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.api.recipe;
+
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ChemicalPlantFrontend extends RecipeMapFrontend {
+
+ public ChemicalPlantFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 7, 6, itemInputCount, 1);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(itemOutputCount, 106, 6, 2);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 7, 41, fluidInputCount, 1);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 142, 6, 1, fluidOutputCount);
+ }
+
+ @Override
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (ItemUtils.isCatalyst(pStack.item)) {
+ currentTip.add(GRAY + "Does not always get consumed in the process");
+ currentTip.add(GRAY + "Higher tier pipe casings allow this item to last longer");
+ } else {
+ super.handleNEIItemInputTooltip(currentTip, pStack);
+ }
+ return currentTip;
+ }
+
+ @Override
+ protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (ItemUtils.isCatalyst(stack.item)) {
+ drawNEIOverlayText("NC*", stack);
+ } else {
+ super.drawNEIOverlayForInput(stack);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java b/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java
new file mode 100644
index 0000000000..310f6f540d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java
@@ -0,0 +1,17 @@
+package gtPlusPlus.api.recipe;
+
+import static gregtech.api.recipe.RecipeCategory.createIcon;
+
+import gregtech.api.enums.Mods;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategoryHolder;
+
+public class GTPPRecipeCategories {
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory absNonAlloyRecipes = new RecipeCategory(
+ "gtpp.recipe.category.abs_non_alloy_recipes",
+ GTPPRecipeMaps.alloyBlastSmelterRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(Mods.GTPlusPlus.getResourcePath("textures", "gui", "picture", "abs_non_alloy_recipes.png"))));
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java b/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java
new file mode 100644
index 0000000000..d2171d1bdd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.api.recipe;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.maps.FluidOnlyFrontend;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.recipe.maps.LargeNEIFrontend;
+import gregtech.api.util.GT_Utility;
+import gregtech.nei.formatter.FuelSpecialValueFormatter;
+import gregtech.nei.formatter.HeatingCoilSpecialValueFormatter;
+import gregtech.nei.formatter.SimpleSpecialValueFormatter;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class GTPPRecipeMaps {
+
+ public static final RecipeMap<RecipeMapBackend> cokeOvenRecipes = RecipeMapBuilder.of("gtpp.recipe.cokeoven")
+ .maxIO(2, 9, 1, 1)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> multiblockMassFabricatorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.matterfab2")
+ .maxIO(2, 0, 1, 1)
+ .build();
+ public static final RecipeMap<FuelBackend> rocketFuels = RecipeMapBuilder
+ .of("gtpp.recipe.rocketenginefuel", FuelBackend::new)
+ .maxIO(0, 0, 1, 0)
+ .neiSpecialInfoFormatter(
+ recipeInfo -> Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.fuel",
+ GT_Utility.formatNumbers(recipeInfo.recipe.mSpecialValue * 3000L))))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> quantumForceTransformerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.quantumforcesmelter")
+ .maxIO(6, 6, 6, 6)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("GT5U.nei.tier"))
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalDehydratorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.chemicaldehydrator")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> vacuumFurnaceRecipes = RecipeMapBuilder.of("gtpp.recipe.vacfurnace")
+ .maxIO(9, 9, 3, 3)
+ .minInputs(1, 0)
+ .neiSpecialInfoFormatter(HeatingCoilSpecialValueFormatter.INSTANCE)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> alloyBlastSmelterRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.alloyblastsmelter")
+ .maxIO(9, 9, 3, 3)
+ .minInputs(1, 0)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> liquidFluorineThoriumReactorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.lftr")
+ .maxIO(0, 0, 6, 6)
+ .minInputs(0, 2)
+ .frontend(FluidOnlyFrontend::new)
+ .neiSpecialInfoFormatter(recipeInfo -> {
+ final long eut = recipeInfo.recipe.mSpecialValue;
+ final int duration = recipeInfo.recipe.mDuration;
+ return Arrays.asList(
+ StatCollector.translateToLocalFormatted("gtpp.nei.lftr.power", GT_Utility.formatNumbers(eut)),
+ StatCollector
+ .translateToLocalFormatted("gtpp.nei.lftr.dynamo", MathUtils.formatNumbers(duration * eut)),
+ StatCollector
+ .translateToLocalFormatted("gtpp.nei.lftr.total", MathUtils.formatNumbers(duration * eut * 4)));
+ })
+ .build();
+ public static final RecipeMap<RecipeMapBackend> nuclearSaltProcessingPlantRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.nuclearsaltprocessingplant")
+ .maxIO(1, 6, 2, 3)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> millingRecipes = RecipeMapBuilder.of("gtpp.recipe.oremill")
+ .maxIO(3, 1, 0, 0)
+ .minInputs(1, 0)
+ .frontend(MillingFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fissionFuelProcessingRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.fissionfuel")
+ .maxIO(0, 0, 6, 1)
+ .frontend(FluidOnlyFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> coldTrapRecipes = RecipeMapBuilder.of("gtpp.recipe.coldtrap")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> reactorProcessingUnitRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.reactorprocessingunit")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> simpleWasherRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.simplewasher")
+ .maxIO(1, 1, 1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> molecularTransformerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.moleculartransformer")
+ .maxIO(1, 1, 0, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_MICROSCOPE
+ : null)
+ .neiHandlerInfo(
+ builder -> builder
+ .setDisplayStack(ItemUtils.getItemStackFromFQRN("AdvancedSolarPanel:BlockMolecularTransformer", 1)))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalPlantRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.fluidchemicaleactor")
+ .maxIO(4, 6, 4, 3)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_3;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_1;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_1;
+ })
+ .progressBar(GTPP_UITextures.PROGRESSBAR_FLUID_REACTOR, ProgressBar.Direction.CIRCULAR_CW)
+ .progressBarPos(82, 24)
+ .neiSpecialInfoFormatter(recipeInfo -> {
+ int tier = recipeInfo.recipe.mSpecialValue + 1;
+ String materialName = StatCollector.translateToLocal("gtpp.nei.chemplant.tier." + tier);
+ return Collections
+ .singletonList(StatCollector.translateToLocalFormatted("GT5U.nei.tier", tier + " - " + materialName));
+ })
+ .frontend(ChemicalPlantFrontend::new)
+ .build();
+ public static final RecipeMap<FuelBackend> rtgFuels = RecipeMapBuilder
+ .of("gtpp.recipe.RTGgenerators", FuelBackend::new)
+ .maxIO(1, 0, 0, 0)
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("gtpp.nei.rtg.days", 365))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> thermalBoilerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.thermalgeneratorfuel")
+ .maxIO(0, 9, 2, 3)
+ .frontend(ThermalBoilerFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> solarTowerRecipes = RecipeMapBuilder.of("gtpp.recipe.solartower")
+ .maxIO(0, 0, 1, 1)
+ .neiSpecialInfoFormatter(
+ recipeInfo -> Arrays.asList(
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.1"),
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.2"),
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.3")))
+ .frontend(FluidOnlyFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> cyclotronRecipes = RecipeMapBuilder.of("gtpp.recipe.cyclotron")
+ .maxIO(9, 9, 1, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fishPondRecipes = RecipeMapBuilder.of("gtpp.recipe.fishpond")
+ .maxIO(1, 1, 0, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> spargeTowerFakeRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.spargetower")
+ .maxIO(0, 0, 9, 9)
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<RecipeMapBackend> advancedFreezerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.cryogenicfreezer")
+ .maxIO(1, 1, 2, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> centrifugeNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multicentrifuge")
+ .maxIO(6, 6, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> electrolyzerNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multielectro")
+ .maxIO(6, 6, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> mixerNonCellRecipes = RecipeMapBuilder.of("gtpp.recipe.multimixer")
+ .maxIO(9, 9, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_MIXER, ProgressBar.Direction.CIRCULAR_CW)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalDehydratorNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multidehydrator")
+ .maxIO(6, 9, 3, 3)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<FuelBackend> semiFluidFuels = RecipeMapBuilder
+ .of("gtpp.recipe.semifluidgeneratorfuels", FuelBackend::new)
+ .maxIO(0, 0, 1, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> flotationCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.flotationcell")
+ .maxIO(6, 0, 1, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> treeGrowthSimulatorFakeRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.treefarm")
+ .maxIO(
+ GregtechMetaTileEntityTreeFarm.Mode.values().length,
+ GregtechMetaTileEntityTreeFarm.Mode.values().length,
+ 0,
+ 0)
+ .minInputs(1, 0)
+ .useSpecialSlot()
+ .frontend(TGSFrontend::new)
+ .build();
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java b/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java
new file mode 100644
index 0000000000..26e2ab2ec9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.api.recipe;
+
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class MillingFrontend extends RecipeMapFrontend {
+
+ public MillingFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (ItemUtils.isMillingBall(pStack.item)) {
+ currentTip.add(GRAY + StatCollector.translateToLocal("gtpp.nei.milling.not_consumed"));
+ } else {
+ super.handleNEIItemInputTooltip(currentTip, pStack);
+ }
+ return currentTip;
+ }
+
+ @Override
+ protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (ItemUtils.isMillingBall(stack.item)) {
+ drawNEIOverlayText("NC*", stack);
+ } else {
+ super.drawNEIOverlayForInput(stack);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java b/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java
new file mode 100644
index 0000000000..e57ebaf5f9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.api.recipe;
+
+import java.awt.Rectangle;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gregtech.nei.RecipeDisplayInfo;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm.Mode;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class TGSFrontend extends RecipeMapFrontend {
+
+ private static final int SLOT_SIZE = 18;
+ private static final int CENTER_X = 90;
+ private static final int SPECIAL_X = CENTER_X - SLOT_SIZE / 2;
+ private static final int SPECIAL_Y = 9;
+ private static final int INPUTS_X = CENTER_X - SLOT_SIZE * 3;
+ private static final int INPUTS_Y = SPECIAL_Y + SLOT_SIZE + SLOT_SIZE / 2;
+ private static final int OUTPUTS_X = CENTER_X + SLOT_SIZE;
+ private static final int OUTPUTS_Y = INPUTS_Y;
+
+ public TGSFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(
+ uiPropertiesBuilder
+ .addNEITransferRect(
+ new Rectangle(INPUTS_X + SLOT_SIZE * 2, INPUTS_Y + SLOT_SIZE / 2, SLOT_SIZE * 2, SLOT_SIZE))
+ .progressBarPos(new Pos2d(CENTER_X - 10, INPUTS_Y + SLOT_SIZE / 2)),
+ neiPropertiesBuilder.neiSpecialInfoFormatter(new TGSSpecialValueFormatter()));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ // Do not.
+ }
+
+ @Override
+ public Pos2d getSpecialItemPosition() {
+ return new Pos2d(SPECIAL_X, SPECIAL_Y);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(Mode.values().length, INPUTS_X, INPUTS_Y, 2);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(Mode.values().length, OUTPUTS_X, OUTPUTS_Y, 2);
+ }
+
+ private static final String[] tooltipInputs = { StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.saw"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.cutter"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.shears"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.knife") };
+
+ private static final String[] tooltipOutputs = { StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsSaw"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsCutter"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsShears"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsKnife") };
+ private static final String tooltipSapling = StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.sapling");
+ private static final String tooltipMultiplier = StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.multiplier");
+
+ @Override
+ public List<String> handleNEIItemTooltip(ItemStack stack, List<String> currentTip,
+ GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+
+ /*
+ * This gets a little complicated, because we want to assign tooltips to inputs/outputs based on which mode
+ * (saw, shears, etc.) they correspond to. But CachedDefaultRecipe does not retain this information for us. This
+ * is because some recipes don't output any items for some modes. For example, if a recipe only yields logs and
+ * leaves, then the outputs of GT_Recipe will be {log, null, leaves}. However, in CachedDefaultRecipe this gets
+ * condensed to just {log, leaves}, with null values omitted. So to figure out which item came from which mode,
+ * we need to step through both of these arrays simultaneously and match non-null inputs/outputs in GT_Recipe to
+ * inputs/outputs in CachedDefaultRecipe.
+ */
+
+ // The last input in neiCachedRecipe is always the special slot, this is the input sapling.
+ if (stack == neiCachedRecipe.mInputs.get(neiCachedRecipe.mInputs.size() - 1).item) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipSapling);
+ super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe);
+ return currentTip;
+ }
+
+ GT_Recipe.GT_Recipe_WithAlt recipe = (GT_Recipe.GT_Recipe_WithAlt) neiCachedRecipe.mRecipe;
+
+ // Inputs
+ int slot = 0;
+ for (int mode = 0; mode < Mode.values().length; ++mode) {
+ if (mode < recipe.mOreDictAlt.length && recipe.mOreDictAlt[mode] != null) {
+ // There is a valid input in this mode.
+ if (slot < neiCachedRecipe.mInputs.size() && stack == neiCachedRecipe.mInputs.get(slot).item) {
+ int toolMultiplier = GregtechMetaTileEntityTreeFarm.getToolMultiplier(stack, Mode.values()[mode]);
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipInputs[mode]);
+ if (toolMultiplier > 0) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipMultiplier + " " + toolMultiplier + "x");
+ }
+ return currentTip;
+ }
+ ++slot;
+ }
+ }
+
+ // Outputs
+ slot = 0;
+ for (int mode = 0; mode < Mode.values().length; ++mode) {
+ if (mode < recipe.mOutputs.length && recipe.mOutputs[mode] != null) {
+ // There is a valid output in this mode.
+ if (slot < neiCachedRecipe.mOutputs.size() && stack == neiCachedRecipe.mOutputs.get(slot).item) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipOutputs[mode]);
+ return currentTip;
+ }
+ ++slot;
+ }
+ }
+
+ return currentTip;
+ }
+
+ private static class TGSSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Arrays.asList(
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-1"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-2"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-3"));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java b/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java
new file mode 100644
index 0000000000..93974b9f9a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.api.recipe;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.maps.LargeNEIFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.RecipeDisplayInfo;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ThermalBoilerFrontend extends LargeNEIFrontend {
+
+ private static final int tileSize = 18;
+ private static final int xOrigin = 16;
+ private static final int yOrigin = 8 + tileSize; // Aligned with second row of output items.
+ private static final int maxInputs = 3;
+
+ public ThermalBoilerFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(
+ uiPropertiesBuilder,
+ neiPropertiesBuilder.neiSpecialInfoFormatter(new ThermalBoilerSpecialValueFormatter()));
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper
+ .getGridPositions(fluidInputCount, xOrigin + tileSize * (maxInputs - fluidInputCount), yOrigin, maxInputs);
+ }
+
+ private static class ThermalBoilerSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ // TODO: Translation.
+ List<String> result = new ArrayList<>();
+ result.add("Steam output shown");
+ result.add("at maximum efficiency.");
+
+ if (recipeInfo.recipe.mSpecialValue == -1) {
+ result.add("Without a Lava Filter,");
+ result.add("only Obsidian is produced.");
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/ModBlocks.java b/src/main/java/gtPlusPlus/core/block/ModBlocks.java
new file mode 100644
index 0000000000..634a073b02
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/ModBlocks.java
@@ -0,0 +1,104 @@
+package gtPlusPlus.core.block;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.general.BlockCompressedObsidian;
+import gtPlusPlus.core.block.general.FluidTankInfinite;
+import gtPlusPlus.core.block.general.HellFire;
+import gtPlusPlus.core.block.general.LightGlass;
+import gtPlusPlus.core.block.general.MiningExplosives;
+import gtPlusPlus.core.block.general.antigrief.BlockWitherProof;
+import gtPlusPlus.core.block.machine.CircuitProgrammer;
+import gtPlusPlus.core.block.machine.DecayablesChest;
+import gtPlusPlus.core.block.machine.FishTrap;
+import gtPlusPlus.core.block.machine.Machine_PestKiller;
+import gtPlusPlus.core.block.machine.Machine_PooCollector;
+import gtPlusPlus.core.block.machine.Machine_ProjectTable;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox;
+import gtPlusPlus.core.block.machine.VolumetricFlaskSetter;
+import gtPlusPlus.core.fluids.FluidRegistryHandler;
+
+public final class ModBlocks {
+
+ public static Block blockCircuitProgrammer;
+ public static Block blockVolumetricFlaskSetter;
+
+ public static Block blockFishTrap;
+ public static Block blockDecayablesChest;
+
+ public static Block blockCasingsMisc;
+ public static Block blockCasings2Misc;
+ public static Block blockCasings3Misc;
+ public static Block blockCasings4Misc;
+ public static Block blockCasings5Misc;
+ public static Block blockCasings6Misc;
+ public static Block blockCasingsTieredGTPP;
+ public static Block blockSpecialMultiCasings;
+ public static Block blockSpecialMultiCasings2;
+ public static Block blockCustomMachineCasings;
+ public static Block blockCustomPipeGearCasings;
+
+ public static Block MatterFabricatorEffectBlock;
+
+ public static Fluid fluidSludge = new Fluid("fluid.sludge");
+ public static Block blockFluidSludge;
+
+ public static Block blockMiningExplosive;
+
+ public static Block blockHellfire;
+ public static Block blockInfiniteFLuidTank;
+ public static Block blockProjectTable;
+ public static Block blockWitherGuard;
+ public static Block blockCompressedObsidian;
+
+ public static Block blockPlayerDoorWooden;
+ public static Block blockPlayerDoorIron;
+ public static Block blockPlayerDoorCustom_Glass;
+ public static Block blockPlayerDoorCustom_Ice;
+ public static Block blockPlayerDoorCustom_Cactus;
+
+ public static Block blockCustomJukebox;
+
+ public static Block blockPooCollector;
+
+ public static Block blockPestKiller;
+
+ public static void init() {
+ Logger.INFO("Initializing Blocks.");
+
+ registerBlocks();
+ }
+
+ public static void registerBlocks() {
+
+ Logger.INFO("Registering Blocks.");
+ MatterFabricatorEffectBlock = new LightGlass(false);
+
+ // Fluids
+ FluidRegistryHandler.registerFluids();
+
+ // Workbench
+ blockFishTrap = new FishTrap();
+ blockInfiniteFLuidTank = new FluidTankInfinite();
+ blockMiningExplosive = new MiningExplosives();
+ blockHellfire = new HellFire();
+ blockProjectTable = new Machine_ProjectTable();
+ blockWitherGuard = new BlockWitherProof();
+ blockCompressedObsidian = new BlockCompressedObsidian();
+
+ blockCircuitProgrammer = new CircuitProgrammer();
+
+ blockDecayablesChest = new DecayablesChest();
+
+ blockCustomJukebox = new Machine_SuperJukebox();
+
+ blockPooCollector = new Machine_PooCollector();
+
+ blockPestKiller = new Machine_PestKiller();
+
+ blockVolumetricFlaskSetter = new VolumetricFlaskSetter();
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java b/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
new file mode 100644
index 0000000000..d39c194dfd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BasicBlock extends BlockContainer {
+
+ public BasicBlock(BlockTypes type, final String unlocalizedName, final Material material, final int harvestLevel) {
+ super(material);
+ this.setBlockName(Utils.sanitizeString(unlocalizedName));
+
+ if (type != BlockTypes.ORE && !unlocalizedName.toLowerCase()
+ .contains("ore")) {
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ }
+
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setResistance(6.0F);
+ this.setLightLevel(0.0F);
+ this.setHardness(1.0f * harvestLevel);
+ this.setHarvestLevel("pickaxe", harvestLevel);
+ this.setStepSound(soundTypeMetal);
+ }
+
+ public static enum BlockTypes {
+
+ STANDARD("blockBlock", "pickaxe", soundTypeMetal),
+ FRAME("blockFrameGt", "wrench", soundTypeMetal),
+ ORE("blockStone", "pickaxe", soundTypeStone);
+
+ private final String TEXTURE_NAME;
+ private final String HARVEST_TOOL;
+ private final SoundType soundOfBlock;
+
+ BlockTypes(final String textureName, final String harvestTool, final SoundType blockSound) {
+ this.TEXTURE_NAME = textureName;
+ this.HARVEST_TOOL = harvestTool;
+ this.soundOfBlock = blockSound;
+ }
+
+ public String getTexture() {
+ return this.TEXTURE_NAME;
+ }
+
+ public String getHarvestTool() {
+ return this.HARVEST_TOOL;
+ }
+
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World p_149915_1_, final int p_149915_2_) {
+ return null;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java b/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
new file mode 100644
index 0000000000..c39565ea41
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
@@ -0,0 +1,322 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.core.CreativeTab;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.api.objects.minecraft.SafeTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class BasicTileBlockWithTooltip extends BlockContainer implements ITileTooltip {
+
+ /**
+ * Each mapped object holds the data for the six sides.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<SafeTexture>> mSidedTextureArray;
+
+ /**
+ * Holds the data for the six sides, each side holds an array of data for each respective meta.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<String>> mSidedTexturePathArray;
+
+ /**
+ * Does this block have any meta at all?
+ */
+ public final boolean hasMeta() {
+ return getMetaCount() > 0;
+ }
+
+ /**
+ * The amount of meta this block has.
+ */
+ public abstract int getMetaCount();
+
+ /**
+ * Does this {@link Block} require special {@link ItemBlock} handling?
+ *
+ * @return The {@link Class} that will be used for this {@link Block}.
+ */
+ public Class<? extends ItemBlock> getItemBlockClass() {
+ return ItemBlock.class;
+ }
+
+ /**
+ * A lazy way to declare the unlocal name for the block, makes boilerplating easy.
+ *
+ * @return The internal name for this block.
+ */
+ public abstract String getUnlocalBlockName();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Hardness.
+ */
+ protected abstract float initBlockHardness();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Resistance.
+ */
+ protected abstract float initBlockResistance();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return The {@link CreativeTab} this Block is shown on.
+ */
+ protected abstract CreativeTabs initCreativeTab();
+
+ /**
+ * The ID used by the {@link ITileTooltip} handler. Return -1 if you are not providing a custom {@link ItemBlock} in
+ * {@link #getItemBlockClass}().
+ */
+ @Override
+ public abstract int getTooltipID();
+
+ public BasicTileBlockWithTooltip(Material aBlockMat) {
+ super(aBlockMat);
+ // Use Abstract method values
+ this.setHardness(initBlockHardness());
+ this.setResistance(initBlockResistance());
+ this.setBlockName(getUnlocalBlockName());
+ this.setCreativeTab(initCreativeTab());
+ // Register the block last.
+ GameRegistry.registerBlock(this, getItemBlockClass(), getUnlocalBlockName());
+ Logger.INFO("Registered " + getTileEntityName() + ".");
+ if (Utils.isClient()) {
+ // Handle Textures
+ handleTextures();
+ }
+ }
+
+ /**
+ * The name of the Tile Entity.
+ */
+ protected abstract String getTileEntityName();
+
+ /**
+ * The String used for texture pathing.
+ *
+ * @return Sanitized {@link String}, containing no spaces or illegal characters.
+ */
+ private String getTileEntityNameForTexturePathing() {
+ return Utils.sanitizeString(getTileEntityName().replace(" ", ""));
+ }
+
+ /**
+ * An array of CubicObjects, one for each meta, else just a single cell array. Expected to be null regularly, as the
+ * default texture handling should suffice. Handy if re-using textures or using a non-standard structure for them.
+ * FULL texture path must be used, inclusive of the MODID and a colon.
+ */
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return mSidedTextureArray.get(aMeta)
+ .get(ForgeDirection.getOrientation(ordinalSide))
+ .getIcon();
+ }
+
+ @Override
+ public IIcon getIcon(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ return super.getIcon(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private void handleTextures() {
+
+ Logger.INFO("[TeTexture] Building Texture Maps for " + getTileEntityName() + ".");
+
+ // Init on the Client side only, to prevent Field initialisers existing in the Server side bytecode.
+ mSidedTextureArray = new AutoMap<>();
+ mSidedTexturePathArray = new AutoMap<>();
+
+ // Store them in forge order
+ // DOWN, UP, NORTH, SOUTH, WEST, EAST
+
+ // Default Path Name, this will make us look inside 'miscutils\textures\blocks'
+ final String aPrefixTexPath = GTPlusPlus.ID + ":";
+ // Default Path Name, this will make us look in the subdirectory for this Tile Entity.
+ final String aTexPathMid = "TileEntities" + CORE.SEPERATOR
+ + getTileEntityNameForTexturePathing()
+ + CORE.SEPERATOR;
+ // Construct a full path
+ String aTexPathBuilt = aPrefixTexPath + aTexPathMid;
+ // File Name Suffixes, without meta tags
+ String aStringBot;
+ String aStringTop;
+ String aStringBack;
+ String aStringFront;
+ String aStringLeft;
+ String aStringRight;
+ // Do we provide a matrix of custom data to be used for texture processing instead?
+ if (getCustomTextureDirectoryObject() != null) {
+ // Get custom provided texture data.
+ CubicObject<String>[] aDataMap = getCustomTextureDirectoryObject();
+ Logger.INFO("[TeTexture] Found custom texture data, using this instead. Size: " + aDataMap.length);
+ // Map each meta string data to the main map.
+ for (int i = 0; i < aDataMap.length; i++) {
+ mSidedTexturePathArray.put(aDataMap[i]);
+ Logger.INFO("Mapped value for meta " + i + ".");
+ }
+ } else {
+ Logger.INFO("[TeTexture] Processing " + (1 + getMetaCount()) + " sets.");
+ // Iterate once for each meta
+ for (int i = 0; i < (1 + getMetaCount()); i++) {
+
+ // File Name Suffixes, without meta tags
+ aStringBot = "Bottom";
+ aStringTop = "Top";
+ aStringBack = "Back";
+ aStringFront = "Front";
+ aStringLeft = "Left";
+ aStringRight = "Right";
+
+ // Add tails if we have meta
+ if (hasMeta()) {
+ aStringBot = aStringBot + "_" + i;
+ aStringTop = aStringTop + "_" + i;
+ aStringBack = aStringBack + "_" + i;
+ aStringFront = aStringFront + "_" + i;
+ aStringLeft = aStringLeft + "_" + i;
+ aStringRight = aStringRight + "_" + i;
+ }
+ // Append the full path
+ aStringBot = aTexPathBuilt + aStringBot;
+ aStringTop = aTexPathBuilt + aStringTop;
+ aStringBack = aTexPathBuilt + aStringBack;
+ aStringFront = aTexPathBuilt + aStringFront;
+ aStringLeft = aTexPathBuilt + aStringLeft;
+ aStringRight = aTexPathBuilt + aStringRight;
+ // Convenience Blob
+ CubicObject<String> aMetaBlob = new CubicObject<>(
+ aStringBot,
+ aStringTop,
+ aStringBack,
+ aStringFront,
+ aStringLeft,
+ aStringRight);
+ mSidedTexturePathArray.put(aMetaBlob);
+ Logger.INFO("[TeTexture] Added Texture Path data to map for meta " + i);
+ }
+ }
+ Logger.INFO("[TeTexture] Map size for pathing: " + mSidedTexturePathArray.size());
+
+ // Iteration Index
+ int aIndex = 0;
+
+ // Iterate each CubicObject, holding the six texture paths for each meta.
+ for (CubicObject<String> aMetaBlob : mSidedTexturePathArray) {
+ // Make a Safe Texture for each side
+ SafeTexture aBottom = SafeTexture.register(aMetaBlob.DOWN);
+ SafeTexture aTop = SafeTexture.register(aMetaBlob.UP);
+ SafeTexture aBack = SafeTexture.register(aMetaBlob.NORTH);
+ SafeTexture aFont = SafeTexture.register(aMetaBlob.SOUTH);
+ SafeTexture aWest = SafeTexture.register(aMetaBlob.WEST);
+ SafeTexture aEast = SafeTexture.register(aMetaBlob.EAST);
+ // Store them in an Array
+ SafeTexture[] aInjectBlob = new SafeTexture[] { aBottom, aTop, aBack, aFont, aWest, aEast };
+ // Convenience Blob
+ CubicObject<SafeTexture> aMetaBlob2 = new CubicObject<>(aInjectBlob);
+ // Store this Blob into
+ mSidedTextureArray.put(aMetaBlob2);
+ Logger.INFO("[TeTexture] Added SafeTexture data to map for meta " + (aIndex++));
+ }
+ Logger.INFO("[TeTexture] Map size for registration: " + mSidedTextureArray.size());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerBlockIcons(final IIconRegister aRegisterer) {}
+
+ @Override
+ public abstract TileEntity createNewTileEntity(final World world, final int p_149915_2_);
+
+ /**
+ * Called when {@link #breakBlock}() is called, but before {@link InventoryUtils#dropInventoryItems} and the super
+ * call.
+ */
+ public void onBlockBreak() {}
+
+ @Override
+ public final void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ onBlockBreak();
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void getSubBlocks(Item aItem, CreativeTabs p_149666_2_, List aList) {
+ if (hasMeta()) {
+ for (int i = 0; i < getMetaCount(); i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ } else {
+ aList.add(ItemUtils.getSimpleStack(aItem));
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ /**
+ * Get the block's damage value (for use with pick block).
+ */
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public Item getItemDropped(int meta, Random rand, int p_149650_3_) {
+ return ItemUtils.getSimpleStack(this, 1)
+ .getItem();
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ ArrayList<ItemStack> drops = new ArrayList<>();
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ return drops;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java b/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
new file mode 100644
index 0000000000..6772b71262
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.BlockFluidClassic;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.core.client.renderer.particle.EntityDropParticleFX;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+import gtPlusPlus.core.util.Utils;
+
+public class BlockBaseFluid extends BlockFluidClassic {
+
+ private final String name;
+ private final IIcon[] textureArray = new IIcon[6];
+
+ protected float particleRed = 1.0F;
+ protected float particleGreen = 1.0F;
+ protected float particleBlue = 1.0F;
+
+ public BlockBaseFluid(String materialName, Fluid fluid, Material material) {
+ super(fluid, material);
+ this.setLightOpacity(2);
+ this.name = Utils.sanitizeString(materialName);
+ this.setBlockName("fluid" + this.name);
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "fluid" + this.name);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType arg0, IBlockAccess arg1, int arg2, int arg3, int arg4) {
+ return false;
+ }
+
+ public boolean preInit() {
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int meta) {
+ return ordinalSide <= 1 ? this.textureArray[0] : this.textureArray[1];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister icon) {
+ this.textureArray[0] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Still");
+ this.textureArray[1] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Flow");
+ }
+
+ @Override
+ @Optional.Method(modid = Mods.Names.C_O_F_H_CORE)
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(World arg0, int arg1, int arg2, int arg3, Random arg4) {
+ super.randomDisplayTick(arg0, arg1, arg2, arg3, arg4);
+ double arg5 = arg1 + arg4.nextFloat();
+ double arg7 = arg2 - 1.05D;
+ double arg9 = arg3 + arg4.nextFloat();
+ if (super.density < 0) {
+ arg7 = arg2 + 2.1D;
+ }
+
+ if (arg4.nextInt(20) == 0
+ && arg0.isSideSolid(
+ arg1,
+ arg2 + super.densityDir,
+ arg3,
+ super.densityDir == -1 ? ForgeDirection.UP : ForgeDirection.DOWN)
+ && !arg0.getBlock(arg1, arg2 + 2 * super.densityDir, arg3)
+ .getMaterial()
+ .blocksMovement()) {
+ EntityDropParticleFX arg11 = new EntityDropParticleFX(
+ arg0,
+ arg5,
+ arg7,
+ arg9,
+ this.particleRed,
+ this.particleGreen,
+ this.particleBlue,
+ super.densityDir);
+ FMLClientHandler.instance()
+ .getClient().effectRenderer.addEffect(arg11);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java b/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
new file mode 100644
index 0000000000..b07c6d1529
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
@@ -0,0 +1,245 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockGtBlock;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BlockBaseModular extends BasicBlock {
+
+ protected Material blockMaterial;
+
+ protected int blockColour;
+ public BlockTypes thisBlock;
+ protected String thisBlockMaterial;
+ protected String thisBlockMaterialTranslatedName;
+ protected final String thisBlockType;
+
+ private static final HashMap<String, Block> sBlockCache = new HashMap<>();
+
+ public static Block getMaterialBlock(Material aMaterial, BlockTypes aType) {
+ return sBlockCache.get(aMaterial.getUnlocalizedName() + "." + aType.name());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType) {
+ this(material, blockType, material.getRgbAsHex());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType, final int colour) {
+ this(
+ material.getUnlocalizedName(),
+ material.getLocalizedName(),
+ net.minecraft.block.material.Material.iron,
+ blockType,
+ colour,
+ Math.min(Math.max(material.vTier, 1), 6));
+ blockMaterial = material;
+ registerComponent();
+ sBlockCache.put(material.getUnlocalizedName() + "." + blockType.name(), this);
+ thisBlockMaterialTranslatedName = material.getTranslatedName();
+ GT_LanguageManager.addStringLocalization("gtplusplus." + getUnlocalizedName() + ".name", getProperName());
+ }
+
+ protected BlockBaseModular(final String unlocalizedName, final String blockMaterialString,
+ final net.minecraft.block.material.Material vanillaMaterial, final BlockTypes blockType, final int colour,
+ final int miningLevel) {
+ super(blockType, unlocalizedName, vanillaMaterial, miningLevel);
+ this.setHarvestLevel(blockType.getHarvestTool(), miningLevel);
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + blockType.getTexture());
+ this.blockColour = colour;
+ this.thisBlock = blockType;
+ this.thisBlockMaterial = blockMaterialString;
+ this.thisBlockType = blockType.name()
+ .toUpperCase();
+ this.setBlockName(this.getUnlocalizedProperName());
+ int fx = getBlockTypeMeta();
+ GameRegistry.registerBlock(
+ this,
+ ItemBlockGtBlock.class,
+ Utils.sanitizeString(blockType.getTexture() + unlocalizedName));
+ if (fx == 0) {
+ GT_OreDictUnificator
+ .registerOre("block" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 1) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 2) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ }
+ }
+
+ public static String unifyMaterialName(String rawMaterName) {
+ return rawMaterName.replace(" ", "")
+ .replace("-", "")
+ .replace("_", "");
+ }
+
+ public void registerComponent() {
+ Logger.MATERIALS("Attempting to register " + this.getUnlocalizedName() + ".");
+ if (this.blockMaterial == null) {
+ Logger.MATERIALS("Tried to register " + this.getUnlocalizedName() + " but the material was null.");
+ return;
+ }
+ String aName = blockMaterial.getUnlocalizedName();
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(aName);
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ int fx = getBlockTypeMeta();
+ String aKey = (fx == 0 ? OrePrefixes.block.name()
+ : (fx == 1 ? OrePrefixes.frameGt.name() : OrePrefixes.ore.name()));
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS("Registering a material component. Item: [" + aName + "] Map: [" + aKey + "]");
+ Material.mComponentMap.put(aName, aMap);
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component.");
+ }
+ }
+
+ public int getBlockTypeMeta() {
+ if (this.thisBlockType.equals(
+ BlockTypes.STANDARD.name()
+ .toUpperCase())) {
+ return 0;
+ } else if (this.thisBlockType.equals(
+ BlockTypes.FRAME.name()
+ .toUpperCase())) {
+ return 1;
+ } else
+ if (this.thisBlockType.equals(
+ BlockTypes.ORE.name()
+ .toUpperCase())) {
+ return 2;
+ }
+ return 0;
+ }
+
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ if (this.thisBlock == BlockTypes.FRAME) {
+ return 1;
+ }
+ return 0;
+ }
+
+ public String getProperName() {
+ String tempIngot = null;
+ if (this.thisBlock == BlockTypes.STANDARD) {
+ tempIngot = "Block of %material";
+ } else if (this.thisBlock == BlockTypes.FRAME) {
+ tempIngot = "%material Frame Box";
+ } else if (this.thisBlock == BlockTypes.ORE) {
+ tempIngot = "%material Ore [Old]";
+ }
+ return tempIngot;
+ }
+
+ public String getUnlocalizedProperName() {
+ return getProperName().replace("%s", "%temp")
+ .replace("%material", this.thisBlockMaterial)
+ .replace("%temp", "%s");
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return GT_LanguageManager.getTranslation("gtplusplus." + getUnlocalizedName() + ".name")
+ .replace("%s", "%temp")
+ .replace("%material", this.thisBlockMaterialTranslatedName)
+ .replace("%temp", "%s");
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "block." + blockMaterial.getUnlocalizedName()
+ + "."
+ + this.thisBlock.name()
+ .toLowerCase();
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public Material getMaterialEx() {
+ return this.blockMaterial;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ if (!CORE.ConfigSwitches.useGregtechTextures || this.blockMaterial == null
+ || this.thisBlock == BlockTypes.ORE) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + this.thisBlock.getTexture());
+ }
+ String metType = "9j4852jyo3rjmh3owlhw9oe";
+ if (this.blockMaterial != null) {
+ TextureSet u = this.blockMaterial.getTextureSet();
+ if (u != null) {
+ metType = u.mSetName;
+ }
+ }
+ metType = (metType.equals("9j4852jyo3rjmh3owlhw9oe") ? "METALLIC" : metType);
+ int tier = blockMaterial != null ? this.blockMaterial.vTier : 0;
+ String aType = (this.thisBlock == BlockTypes.FRAME) ? "frameGt" : (tier <= 4 ? "block1" : "block5");
+ this.blockIcon = iIcon.registerIcon(GregTech.ID + ":" + "materialicons/" + metType + "/" + aType);
+ }
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+
+ @Override
+ public int getBlockColor() {
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java b/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java
new file mode 100644
index 0000000000..1813090810
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java
@@ -0,0 +1,217 @@
+package gtPlusPlus.core.block.base;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.interfaces.ITexturedBlock;
+import gtPlusPlus.core.client.renderer.CustomOreBlockRenderer;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockOre;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_RenderedTexture;
+
+public class BlockBaseOre extends BasicBlock implements ITexturedBlock {
+
+ private final Material blockMaterial;
+ protected static boolean shouldFortune = false;
+ protected static boolean shouldSilkTouch = false;
+
+ public BlockBaseOre(final Material material, final BlockTypes blockType) {
+ super(
+ blockType,
+ Utils.sanitizeString(material.getUnlocalizedName()),
+ net.minecraft.block.material.Material.rock,
+ Math.min(Math.max(material.vTier, 1), 6));
+ int aMaterialTierForMining = Math.min(Math.max(material.vTier, 1), 6);
+ this.blockMaterial = material;
+ this.setHardness(1.0f * aMaterialTierForMining);
+ this.setResistance(6.0F);
+ this.setLightLevel(0.0F);
+ this.setHarvestLevel("pickaxe", aMaterialTierForMining);
+ this.setStepSound(soundTypeStone);
+ this.setBlockName("Ore" + Utils.sanitizeString(Utils.sanitizeString(material.getUnlocalizedName())));
+ this.setBlockTextureName("stone");
+ try {
+ GameRegistry.registerBlock(
+ this,
+ ItemBlockOre.class,
+ Utils.sanitizeString("ore" + Utils.sanitizeString(this.blockMaterial.getLocalizedName())));
+ GT_OreDictUnificator.registerOre(
+ "ore" + Utils.sanitizeString(this.blockMaterial.getLocalizedName()),
+ ItemUtils.getSimpleStack(this));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ public Material getMaterialEx() {
+ return this.blockMaterial;
+ }
+
+ @Override
+ public int getRenderType() {
+ try {
+ if (CustomOreBlockRenderer.INSTANCE != null) {
+ return CustomOreBlockRenderer.INSTANCE.mRenderID;
+ }
+ return super.getRenderType();
+ } catch (NullPointerException n) {
+ return 0;
+ }
+ }
+
+ @Override
+ public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ /**
+ * GT Texture Handler
+ */
+
+ // .08 compat
+ public static IIconContainer[] hiddenTextureArray;
+
+ @Override
+ public ITexture[] getTexture(ForgeDirection side) {
+ return getTexture(null, side);
+ }
+
+ @Override
+ public ITexture[] getTexture(Block block, ForgeDirection side) {
+ if (this.blockMaterial != null) {
+ GTPP_RenderedTexture aIconSet = new GTPP_RenderedTexture(
+ blockMaterial.getTextureSet().mTextures[OrePrefixes.ore.mTextureIndex],
+ this.blockMaterial.getRGBA());
+ return new ITexture[] { new GTPP_CopiedBlockTexture(Blocks.stone, 0, 0), aIconSet };
+ }
+
+ if (hiddenTextureArray == null) {
+ try {
+ Field o = ReflectionUtils.getField(Textures.BlockIcons.class, "STONES");
+ if (o != null) {
+ hiddenTextureArray = (IIconContainer[]) o.get(Textures.BlockIcons.class);
+ }
+ if (hiddenTextureArray == null) {
+ hiddenTextureArray = new IIconContainer[6];
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ hiddenTextureArray = new IIconContainer[6];
+ }
+ }
+ return new ITexture[] { new GTPP_RenderedTexture(hiddenTextureArray[0], new short[] { 240, 240, 240, 0 }) };
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister p_149651_1_) {}
+
+ @Override
+ public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) {
+ if (EnchantmentHelper.getSilkTouchModifier(player)) {
+ shouldSilkTouch = true;
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+
+ if (shouldSilkTouch) {
+ shouldSilkTouch = false;
+ }
+ return;
+ }
+
+ if (!(player instanceof FakePlayer)) {
+ shouldFortune = true;
+ }
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+ if (shouldFortune) {
+ shouldFortune = false;
+ }
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ ArrayList<ItemStack> drops = new ArrayList<>();
+ if (shouldSilkTouch) {
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ } else {
+ switch (GT_Mod.gregtechproxy.oreDropSystem) {
+ case Item -> {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ case FortuneItem -> {
+ // if shouldFortune and isNatural then get fortune drops
+ // if not shouldFortune or not isNatural then get normal drops
+ // if not shouldFortune and isNatural then get normal drops
+ // if shouldFortune and not isNatural then get normal drops
+ if (shouldFortune && fortune > 0) {
+ int aMinAmount = 1;
+ // Max applicable fortune
+ if (fortune > 3) fortune = 3;
+ long amount = (long) new Random().nextInt(fortune) + aMinAmount;
+ for (int i = 0; i < amount; i++) {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ } else {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ }
+ case UnifiedBlock -> {
+ // Unified ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ case PerDimBlock -> {
+ // Per Dimension ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ case Block -> {
+ // Regular ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ }
+ }
+ return drops;
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java b/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java
new file mode 100644
index 0000000000..0c353cfbdd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java
@@ -0,0 +1,100 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockObsidian;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+
+public class BlockCompressedObsidian extends BlockObsidian {
+
+ private final IIcon textureArray[] = new IIcon[11];
+
+ public BlockCompressedObsidian() {
+ this.setBlockName("blockCompressedObsidian");
+ this.setHardness(50.0F);
+ this.setResistance(2000.0F);
+ this.setStepSound(soundTypePiston);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "blockCompressedObsidian");
+ }
+
+ @Override
+ public MapColor getMapColor(final int meta) {
+ if (meta < 5) {
+ return MapColor.obsidianColor;
+ }
+ if (meta > 5) {
+ return MapColor.goldColor;
+ } else {
+ return MapColor.sandColor;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iicon) {
+ this.textureArray[0] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian1");
+ this.textureArray[1] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian2");
+ this.textureArray[2] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian3");
+ this.textureArray[3] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian4");
+ this.textureArray[4] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian5");
+ this.textureArray[5] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian_invert");
+ this.textureArray[6] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone1");
+ this.textureArray[7] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone2");
+ this.textureArray[8] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone3");
+ this.textureArray[9] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone4");
+ this.textureArray[10] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone5");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.textureArray[meta];
+ }
+
+ @Override
+ public int damageDropped(final int damage) {
+ return damage;
+ }
+
+ @Override
+ public void getSubBlocks(final Item item, final CreativeTabs tab, final List list) {
+ for (int i = 0; i < 11; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public Item getItemDropped(final int meta, final Random rand, final int fortune) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(final World world, final int x, final int y, final int z, final int metadata,
+ final int fortune) {
+ int m = metadata;
+ if (m == 5) {
+ m = 1;
+ }
+ return super.getDrops(world, x, y, z, m, fortune);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java b/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java
new file mode 100644
index 0000000000..dc6c92f065
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java
@@ -0,0 +1,197 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockAir;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.block.ModBlocks;
+
+public class BlockSuperLight extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ public BlockSuperLight() {
+ super(Material.circuits);
+ this.setBlockName("blockSuperLight");
+ this.setCreativeTab(CreativeTabs.tabRedstone);
+ GameRegistry.registerBlock(this, "blockSuperLight");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.blockIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "SwirlBigBlue");
+ }
+
+ /**
+ * Returns a new instance of a block's tile entity class. Called on placing the block.
+ */
+ @Override
+ public TileEntity createNewTileEntity(World aWorld, int p_149915_2_) {
+ return new TileEntitySuperLight();
+ }
+
+ public static class TileEntitySuperLight extends TileEntity {
+
+ private long mCreated;
+
+ private long mLastUpdateTick = 0;
+
+ private int[][][][] aLitBlocks = new int[50][10][50][1];
+
+ private boolean mPowered = false;
+
+ public TileEntitySuperLight() {
+ mCreated = System.currentTimeMillis();
+ Logger.INFO("Created Super-Lamp");
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+ mCreated = aNBT.getLong("mCreated");
+ mPowered = aNBT.getBoolean("mPowered");
+ NBTTagCompound aLightingData = aNBT.getCompoundTag("lighting");
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int aData = aLightingData.getInteger("[" + x + "][" + y + "][" + z + "]");
+ aLitBlocks[x][y][z][0] = aData;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ aNBT.setLong("mCreated", mCreated);
+ aNBT.setBoolean("mPowered", mPowered);
+ NBTTagCompound aLightingData = new NBTTagCompound();
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int aFlag = aLitBlocks[x][y][z][0];
+ aLightingData.setInteger("[" + x + "][" + y + "][" + z + "]", aFlag);
+ }
+ }
+ }
+ aNBT.setTag("lighting", aLightingData);
+ }
+
+ @Override
+ public void updateEntity() {
+ super.updateEntity();
+
+ if (this.worldObj.isRemote) {
+ return;
+ }
+
+ try {
+ if (mLastUpdateTick == 0 || (System.currentTimeMillis() - mLastUpdateTick) >= 30000) {
+ boolean powered = (this.worldObj
+ .isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord, this.zCoord));
+ boolean aLastState = mPowered;
+ // Logger.INFO("Powered: "+powered);
+ mPowered = powered;
+ if (mPowered != aLastState) {
+ updateLighting(powered);
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+
+ @Override
+ public void markDirty() {
+ super.markDirty();
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return super.canUpdate();
+ }
+
+ public void updateLighting(boolean enable) {
+
+ mLastUpdateTick = System.currentTimeMillis();
+
+ aLitBlocks = new int[50][10][50][1];
+ int aLitCounter = 0;
+ AutoMap<BlockPos> aBlocksToUpdate = new AutoMap<>();
+ Logger.INFO("Trying to relight area.");
+
+ BlockPos aStartIterationPoint = new BlockPos(
+ this.xCoord - 24,
+ this.yCoord - 4,
+ this.zCoord - 24,
+ this.worldObj);
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int xOff = aStartIterationPoint.xPos + x;
+ int yOff = aStartIterationPoint.yPos + y;
+ int zOff = aStartIterationPoint.zPos + z;
+ Block aBlockGet = this.worldObj.getBlock(xOff, yOff, zOff);
+ if (aBlockGet != null) {
+ if (aBlockGet instanceof BlockAir) {
+
+ int aLight = aBlockGet.getLightValue();
+
+ // Don't Need to relight anything.
+ if ((enable && aLight > 0) || (!enable && aLight == 0)) {
+ continue;
+ }
+ // Turning Lights on
+ else if (enable && aLight == 0) {
+ aBlocksToUpdate.put(new BlockPos(xOff, yOff, zOff, this.worldObj));
+ this.worldObj
+ .setBlock(xOff, yOff, zOff, ModBlocks.MatterFabricatorEffectBlock, 0, 3);
+ aLitCounter++;
+ }
+ // Turning Lights off
+ else if (!enable && aLight > 0) {
+ aBlocksToUpdate.put(new BlockPos(xOff, yOff, zOff, this.worldObj));
+ if (aBlockGet instanceof LightGlass) {
+ Logger.INFO("Dimmed air.");
+ this.worldObj.setBlock(xOff, yOff, zOff, Blocks.air, 0, 3);
+ }
+ }
+ aLitBlocks[x][y][z][0] = enable ? 15 : 0;
+ } else {
+ aLitBlocks[x][y][z][0] = -1;
+ }
+ } else {
+ aLitBlocks[x][y][z][0] = -1;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java b/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java
new file mode 100644
index 0000000000..41a581394b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java
@@ -0,0 +1,141 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.ItemFluidContainer;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.tileentities.general.TileEntityInfiniteFluid;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class FluidTankInfinite extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ public FluidTankInfinite() {
+ super(Material.iron);
+ this.setBlockName("blockInfiniteFluidTank");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, "blockInfiniteFluidTank");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureBottom = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureFront = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+ TileEntityInfiniteFluid tank = (TileEntityInfiniteFluid) world.getTileEntity(x, y, z);
+ if (tank != null) {
+ Item handItem;
+ try {
+ handItem = player.getHeldItem()
+ .getItem();
+ } catch (Throwable t) {
+ handItem = null;
+ }
+ if (handItem != null
+ && (handItem instanceof IFluidContainerItem || handItem instanceof ItemFluidContainer
+ || FluidContainerRegistry.isFilledContainer(player.getHeldItem()))) {
+ if (tank.tank.getFluid() == null) {
+ try {
+ if (!FluidContainerRegistry.isFilledContainer(player.getHeldItem())) {
+ ItemStack handItemStack = player.getHeldItem();
+ IFluidContainerItem container = (IFluidContainerItem) handItem;
+ FluidStack containerFluid = container.getFluid(handItemStack);
+ container.drain(handItemStack, container.getFluid(handItemStack).amount, true);
+ tank.tank.setFluid(containerFluid);
+ } else {
+ ItemStack handItemStack = player.getHeldItem();
+ FluidContainerRegistry.drainFluidContainer(handItemStack);
+ FluidStack containerFluid = FluidContainerRegistry.getFluidForFilledItem(handItemStack);
+ ItemStack emptyContainer = FluidContainerRegistry.drainFluidContainer(handItemStack);
+ player.setItemInUse(emptyContainer, 0);
+
+ tank.tank.setFluid(containerFluid);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ if (tank.tank.getFluid() != null) {
+ PlayerUtils.messagePlayer(
+ player,
+ "This tank contains " + tank.tank.getFluidAmount()
+ + "L of "
+ + tank.tank.getFluid()
+ .getLocalizedName());
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityInfiniteFluid();
+ }
+
+ @Override
+ public void onBlockAdded(World world, int x, int y, int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/HellFire.java b/src/main/java/gtPlusPlus/core/block/general/HellFire.java
new file mode 100644
index 0000000000..4e8d94328d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/HellFire.java
@@ -0,0 +1,535 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.IdentityHashMap;
+import java.util.Map.Entry;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFire;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.Maps;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class HellFire extends BlockFire {
+
+ private final int[] field_149849_a = new int[Short.MAX_VALUE];
+
+ private final int[] field_149848_b = new int[Short.MAX_VALUE];
+
+ @SideOnly(Side.CLIENT)
+ private IIcon[] IIconArray;
+
+ public HellFire() {
+ this.setTickRandomly(true);
+ this.setLightLevel(1F);
+ this.setLightOpacity(0);
+ // this.setBlockTextureName(GTPlusPlus.ID + "hellfire/blockHellFire");
+ this.setBlockName("blockHellFire");
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ GameRegistry.registerBlock(this, "blockHellFire");
+ this.enableBrutalFire();
+ }
+
+ private void enableBrutalFire() {
+ for (final Object o : Block.blockRegistry.getKeys()) {
+
+ try {
+
+ final String name = (String) o;
+ final Block b = Block.getBlockFromName(name);
+ if (b != Blocks.air) {
+ final int spread = Blocks.fire.getEncouragement(b);
+ final int flamm = Blocks.fire.getFlammability(b);
+ if (flamm > 0 && spread > 0) {
+ this.setFireInfo(b, spread * 4, flamm * 4);
+ }
+ }
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ // Special Case madness
+ this.setFireInfo(Blocks.brown_mushroom_block, 20, 100);
+ this.setFireInfo(Blocks.red_mushroom_block, 20, 100);
+ this.setFireInfo(Blocks.grass, 20, 100);
+ this.setFireInfo(Blocks.mycelium, 20, 100);
+ }
+
+ /**
+ * How many world ticks before ticking
+ */
+ @Override
+ public int tickRate(final World world) {
+ return 5;
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(final World world, final int x, final int y, final int z, Random random) {
+
+ random = new XSTR();
+
+ if (world.getGameRules()
+ .getGameRuleBooleanValue("doFireTick")) {
+ final boolean flag = world.getBlock(x, y - 1, z)
+ .isFireSource(world, x, y - 1, z, UP);
+
+ if (!this.canPlaceBlockAt(world, x, y, z)) {
+ world.setBlockToAir(x, y, z);
+ }
+
+ if (!flag && world.isRaining()
+ && (world.canLightningStrikeAt(x, y, z) || world.canLightningStrikeAt(x - 1, y, z)
+ || world.canLightningStrikeAt(x + 1, y, z)
+ || world.canLightningStrikeAt(x, y, z - 1)
+ || world.canLightningStrikeAt(x, y, z + 1))) {
+
+ if (MathUtils.randInt(0, 100) >= 90) {
+ world.setBlockToAir(x, y, z);
+ }
+ } else {
+ final int blockMeta = world.getBlockMetadata(x, y, z);
+
+ if (blockMeta < 15) {
+ world.setBlockMetadataWithNotify(x, y, z, blockMeta + (random.nextInt(3) / 2), 4);
+ }
+
+ world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + random.nextInt(10));
+
+ if (!flag && !this.canNeighborBurn(world, x, y, z)) {
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z) || (blockMeta > 3)) {
+ world.setBlockToAir(x, y, z);
+ }
+ } else if (!flag && !this.canCatchFire(world, x, y - 1, z, UP)
+ && (blockMeta == 15)
+ && (random.nextInt(4) == 0)) {
+ world.setBlockToAir(x, y, z);
+ } else {
+ final boolean flag1 = world.isBlockHighHumidity(x, y, z);
+ byte b0 = 0;
+
+ if (flag1) {
+ b0 = -50;
+ }
+
+ this.tryCatchFire(world, x + 1, y, z, 300 + b0, random, blockMeta, WEST);
+ this.tryCatchFire(world, x - 1, y, z, 300 + b0, random, blockMeta, EAST);
+ this.tryCatchFire(world, x, y - 1, z, 250 + b0, random, blockMeta, UP);
+ this.tryCatchFire(world, x, y + 1, z, 250 + b0, random, blockMeta, DOWN);
+ this.tryCatchFire(world, x, y, z - 1, 300 + b0, random, blockMeta, SOUTH);
+ this.tryCatchFire(world, x, y, z + 1, 300 + b0, random, blockMeta, NORTH);
+
+ for (int i1 = x - 1; i1 <= (x + 1); ++i1) {
+ for (int j1 = z - 1; j1 <= (z + 1); ++j1) {
+ for (int k1 = y - 1; k1 <= (y + 4); ++k1) {
+ if ((i1 != x) || (k1 != y) || (j1 != z)) {
+ int l1 = 100;
+
+ if (k1 > (y + 1)) {
+ l1 += (k1 - (y + 1)) * 100;
+ }
+
+ final int neighbourFireChance = this
+ .getChanceOfNeighborsEncouragingFire(world, i1, k1, j1);
+
+ if (neighbourFireChance > 0) {
+ int j2 = (neighbourFireChance + 40
+ + (world.difficultySetting.getDifficultyId() * 14)) / (blockMeta + 30);
+
+ if (flag1) {
+ j2 /= 2;
+ }
+
+ if ((j2 > 0) && (random.nextInt(l1) <= j2)
+ && (!world.isRaining() || !world.canLightningStrikeAt(i1, k1, j1))
+ && !world.canLightningStrikeAt(i1 - 1, k1, z)
+ && !world.canLightningStrikeAt(i1 + 1, k1, j1)
+ && !world.canLightningStrikeAt(i1, k1, j1 - 1)
+ && !world.canLightningStrikeAt(i1, k1, j1 + 1)) {
+ int k2 = blockMeta + (random.nextInt(5) / 4);
+
+ if (k2 > 15) {
+ k2 = 15;
+ }
+
+ world.setBlock(i1, k1, j1, this, k2, 3);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void tryCatchFire(final World world, final int p_149841_2_, final int p_149841_3_, final int p_149841_4_,
+ final int p_149841_5_, final Random p_149841_6_, final int p_149841_7_, final ForgeDirection face) {
+ final int j1 = world.getBlock(p_149841_2_, p_149841_3_, p_149841_4_)
+ .getFlammability(world, p_149841_2_, p_149841_3_, p_149841_4_, face);
+
+ if (p_149841_6_.nextInt(p_149841_5_) < j1) {
+ final boolean flag = world.getBlock(p_149841_2_, p_149841_3_, p_149841_4_) == Blocks.tnt;
+
+ if ((p_149841_6_.nextInt(p_149841_7_ + 10) < 5)
+ && !world.canLightningStrikeAt(p_149841_2_, p_149841_3_, p_149841_4_)) {
+ int k1 = p_149841_7_ + (p_149841_6_.nextInt(5) / 4);
+
+ if (k1 > 15) {
+ k1 = 15;
+ }
+
+ world.setBlock(p_149841_2_, p_149841_3_, p_149841_4_, this, k1, 3);
+ } else {
+ world.setBlockToAir(p_149841_2_, p_149841_3_, p_149841_4_);
+ }
+
+ if (flag) {
+ Blocks.tnt.onBlockDestroyedByPlayer(world, p_149841_2_, p_149841_3_, p_149841_4_, 1);
+ }
+ }
+ }
+
+ /**
+ * Returns true if at least one block next to this one can burn.
+ */
+ private boolean canNeighborBurn(final World world, final int x, final int y, final int z) {
+ return this.canCatchFire(world, x + 1, y, z, WEST) || this.canCatchFire(world, x - 1, y, z, EAST)
+ || this.canCatchFire(world, x, y - 1, z, UP)
+ || this.canCatchFire(world, x, y + 1, z, DOWN)
+ || this.canCatchFire(world, x, y, z - 1, SOUTH)
+ || this.canCatchFire(world, x, y, z + 1, NORTH);
+ }
+
+ /**
+ * Gets the highest chance of a neighbor block encouraging this block to catch fire
+ */
+ private int getChanceOfNeighborsEncouragingFire(final World world, final int x, final int y, final int z) {
+ final byte b0 = 0;
+
+ if (!world.isAirBlock(x, y, z)) {
+ return 0;
+ } else {
+ int l = b0;
+ l = this.getChanceToEncourageFire(world, x + 1, y, z, l, WEST);
+ l = this.getChanceToEncourageFire(world, x - 1, y, z, l, EAST);
+ l = this.getChanceToEncourageFire(world, x, y - 1, z, l, UP);
+ l = this.getChanceToEncourageFire(world, x, y + 1, z, l, DOWN);
+ l = this.getChanceToEncourageFire(world, x, y, z - 1, l, SOUTH);
+ l = this.getChanceToEncourageFire(world, x, y, z + 1, l, NORTH);
+ return l;
+ }
+ }
+
+ /**
+ * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
+ */
+ @Override
+ public boolean canPlaceBlockAt(final World worldObj, final int x, final int y, final int z) {
+ return World.doesBlockHaveSolidTopSurface(worldObj, x, y - 1, z) || this.canNeighborBurn(worldObj, x, y, z);
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor Block
+ */
+ @Override
+ public void onNeighborBlockChange(final World worldObj, final int x, final int y, final int z,
+ final Block blockObj) {
+ if (!World.doesBlockHaveSolidTopSurface(worldObj, x, y - 1, z) && !this.canNeighborBurn(worldObj, x, y, z)) {
+ worldObj.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Called whenever the block is added into the world. Args: world, x, y, z
+ */
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ if ((world.provider.dimensionId > 0) || !Blocks.portal.func_150000_e(world, x, y, z)) {
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z) && !this.canNeighborBurn(world, x, y, z)) {
+ world.setBlockToAir(x, y, z);
+ } else {
+ world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + world.rand.nextInt(10));
+ }
+ }
+ }
+
+ // Burn
+ @Override
+ public void onEntityWalking(final World world, final int i, final int j, final int k, final Entity entity) {
+ entity.setFire(10);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ // Burn
+ @Override
+ public void onEntityCollidedWithBlock(final World world, final int i, final int j, final int k,
+ final Entity entity) {
+ entity.setFire(10);
+ }
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(final World world, final int x, final int y, final int z, Random randomObj) {
+
+ randomObj = new XSTR();
+
+ if (randomObj.nextInt(24) == 0) {
+ world.playSound(
+ x + 0.5F,
+ y + 0.5F,
+ z + 0.5F,
+ "fire.fire",
+ 1.0F + randomObj.nextFloat(),
+ (randomObj.nextFloat() * 0.7F) + 0.3F,
+ false);
+ }
+
+ int l;
+ float f;
+ float f1;
+ float f2;
+
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z)
+ && !Blocks.fire.canCatchFire(world, x, y - 1, z, UP)) {
+ if (Blocks.fire.canCatchFire(world, x - 1, y, z, EAST)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + (randomObj.nextFloat() * 0.1F);
+ f1 = y + randomObj.nextFloat();
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x + 1, y, z, WEST)) {
+ for (l = 0; l < 2; ++l) {
+ f = (x + 1) - (randomObj.nextFloat() * 0.1F);
+ f1 = y + randomObj.nextFloat();
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y, z - 1, SOUTH)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + randomObj.nextFloat();
+ f2 = z + (randomObj.nextFloat() * 0.1F);
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y, z + 1, NORTH)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + randomObj.nextFloat();
+ f2 = (z + 1) - (randomObj.nextFloat() * 0.1F);
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y + 1, z, DOWN)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = (y + 1) - (randomObj.nextFloat() * 0.1F);
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ } else {
+ for (l = 0; l < 5; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + (randomObj.nextFloat() * 0.5F) + 0.5F;
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister IIconRegister) {
+ this.IIconArray = new IIcon[] {
+ IIconRegister.registerIcon(GTPlusPlus.ID + ":" + "hellfire/" + "blockHellFire" + "_layer_0"),
+ IIconRegister.registerIcon(GTPlusPlus.ID + ":" + "hellfire/" + "blockHellFire" + "_layer_1") };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getFireIcon(final int p_149840_1_) {
+ return this.IIconArray[p_149840_1_];
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.IIconArray[0];
+ }
+
+ @Override
+ public MapColor getMapColor(final int p_149728_1_) {
+ return MapColor.snowColor;
+ }
+
+ /*
+ * ================================= Forge Start ======================================
+ */
+ private static class FireInfo {
+
+ private int encouragement = 0;
+ private int flammibility = 0;
+ }
+
+ private final IdentityHashMap<Block, FireInfo> blockInfo = Maps.newIdentityHashMap();
+
+ @Override
+ public void setFireInfo(final Block block, final int encouragement, final int flammibility) {
+ try {
+ if (block == Blocks.air) {
+ throw new IllegalArgumentException("Tried to set air on fire... This is bad.");
+ }
+ final int id = Block.getIdFromBlock(block);
+ if (id >= 4096 || id >= field_149849_a.length || id >= field_149848_b.length) {
+ return;
+ }
+ this.field_149849_a[id] = encouragement;
+ this.field_149848_b[id] = flammibility;
+
+ final FireInfo info = this.getInfo(block, true);
+ info.encouragement = encouragement;
+ info.flammibility = flammibility;
+ } catch (Throwable t) {}
+ }
+
+ private FireInfo getInfo(final Block block, final boolean garentee) {
+ FireInfo ret = this.blockInfo.get(block);
+ if ((ret == null) && garentee) {
+ ret = new FireInfo();
+ this.blockInfo.put(block, ret);
+ }
+ return ret;
+ }
+
+ @Override
+ public void rebuildFireInfo() {
+ for (int x = 0; x < 4096; x++) {
+ // If we care.. we could detect changes in here and make sure we
+ // keep them, however
+ // it's my thinking that anyone who hacks into the private variables
+ // should DIAF and we don't care about them.
+ this.field_149849_a[x] = 0;
+ this.field_149848_b[x] = 0;
+ }
+
+ for (final Entry<Block, FireInfo> e : this.blockInfo.entrySet()) {
+ final int id = Block.getIdFromBlock(e.getKey());
+ if ((id >= 0) && (id < 4096)) {
+ this.field_149849_a[id] = e.getValue().encouragement;
+ this.field_149848_b[id] = e.getValue().flammibility;
+ }
+ }
+ }
+
+ @Override
+ public int getFlammability(final Block block) {
+ final int id = Block.getIdFromBlock(block);
+ return (id >= 0) && (id < 4096) ? this.field_149848_b[id] : 0;
+ }
+
+ @Override
+ public int getEncouragement(final Block block) {
+ final int id = Block.getIdFromBlock(block);
+ return (id >= 0) && (id < 4096) ? this.field_149849_a[id] : 0;
+ }
+
+ /**
+ * Side sensitive version that calls the block function.
+ *
+ * @param world The current world
+ * @param x X Position
+ * @param y Y Position
+ * @param z Z Position
+ * @param face The side the fire is coming from
+ * @return True if the face can catch fire.
+ */
+ @Override
+ public boolean canCatchFire(final IBlockAccess world, final int x, final int y, final int z,
+ final ForgeDirection face) {
+ return world.getBlock(x, y, z)
+ .isFlammable(world, x, y, z, face);
+ }
+
+ /**
+ * Side sensitive version that calls the block function.
+ *
+ * @param world The current world
+ * @param x X Position
+ * @param y Y Position
+ * @param z Z Position
+ * @param oldChance The previous maximum chance.
+ * @param face The side the fire is coming from
+ * @return The chance of the block catching fire, or oldChance if it is higher
+ */
+ @Override
+ public int getChanceToEncourageFire(final IBlockAccess world, final int x, final int y, final int z,
+ final int oldChance, final ForgeDirection face) {
+ final int newChance = world.getBlock(x, y, z)
+ .getFireSpreadSpeed(world, x, y, z, face);
+ return (newChance > oldChance ? newChance : oldChance);
+ }
+ /*
+ * ================================= Forge Start ======================================
+ */
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/LightGlass.java b/src/main/java/gtPlusPlus/core/block/general/LightGlass.java
new file mode 100644
index 0000000000..b6facce45f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/LightGlass.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockAir;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import codechicken.nei.api.API;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+/*
+ * public class LightGlass extends BlockBreakable {
+ */
+public class LightGlass extends BlockAir {
+
+ private int state = 0;
+ private final int a = 255;
+ private int r = 255;
+ private int g = 0;
+ private int b = 0;
+ private int hex;
+
+ public LightGlass(final boolean bool) {
+ super();
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setBlockName("blockMFEffect");
+ this.setLightLevel(12F);
+ setHardness(0.1F);
+ setBlockTextureName(GTPlusPlus.ID + ":" + "blockMFEffect");
+ setStepSound(Block.soundTypeGlass);
+ GameRegistry.registerBlock(this, "blockMFEffect");
+
+ API.hideItem(new ItemStack(this));
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(final Random rand) {
+ return 0;
+ }
+
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops.
+ */
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + "blockMFEffect");
+ }
+
+ @Override
+ // http://stackoverflow.com/questions/31784658/how-can-i-loop-through-all-rgb-combinations-in-rainbow-order-in-java
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ if (this.state == 0) {
+ this.g++;
+ if (this.g == 255) {
+ this.state = 1;
+ }
+ }
+ if (this.state == 1) {
+ this.r--;
+ if (this.r == 0) {
+ this.state = 2;
+ }
+ }
+ if (this.state == 2) {
+ this.b++;
+ if (this.b == 255) {
+ this.state = 3;
+ }
+ }
+ if (this.state == 3) {
+ this.g--;
+ if (this.g == 0) {
+ this.state = 4;
+ }
+ }
+ if (this.state == 4) {
+ this.r++;
+ if (this.r == 255) {
+ this.state = 5;
+ }
+ }
+ if (this.state == 5) {
+ this.b--;
+ if (this.b == 0) {
+ this.state = 0;
+ }
+ }
+ this.hex = (this.a << 24) + (this.r << 16) + (this.g << 8) + (this.b);
+ return this.hex;
+ }
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(final World world, final int posX, final int posY, final int posZ,
+ final Random random) {
+ // Utils.spawnFX(world, posX, posY, posZ, "smoke", "cloud");
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java b/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java
new file mode 100644
index 0000000000..7579907e9d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java
@@ -0,0 +1,193 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockTNT;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.init.Items;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+
+public class MiningExplosives extends BlockTNT {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ public MiningExplosives() {
+ this.setBlockName("blockMiningExplosives");
+ GameRegistry.registerBlock(this, "blockMiningExplosives");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 0 ? this.textureBottom : (ordinalSide == 1 ? this.textureTop : this.blockIcon);
+ }
+
+ /**
+ * Called whenever the block is added into the world. Args: world, x, y, z
+ */
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+
+ if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
+ this.onBlockDestroyedByPlayer(world, x, y, z, 1);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor Block
+ */
+ @Override
+ public void onNeighborBlockChange(final World world, final int x, final int y, final int z,
+ final Block neighbourblock) {
+ if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
+ this.onBlockDestroyedByPlayer(world, x, y, z, 1);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(final Random random) {
+ return 1;
+ }
+
+ /**
+ * Called upon the block being destroyed by an explosion
+ */
+ @Override
+ public void onBlockDestroyedByExplosion(final World world, final int x, final int y, final int z,
+ final Explosion bang) {
+ if (!world.isRemote) {
+ final EntityPrimedMiningExplosive EntityPrimedMiningExplosive = new EntityPrimedMiningExplosive(
+ world,
+ x + 0.5F,
+ y + 0.5F,
+ z + 0.5F,
+ bang.getExplosivePlacedBy());
+ EntityPrimedMiningExplosive.fuse = world.rand.nextInt(EntityPrimedMiningExplosive.fuse / 4)
+ + (EntityPrimedMiningExplosive.fuse / 8);
+ world.spawnEntityInWorld(EntityPrimedMiningExplosive);
+ }
+ }
+
+ /**
+ * Called right before the block is destroyed by a player. Args: world, x, y, z, metaData
+ */
+ @Override
+ public void onBlockDestroyedByPlayer(final World world, final int x, final int y, final int z, final int meta) {
+ this.func_150114_a(world, x, y, z, meta, (EntityLivingBase) null);
+ }
+
+ // TODO Spawns Primed TNT?
+ @Override
+ public void func_150114_a(final World world, final int p_150114_2_, final int p_150114_3_, final int p_150114_4_,
+ final int p_150114_5_, final EntityLivingBase entityLiving) {
+ if (!world.isRemote) {
+ if ((p_150114_5_ & 1) == 1) {
+ final EntityPrimedMiningExplosive EntityPrimedMiningExplosive = new EntityPrimedMiningExplosive(
+ world,
+ p_150114_2_ + 0.5F,
+ p_150114_3_ + 0.5F,
+ p_150114_4_ + 0.5F,
+ entityLiving);
+ world.spawnEntityInWorld(EntityPrimedMiningExplosive);
+ world.playSoundAtEntity(EntityPrimedMiningExplosive, "game.tnt.primed", 1.0F, 1.0F);
+ }
+ }
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z,
+ final EntityPlayer clickingPlayer, final int p_149727_6_, final float p_149727_7_, final float p_149727_8_,
+ final float p_149727_9_) {
+ if ((clickingPlayer.getCurrentEquippedItem() != null) && (clickingPlayer.getCurrentEquippedItem()
+ .getItem() == Items.flint_and_steel)) {
+ this.func_150114_a(world, x, y, z, 1, clickingPlayer);
+ world.setBlockToAir(x, y, z);
+ clickingPlayer.getCurrentEquippedItem()
+ .damageItem(1, clickingPlayer);
+ return true;
+ } else {
+ return super.onBlockActivated(
+ world,
+ x,
+ y,
+ z,
+ clickingPlayer,
+ p_149727_6_,
+ p_149727_7_,
+ p_149727_8_,
+ p_149727_9_);
+ }
+ }
+
+ /**
+ * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
+ */
+ @Override
+ public void onEntityCollidedWithBlock(final World world, final int x, final int y, final int z,
+ final Entity entityTriggering) {
+ if ((entityTriggering instanceof final EntityArrow entityarrow) && !world.isRemote) {
+
+ if (entityarrow.isBurning()) {
+ this.func_150114_a(
+ world,
+ x,
+ y,
+ z,
+ 1,
+ entityarrow.shootingEntity instanceof EntityLivingBase
+ ? (EntityLivingBase) entityarrow.shootingEntity
+ : null);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+ }
+
+ /**
+ * Return whether this block can drop from an explosion.
+ */
+ @Override
+ public boolean canDropFromExplosion(final Explosion bang) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iconRegister) {
+ this.blockIcon = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalSheet2");
+ this.textureTop = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalFunnel");
+ this.textureBottom = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalPanel");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java b/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java
new file mode 100644
index 0000000000..7e64f19bf3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java
@@ -0,0 +1,161 @@
+package gtPlusPlus.core.block.general.antigrief;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraft.entity.boss.EntityWither;
+import net.minecraft.entity.boss.IBossDisplayData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BlockWitherProof extends Block {
+
+ public BlockWitherProof() {
+ super(Material.redstoneLight);
+ this.setBlockName(Utils.sanitizeString("blockBlackGate"));
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + "blockFrameGt");
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setHardness(-1F);
+ this.setResistance(5000.0F);
+ this.setHarvestLevel("pickaxe", 3);
+ this.setStepSound(soundTypeMetal);
+ GameRegistry.registerBlock(this, Utils.sanitizeString("blockBlackGate"));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + "blockFrameGt");
+ }
+
+ @Override
+ public void onBlockExploded(final World world, final int x, final int y, final int z, final Explosion explosion) {
+ // prevent from being destroyed by wither and nukes.
+ }
+
+ @Override
+ public void onBlockDestroyedByExplosion(final World p_149723_1_, final int p_149723_2_, final int p_149723_3_,
+ final int p_149723_4_, final Explosion p_149723_5_) {}
+
+ @Override
+ public boolean canDropFromExplosion(final Explosion p_149659_1_) {
+ return false;
+ }
+
+ @Override
+ public boolean canEntityDestroy(final IBlockAccess world, final int x, final int y, final int z,
+ final Entity entity) {
+ if ((entity == null) || !entity.isEntityAlive()) {
+ return false;
+ }
+ if ((entity instanceof EntityWither) || (entity instanceof EntityDragon)
+ || (entity instanceof IBossDisplayData)) {
+ return false;
+ } else {
+ return super.canEntityDestroy(world, x, y, z, entity);
+ }
+ }
+
+ // Colour Handling
+ private static final int mWitherColour = Utils.rgbtoHexValue(32, 32, 32);
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return mWitherColour;
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return mWitherColour;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_,
+ int p_149749_6_) {
+ super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
+ }
+
+ @Override
+ public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World p_149737_2_, int p_149737_3_,
+ int p_149737_4_, int p_149737_5_) {
+ if (aPlayer != null && aPlayer instanceof EntityPlayerMP) {
+ return 1f;
+ }
+ return -1f;
+ }
+
+ @Override
+ public float getExplosionResistance(Entity p_149638_1_) {
+ return Float.MAX_VALUE;
+ }
+
+ @Override
+ public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_,
+ EntityPlayer p_149699_5_) {
+ super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
+ if ((entity == null) || !entity.isEntityAlive()) {
+ return;
+ }
+ if ((entity instanceof EntityWither) || (entity instanceof EntityDragon)
+ || (entity instanceof IBossDisplayData)) {
+ return;
+ } else {
+ super.onEntityCollidedWithBlock(world, x, y, z, entity);
+ }
+ }
+
+ @Override
+ public void harvestBlock(World p_149636_1_, EntityPlayer p_149636_2_, int p_149636_3_, int p_149636_4_,
+ int p_149636_5_, int p_149636_6_) {
+ super.harvestBlock(p_149636_1_, p_149636_2_, p_149636_3_, p_149636_4_, p_149636_5_, p_149636_6_);
+ }
+
+ @Override
+ public boolean canHarvestBlock(EntityPlayer player, int meta) {
+ if (player != null && player instanceof EntityPlayerMP) {
+ return true;
+ }
+ return super.canHarvestBlock(player, meta);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity par1Entity, World world, int x, int y, int z, double explosionX,
+ double explosionY, double explosionZ) {
+ return Float.MAX_VALUE;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java b/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java
new file mode 100644
index 0000000000..200f85d31d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.block.general.fluids;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.BlockFluidClassic;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockFluidSludge extends BlockFluidClassic {
+
+ @SideOnly(Side.CLIENT)
+ protected IIcon stillIcon;
+
+ @SideOnly(Side.CLIENT)
+ protected IIcon flowingIcon;
+
+ public BlockFluidSludge(final Fluid fluid, final Material material) {
+ super(fluid, material);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ((ordinalSide == 0) || (ordinalSide == 1)) ? this.stillIcon : this.flowingIcon;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(final IIconRegister register) {
+ this.stillIcon = register.registerIcon(GTPlusPlus.ID + ":fluids/fluid.jackdaniels");
+ this.flowingIcon = register.registerIcon(GTPlusPlus.ID + ":fluids/fluid.jackdaniels");
+ }
+
+ @Override
+ public boolean canDisplace(final IBlockAccess world, final int x, final int y, final int z) {
+ if (world.getBlock(x, y, z)
+ .getMaterial()
+ .isLiquid()) {
+ return false;
+ }
+ return super.canDisplace(world, x, y, z);
+ }
+
+ @Override
+ public boolean displaceIfPossible(final World world, final int x, final int y, final int z) {
+ if (world.getBlock(x, y, z)
+ .getMaterial()
+ .isLiquid()) {
+ return false;
+ }
+ return super.displaceIfPossible(world, x, y, z);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java b/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java
new file mode 100644
index 0000000000..f6cd34aec1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java
@@ -0,0 +1,153 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.core.block.base.BasicTileBlockWithTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class CircuitProgrammer extends BasicTileBlockWithTooltip {
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 4;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public CircuitProgrammer() {
+ super(Material.iron);
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+
+ boolean mDidScrewDriver = false;
+ // Check For Screwdriver
+ try {
+ final ItemStack mHandStack = PlayerUtils.getItemStackInPlayersHand(world, player.getDisplayName());
+ final Item mHandItem = mHandStack.getItem();
+ if (((mHandItem instanceof GT_MetaGenerated_Tool_01)
+ && ((mHandItem.getDamage(mHandStack) == 22) || (mHandItem.getDamage(mHandStack) == 150)))) {
+ final TileEntityCircuitProgrammer tile = (TileEntityCircuitProgrammer) world.getTileEntity(x, y, z);
+ if (tile != null) {
+ mDidScrewDriver = tile.onScrewdriverRightClick((byte) side, player, x, y, z);
+ }
+ }
+ } catch (final Throwable t) {}
+
+ if (!mDidScrewDriver) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityCircuitProgrammer)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI8, world, x, y, z);
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityCircuitProgrammer();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityCircuitProgrammer) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int getMetaCount() {
+ return 0;
+ }
+
+ @Override
+ public String getUnlocalBlockName() {
+ return "blockCircuitProgrammer";
+ }
+
+ @Override
+ protected float initBlockHardness() {
+ return 5f;
+ }
+
+ @Override
+ protected float initBlockResistance() {
+ return 1f;
+ }
+
+ @Override
+ protected CreativeTabs initCreativeTab() {
+ return AddToCreativeTab.tabMachines;
+ }
+
+ @Override
+ protected String getTileEntityName() {
+ return "Circuit Programmer";
+ }
+
+ @Override
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ String[] aTexData = new String[] { GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_G",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_TECH_PANEL_B",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I" };
+ CubicObject<String>[] aTextureData = new CubicObject[] { new CubicObject<>(aTexData) };
+ return aTextureData;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java b/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java
new file mode 100644
index 0000000000..c333e7a5ca
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java
@@ -0,0 +1,186 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.client.renderer.RenderDecayChest;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class DecayablesChest extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 5;
+
+ public final int field_149956_a = 0;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public DecayablesChest() {
+ super(Material.iron);
+ this.setBlockName("blockDecayablesChest");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setHardness(5f);
+ this.setResistance(1f);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockDecayablesChest");
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ }
+
+ /**
+ * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
+ * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
+ */
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * The type of render function that is called for this block
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderType() {
+ try {
+ if (RenderDecayChest.INSTANCE != null) {
+ return RenderDecayChest.INSTANCE.mRenderID;
+ }
+ return super.getRenderType();
+ } catch (NullPointerException n) {
+ return 0;
+ }
+ }
+
+ /**
+ * Updates the blocks bounds based on its current state. Args: world, x, y, z
+ */
+ @Override
+ public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_,
+ int p_149719_4_) {
+ if (p_149719_1_.getBlock(p_149719_2_, p_149719_3_, p_149719_4_ - 1) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0F, 0.9375F, 0.875F, 0.9375F);
+ } else if (p_149719_1_.getBlock(p_149719_2_, p_149719_3_, p_149719_4_ + 1) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 1.0F);
+ } else if (p_149719_1_.getBlock(p_149719_2_ - 1, p_149719_3_, p_149719_4_) == this) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ } else if (p_149719_1_.getBlock(p_149719_2_ + 1, p_149719_3_, p_149719_4_) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 1.0F, 0.875F, 0.9375F);
+ } else {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ }
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop : (ordinalSide == 0 ? this.textureBottom : this.textureFront);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_top");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_top");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_side");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_bottom");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityDecayablesChest)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI13, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityDecayablesChest();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityDecayablesChest) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java b/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java
new file mode 100644
index 0000000000..0ec1ac629a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java
@@ -0,0 +1,136 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class FishTrap extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 0;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public FishTrap() {
+ super(Material.iron);
+ this.setBlockName("blockFishTrap");
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockFishTrap");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityFishTrap)) {
+ player.openGui(GTplusplus.instance, 5, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityFishTrap();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityFishTrap) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java b/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java
new file mode 100644
index 0000000000..bf98a22500
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class Machine_PestKiller extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 6;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public Machine_PestKiller() {
+ super(Material.wood);
+ this.setBlockName("blockPestKiller");
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockPestKiller");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop : (ordinalSide == 0 ? this.textureBottom : this.textureFront);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_PESTKILLER_TOP");
+ this.textureBottom = p_149651_1_.registerIcon("planks_acacia");
+ this.textureFront = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityPestKiller)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI15, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityPestKiller();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityPestKiller) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java b/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java
new file mode 100644
index 0000000000..4f1b679fcf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+import gtPlusPlus.core.tileentities.machines.TileEntityAdvPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityBaseFluidCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityPooCollector;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class Machine_PooCollector extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop2;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureSide;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureSide2;
+
+ public Machine_PooCollector() {
+ super(Material.iron);
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setBlockName("blockPooCollector");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "blockPooCollector");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ if (aMeta <= 7) {
+ blockIcon = textureSide;
+ return ordinalSide <= 1 ? this.textureTop : this.textureSide;
+ } else {
+ blockIcon = textureSide2;
+ return ordinalSide <= 1 ? this.textureTop2 : this.textureSide2;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_top");
+ this.textureTop2 = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_adv_top");
+ this.textureSide = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_sides");
+ this.textureSide2 = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_adv_sides");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+ TileEntityBaseFluidCollector tank = (TileEntityBaseFluidCollector) world.getTileEntity(x, y, z);
+ if (tank != null) {
+ Item handItem;
+ try {
+ handItem = player.getHeldItem()
+ .getItem();
+ } catch (Throwable t) {
+ handItem = null;
+ }
+
+ // Fluid container code
+ /*
+ * if (handItem != null && (handItem instanceof IFluidContainerItem || handItem instanceof
+ * ItemFluidContainer || FluidContainerRegistry.isFilledContainer(player.getHeldItem()))) { if
+ * (tank.tank.getFluid() == null) { try { if
+ * (!FluidContainerRegistry.isFilledContainer(player.getHeldItem())) { ItemStack handItemStack =
+ * player.getHeldItem(); IFluidContainerItem container = (IFluidContainerItem) handItem; FluidStack
+ * containerFluid = container.getFluid(handItemStack); container.drain(handItemStack,
+ * container.getFluid(handItemStack).amount, true); tank.tank.setFluid(containerFluid); } else {
+ * ItemStack handItemStack = player.getHeldItem();
+ * FluidContainerRegistry.drainFluidContainer(handItemStack); FluidStack containerFluid =
+ * FluidContainerRegistry.getFluidForFilledItem(handItemStack); ItemStack emptyContainer =
+ * FluidContainerRegistry.drainFluidContainer(handItemStack); player.setItemInUse(emptyContainer, 0);
+ * tank.tank.setFluid(containerFluid); } } catch (Throwable t) { t.printStackTrace(); } } }
+ */
+
+ if (!tank.mInventory.isEmpty()) {
+ PlayerUtils.messagePlayer(player, "Inventory contains:");
+ PlayerUtils.messagePlayer(player, ItemUtils.getArrayStackNames(tank.mInventory.getRealInventory()));
+ } else {
+ PlayerUtils.messagePlayer(player, "No solids collected yet.");
+ }
+ if (tank.tank.getFluid() != null) {
+ PlayerUtils.messagePlayer(
+ player,
+ "Tank contains " + tank.tank.getFluidAmount()
+ + "L of "
+ + tank.tank.getFluid()
+ .getLocalizedName());
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return super.isOpaqueCube();
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int aMeta) {
+ return aMeta <= 7 ? new TileEntityPooCollector() : new TileEntityAdvPooCollector();
+ }
+
+ @Override
+ public void onBlockAdded(World world, int x, int y, int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public int getBlockColor() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public int damageDropped(final int damage) {
+ return damage;
+ }
+
+ @Override
+ public Item getItemDropped(final int meta, final Random rand, final int fortune) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ public int getRenderColor(int aMeta) {
+ return super.getRenderColor(aMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 8));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java b/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java
new file mode 100644
index 0000000000..4f0d0d7d60
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.BuildCraftCore;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import ic2.core.item.tool.ItemToolWrench;
+
+@Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = Mods.Names.ENDER_I_O)
+public class Machine_ProjectTable extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 3;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public Machine_ProjectTable() {
+ super(Material.iron);
+ this.setBlockName("blockProjectBench");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockProjectBench");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "cover_crafting");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+
+ ItemStack heldItem = null;
+ if (world.isRemote) {
+ heldItem = PlayerUtils.getItemStackInPlayersHand();
+ }
+
+ boolean holdingWrench = false;
+
+ if (heldItem != null) {
+ holdingWrench = isWrench(heldItem);
+ }
+
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof TileEntityProjectTable) {
+ if (!holdingWrench) {
+ player.openGui(GTplusplus.instance, 0, world, x, y, z);
+ return true;
+ }
+ Logger.INFO("Holding a Wrench, doing wrench things instead.");
+ }
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityProjectTable();
+ }
+
+ public static boolean isWrench(final ItemStack item) {
+ if (item.getItem() instanceof ItemToolWrench) {
+ return true;
+ }
+ if (BuildCraftCore.isModLoaded()) {
+ return checkBuildcraftWrench(item);
+ }
+ if (EnderIO.isModLoaded()) {
+ return checkEnderIOWrench(item);
+ }
+ return false;
+ }
+
+ private static boolean checkEnderIOWrench(final ItemStack item) {
+ if (ReflectionUtils.doesClassExist("crazypants.enderio.api.tool.ITool")) {
+ Class<?> wrenchClass;
+ wrenchClass = ReflectionUtils.getClass("crazypants.enderio.api.tool.ITool");
+ if (wrenchClass.isInstance(item.getItem())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean checkBuildcraftWrench(final ItemStack item) {
+ if (ReflectionUtils.doesClassExist("buildcraft.api.tools.IToolWrench")) {
+ Class<?> wrenchClass;
+ wrenchClass = ReflectionUtils.getClass("buildcraft.api.tools.IToolWrench");
+ if (wrenchClass.isInstance(item.getItem())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java b/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java
new file mode 100644
index 0000000000..470fa98a9b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java
@@ -0,0 +1,558 @@
+package gtPlusPlus.core.block.machine;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockJukebox;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemRecord;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.inventories.Inventory_SuperJukebox;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class Machine_SuperJukebox extends BlockJukebox {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon mIcon;
+
+ public Machine_SuperJukebox() {
+ this.setBlockName("blockSuperJukebox");
+ this.setCreativeTab(CreativeTabs.tabRedstone);
+ setHardness(2.0F);
+ setResistance(10.0F);
+ setStepSound(soundTypePiston);
+ setBlockTextureName("jukebox");
+ GameRegistry.registerBlock(this, "blockSuperJukebox");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return ordinalSide == 1 ? this.mIcon : this.blockIcon;
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntitySuperJukebox)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI14, world, x, y, z);
+ return true;
+ }
+ return false;
+
+ /*
+ * if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { return false; } else { this.func_149925_e(aWorld, aX, aY,
+ * aZ); return true; }
+ */
+ }
+
+ /**
+ * Set the record in the {@link SuperJukebox} {@link TileEntity}.
+ */
+ @Override
+ public final void func_149926_b(World aWorld, int aX, int aY, int aZ, ItemStack aStackToSet) {
+ setRecordInJukeBox(aWorld, aX, aY, aZ, aStackToSet);
+ }
+
+ public void setRecordInJukeBox(World aWorld, int aX, int aY, int aZ, ItemStack aStackToSet) {
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+ if (tileentityjukebox != null && aStackToSet.getItem() instanceof ItemRecord) {
+ tileentityjukebox.setCurrentRecord(aStackToSet.copy());
+ // aWorld.setBlockMetadataWithNotify(aX, aY, aZ, 1, 2);
+ }
+ }
+ }
+
+ /**
+ * Function to handle playing of records.
+ */
+ @Override
+ public final void func_149925_e(World aWorld, int aX, int aY, int aZ) {
+ playJukeboxRecord(aWorld, aX, aY, aZ);
+ }
+
+ public void playJukeboxRecord(World aWorld, int aX, int aY, int aZ) {
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+
+ if (tileentityjukebox != null) {
+ ItemStack itemstack = tileentityjukebox.func_145856_a();
+
+ if (itemstack != null) {
+
+ aWorld.playAuxSFX(1005, aX, aY, aZ, Item.getIdFromItem(itemstack.getItem()));
+ /*
+ * float f = 0.7F; double d0 = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
+ * double d1 = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.2D + 0.6D; double d2
+ * = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; ItemStack itemstack1 =
+ * itemstack.copy(); EntityItem entityitem = new EntityItem(aWorld, (double) aX + d0, (double) aY +
+ * d1, (double) aZ + d2, itemstack1); entityitem.delayBeforeCanPickup = 10;
+ * aWorld.spawnEntityInWorld(entityitem);
+ */
+ }
+ }
+ }
+ }
+
+ @Override
+ public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_,
+ int p_149749_6_) {
+ this.func_149925_e(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_);
+ super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
+ }
+
+ /**
+ * Drops the block items with a specified chance of dropping the specified items
+ */
+ @Override
+ public void dropBlockAsItemWithChance(World p_149690_1_, int p_149690_2_, int p_149690_3_, int p_149690_4_,
+ int p_149690_5_, float p_149690_6_, int p_149690_7_) {
+ if (!p_149690_1_.isRemote) {
+ super.dropBlockAsItemWithChance(
+ p_149690_1_,
+ p_149690_2_,
+ p_149690_3_,
+ p_149690_4_,
+ p_149690_5_,
+ p_149690_6_,
+ 0);
+ }
+ }
+
+ /**
+ * Returns a new instance of a block's tile entity class. Called on placing the block.
+ */
+ @Override
+ public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
+ return new TileEntitySuperJukebox();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side");
+ this.mIcon = p_149651_1_.registerIcon(this.getTextureName() + "_top");
+ }
+
+ public static class TileEntitySuperJukebox extends TileEntityJukebox implements ISidedInventory {
+
+ /** The number of players currently using this chest */
+ public int numPlayersUsing;
+
+ private ItemStack mCurrentlyPlayingStack;
+ private final Inventory_SuperJukebox inventoryContents;
+ private String customName;
+
+ /*
+ * Important Data
+ */
+
+ public int a_TEST_INT_VAR_1;
+ public int a_TEST_INT_VAR_2;
+ public int a_TEST_INT_VAR_3;
+ public int a_TEST_INT_VAR_4;
+
+ public boolean mIsPlaying = false;
+ public boolean mIsLooping = false;
+ public boolean a_TEST_BOOL_VAR_3;
+ public boolean a_TEST_BOOL_VAR_4;
+
+ public TileEntitySuperJukebox() {
+ this.inventoryContents = new Inventory_SuperJukebox();
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+
+ if (aNBT.hasKey("RecordItem", 10)) {
+ this.func_145857_a(ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("RecordItem")));
+ } else if (aNBT.getInteger("Record") > 0) {
+ this.func_145857_a(new ItemStack(Item.getItemById(aNBT.getInteger("Record")), 1, 0));
+ }
+
+ this.inventoryContents.readFromNBT(aNBT.getCompoundTag("ContentsChest"));
+ if (aNBT.hasKey("CustomName", 8)) {
+ this.setCustomName(aNBT.getString("CustomName"));
+ }
+
+ mIsPlaying = aNBT.getBoolean("mIsPlaying");
+ mIsLooping = aNBT.getBoolean("mIsLooping");
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+
+ if (this.getCurrentRecord() != null) {
+ aNBT.setTag(
+ "RecordItem",
+ this.func_145856_a()
+ .writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger(
+ "Record",
+ Item.getIdFromItem(
+ this.func_145856_a()
+ .getItem()));
+ }
+
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ aNBT.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ aNBT.setString("CustomName", this.getCustomName());
+ }
+
+ aNBT.setBoolean("mIsPlaying", mIsPlaying);
+ aNBT.setBoolean("mIsLooping", mIsLooping);
+ }
+
+ /**
+ * Called to get the internal stack
+ */
+ @Override
+ public ItemStack func_145856_a() {
+ return this.mCurrentlyPlayingStack;
+ }
+
+ /**
+ * Called to get the internal stack, wraps vanilla function {@link func_145856_a}.
+ */
+ public ItemStack getCurrentRecord() {
+ return func_145856_a();
+ }
+
+ /**
+ * Called to set the internal stack
+ */
+ @Override
+ public void func_145857_a(ItemStack p_145857_1_) {
+ this.mCurrentlyPlayingStack = p_145857_1_;
+ this.markDirty();
+ }
+
+ /**
+ * Called to set the internal stack, wraps vanilla function {@link func_145857_a}.
+ */
+ public void setCurrentRecord(ItemStack aStack) {
+ func_145857_a(aStack);
+ this.markDirty();
+ }
+
+ public Inventory_SuperJukebox getInventory() {
+ return this.inventoryContents;
+ }
+
+ public boolean playRecord(ItemStack aRecord) {
+
+ return false;
+ }
+
+ public boolean stopRecord() {
+ return openDiscDrive();
+ }
+
+ public void setLoopState(boolean isShufflingForever) {}
+
+ // Play button pressed
+ public boolean jukeboxLogicUpdate() {
+
+ if (this.worldObj.isRemote) {
+ return true;
+ }
+
+ Logger.INFO("a");
+ if (this.mIsPlaying || this.mIsLooping) {
+ return selectRecordToPlayFromInventoryAndSetViaVanillaHandler();
+ } else {
+ return stopRecord();
+ }
+ }
+
+ // Determine which record to play
+ public boolean selectRecordToPlayFromInventoryAndSetViaVanillaHandler() {
+ AutoMap<ItemStack> mValidRecords = new AutoMap<>();
+ for (ItemStack g : this.getInventory()
+ .getInventory()) {
+ if (g != null) {
+ if (g.getItem() instanceof ItemRecord) {
+ mValidRecords.put(g);
+ }
+ }
+ }
+
+ Logger.INFO("b1");
+ // Select First Record
+ ItemStack aRecordToPlay;
+ if (mValidRecords.size() == 0) {
+ Logger.INFO("bX");
+ return false;
+ } else {
+ aRecordToPlay = mValidRecords.get(!mIsLooping ? 0 : MathUtils.randInt(0, (mValidRecords.size() - 1)));
+ }
+ Logger.INFO("b2 - " + aRecordToPlay.getDisplayName());
+
+ int aSlotCounter = 0;
+ for (ItemStack g : this.getInventory()
+ .getInventory()) {
+ if (g != null && aSlotCounter <= 17) {
+ Logger.INFO("b3 - " + g.getDisplayName());
+ if (GT_Utility.areStacksEqual(g, aRecordToPlay, true)) {
+ IInventory aThisInv = this.getInventory();
+ if (aThisInv.getStackInSlot(20) != null) {
+ openDiscDrive();
+ }
+
+ GT_Utility.moveStackFromSlotAToSlotB(
+ aThisInv,
+ aThisInv,
+ aSlotCounter,
+ 20,
+ (byte) 1,
+ (byte) 1,
+ (byte) 1,
+ (byte) 1);
+ setCurrentRecord(aThisInv.getStackInSlot(20));
+
+ World aWorld = this.worldObj;
+ int aX = this.xCoord;
+ int aY = this.yCoord;
+ int aZ = this.zCoord;
+ if (!aWorld.isRemote) {
+ aRecordToPlay = this.func_145856_a();
+ if (aRecordToPlay != null) {
+ aWorld.playAuxSFX(1005, aX, aY, aZ, Item.getIdFromItem(aRecordToPlay.getItem()));
+ this.markDirty();
+ return true;
+ }
+ }
+
+ Logger.INFO("b++");
+ this.markDirty();
+ return false;
+ }
+ }
+ aSlotCounter++;
+ }
+
+ Logger.INFO("b4");
+ this.markDirty();
+ return false;
+ }
+
+ public boolean genericMethodThree(Object a1, Object a2, Object a3, Object a4) {
+ return false;
+ }
+
+ public void vanillaStopJukebox() {
+ World aWorld = this.worldObj;
+ int aX = this.xCoord;
+ int aY = this.yCoord;
+ int aZ = this.zCoord;
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+ if (tileentityjukebox != null) {
+ ItemStack aRecordToPlay = tileentityjukebox.func_145856_a();
+ if (aRecordToPlay != null) {
+ aWorld.playAuxSFX(1005, aX, aY, aZ, 0);
+ aWorld.playRecord((String) null, aX, aY, aZ);
+ tileentityjukebox.func_145857_a((ItemStack) null);
+ this.markDirty();
+ }
+ }
+ }
+ }
+
+ public boolean openDiscDrive() {
+ int aSlotCounter = 17;
+
+ ItemStack g;
+
+ for (int i = 17; i >= 0; i--) {
+ g = this.getInventory()
+ .getInventory()[i];
+ if (g == null && aSlotCounter >= 0) {
+ IInventory aThisInv = this.getInventory();
+ GT_Utility
+ .moveStackFromSlotAToSlotB(aThisInv, aThisInv, 20, i, (byte) 1, (byte) 1, (byte) 1, (byte) 1);
+ vanillaStopJukebox();
+ Logger.INFO("b++");
+ this.markDirty();
+ return true;
+ }
+ }
+
+ /*
+ * for (ItemStack g : this.getInventory().getInventory()) { if (g == null && aSlotCounter >= 0) { IInventory
+ * aThisInv = this.getInventory(); GT_Utility.moveStackFromSlotAToSlotB(aThisInv, aThisInv, 20,
+ * aSlotCounter, (byte) 1, (byte) 1, (byte) 1, (byte) 1); vanillaStopJukebox(); Logger.INFO("b++"); return
+ * true; } aSlotCounter--; }
+ */
+ this.markDirty();
+ return false;
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32)
+ != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory() - 3;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ if (this.numPlayersUsing < 0) {
+ this.numPlayersUsing = 0;
+ }
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing++;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing--;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ if (slot >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ private static final int[] SIDED_SLOTS = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17 };
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return SIDED_SLOTS;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ if (p_102007_1_ >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(p_102007_1_, p_102007_2_);
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ if (p_102008_1_ >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(p_102008_1_, p_102008_2_);
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.SuperJukebox";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java b/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..1bca4a5c5f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.core.block.base.BasicTileBlockWithTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class VolumetricFlaskSetter extends BasicTileBlockWithTooltip {
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 8;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ @Override
+ public Class<? extends ItemBlock> getItemBlockClass() {
+ return ItemBlockBasicTile.class;
+ }
+
+ public VolumetricFlaskSetter() {
+ super(Material.iron);
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+
+ boolean mDidScrewDriver = false;
+ // Check For Screwdriver
+ try {
+ final ItemStack mHandStack = PlayerUtils.getItemStackInPlayersHand(world, player.getDisplayName());
+ final Item mHandItem = mHandStack.getItem();
+ if (((mHandItem instanceof GT_MetaGenerated_Tool_01)
+ && ((mHandItem.getDamage(mHandStack) == 22) || (mHandItem.getDamage(mHandStack) == 150)))) {
+ final TileEntityVolumetricFlaskSetter tile = (TileEntityVolumetricFlaskSetter) world
+ .getTileEntity(x, y, z);
+ if (tile != null) {
+ mDidScrewDriver = tile.onScrewdriverRightClick((byte) side, player, x, y, z);
+ }
+ }
+ } catch (final Throwable t) {}
+
+ if (!mDidScrewDriver) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityVolumetricFlaskSetter aTile)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI18, world, x, y, z);
+ // new Packet_VolumetricFlaskGui2(aTile, aTile.getCustomValue());
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityVolumetricFlaskSetter();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityVolumetricFlaskSetter) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int getMetaCount() {
+ return 0;
+ }
+
+ @Override
+ public String getUnlocalBlockName() {
+ return "blockVolumetricFlaskSetter";
+ }
+
+ @Override
+ protected float initBlockHardness() {
+ return 5f;
+ }
+
+ @Override
+ protected float initBlockResistance() {
+ return 1f;
+ }
+
+ @Override
+ protected CreativeTabs initCreativeTab() {
+ return AddToCreativeTab.tabMachines;
+ }
+
+ @Override
+ protected String getTileEntityName() {
+ return "Volumetric Flask Configurator";
+ }
+
+ @Override
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ String[] aTexData = new String[] { GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_A",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_TECH_PANEL_C",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H" };
+ CubicObject<String>[] aTextureData = new CubicObject[] { new CubicObject<>(aTexData) };
+ return aTextureData;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java b/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java
new file mode 100644
index 0000000000..ce4d9a0320
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.core.client;
+
+import gregtech.api.enums.TextureSet;
+
+public class CustomTextureSet extends TextureSet {
+
+ public static enum TextureSets {
+
+ REFINED(),
+ GEM_A(),
+ ENRICHED(),
+ NUCLEAR;
+
+ private final CustomTextureSet A;
+
+ private TextureSets() {
+ A = new CustomTextureSet(
+ this.name()
+ .toUpperCase());
+ }
+
+ public CustomTextureSet get() {
+ return A;
+ }
+ }
+
+ public CustomTextureSet(String aSetName) {
+ super(aSetName);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java b/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java
new file mode 100644
index 0000000000..ef0943684c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java
@@ -0,0 +1,45 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelBase;
+import net.minecraft.client.model.ModelRenderer;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelDecayChest extends ModelBase {
+
+ /** The chest lid in the chest's model. */
+ public ModelRenderer chestLid = (new ModelRenderer(this, 0, 0)).setTextureSize(64, 64);
+ /** The model of the bottom of the chest. */
+ public ModelRenderer chestBelow;
+ /** The chest's knob in the chest model. */
+ public ModelRenderer chestKnob;
+
+ public ModelDecayChest() {
+ this.chestLid.addBox(0.0F, -5.0F, -14.0F, 14, 5, 14, 0.0F);
+ this.chestLid.rotationPointX = 1.0F;
+ this.chestLid.rotationPointY = 7.0F;
+ this.chestLid.rotationPointZ = 15.0F;
+ this.chestKnob = (new ModelRenderer(this, 0, 0)).setTextureSize(64, 64);
+ this.chestKnob.addBox(-1.0F, -2.0F, -15.0F, 2, 4, 1, 0.0F);
+ this.chestKnob.rotationPointX = 8.0F;
+ this.chestKnob.rotationPointY = 7.0F;
+ this.chestKnob.rotationPointZ = 15.0F;
+ this.chestBelow = (new ModelRenderer(this, 0, 19)).setTextureSize(64, 64);
+ this.chestBelow.addBox(0.0F, 0.0F, 0.0F, 14, 10, 14, 0.0F);
+ this.chestBelow.rotationPointX = 1.0F;
+ this.chestBelow.rotationPointY = 6.0F;
+ this.chestBelow.rotationPointZ = 1.0F;
+ }
+
+ /**
+ * This method renders out all parts of the chest model.
+ */
+ public void renderAll() {
+ this.chestKnob.rotateAngleX = this.chestLid.rotateAngleX;
+ this.chestLid.render(0.0625F);
+ this.chestKnob.render(0.0625F);
+ this.chestBelow.render(0.0625F);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java b/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java
new file mode 100644
index 0000000000..3b5922444d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java
@@ -0,0 +1,87 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelBlaze;
+import net.minecraft.client.model.ModelRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.MathHelper;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelSickBlaze extends ModelBlaze {
+
+ /** The sticks that fly around the Blaze. */
+ private ModelRenderer[] blazeSticks = new ModelRenderer[24];
+
+ private ModelRenderer blazeHead;
+
+ public ModelSickBlaze() {
+ for (int i = 0; i < this.blazeSticks.length; ++i) {
+ this.blazeSticks[i] = new ModelRenderer(this, 0, 16);
+ this.blazeSticks[i].addBox(0.0F, 0.0F, 0.0F, 2, 8, 2);
+ }
+
+ this.blazeHead = new ModelRenderer(this, 0, 0);
+ this.blazeHead.addBox(-4.0F, -4.0F, -4.0F, 8, 8, 8);
+ }
+
+ @Override
+ public int func_78104_a() {
+ return 8;
+ }
+
+ /**
+ * Sets the models various rotation angles then renders the model.
+ */
+ @Override
+ public void render(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_,
+ float p_78088_6_, float p_78088_7_) {
+ this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, p_78088_7_, p_78088_1_);
+ this.blazeHead.render(p_78088_7_);
+
+ for (ModelRenderer blazeStick : this.blazeSticks) {
+ blazeStick.render(p_78088_7_);
+ }
+ }
+
+ /**
+ * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms
+ * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how
+ * "far" arms and legs can swing at most.
+ */
+ @Override
+ public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_,
+ float p_78087_5_, float p_78087_6_, Entity p_78087_7_) {
+ float f6 = p_78087_3_ * (float) Math.PI * -0.1F;
+ int i;
+
+ for (i = 0; i < 4; ++i) {
+ this.blazeSticks[i].rotationPointY = -2.0F + MathHelper.cos((i * 2 + p_78087_3_) * 0.25F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 9.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 9.0F;
+ ++f6;
+ }
+
+ f6 = ((float) Math.PI / 4F) + p_78087_3_ * (float) Math.PI * 0.03F;
+
+ for (i = 4; i < 8; ++i) {
+ this.blazeSticks[i].rotationPointY = 2.0F + MathHelper.cos((i * 2 + p_78087_3_) * 0.25F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 7.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 7.0F;
+ ++f6;
+ }
+
+ f6 = 0.47123894F + p_78087_3_ * (float) Math.PI * -0.05F;
+
+ for (i = 8; i < 12; ++i) {
+ this.blazeSticks[i].rotationPointY = 11.0F + MathHelper.cos((i * 1.5F + p_78087_3_) * 0.5F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 5.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 5.0F;
+ ++f6;
+ }
+
+ this.blazeHead.rotateAngleY = p_78087_4_ / (180F / (float) Math.PI);
+ this.blazeHead.rotateAngleX = p_78087_5_ / (180F / (float) Math.PI);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java b/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java
new file mode 100644
index 0000000000..457bc7a377
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelIronGolem;
+import net.minecraft.client.model.ModelRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelStaballoyConstruct extends ModelIronGolem {
+
+ public ModelStaballoyConstruct() {
+ this(0.0F);
+ }
+
+ public ModelStaballoyConstruct(float p_i1161_1_) {
+ this(p_i1161_1_, -7.0F);
+ }
+
+ public ModelStaballoyConstruct(float p_i1162_1_, float p_i1162_2_) {
+ short short1 = 128;
+ short short2 = 128;
+ this.ironGolemHead = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemHead.setRotationPoint(0.0F, 0.0F + p_i1162_2_, -2.0F);
+ this.ironGolemHead.setTextureOffset(0, 0)
+ .addBox(-4.0F, -12.0F, -5.5F, 8, 10, 8, p_i1162_1_);
+ this.ironGolemHead.setTextureOffset(24, 0)
+ .addBox(-1.0F, -5.0F, -7.5F, 2, 4, 2, p_i1162_1_);
+ this.ironGolemBody = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemBody.setRotationPoint(0.0F, 0.0F + p_i1162_2_, 0.0F);
+ this.ironGolemBody.setTextureOffset(0, 40)
+ .addBox(-9.0F, -2.0F, -6.0F, 18, 12, 11, p_i1162_1_);
+ this.ironGolemBody.setTextureOffset(0, 70)
+ .addBox(-4.5F, 10.0F, -3.0F, 9, 5, 6, p_i1162_1_ + 0.5F);
+ this.ironGolemRightArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemRightArm.setRotationPoint(0.0F, -7.0F, 0.0F);
+ this.ironGolemRightArm.setTextureOffset(60, 21)
+ .addBox(-13.0F, -2.5F, -3.0F, 4, 30, 6, p_i1162_1_);
+ this.ironGolemLeftArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemLeftArm.setRotationPoint(0.0F, -7.0F, 0.0F);
+ this.ironGolemLeftArm.setTextureOffset(60, 58)
+ .addBox(9.0F, -2.5F, -3.0F, 4, 30, 6, p_i1162_1_);
+ this.ironGolemLeftLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
+ this.ironGolemLeftLeg.setRotationPoint(-4.0F, 18.0F + p_i1162_2_, 0.0F);
+ this.ironGolemLeftLeg.setTextureOffset(37, 0)
+ .addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, p_i1162_1_);
+ this.ironGolemRightLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
+ this.ironGolemRightLeg.mirror = true;
+ this.ironGolemRightLeg.setTextureOffset(60, 0)
+ .setRotationPoint(5.0F, 18.0F + p_i1162_2_, 0.0F);
+ this.ironGolemRightLeg.addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, p_i1162_1_);
+ }
+
+ /**
+ * Sets the models various rotation angles then renders the model.
+ */
+ @Override
+ public void render(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_,
+ float p_78088_6_, float p_78088_7_) {
+ this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, p_78088_7_, p_78088_1_);
+ this.ironGolemHead.render(p_78088_7_);
+ this.ironGolemBody.render(p_78088_7_);
+ this.ironGolemLeftLeg.render(p_78088_7_);
+ this.ironGolemRightLeg.render(p_78088_7_);
+ this.ironGolemRightArm.render(p_78088_7_);
+ this.ironGolemLeftArm.render(p_78088_7_);
+ }
+
+ /**
+ * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms
+ * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how
+ * "far" arms and legs can swing at most.
+ */
+ @Override
+ public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_,
+ float p_78087_5_, float p_78087_6_, Entity p_78087_7_) {
+ this.ironGolemHead.rotateAngleY = p_78087_4_ / (180F / (float) Math.PI);
+ this.ironGolemHead.rotateAngleX = p_78087_5_ / (180F / (float) Math.PI);
+ this.ironGolemLeftLeg.rotateAngleX = -1.5F * this.func_78172_a(p_78087_1_, 13.0F) * p_78087_2_;
+ this.ironGolemRightLeg.rotateAngleX = 1.5F * this.func_78172_a(p_78087_1_, 13.0F) * p_78087_2_;
+ this.ironGolemLeftLeg.rotateAngleY = 0.0F;
+ this.ironGolemRightLeg.rotateAngleY = 0.0F;
+ }
+
+ /**
+ * Used for easily adding entity-dependent animations. The second and third float params here are the same second
+ * and third as in the setRotationAngles method.
+ */
+ @Override
+ public void setLivingAnimations(EntityLivingBase p_78086_1_, float p_78086_2_, float p_78086_3_, float p_78086_4_) {
+ EntityIronGolem entityirongolem = (EntityIronGolem) p_78086_1_;
+ int i = entityirongolem.getAttackTimer();
+
+ if (i > 0) {
+ this.ironGolemRightArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a(i - p_78086_4_, 10.0F);
+ this.ironGolemLeftArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a(i - p_78086_4_, 10.0F);
+ } else {
+ int j = entityirongolem.getHoldRoseTick();
+
+ if (j > 0) {
+ this.ironGolemRightArm.rotateAngleX = -0.8F + 0.025F * this.func_78172_a(j, 70.0F);
+ this.ironGolemLeftArm.rotateAngleX = 0.0F;
+ } else {
+ this.ironGolemRightArm.rotateAngleX = (-0.2F + 1.5F * this.func_78172_a(p_78086_2_, 13.0F))
+ * p_78086_3_;
+ this.ironGolemLeftArm.rotateAngleX = (-0.2F - 1.5F * this.func_78172_a(p_78086_2_, 13.0F)) * p_78086_3_;
+ }
+ }
+ }
+
+ private float func_78172_a(float p_78172_1_, float p_78172_2_) {
+ return (Math.abs(p_78172_1_ % p_78172_2_ - p_78172_2_ * 0.5F) - p_78172_2_ * 0.25F) / (p_78172_2_ * 0.25F);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java b/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java
new file mode 100644
index 0000000000..f83844f3e3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+/**
+ * Easy way of rendering an item which should look like a block. Borrowed.
+ *
+ * @author King Lemming
+ *
+ */
+public class CustomItemBlockRenderer implements IItemRenderer {
+
+ public static CustomItemBlockRenderer instance = new CustomItemBlockRenderer();
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return true;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+
+ double offset = -0.5;
+ if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ offset = 0;
+ } else if (type == ItemRenderType.ENTITY) {
+ GL11.glScalef(0.5F, 0.5F, 0.5F);
+ }
+ renderItemAsBlock((RenderBlocks) data[0], item, offset, offset, offset);
+ }
+
+ public static void renderItemAsBlock(RenderBlocks renderer, ItemStack item, double translateX, double translateY,
+ double translateZ) {
+
+ renderTextureAsBlock(renderer, item.getIconIndex(), translateX, translateY, translateZ);
+ }
+
+ public static void renderTextureAsBlock(RenderBlocks renderer, IIcon texture, double translateX, double translateY,
+ double translateZ) {
+
+ Tessellator tessellator = Tessellator.instance;
+ Block block = Blocks.stone;
+
+ if (texture == null) {
+ return;
+ }
+ renderer.setRenderBoundsFromBlock(block);
+ GL11.glTranslated(translateX, translateY, translateZ);
+ tessellator.startDrawingQuads();
+
+ tessellator.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.draw();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java b/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java
new file mode 100644
index 0000000000..689f075703
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java
@@ -0,0 +1,2469 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.api.interfaces.ITexture;
+import gtPlusPlus.api.interfaces.ITexturedBlock;
+import gtPlusPlus.api.objects.Logger;
+
+public class CustomOreBlockRenderer implements ISimpleBlockRenderingHandler {
+
+ public static CustomOreBlockRenderer INSTANCE;
+ public final int mRenderID;
+
+ public CustomOreBlockRenderer() {
+ INSTANCE = this;
+ this.mRenderID = RenderingRegistry.getNextAvailableRenderId();
+ RenderingRegistry.registerBlockHandler(this);
+ Logger.INFO("Registered Custom Ore Block Renderer.");
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer) {
+ Block tTileEntity = aBlock;
+ if ((tTileEntity instanceof ITexturedBlock)) {
+ return renderStandardBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ aRenderer,
+ new ITexture[][] { ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.DOWN),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.UP),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.NORTH),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.SOUTH),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.WEST),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.EAST) });
+ }
+ return false;
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer, ITexture[][] aTextures) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ int l = aBlock.colorMultiplier(aWorld, aX, aY, aZ);
+ float RED = (float) (l >> 16 & 255) / 255.0F;
+ float GREEN = (float) (l >> 8 & 255) / 255.0F;
+ float BLUE = (float) (l & 255) / 255.0F;
+
+ if (Minecraft.isAmbientOcclusionEnabled() && aBlock.getLightValue() == 0) {
+ if (RenderBlocks.getInstance().partialRenderBounds) {
+ return INSTANCE.renderStandardBlockWithAmbientOcclusionPartial(
+ aWorld,
+ aRenderer,
+ aTextures,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ RED,
+ GREEN,
+ BLUE);
+ } else {
+ return INSTANCE.renderStandardBlockWithAmbientOcclusion(
+ aWorld,
+ aRenderer,
+ aTextures,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ RED,
+ GREEN,
+ BLUE);
+ }
+ } else {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[0], true);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[1], true);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[2], true);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[3], true);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[4], true);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[5], true);
+ }
+ return true;
+ }
+
+ public static void renderFaceYNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[0], true);
+ }
+
+ public static void renderFaceYPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[1], true);
+ }
+
+ public static void renderFaceZNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[2], true);
+ }
+
+ public static void renderFaceZPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[3], true);
+ }
+
+ public static void renderFaceXNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[4], true);
+ }
+
+ public static void renderFaceXPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[5], true);
+ }
+
+ public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ));
+ }
+ aRenderer.flipTexture = (!aFullBlock);
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ));
+ }
+ aRenderer.flipTexture = (!aFullBlock);
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ @Override
+ public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) {
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.DOWN),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.UP),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.NORTH),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.SOUTH),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.WEST),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.EAST),
+ true);
+ Tessellator.instance.draw();
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID,
+ RenderBlocks aRenderer) {
+ blockAccess = aWorld;
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int aModel) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return this.mRenderID;
+ }
+
+ public void setRenderBounds(double p_147782_1_, double p_147782_3_, double p_147782_5_, double p_147782_7_,
+ double p_147782_9_, double p_147782_11_) {
+ if (!this.lockBlockBounds) {
+ this.renderMinX = p_147782_1_;
+ this.renderMaxX = p_147782_7_;
+ this.renderMinY = p_147782_3_;
+ this.renderMaxY = p_147782_9_;
+ this.renderMinZ = p_147782_5_;
+ this.renderMaxZ = p_147782_11_;
+ this.partialRenderBounds = this.minecraftRB.gameSettings.ambientOcclusion >= 2
+ && (this.renderMinX > 0.0D || this.renderMaxX < 1.0D
+ || this.renderMinY > 0.0D
+ || this.renderMaxY < 1.0D
+ || this.renderMinZ > 0.0D
+ || this.renderMaxZ < 1.0D);
+ }
+ }
+
+ /**
+ * Like setRenderBounds, but automatically pulling the bounds from the given Block.
+ */
+ public void setRenderBoundsFromBlock(Block block) {
+ if (!this.lockBlockBounds) {
+ this.renderMinX = block.getBlockBoundsMinX();
+ this.renderMaxX = block.getBlockBoundsMaxX();
+ this.renderMinY = block.getBlockBoundsMinY();
+ this.renderMaxY = block.getBlockBoundsMaxY();
+ this.renderMinZ = block.getBlockBoundsMinZ();
+ this.renderMaxZ = block.getBlockBoundsMaxZ();
+ this.partialRenderBounds = this.minecraftRB.gameSettings.ambientOcclusion >= 2
+ && (this.renderMinX > 0.0D || this.renderMaxX < 1.0D
+ || this.renderMinY > 0.0D
+ || this.renderMaxY < 1.0D
+ || this.renderMinZ > 0.0D
+ || this.renderMaxZ < 1.0D);
+ }
+ }
+
+ /**
+ * Vanilla Variables
+ */
+
+ /** The minimum X value for rendering (default 0.0). */
+ public double renderMinX;
+ /** The maximum X value for rendering (default 1.0). */
+ public double renderMaxX;
+ /** The minimum Y value for rendering (default 0.0). */
+ public double renderMinY;
+ /** The maximum Y value for rendering (default 1.0). */
+ public double renderMaxY;
+ /** The minimum Z value for rendering (default 0.0). */
+ public double renderMinZ;
+ /** The maximum Z value for rendering (default 1.0). */
+ public double renderMaxZ;
+
+ public boolean lockBlockBounds;
+ public boolean partialRenderBounds;
+ public final Minecraft minecraftRB = RenderBlocks.getInstance().minecraftRB;
+ public int uvRotateEast;
+ public int uvRotateWest;
+ public int uvRotateSouth;
+ public int uvRotateNorth;
+ public int uvRotateTop;
+ public int uvRotateBottom;
+ /** Whether ambient occlusion is enabled or not */
+ public boolean enableAO;
+ /** Used as a scratch variable for ambient occlusion on the north/bottom/east corner. */
+ public float aoLightValueScratchXYZNNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the north face. */
+ public float aoLightValueScratchXYNN;
+ /** Used as a scratch variable for ambient occlusion on the north/bottom/west corner. */
+ public float aoLightValueScratchXYZNNP;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the east face. */
+ public float aoLightValueScratchYZNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the west face. */
+ public float aoLightValueScratchYZNP;
+ /** Used as a scratch variable for ambient occlusion on the south/bottom/east corner. */
+ public float aoLightValueScratchXYZPNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the south face. */
+ public float aoLightValueScratchXYPN;
+ /** Used as a scratch variable for ambient occlusion on the south/bottom/west corner. */
+ public float aoLightValueScratchXYZPNP;
+ /** Used as a scratch variable for ambient occlusion on the north/top/east corner. */
+ public float aoLightValueScratchXYZNPN;
+ /** Used as a scratch variable for ambient occlusion between the top face and the north face. */
+ public float aoLightValueScratchXYNP;
+ /** Used as a scratch variable for ambient occlusion on the north/top/west corner. */
+ public float aoLightValueScratchXYZNPP;
+ /** Used as a scratch variable for ambient occlusion between the top face and the east face. */
+ public float aoLightValueScratchYZPN;
+ /** Used as a scratch variable for ambient occlusion on the south/top/east corner. */
+ public float aoLightValueScratchXYZPPN;
+ /** Used as a scratch variable for ambient occlusion between the top face and the south face. */
+ public float aoLightValueScratchXYPP;
+ /** Used as a scratch variable for ambient occlusion between the top face and the west face. */
+ public float aoLightValueScratchYZPP;
+ /** Used as a scratch variable for ambient occlusion on the south/top/west corner. */
+ public float aoLightValueScratchXYZPPP;
+ /** Used as a scratch variable for ambient occlusion between the north face and the east face. */
+ public float aoLightValueScratchXZNN;
+ /** Used as a scratch variable for ambient occlusion between the south face and the east face. */
+ public float aoLightValueScratchXZPN;
+ /** Used as a scratch variable for ambient occlusion between the north face and the west face. */
+ public float aoLightValueScratchXZNP;
+ /** Used as a scratch variable for ambient occlusion between the south face and the west face. */
+ public float aoLightValueScratchXZPP;
+ /** Ambient occlusion brightness XYZNNN */
+ public int aoBrightnessXYZNNN;
+ /** Ambient occlusion brightness XYNN */
+ public int aoBrightnessXYNN;
+ /** Ambient occlusion brightness XYZNNP */
+ public int aoBrightnessXYZNNP;
+ /** Ambient occlusion brightness YZNN */
+ public int aoBrightnessYZNN;
+ /** Ambient occlusion brightness YZNP */
+ public int aoBrightnessYZNP;
+ /** Ambient occlusion brightness XYZPNN */
+ public int aoBrightnessXYZPNN;
+ /** Ambient occlusion brightness XYPN */
+ public int aoBrightnessXYPN;
+ /** Ambient occlusion brightness XYZPNP */
+ public int aoBrightnessXYZPNP;
+ /** Ambient occlusion brightness XYZNPN */
+ public int aoBrightnessXYZNPN;
+ /** Ambient occlusion brightness XYNP */
+ public int aoBrightnessXYNP;
+ /** Ambient occlusion brightness XYZNPP */
+ public int aoBrightnessXYZNPP;
+ /** Ambient occlusion brightness YZPN */
+ public int aoBrightnessYZPN;
+ /** Ambient occlusion brightness XYZPPN */
+ public int aoBrightnessXYZPPN;
+ /** Ambient occlusion brightness XYPP */
+ public int aoBrightnessXYPP;
+ /** Ambient occlusion brightness YZPP */
+ public int aoBrightnessYZPP;
+ /** Ambient occlusion brightness XYZPPP */
+ public int aoBrightnessXYZPPP;
+ /** Ambient occlusion brightness XZNN */
+ public int aoBrightnessXZNN;
+ /** Ambient occlusion brightness XZPN */
+ public int aoBrightnessXZPN;
+ /** Ambient occlusion brightness XZNP */
+ public int aoBrightnessXZNP;
+ /** Ambient occlusion brightness XZPP */
+ public int aoBrightnessXZPP;
+ /** Brightness top left */
+ public int brightnessTopLeft;
+ /** Brightness bottom left */
+ public int brightnessBottomLeft;
+ /** Brightness bottom right */
+ public int brightnessBottomRight;
+ /** Brightness top right */
+ public int brightnessTopRight;
+ /** Red color value for the top left corner */
+ public float colorRedTopLeft;
+ /** Red color value for the bottom left corner */
+ public float colorRedBottomLeft;
+ /** Red color value for the bottom right corner */
+ public float colorRedBottomRight;
+ /** Red color value for the top right corner */
+ public float colorRedTopRight;
+ /** Green color value for the top left corner */
+ public float colorGreenTopLeft;
+ /** Green color value for the bottom left corner */
+ public float colorGreenBottomLeft;
+ /** Green color value for the bottom right corner */
+ public float colorGreenBottomRight;
+ /** Green color value for the top right corner */
+ public float colorGreenTopRight;
+ /** Blue color value for the top left corner */
+ public float colorBlueTopLeft;
+ /** Blue color value for the bottom left corner */
+ public float colorBlueBottomLeft;
+ /** Blue color value for the bottom right corner */
+ public float colorBlueBottomRight;
+ /** Blue color value for the top right corner */
+ public float colorBlueTopRight;
+ /** If set to >=0, all block faces will be rendered using this texture index */
+ public IIcon overrideBlockTexture;
+
+ /**
+ * Clear override block texture
+ */
+ public void clearOverrideBlockTexture() {
+ this.overrideBlockTexture = null;
+ }
+
+ public boolean hasOverrideBlockTexture() {
+ return this.overrideBlockTexture != null;
+ }
+
+ public IIcon getBlockIcon(Block block, IBlockAccess access, int x, int y, int z, int side) {
+ return this.getIconSafe(block.getIcon(access, x, y, z, side));
+ }
+
+ public IIcon getBlockIconFromSideAndMetadata(Block block, int side, int meta) {
+ return this.getIconSafe(block.getIcon(side, meta));
+ }
+
+ public IIcon getBlockIconFromSide(Block block, int side) {
+ return this.getIconSafe(block.getBlockTextureFromSide(side));
+ }
+
+ public IIcon getBlockIcon(Block block) {
+ return this.getIconSafe(block.getBlockTextureFromSide(1));
+ }
+
+ public IIcon getIconSafe(IIcon iicon) {
+ if (iicon == null) {
+ iicon = ((TextureMap) Minecraft.getMinecraft()
+ .getTextureManager()
+ .getTexture(TextureMap.locationBlocksTexture)).getAtlasSprite("missingno");
+ }
+
+ return (IIcon) iicon;
+ }
+
+ IBlockAccess blockAccess = RenderBlocks.getInstance().blockAccess;
+
+ public boolean renderStandardBlockWithAmbientOcclusion(IBlockAccess aWorld, RenderBlocks aRenderer,
+ ITexture[][] aTextures, Block block, int xPos, int yPos, int zPos, float R, float G, float B) {
+ this.enableAO = true;
+ boolean flag = false;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+ boolean flag1 = true;
+ int l = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos);
+ Tessellator tessellator = Tessellator.instance;
+ tessellator.setBrightness(983055);
+
+ if (this.getBlockIcon(block)
+ .getIconName()
+ .equals("grass_top")) {
+ flag1 = false;
+ } else if (this.hasOverrideBlockTexture()) {
+ flag1 = false;
+ }
+
+ boolean flag2;
+ boolean flag3;
+ boolean flag4;
+ boolean flag5;
+ int i1;
+ float f7;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos - 1, zPos, 0)) {
+ if (this.renderMinY <= 0.0D) {
+ --yPos;
+ }
+
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMinY <= 0.0D) {
+ ++yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinY <= 0.0D || !blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXYNN + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXYPN)
+ / 4.0F;
+ f5 = (f7 + this.aoLightValueScratchYZNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNN)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNN + f7 + this.aoLightValueScratchYZNN)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXYNN, this.aoBrightnessYZNP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXYPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYPN, this.aoBrightnessXYZPNN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.5F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.5F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos + 1, zPos, 1)) {
+ if (this.renderMaxY >= 1.0D) {
+ ++yPos;
+ }
+
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMaxY >= 1.0D) {
+ --yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxY >= 1.0D || !blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYZNPP + this.aoLightValueScratchXYNP + this.aoLightValueScratchYZPP + f7)
+ / 4.0F;
+ f3 = (this.aoLightValueScratchYZPP + f7 + this.aoLightValueScratchXYZPPP + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNPP, this.aoBrightnessXYNP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXYZPPP, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXYPP, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNP, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B;
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ IIcon iicon;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos - 1, 2)) {
+ if (this.renderMinZ <= 0.0D) {
+ --zPos;
+ }
+
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMinZ <= 0.0D) {
+ ++zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinZ <= 0.0D || !blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXZNN + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXZPN + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchYZNN + f7 + this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXZPN)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXZNN + this.aoLightValueScratchYZNN + f7)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYZPNN, this.aoBrightnessXZPN, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXZNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 2);
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos + 1, 3)) {
+ if (this.renderMaxZ >= 1.0D) {
+ ++zPos;
+ }
+
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMaxZ >= 1.0D) {
+ --zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxZ >= 1.0D || !blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXZNP + this.aoLightValueScratchXYZNPP + f7 + this.aoLightValueScratchYZPP)
+ / 4.0F;
+ f6 = (f7 + this.aoLightValueScratchYZPP + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXZNP + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYZNPP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXZPP, this.aoBrightnessXYZPPP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, this.aoBrightnessYZNP, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 3);
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos - 1, yPos, zPos, 4)) {
+ if (this.renderMinX <= 0.0D) {
+ --xPos;
+ }
+
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMinX <= 0.0D) {
+ ++xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinX <= 0.0D || !blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNP + f7 + this.aoLightValueScratchXZNP)
+ / 4.0F;
+ f3 = (f7 + this.aoLightValueScratchXZNP + this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXZNN + f7 + this.aoLightValueScratchXYZNPN + this.aoLightValueScratchXYNP)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXYNN + this.aoLightValueScratchXZNN + f7)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYNP, this.aoBrightnessXYZNPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessXYNP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXYNN, this.aoBrightnessXZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 4);
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos + 1, yPos, zPos, 5)) {
+ if (this.renderMaxX >= 1.0D) {
+ ++xPos;
+ }
+
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMaxX >= 1.0D) {
+ --xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxX >= 1.0D || !blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNP + f7 + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXZPN + f7)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXZPN + f7 + this.aoLightValueScratchXYZPPN + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f6 = (f7 + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYPN, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPP, this.aoBrightnessXYPP, this.aoBrightnessXYZPPP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZPNN, this.aoBrightnessXYPN, this.aoBrightnessXZPN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 5);
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ this.enableAO = false;
+ return flag;
+ }
+
+ /**
+ * Renders non-full-cube block with ambient occusion. Args: block, x, y, z, red, green, blue (lighting)
+ */
+ public boolean renderStandardBlockWithAmbientOcclusionPartial(IBlockAccess aWorld, RenderBlocks aRenderer,
+ ITexture[][] aTextures, Block block, int xPos, int yPos, int zPos, float R, float G, float B) {
+ this.enableAO = true;
+ boolean flag = false;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+ boolean flag1 = true;
+ int l = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos);
+ Tessellator tessellator = Tessellator.instance;
+ tessellator.setBrightness(983055);
+
+ if (this.getBlockIcon(block)
+ .getIconName()
+ .equals("grass_top")) {
+ flag1 = false;
+ } else if (this.hasOverrideBlockTexture()) {
+ flag1 = false;
+ }
+
+ boolean flag2;
+ boolean flag3;
+ boolean flag4;
+ boolean flag5;
+ int i1;
+ float f7;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos - 1, zPos, 0)) {
+ if (this.renderMinY <= 0.0D) {
+ --yPos;
+ }
+
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMinY <= 0.0D) {
+ ++yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinY <= 0.0D || !blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXYNN + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXYPN)
+ / 4.0F;
+ f5 = (f7 + this.aoLightValueScratchYZNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNN)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNN + f7 + this.aoLightValueScratchYZNN)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXYNN, this.aoBrightnessYZNP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXYPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYPN, this.aoBrightnessXYZPNN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.5F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.5F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos + 1, zPos, 1)) {
+ if (this.renderMaxY >= 1.0D) {
+ ++yPos;
+ }
+
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMaxY >= 1.0D) {
+ --yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxY >= 1.0D || !blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYZNPP + this.aoLightValueScratchXYNP + this.aoLightValueScratchYZPP + f7)
+ / 4.0F;
+ f3 = (this.aoLightValueScratchYZPP + f7 + this.aoLightValueScratchXYZPPP + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNPP, this.aoBrightnessXYNP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXYZPPP, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXYPP, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNP, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B;
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ float f8;
+ float f9;
+ float f10;
+ float f11;
+ int j1;
+ int k1;
+ int l1;
+ int i2;
+ IIcon iicon;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos - 1, 2)) {
+ if (this.renderMinZ <= 0.0D) {
+ --zPos;
+ }
+
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMinZ <= 0.0D) {
+ ++zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinZ <= 0.0D || !blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXZNN + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXZPN + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchYZNN + f7 + this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXZPN)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXZNN + this.aoLightValueScratchYZNN + f7)
+ / 4.0F;
+ f3 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMaxY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ f4 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMaxY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ f5 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMinY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ f6 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMinY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYZPNN, this.aoBrightnessXZPN, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXZNN, this.aoBrightnessYZNN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMaxY * (1.0D - this.renderMinX),
+ this.renderMaxY * this.renderMinX,
+ (1.0D - this.renderMaxY) * this.renderMinX,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMaxY * (1.0D - this.renderMaxX),
+ this.renderMaxY * this.renderMaxX,
+ (1.0D - this.renderMaxY) * this.renderMaxX,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMinY * (1.0D - this.renderMaxX),
+ this.renderMinY * this.renderMaxX,
+ (1.0D - this.renderMinY) * this.renderMaxX,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMinY * (1.0D - this.renderMinX),
+ this.renderMinY * this.renderMinX,
+ (1.0D - this.renderMinY) * this.renderMinX,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 2);
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos + 1, 3)) {
+ if (this.renderMaxZ >= 1.0D) {
+ ++zPos;
+ }
+
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMaxZ >= 1.0D) {
+ --zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxZ >= 1.0D || !blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXZNP + this.aoLightValueScratchXYZNPP + f7 + this.aoLightValueScratchYZPP)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchYZPP + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXZNP + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f3 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMaxY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ f4 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMinY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+ f5 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMinY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ f6 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMaxY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYZNPP, this.aoBrightnessYZPP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXZPP, this.aoBrightnessXYZPPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, this.aoBrightnessYZNP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMaxY * (1.0D - this.renderMinX),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinX),
+ (1.0D - this.renderMaxY) * this.renderMinX,
+ this.renderMaxY * this.renderMinX);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMinY * (1.0D - this.renderMinX),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinX),
+ (1.0D - this.renderMinY) * this.renderMinX,
+ this.renderMinY * this.renderMinX);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMinY * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMinY) * this.renderMaxX,
+ this.renderMinY * this.renderMaxX);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMaxY * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMaxY) * this.renderMaxX,
+ this.renderMaxY * this.renderMaxX);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 3);
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos - 1, yPos, zPos, 4)) {
+ if (this.renderMinX <= 0.0D) {
+ --xPos;
+ }
+
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMinX <= 0.0D) {
+ ++xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinX <= 0.0D || !blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNP + f7 + this.aoLightValueScratchXZNP)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchXZNP + this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPP)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchXZNN + f7 + this.aoLightValueScratchXYZNPN + this.aoLightValueScratchXYNP)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXYNN + this.aoLightValueScratchXZNN + f7)
+ / 4.0F;
+ f3 = (float) ((double) f9 * this.renderMaxY * this.renderMaxZ
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMaxZ)
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ)
+ + (double) f8 * (1.0D - this.renderMaxY) * this.renderMaxZ);
+ f4 = (float) ((double) f9 * this.renderMaxY * this.renderMinZ
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMinZ)
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ)
+ + (double) f8 * (1.0D - this.renderMaxY) * this.renderMinZ);
+ f5 = (float) ((double) f9 * this.renderMinY * this.renderMinZ
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMinZ)
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinZ)
+ + (double) f8 * (1.0D - this.renderMinY) * this.renderMinZ);
+ f6 = (float) ((double) f9 * this.renderMinY * this.renderMaxZ
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMaxZ)
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ)
+ + (double) f8 * (1.0D - this.renderMinY) * this.renderMaxZ);
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYNP, this.aoBrightnessXYZNPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessXYNP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXYNN, this.aoBrightnessXZNN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMaxY * this.renderMaxZ,
+ this.renderMaxY * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMaxY) * this.renderMaxZ);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMaxY * this.renderMinZ,
+ this.renderMaxY * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMaxY) * this.renderMinZ);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMinY * this.renderMinZ,
+ this.renderMinY * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMinY) * this.renderMinZ);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMinY * this.renderMaxZ,
+ this.renderMinY * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMinY) * this.renderMaxZ);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 4);
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos + 1, yPos, zPos, 5)) {
+ if (this.renderMaxX >= 1.0D) {
+ ++xPos;
+ }
+
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMaxX >= 1.0D) {
+ --xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxX >= 1.0D || !blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNP + f7 + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f9 = (this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXZPN + f7)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchXZPN + f7 + this.aoLightValueScratchXYZPPN + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f11 = (f7 + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f3 = (float) ((double) f8 * (1.0D - this.renderMinY) * this.renderMaxZ
+ + (double) f9 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ)
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMaxZ)
+ + (double) f11 * this.renderMinY * this.renderMaxZ);
+ f4 = (float) ((double) f8 * (1.0D - this.renderMinY) * this.renderMinZ
+ + (double) f9 * (1.0D - this.renderMinY) * (1.0D - this.renderMinZ)
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMinZ)
+ + (double) f11 * this.renderMinY * this.renderMinZ);
+ f5 = (float) ((double) f8 * (1.0D - this.renderMaxY) * this.renderMinZ
+ + (double) f9 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ)
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMinZ)
+ + (double) f11 * this.renderMaxY * this.renderMinZ);
+ f6 = (float) ((double) f8 * (1.0D - this.renderMaxY) * this.renderMaxZ
+ + (double) f9 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ)
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMaxZ)
+ + (double) f11 * this.renderMaxY * this.renderMaxZ);
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYPN, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPP, this.aoBrightnessXYPP, this.aoBrightnessXYZPPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, this.aoBrightnessXYPP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZPNN, this.aoBrightnessXYPN, this.aoBrightnessXZPN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMinY) * this.renderMaxZ,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ),
+ this.renderMinY * (1.0D - this.renderMaxZ),
+ this.renderMinY * this.renderMaxZ);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMinY) * this.renderMinZ,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinZ),
+ this.renderMinY * (1.0D - this.renderMinZ),
+ this.renderMinY * this.renderMinZ);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMaxY) * this.renderMinZ,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ),
+ this.renderMaxY * (1.0D - this.renderMinZ),
+ this.renderMaxY * this.renderMinZ);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMaxY) * this.renderMaxZ,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ),
+ this.renderMaxY * (1.0D - this.renderMaxZ),
+ this.renderMaxY * this.renderMaxZ);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 5);
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ this.enableAO = false;
+ return flag;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java b/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java
new file mode 100644
index 0000000000..c691bac144
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.client.model.ModelDecayChest;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+@SideOnly(Side.CLIENT)
+public class RenderDecayChest extends TileEntitySpecialRenderer {
+
+ private static final ResourceLocation mChestTexture = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/blocks/TileEntities/DecayablesChest_full.png");
+ private ModelDecayChest mChestModel = new ModelDecayChest();
+
+ public static RenderDecayChest INSTANCE;
+ public final int mRenderID;
+
+ public RenderDecayChest() {
+ INSTANCE = this;
+ this.mRenderID = RenderingRegistry.getNextAvailableRenderId();
+ Logger.INFO("Registered Lead Lined Chest Renderer.");
+ }
+
+ public void renderTileEntityAt(TileEntityDecayablesChest p_147500_1_, double p_147500_2_, double p_147500_4_,
+ double p_147500_6_, float p_147500_8_) {
+
+ int i = 0;
+
+ if (true) {
+ this.bindTexture(mChestTexture);
+ GL11.glPushMatrix();
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glTranslatef((float) p_147500_2_, (float) p_147500_4_ + 1.0F, (float) p_147500_6_ + 1.0F);
+ GL11.glScalef(1.0F, -1.0F, -1.0F);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ short short1 = 0;
+
+ if (i == 2) {
+ short1 = 180;
+ }
+
+ if (i == 3) {
+ short1 = 0;
+ }
+
+ if (i == 4) {
+ short1 = 90;
+ }
+
+ if (i == 5) {
+ short1 = -90;
+ }
+
+ GL11.glRotatef((float) short1, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ float f1 = p_147500_1_.prevLidAngle + (p_147500_1_.lidAngle - p_147500_1_.prevLidAngle) * p_147500_8_;
+
+ f1 = 1.0F - f1;
+ f1 = 1.0F - f1 * f1 * f1;
+ mChestModel.chestLid.rotateAngleX = -(f1 * CORE.PI / 2.0F);
+ mChestModel.renderAll();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity p_147500_1_, double p_147500_2_, double p_147500_4_, double p_147500_6_,
+ float p_147500_8_) {
+ this.renderTileEntityAt(
+ (TileEntityDecayablesChest) p_147500_1_,
+ p_147500_2_,
+ p_147500_4_,
+ p_147500_6_,
+ p_147500_8_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java b/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java
new file mode 100644
index 0000000000..259352367d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.entity.RenderTNTPrimed;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+
+@SideOnly(Side.CLIENT)
+public class RenderMiningExplosivesPrimed extends RenderTNTPrimed {
+
+ private final RenderBlocks blockRenderer = new RenderBlocks();
+
+ public RenderMiningExplosivesPrimed() {
+ this.shadowSize = 0.5F;
+ Logger.WARNING("Rendering Mining Explosion. 1");
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(final EntityPrimedMiningExplosive entity, final double p_76986_2_, final double p_76986_4_,
+ final double p_76986_6_, final float p_76986_8_, final float p_76986_9_) {
+ Logger.WARNING("Rendering Mining Explosion. 2");
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_);
+ float f2;
+
+ if (((entity.fuse - p_76986_9_) + 1.0F) < 10.0F) {
+ f2 = 1.0F - (((entity.fuse - p_76986_9_) + 1.0F) / 10.0F);
+
+ if (f2 < 0.0F) {
+ f2 = 0.0F;
+ }
+
+ if (f2 > 1.0F) {
+ f2 = 1.0F;
+ }
+
+ f2 *= f2;
+ f2 *= f2;
+ final float f3 = 1.0F + (f2 * 0.3F);
+ GL11.glScalef(f3, f3, f3);
+ }
+
+ f2 = (1.0F - (((entity.fuse - p_76986_9_) + 1.0F) / 100.0F)) * 0.8F;
+ this.bindEntityTexture(entity);
+ this.blockRenderer.renderBlockAsItem(ModBlocks.blockMiningExplosive, 0, entity.getBrightness(p_76986_9_));
+
+ if (((entity.fuse / 5) % 2) == 0) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, f2);
+ this.blockRenderer.renderBlockAsItem(ModBlocks.blockMiningExplosive, 0, 1.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(final EntityPrimedMiningExplosive p_110775_1_) {
+ return TextureMap.locationBlocksTexture;
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(final Entity p_110775_1_) {
+ Logger.WARNING("Rendering Mining Explosion. 4");
+ return this.getEntityTexture((EntityPrimedMiningExplosive) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(final Entity p_76986_1_, final double p_76986_2_, final double p_76986_4_,
+ final double p_76986_6_, final float p_76986_8_, final float p_76986_9_) {
+ Logger.WARNING("Rendering Mining Explosion. 3");
+ this.doRender(
+ (EntityPrimedMiningExplosive) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java b/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java
new file mode 100644
index 0000000000..c1d3927416
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.entity.RenderLiving;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.util.ResourceLocation;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.client.model.ModelSickBlaze;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+
+@SideOnly(Side.CLIENT)
+public class RenderSickBlaze extends RenderLiving {
+
+ private static final ResourceLocation blazeTextures = new ResourceLocation(
+ GTPlusPlus.ID + ":" + "textures/entity/sickBlaze.png");
+ private int field_77068_a;
+
+ public RenderSickBlaze() {
+ super(new ModelSickBlaze(), 0.5F);
+ this.field_77068_a = ((ModelSickBlaze) this.mainModel).func_78104_a();
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntitySickBlaze p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ int i = ((ModelSickBlaze) this.mainModel).func_78104_a();
+
+ if (i != this.field_77068_a) {
+ this.field_77068_a = i;
+ this.mainModel = new ModelSickBlaze();
+ }
+
+ super.doRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntitySickBlaze p_110775_1_) {
+ return blazeTextures;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
+ return this.getEntityTexture((EntitySickBlaze) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java b/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java
new file mode 100644
index 0000000000..f2ebe84d4d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java
@@ -0,0 +1,163 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.client.renderer.entity.RenderLiving;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.client.model.ModelStaballoyConstruct;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+
+@SideOnly(Side.CLIENT)
+public class RenderStaballoyConstruct extends RenderLiving {
+
+ private static final ResourceLocation staballoyGolemTextures = new ResourceLocation(
+ GTPlusPlus.ID + ":" + "textures/entity/golemStaballoy.png");
+ /** Staballoy Golem's Model. */
+ private final ModelStaballoyConstruct staballoyGolemModel;
+
+ public RenderStaballoyConstruct() {
+ super(new ModelStaballoyConstruct(), 0.8F);
+ this.staballoyGolemModel = (ModelStaballoyConstruct) this.mainModel;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntityStaballoyConstruct p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ super.doRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntityStaballoyConstruct p_110775_1_) {
+ return staballoyGolemTextures;
+ }
+
+ protected void rotateCorpse(EntityStaballoyConstruct p_77043_1_, float p_77043_2_, float p_77043_3_,
+ float p_77043_4_) {
+ super.rotateCorpse(p_77043_1_, p_77043_2_, p_77043_3_, p_77043_4_);
+
+ if (p_77043_1_.limbSwingAmount >= 0.01D) {
+ float f3 = 13.0F;
+ float f4 = p_77043_1_.limbSwing - p_77043_1_.limbSwingAmount * (1.0F - p_77043_4_) + 6.0F;
+ float f5 = (Math.abs(f4 % f3 - f3 * 0.5F) - f3 * 0.25F) / (f3 * 0.25F);
+ GL11.glRotatef(6.5F * f5, 0.0F, 0.0F, 1.0F);
+ }
+ }
+
+ protected void renderEquippedItems(EntityStaballoyConstruct p_77029_1_, float p_77029_2_) {
+ super.renderEquippedItems(p_77029_1_, p_77029_2_);
+
+ if (p_77029_1_.getHoldRoseTick() != 0) {
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPushMatrix();
+ GL11.glRotatef(
+ 5.0F + 180.0F * this.staballoyGolemModel.ironGolemRightArm.rotateAngleX / (float) Math.PI,
+ 1.0F,
+ 0.0F,
+ 0.0F);
+ GL11.glTranslatef(-0.6875F, 1.25F, -0.9375F);
+ GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
+ float f1 = 0.8F;
+ GL11.glScalef(f1, -f1, f1);
+ int i = p_77029_1_.getBrightnessForRender(p_77029_2_);
+ int j = i % 65536;
+ int k = i / 65536;
+ OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, j / 1.0F, k / 1.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.bindTexture(TextureMap.locationBlocksTexture);
+ this.field_147909_c.renderBlockAsItem(Blocks.red_flower, 0, 1.0F);
+ GL11.glPopMatrix();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ }
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+
+ @Override
+ protected void renderEquippedItems(EntityLivingBase p_77029_1_, float p_77029_2_) {
+ this.renderEquippedItems((EntityStaballoyConstruct) p_77029_1_, p_77029_2_);
+ }
+
+ @Override
+ protected void rotateCorpse(EntityLivingBase p_77043_1_, float p_77043_2_, float p_77043_3_, float p_77043_4_) {
+ this.rotateCorpse((EntityStaballoyConstruct) p_77043_1_, p_77043_2_, p_77043_3_, p_77043_4_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
+ return this.getEntityTexture((EntityStaballoyConstruct) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java b/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java
new file mode 100644
index 0000000000..2c0ed7f562
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java
@@ -0,0 +1,89 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.Render;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Items;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.projectile.EntityToxinball;
+
+@SideOnly(Side.CLIENT)
+public class RenderToxinball extends Render {
+
+ private float mSize;
+
+ public RenderToxinball(float scale) {
+ this.mSize = scale;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntityToxinball entity, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ GL11.glPushMatrix();
+ this.bindEntityTexture(entity);
+ GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ float f2 = this.mSize;
+ GL11.glScalef(f2 / 1.0F, f2 / 1.0F, f2 / 1.0F);
+ IIcon iicon = Items.slime_ball.getIconFromDamage(0);
+ Tessellator tessellator = Tessellator.instance;
+ float f3 = iicon.getMinU();
+ float f4 = iicon.getMaxU();
+ float f5 = iicon.getMinV();
+ float f6 = iicon.getMaxV();
+ float f7 = 1.0F;
+ float f8 = 0.5F;
+ float f9 = 0.25F;
+ GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ tessellator.addVertexWithUV(0.0F - f8, 0.0F - f9, 0.0D, f3, f6);
+ tessellator.addVertexWithUV(f7 - f8, 0.0F - f9, 0.0D, f4, f6);
+ tessellator.addVertexWithUV(f7 - f8, 1.0F - f9, 0.0D, f4, f5);
+ tessellator.addVertexWithUV(0.0F - f8, 1.0F - f9, 0.0D, f3, f5);
+ tessellator.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntityToxinball entity) {
+ return TextureMap.locationItemsTexture;
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity entity) {
+ return this.getEntityTexture((EntityToxinball) entity);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity entity, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender((EntityToxinball) entity, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java b/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java
new file mode 100644
index 0000000000..58b135f3fb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.core.client.renderer.particle;
+
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.particle.EntityFX;
+import net.minecraft.world.World;
+
+import cofh.lib.util.helpers.MathHelper;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class EntityDropParticleFX extends EntityFX {
+
+ private int bobTimer;
+
+ public EntityDropParticleFX(World world, double x, double y, double z, float particleRed, float particleGreen,
+ float particleBlue) {
+
+ this(world, x, y, z, particleRed, particleGreen, particleBlue, -1);
+ }
+
+ public EntityDropParticleFX(World world, double x, double y, double z, float particleRed, float particleGreen,
+ float particleBlue, int gravityMod) {
+
+ super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+
+ this.particleRed = particleRed;
+ this.particleGreen = particleGreen;
+ this.particleBlue = particleBlue;
+
+ this.setParticleTextureIndex(113);
+ this.setSize(0.01F, 0.01F);
+ this.particleGravity = -0.06F * gravityMod;
+ this.bobTimer = 40;
+ this.particleMaxAge = (int) (48.0D / (Math.random() * 0.8D + 0.2D));
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ }
+
+ @Override
+ public void onUpdate() {
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+
+ this.motionY -= this.particleGravity;
+
+ if (this.bobTimer-- > 0) {
+ this.motionX *= 0.02D;
+ this.motionY *= 0.02D;
+ this.motionZ *= 0.02D;
+ this.setParticleTextureIndex(113);
+ } else {
+ this.setParticleTextureIndex(112);
+ }
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.9800000190734863D;
+ this.motionY *= 0.9800000190734863D;
+ this.motionZ *= 0.9800000190734863D;
+
+ if (this.particleMaxAge-- <= 0) {
+ this.setDead();
+ }
+ if (this.onGround) {
+ this.setParticleTextureIndex(114);
+ this.motionX *= 0.699999988079071D;
+ this.motionZ *= 0.699999988079071D;
+ }
+ if (this.particleGravity > 0) {
+ Material material = this.worldObj
+ .getBlock(MathHelper.floor(this.posX), MathHelper.floor(this.posY), MathHelper.floor(this.posZ))
+ .getMaterial();
+
+ if (material.isLiquid() || material.isSolid()) {
+ double d0 = MathHelper.floor(this.posY) + 1
+ - BlockLiquid.getLiquidHeightPercent(
+ this.worldObj.getBlockMetadata(
+ MathHelper.floor(this.posX),
+ MathHelper.floor(this.posY),
+ MathHelper.floor(this.posZ)));
+ if (this.posY < d0) {
+ this.setDead();
+ }
+ }
+ } else {
+ Material material = this.worldObj
+ .getBlock(MathHelper.ceil(this.posX), MathHelper.ceil(this.posY), MathHelper.ceil(this.posZ))
+ .getMaterial();
+
+ if (material.isLiquid() || material.isSolid()) {
+ double d0 = MathHelper.ceil(this.posY) + 1
+ - BlockLiquid.getLiquidHeightPercent(
+ this.worldObj.getBlockMetadata(
+ MathHelper.ceil(this.posX),
+ MathHelper.ceil(this.posY),
+ MathHelper.ceil(this.posZ)));
+ if (this.posY > d0) {
+ this.setDead();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java b/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java
new file mode 100644
index 0000000000..1794951248
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java
@@ -0,0 +1,279 @@
+package gtPlusPlus.core.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+
+public class CommandEnableDebugWhileRunning implements ICommand {
+
+ private final List<String> aliases;
+
+ public CommandEnableDebugWhileRunning() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("gtplusplus");
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ if (o instanceof Comparable<?>) {
+ @SuppressWarnings("unchecked")
+ Comparable<ICommand> a = (Comparable<ICommand>) o;
+ if (a.equals(this)) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "gtpp";
+ }
+
+ // Use '/gtpp' along with 'logging' or 'debug' to toggle Debug mode and Logging.
+ // Using nothing after the command toggles both to their opposite states respectively.
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/gtpp ?";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ int aMaxArgumentsAllowed = 2;
+
+ if ((argString == null || argString.length == 0 || argString.length > aMaxArgumentsAllowed)
+ || argString[0].toLowerCase()
+ .equals("?")) {
+ Logger.INFO("Listing commands and their uses.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ AsmConfig.disableAllLogging = !AsmConfig.disableAllLogging;
+ PlayerUtils.messagePlayer(P, "The following are valid args for the '/gtpp' command:");
+ PlayerUtils.messagePlayer(P, "? - This help command.");
+ PlayerUtils.messagePlayer(P, "logging - Toggles ALL GT++ logging for current session.");
+ PlayerUtils.messagePlayer(P, "hand - Lists information about held item.");
+ PlayerUtils.messagePlayer(P, "fuid xxx - Tries to find the fluid in the FluidRegistry.");
+ PlayerUtils.messagePlayer(
+ P,
+ "debug - Toggles GT++ Debug Mode. Only use when advised, may break everything. (OP)");
+ } else if (argString[0].toLowerCase()
+ .equals("debug")) {
+ Logger.INFO("Toggling Debug Mode.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (PlayerUtils.isPlayerOP(P)) {
+ CORE_Preloader.DEBUG_MODE = !CORE_Preloader.DEBUG_MODE;
+ PlayerUtils.messagePlayer(P, "Toggled GT++ Debug Mode - Enabled: " + CORE_Preloader.DEBUG_MODE);
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("logging")) {
+ Logger.INFO("Toggling Logging.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ AsmConfig.disableAllLogging = !AsmConfig.disableAllLogging;
+ PlayerUtils.messagePlayer(P, "Toggled GT++ Logging - Enabled: " + (!AsmConfig.disableAllLogging));
+ }
+ /*
+ * else if (argString[0].toLowerCase().equals("test")) { ItemStack mSemiFluidgen =
+ * ItemUtils.simpleMetaStack("IC2:blockGenerator", 7, 1); final EntityPlayer P = CommandUtils.getPlayer(S);
+ * if(mSemiFluidgen != null) { PlayerUtils.messagePlayer(P, ItemUtils.getItemName(mSemiFluidgen)); } }
+ */
+
+ else if (argString[0].toLowerCase()
+ .equals("inv")) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P != null && !P.worldObj.isRemote) {
+ ItemStack[] aInv = P.inventory.mainInventory;
+ for (ItemStack aItem : aInv) {
+ if (aItem != null) {
+ String aModID = GameRegistry.findUniqueIdentifierFor(aItem.getItem()).modId;
+ String aRegistryName = GameRegistry.findUniqueIdentifierFor(aItem.getItem()).name;
+ Logger.INFO(
+ aModID + ":"
+ + aRegistryName
+ + ":"
+ + aItem.getItemDamage()
+ + " | "
+ + aItem.getDisplayName());
+ }
+ }
+ PlayerUtils.messagePlayer(P, "Dumped Inventory.");
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("hand")) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P != null) {
+ ItemStack aHeldItem = PlayerUtils.getItemStackInPlayersHand(P);
+ if (aHeldItem != null) {
+ String aItemDisplayName = ItemUtils.getItemName(aHeldItem);
+ String aItemUnlocalName = ItemUtils.getUnlocalizedItemName(aHeldItem);
+ String aNbtString = tryIterateNBTData(aHeldItem);
+ AutoMap<String> aOreDictNames = new AutoMap<>();
+
+ int[] aOreIDs = OreDictionary.getOreIDs(aHeldItem);
+ for (int id : aOreIDs) {
+ String aOreNameFromID = OreDictionary.getOreName(id);
+ if (aOreNameFromID != null && aOreNameFromID.length() > 0
+ && !aOreNameFromID.equals("Unknown")) {
+ aOreDictNames.add(aOreNameFromID);
+ }
+ }
+
+ String aOreDictData = "";
+ if (!aOreDictNames.isEmpty()) {
+ for (String tag : aOreDictNames) {
+ aOreDictData += (tag + ", ");
+ }
+ if (aOreDictData.endsWith(", ")) {
+ aOreDictData = aOreDictData.substring(0, aOreDictData.length() - 2);
+ }
+ }
+
+ AutoMap<String> aFluidContainerData = new AutoMap<>();
+ FluidStack aHeldItemFluid = FluidContainerRegistry.getFluidForFilledItem(aHeldItem);
+ if (aHeldItemFluid != null) {
+ aFluidContainerData
+ .put("FluidStack Unlocal Name: " + aHeldItemFluid.getUnlocalizedName());
+ aFluidContainerData.put("FluidStack Local Name: " + aHeldItemFluid.getLocalizedName());
+ aFluidContainerData.put(
+ "Fluid Unlocal Name: " + aHeldItemFluid.getFluid()
+ .getUnlocalizedName());
+ aFluidContainerData.put("Fluid Local Name: " + aHeldItemFluid.getLocalizedName());
+ aFluidContainerData.put(
+ "Fluid Name: " + aHeldItemFluid.getFluid()
+ .getName());
+ }
+
+ PlayerUtils.messagePlayer(P, "[" + aItemUnlocalName + "]" + "[" + aItemDisplayName + "] ");
+ if (aFluidContainerData.size() > 0) {
+ for (String s : aFluidContainerData) {
+ PlayerUtils.messagePlayer(P, "" + s);
+ }
+ }
+ if (!aOreDictNames.isEmpty()) {
+ PlayerUtils.messagePlayer(P, "" + aOreDictData);
+ }
+ if (aNbtString.length() > 0) {
+ PlayerUtils.messagePlayer(P, "" + aNbtString);
+ }
+ } else {
+ PlayerUtils.messagePlayer(P, "No item held.");
+ }
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("fluid")) {
+ if (argString.length > 1 && argString[1] != null && argString[1].length() > 0) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ FluidStack aFluid = FluidUtils.getWildcardFluidStack(argString[1], 1);
+ if (P != null && aFluid != null) {
+ PlayerUtils
+ .messagePlayer(P, "Found fluid stack: " + FluidRegistry.getFluidName(aFluid));
+ } else if (P != null && aFluid == null) {
+ PlayerUtils.messagePlayer(P, "Could not find any fluids.");
+ }
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("item")) {
+ if (argString.length > 1 && argString[1] != null && argString[1].length() > 0) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ ItemStack aTest = ItemUtils.getItemStackFromFQRN(argString[1], 1);
+ if (P != null && aTest != null) {
+ PlayerUtils.messagePlayer(P, "Found fluid stack: " + ItemUtils.getItemName(aTest));
+ } else if (P != null && aTest == null) {
+ PlayerUtils.messagePlayer(P, "Could not find valid item.");
+ }
+ }
+ } else {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ PlayerUtils.messagePlayer(P, "Invalid command, use '?' as an argument for help.'");
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ if (var1 == null || CommandUtils.getPlayer(var1) == null) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ ArrayList<String> aTabCompletes = new ArrayList<>();
+ aTabCompletes.add("?");
+ aTabCompletes.add("logging");
+ aTabCompletes.add("debug");
+ aTabCompletes.add("hand");
+ aTabCompletes.add("fluid");
+ return aTabCompletes;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean playerUsesCommand(final World W, final EntityPlayer P, final int cost) {
+ return true;
+ }
+
+ public static String tryIterateNBTData(ItemStack aStack) {
+ try {
+ AutoMap<String> aItemDataTags = new AutoMap<>();
+ NBTTagCompound aNBT = NBTUtils.getNBT(aStack);
+ if (aNBT != null) {
+ if (!aNBT.hasNoTags()) {
+ Map<?, ?> mInternalMap = ReflectionUtils.getField(aNBT, "tagMap");
+ if (mInternalMap != null) {
+ for (Map.Entry<?, ?> e : mInternalMap.entrySet()) {
+ aItemDataTags.add(
+ e.getKey()
+ .toString() + ":"
+ + e.getValue());
+ }
+ int a = 0;
+ String data = "";
+ for (String tag : aItemDataTags) {
+ data += (tag + ", ");
+ }
+ if (data.endsWith(", ")) {
+ data = data.substring(0, data.length() - 2);
+ }
+ return data;
+ } else {
+ Logger.INFO("Data map reflected from NBTTagCompound was not valid.");
+ return "Bad NBT";
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ return "";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/commands/CommandMath.java b/src/main/java/gtPlusPlus/core/commands/CommandMath.java
new file mode 100644
index 0000000000..6065044c29
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/commands/CommandMath.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.MiningUtils;
+
+public class CommandMath implements ICommand {
+
+ private final List<String> aliases;
+
+ protected String fullEntityName;
+ protected Entity conjuredEntity;
+
+ public CommandMath() {
+ this.aliases = new ArrayList<>();
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ return 0;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "alkalus";
+ }
+
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/alkalus [Dev Command]";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ Logger.INFO("Debug Command");
+ final World W = S.getEntityWorld();
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P.getDisplayName()
+ .equalsIgnoreCase("draknyte1")) {
+ Logger.INFO("[Bedrock Miner] OreType Scan");
+ MiningUtils.iterateAllOreTypes();
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ final EntityPlayer P = CommandUtils.getPlayer(var1);
+ if (P == null) {
+ return false;
+ }
+ if (P.getDisplayName()
+ .toLowerCase()
+ .equals("draknyte1")
+ || P.getCommandSenderName()
+ .toLowerCase()
+ .equals("draknyte1")
+ || CORE.DEVENV) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean playerUsesCommand(final World W, final EntityPlayer P, final int cost) {
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/commands/CommandUtils.java b/src/main/java/gtPlusPlus/core/commands/CommandUtils.java
new file mode 100644
index 0000000000..931ac5239f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/commands/CommandUtils.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.commands;
+
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class CommandUtils {
+
+ public static EntityPlayer getPlayer(final ICommandSender icommandsender) {
+ EntityPlayer player;
+
+ if (icommandsender instanceof EntityPlayer) {
+ player = (EntityPlayer) icommandsender;
+ return player;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/CommonProxy.java b/src/main/java/gtPlusPlus/core/common/CommonProxy.java
new file mode 100644
index 0000000000..d52b3aa112
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/CommonProxy.java
@@ -0,0 +1,210 @@
+package gtPlusPlus.core.common;
+
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.client.IItemRenderer;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.entity.InternalEntityRegistry;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.handler.BurnableFuelHandler;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.handler.COMPAT_IntermodStaging;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.handler.events.EnderDragonDeathHandler;
+import gtPlusPlus.core.handler.events.EntityDeathHandler;
+import gtPlusPlus.core.handler.events.GeneralTooltipEventHandler;
+import gtPlusPlus.core.handler.events.PlayerSleepEventHandler;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.tileentities.ModTileEntities;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.util.SpecialBehaviourTooltipHandler;
+import gtPlusPlus.xmod.gregtech.recipes.GregtechRecipeAdder;
+import gtPlusPlus.xmod.ic2.CustomInternalName;
+
+public class CommonProxy {
+
+ public CommonProxy() {
+ // Should Register Gregtech Materials I've Made
+ Utils.registerEvent(this);
+ }
+
+ public void preInit(final FMLPreInitializationEvent e) {
+ Logger.INFO("Doing some house cleaning.");
+ CORE.RA = new GregtechRecipeAdder();
+ Logger.INFO("Created Gregtech recipe handler.");
+ if (!CORE_Preloader.DEBUG_MODE) {
+ Logger.WARNING("Development mode not enabled.");
+ } else if (CORE_Preloader.DEBUG_MODE) {
+ Logger.INFO("Development mode enabled.");
+ } else {
+ Logger.WARNING("Development mode not set.");
+ }
+
+ AddToCreativeTab.initialiseTabs();
+ CustomInternalName.init();
+
+ ModItems.init();
+ ModBlocks.init();
+ CI.preInit();
+ COMPAT_IntermodStaging.preInit(e);
+ BookHandler.run();
+ // Registration of entities and renderers
+ Logger.INFO("[Proxy] Calling Entity registration.");
+ registerEntities();
+ Logger.INFO("[Proxy] Calling Tile Entity registration.");
+ registerTileEntities();
+
+ Logger.INFO("[Proxy] Calling Render registration.");
+ registerRenderThings();
+ }
+
+ public void init(final FMLInitializationEvent e) {
+ CI.init();
+
+ Utils.registerEvent(new GeneralTooltipEventHandler());
+ // Handles Tooltips for items giving custom multiblock behaviour
+ Utils.registerEvent(new SpecialBehaviourTooltipHandler());
+ // Handles Sleep Benefits
+ PlayerSleepEventHandler.init();
+ // Handles Magic Feather
+ Utils.registerEvent(ModItems.itemMagicFeather);
+
+ Utils.registerEvent(new EnderDragonDeathHandler());
+ Utils.registerEvent(new EntityDeathHandler());
+
+ // Compat Handling
+ COMPAT_HANDLER.registerMyModsOreDictEntries();
+ COMPAT_HANDLER.intermodOreDictionarySupport();
+ COMPAT_IntermodStaging.init(e);
+ }
+
+ public void postInit(final FMLPostInitializationEvent e) {
+
+ // Make Burnables burnable
+ if (!CORE.burnables.isEmpty()) {
+ BurnableFuelHandler fuelHandler = new BurnableFuelHandler();
+ GameRegistry.registerFuelHandler(fuelHandler);
+ Logger.INFO(
+ "[Fuel Handler] Registering " + fuelHandler.getClass()
+ .getName());
+ }
+
+ // Compat Handling
+ Logger.INFO("Removing recipes from other mods.");
+ COMPAT_HANDLER.RemoveRecipesFromOtherMods();
+ Logger.INFO("Initialising Handler, Then Adding Recipes");
+ COMPAT_HANDLER.InitialiseHandlerThenAddRecipes();
+ Logger.INFO("Loading Intermod staging.");
+ COMPAT_IntermodStaging.postInit(e);
+ Logger.INFO("Loading queued recipes.");
+ COMPAT_HANDLER.runQueuedRecipes();
+ Logger.INFO("Registering custom mob drops.");
+ registerCustomMobDrops();
+
+ // Moved last, to prevent recipes being generated post initialisation.
+ Logger.INFO("Loading Gregtech API recipes.");
+ COMPAT_HANDLER.startLoadingGregAPIBasedRecipes();
+ }
+
+ public void serverStarting(final FMLServerStartingEvent e) {
+ COMPAT_HANDLER.InitialiseLateHandlerThenAddRecipes();
+ }
+
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ COMPAT_IntermodStaging.onLoadComplete(event);
+ COMPAT_HANDLER.onLoadComplete(event);
+ }
+
+ public void registerNetworkStuff() {
+ GuiHandler.init();
+ }
+
+ public void registerEntities() {
+ InternalEntityRegistry.registerEntities();
+ }
+
+ public void registerTileEntities() {
+ ModTileEntities.init();
+ }
+
+ public void registerRenderThings() {}
+
+ public int addArmor(final String armor) {
+ return 0;
+ }
+
+ public void registerCustomMobDrops() {
+
+ // Blazes
+ if (ItemUtils.doesOreDictHaveEntryFor("dustPyrotheum")) {
+ EntityUtils.registerDropsForMob(
+ EntityBlaze.class,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPyrotheum", 1),
+ 1,
+ 10);
+ EntityUtils.registerDropsForMob(
+ EntityBlaze.class,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPyrotheum", 1),
+ 1,
+ 10);
+ }
+
+ // GalaxySpace Support
+ if (ReflectionUtils.doesClassExist("galaxyspace.core.entity.mob.EntityEvolvedColdBlaze")) {
+ Class<?> aColdBlaze = ReflectionUtils.getClass("galaxyspace.core.entity.mob.EntityEvolvedColdBlaze");
+ ItemStack aSmallBlizz, aTinyBlizz, aSmallCryo, aTinyCryo;
+ aSmallBlizz = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallBlizz", 1);
+ aTinyBlizz = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBlizz", 1);
+ aSmallCryo = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallCryotheum", 1);
+ aTinyCryo = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCryotheum", 1);
+ EntityUtils
+ .registerDropsForMob(aColdBlaze, ItemUtils.getItemStackOfAmountFromOreDict("stickBlizz", 1), 2, 500);
+ if (aSmallBlizz != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aSmallBlizz, 2, 750);
+ }
+ if (aTinyBlizz != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aTinyBlizz, 4, 1500);
+ }
+ if (aSmallCryo != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aSmallCryo, 1, 50);
+ }
+ if (aTinyCryo != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aTinyCryo, 2, 100);
+ }
+ }
+ }
+
+ protected final AutoMap<Pair<Item, IItemRenderer>> mItemRenderMappings = new AutoMap<>();
+
+ public World getClientWorld() {
+ return null;
+ }
+
+ /**
+ * Returns a side-appropriate EntityPlayer for use during message handling
+ */
+ public EntityPlayer getPlayerEntity(MessageContext ctx) {
+ return ctx.getServerHandler().playerEntity;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java
new file mode 100644
index 0000000000..e90596c876
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.Tier.HV;
+import static gregtech.client.GT_TooltipHandler.Tier.IV;
+import static gregtech.client.GT_TooltipHandler.Tier.LV;
+import static gregtech.client.GT_TooltipHandler.Tier.LuV;
+import static gregtech.client.GT_TooltipHandler.Tier.MV;
+import static gregtech.client.GT_TooltipHandler.Tier.UHV;
+import static gregtech.client.GT_TooltipHandler.Tier.UV;
+import static gregtech.client.GT_TooltipHandler.Tier.ZPM;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.bauble.BatteryPackBaseBauble;
+import gtPlusPlus.core.item.bauble.FireProtectionBauble;
+import gtPlusPlus.core.item.general.ItemCloakingDevice;
+import gtPlusPlus.core.item.general.ItemHealingDevice;
+
+public class COMPAT_Baubles {
+
+ public static void run() {
+ if (Baubles.isModLoaded()) {
+ baublesLoaded();
+ }
+ }
+
+ public static void baublesLoaded() {
+ Logger.INFO("Baubles Found - Loading Wearables.");
+ ModItems.itemPersonalCloakingDevice = new ItemCloakingDevice(0);
+ ModItems.itemPersonalHealingDevice = new ItemHealingDevice();
+ ModItems.itemSupremePizzaGloves = new FireProtectionBauble();
+
+ ModItems.itemChargePack_Low_1 = new BatteryPackBaseBauble(1);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_1, 1, OreDictionary.WILDCARD_VALUE), LV);
+ ModItems.itemChargePack_Low_2 = new BatteryPackBaseBauble(2);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_2, 1, OreDictionary.WILDCARD_VALUE), MV);
+ ModItems.itemChargePack_Low_3 = new BatteryPackBaseBauble(3);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_3, 1, OreDictionary.WILDCARD_VALUE), HV);
+ ModItems.itemChargePack_Low_4 = new BatteryPackBaseBauble(4);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_4, 1, OreDictionary.WILDCARD_VALUE), EV);
+ ModItems.itemChargePack_Low_5 = new BatteryPackBaseBauble(5);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_5, 1, OreDictionary.WILDCARD_VALUE), IV);
+ ModItems.itemChargePack_High_1 = new BatteryPackBaseBauble(6);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_1, 1, OreDictionary.WILDCARD_VALUE), LuV);
+ ModItems.itemChargePack_High_2 = new BatteryPackBaseBauble(7);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_2, 1, OreDictionary.WILDCARD_VALUE), ZPM);
+ ModItems.itemChargePack_High_3 = new BatteryPackBaseBauble(8);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_3, 1, OreDictionary.WILDCARD_VALUE), UV);
+ ModItems.itemChargePack_High_4 = new BatteryPackBaseBauble(9);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_4, 1, OreDictionary.WILDCARD_VALUE), UHV);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java
new file mode 100644
index 0000000000..f61c70ab5b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.common.compat;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.recipe.RECIPES_Tools;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_ExtraUtils {
+
+ public static void OreDict() {
+ RECIPES_Tools.RECIPE_DivisionSigil = new ItemStack(ItemUtils.getItemFromFQRN("ExtraUtilities:divisionSigil"));
+ run();
+ }
+
+ private static void run() {
+ ItemUtils.getItemForOreDict("ExtraUtilities:bedrockiumIngot", "ingotBedrockium", "Bedrockium Ingot", 0);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java
new file mode 100644
index 0000000000..9a9557e418
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.common.compat;
+
+import gtPlusPlus.xmod.pamsharvest.fishtrap.FishTrapHandler;
+
+public class COMPAT_HarvestCraft {
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+ FishTrapHandler.pamsHarvestCraftCompat();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java
new file mode 100644
index 0000000000..c442251a0e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.common.compat;
+
+import static gtPlusPlus.core.handler.COMPAT_HANDLER.RemoveRecipeQueue;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_IC2 {
+
+ private static ItemStack itemCropnalyzer = ItemUtils.simpleMetaStack("IC2:itemCropnalyzer", 0, 1);
+ private static ItemStack itemSolarHelmet = ItemUtils.simpleMetaStack("IC2:itemSolarHelmet", 0, 1);
+
+ public static ShapedRecipeObject Cropnalyzer = new ShapedRecipeObject(
+ "ore:cableGt02Copper",
+ "ore:cableGt02Copper",
+ null,
+ "minecraft:redstone",
+ "ore:blockGlass",
+ "minecraft:redstone",
+ "minecraft:redstone",
+ "ore:circuitBasic",
+ "minecraft:redstone",
+ itemCropnalyzer);
+ public static ShapedRecipeObject SolarHelmet = new ShapedRecipeObject(
+ "ore:plateIron",
+ "ore:plateIron",
+ "ore:plateIron",
+ "ore:plateIron",
+ "gregtech:gt.metaitem.01:32750",
+ "ore:plateIron",
+ "ore:craftingWireCopper",
+ "ore:craftingWireCopper",
+ "ore:craftingWireCopper",
+ itemSolarHelmet);
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+
+ if (ConfigSwitches.disableIC2Recipes) {
+
+ // Remove these.
+ RemoveRecipeQueue.add("IC2:itemCable");
+ RemoveRecipeQueue.add("IC2:itemCable:1");
+ RemoveRecipeQueue.add("IC2:itemCable:2");
+ RemoveRecipeQueue.add("IC2:itemCable:3");
+ RemoveRecipeQueue.add("IC2:itemCable:5");
+ RemoveRecipeQueue.add("IC2:itemCable:6");
+ RemoveRecipeQueue.add("IC2:itemCable:10");
+ RemoveRecipeQueue.add("IC2:itemCable:13");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java
new file mode 100644
index 0000000000..d9c9fec08e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.ForbiddenMagic;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_Thaumcraft {
+
+ public static void OreDict() {
+
+ if (ConfigSwitches.enableThaumcraftShardUnification) {
+ run();
+ }
+ }
+
+ private static void run() {
+
+ for (int i = 0; i <= 6; i++) {
+ ItemUtils.getItemForOreDict("Thaumcraft:ItemShard", "shardAny", "TC Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("Thaumcraft:ItemShard:" + i, 1));
+ ItemUtils.getItemForOreDict("Thaumcraft:ItemShard", "gemInfusedAnything", "TC Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("gemInfusedAnything", ItemUtils.getItemStackFromFQRN("Thaumcraft:ItemShard:" + i, 1));
+ }
+
+ if (ForbiddenMagic.isModLoaded()) {
+ for (int i = 0; i <= 6; i++) {
+ ItemUtils.getItemForOreDict("ForbiddenMagic:NetherShard", "shardAny", "FM Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:NetherShard:" + i, 1));
+ ItemUtils.getItemForOreDict("ForbiddenMagic:NetherShard", "gemInfusedAnything", "FM Shard " + i, i);
+ GT_OreDictUnificator.registerOre(
+ "gemInfusedAnything",
+ ItemUtils.getItemStackFromFQRN("ForbiddenMagic:NetherShard:" + i, 1));
+ }
+ ItemUtils.getItemForOreDict("ForbiddenMagic:GluttonyShard", "shardAny", "FM Gluttony Shard", 0);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:GluttonyShard", 1));
+ ItemUtils.getItemForOreDict("ForbiddenMagic:GluttonyShard", "gemInfusedAnything", "FM Gluttony Shard", 0);
+ GT_OreDictUnificator
+ .registerOre("gemInfusedAnything", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:GluttonyShard", 1));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java
new file mode 100644
index 0000000000..f6fdd87eec
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.Witchery;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_Witchery {
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+ // Koboldite
+ ItemStack aKobolditeDust = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Dust", 148, 1);
+ ItemStack aKobolditeNugget = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Nugget", 149, 1);
+ ItemStack aKobolditeIngot = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Ingot", 150, 1);
+ if (aKobolditeDust != null) GT_OreDictUnificator.registerOre("dust" + "Koboldite", aKobolditeDust);
+ if (aKobolditeNugget != null) GT_OreDictUnificator.registerOre("nugget" + "Koboldite", aKobolditeNugget);
+ if (aKobolditeIngot != null) GT_OreDictUnificator.registerOre("ingot" + "Koboldite", aKobolditeIngot);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/config/ConfigHandler.java b/src/main/java/gtPlusPlus/core/config/ConfigHandler.java
new file mode 100644
index 0000000000..162d5b0f12
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/config/ConfigHandler.java
@@ -0,0 +1,670 @@
+package gtPlusPlus.core.config;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.MACHINE_INFO;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondGeothermalGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.boilerSteamPerSecond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.disableIC2Recipes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.dumpItemAndBlockData;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableAnimatedTextures;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustomCapes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustom_Cables;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustom_Pipes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Dehydrators;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_FluidTanks;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_GeothermalEngines;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Pollution;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_RocketEngines;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_SimpleWasher;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_SteamConverter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Tesseracts;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_Cyclotron;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialFishingPort;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialSifter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_LargeAutoCrafter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_MatterFabricator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_MultiTank;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_NuclearFuelRefinery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_NuclearSaltProcessingPlant;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_PowerSubstation;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_ThermalBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableThaumcraftShardUnification;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableWatchdogBGM;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.hideUniversalCells;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiABS;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDT;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDistillery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvEBF;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvImplosion;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAlgaePond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiCyclotron;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiFrothFlotationCell;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialAlloySmelter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialArcFurnace;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialChisel;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCokeOven;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCuttingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialDehydrator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialElectrolyzer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialExtruder;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialFishingPond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialForgeHammer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMacerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMixer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeBending;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeForming;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialRockBreaker;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialSifter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialVacuumFreezer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeWasher;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWireMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIsaMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiLargeSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiMassFabricator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiPackager;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiRefinery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiThermalBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiTreeFarm;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierGeothermalGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.showHiddenNEIItems;
+import static gtPlusPlus.core.lib.CORE.EVERGLADESBIOME_ID;
+import static gtPlusPlus.core.lib.CORE.EVERGLADES_ID;
+import static gtPlusPlus.core.lib.CORE.turbineCutoffBase;
+
+import java.io.File;
+
+import net.minecraftforge.common.config.Configuration;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class ConfigHandler {
+
+ public static void handleConfigFile(final FMLPreInitializationEvent event) {
+ final Configuration config = new Configuration(
+ new File(event.getModConfigurationDirectory(), "GTplusplus/GTplusplus.cfg"));
+ config.load();
+
+ // Debug
+ /*
+ * DEBUG = config.getBoolean("debugMode", "debug", false,
+ * "Enables all sorts of debug logging. (Don't use unless told to, breaks other things.)");
+ */
+ MACHINE_INFO = config.getBoolean(
+ "enableMachineInfoLogging",
+ "debug",
+ false,
+ "Makes many machines display lots of debug logging.");
+ showHiddenNEIItems = config
+ .getBoolean("showHiddenNEIItems", "debug", false, "Makes all items hidden from NEI display.");
+ dumpItemAndBlockData = config.getBoolean(
+ "dumpItemAndBlockData",
+ "debug",
+ false,
+ "Dumps all GT++ and Toxic Everglade Data to en_US.lang in the config folder. This config option can be used by foreign players to generate blank .lang files, which they can populate with their language of choice.");
+
+ // Machines
+ enableThaumcraftShardUnification = config.getBoolean(
+ "enableThaumcraftShardUnification",
+ "machines",
+ false,
+ "Allows the use of TC shards across many recipes by oreDicting them into a common group.");
+ disableIC2Recipes = config.getBoolean(
+ "disableIC2Recipes",
+ "machines",
+ false,
+ "Alkaluscraft Related - Removes IC2 Cables Except glass fibre. Few other Misc Tweaks.");
+ boilerSteamPerSecond = config.getInt(
+ "boilerSteamPerSecond",
+ "machines",
+ 750,
+ 0,
+ 10000,
+ "Sets the steam per second value in LV,MV,HV boilers (respectively 1x,2x,3x this number for the tiers)");
+
+ // GT-Fixes
+ turbineCutoffBase = config.getInt(
+ "turbineCutoffBase",
+ GregTech.ID,
+ 75000,
+ 0,
+ Integer.MAX_VALUE,
+ "Rotors below this durability will be removed, prevents NEI clutter. Minimum Durability is N * x, where N is the new value set and x is the turbine size, where 1 is Tiny and 4 is Huge. Set to 0 to disable.");
+
+ // Pipes & Cables
+ enableCustom_Pipes = config.getBoolean("enableCustom_Pipes", GregTech.ID, true, "Adds Custom GT Fluid Pipes.");
+ enableCustom_Cables = config.getBoolean("enableCustom_Cables", GregTech.ID, true, "Adds Custom GT Cables.");
+
+ enableMachine_Dehydrators = config
+ .getBoolean("enableMachineDehydrators", GregTech.ID, true, "These dehydrate stuff.");
+ enableMachine_SteamConverter = config
+ .getBoolean("enableMachineSteamConverter", GregTech.ID, true, "Converts IC2 steam -> Railcraft steam.");
+ enableMachine_FluidTanks = config
+ .getBoolean("enableMachineFluidTanks", GregTech.ID, true, "Portable fluid tanks.");
+ enableMachine_RocketEngines = config.getBoolean(
+ "enableMachineRocketEngines",
+ GregTech.ID,
+ true,
+ "Diesel egines with different internals, they consume less fuel overall.");
+ enableMachine_GeothermalEngines = config.getBoolean(
+ "enableMachineGeothermalEngines",
+ GregTech.ID,
+ true,
+ "These may be overpowered, Consult a local geologist.");
+ enableMachine_Tesseracts = config
+ .getBoolean("enableMachineTesseracts", GregTech.ID, true, "Tesseracts for wireless item/fluid movement.");
+ enableMachine_SimpleWasher = config.getBoolean(
+ "enableMachineSimpleWasher",
+ GregTech.ID,
+ true,
+ "Very basic automated cauldron for dust washing.");
+ enableMachine_Pollution = config
+ .getBoolean("enableMachinePollution", GregTech.ID, true, "Pollution Detector & Scrubbers.");
+
+ // Multi machines
+ enableMultiblock_AlloyBlastSmelter = config.getBoolean(
+ "enableMultiblockAlloyBlastSmelter",
+ GregTech.ID,
+ true,
+ "Required to smelt most high tier materials from GT++. Also smelts everything else to molten metal.");
+ enableMultiblock_IndustrialCentrifuge = config
+ .getBoolean("enableMultiblockIndustrialCentrifuge", GregTech.ID, true, "Spin, Spin, Spiiiin.");
+ enableMultiblock_IndustrialCokeOven = config.getBoolean(
+ "enableMultiblockIndustrialCokeOven",
+ GregTech.ID,
+ true,
+ "Pyro Oven Alternative, older, more realistic, better.");
+ enableMultiblock_IndustrialElectrolyzer = config.getBoolean(
+ "enableMultiblockIndustrialElectrolyzer",
+ GregTech.ID,
+ true,
+ "Electrolyzes things with extra bling factor.");
+ enableMultiblock_IndustrialMacerationStack = config.getBoolean(
+ "enableMultiblockIndustrialMacerationStack",
+ GregTech.ID,
+ true,
+ "A hyper efficient maceration tower, nets more bonus outputs.");
+ enableMultiblock_IndustrialPlatePress = config.getBoolean(
+ "enableMultiblockIndustrialPlatePress",
+ GregTech.ID,
+ true,
+ "Industrial bendering machine thingo.");
+ enableMultiblock_IndustrialWireMill = config.getBoolean(
+ "enableMultiblockIndustrialWireMill",
+ GregTech.ID,
+ true,
+ "Produces fine wire and exotic cables.");
+ enableMultiblock_MatterFabricator = config
+ .getBoolean("enableMultiblockMatterFabricator", GregTech.ID, true, "?FAB?RIC?ATE MA?TT?ER.");
+ enableMultiblock_MultiTank = config.getBoolean(
+ "enableMultiblockMultiTank",
+ GregTech.ID,
+ true,
+ "Tall tanks, each layer adds extra fluid storage.");
+ enableMultiblock_PowerSubstation = config
+ .getBoolean("enableMultiblockPowerSubstation", GregTech.ID, true, "For managing large power grids.");
+ enableMultiblock_LiquidFluorideThoriumReactor = config.getBoolean(
+ "enableMultiblockLiquidFluorideThoriumReactor",
+ GregTech.ID,
+ true,
+ "For supplying large power grids.");
+ enableMultiblock_NuclearFuelRefinery = config.getBoolean(
+ "enableMultiblock_NuclearFuelRefinery",
+ GregTech.ID,
+ true,
+ "Refines molten chemicals into nuclear fuels.");
+ enableMultiblock_NuclearSaltProcessingPlant = config.getBoolean(
+ "enableMultiblockNuclearSaltProcessingPlant",
+ GregTech.ID,
+ true,
+ "Reprocesses depleted nuclear salts into useful chemicals.");
+ enableMultiblock_IndustrialSifter = config
+ .getBoolean("enableMultiblock_IndustrialSifter", GregTech.ID, true, "Large scale sifting.");
+ enableMultiblock_LargeAutoCrafter = config.getBoolean(
+ "enableMultiblock_LargeAutoCrafter",
+ GregTech.ID,
+ true,
+ "Can Assemble, Disassemble and Craft Project data from Data Sticks.");
+ enableMultiblock_IndustrialThermalCentrifuge = config.getBoolean(
+ "enableMultiblock_IndustrialThermalCentrifuge",
+ GregTech.ID,
+ true,
+ "Your warm spin for the ore thing.");
+ enableMultiblock_IndustrialWashPlant = config.getBoolean(
+ "enableMultiblock_IndustrialWashPlant",
+ GregTech.ID,
+ true,
+ "Used to wash the dirt, riiiiight offff..");
+ enableMultiblock_ThermalBoiler = config.getBoolean(
+ "enableMachineThermalBoiler",
+ GregTech.ID,
+ true,
+ "Thermal Boiler from GT4. Can Filter Lava for resources.");
+ enableMultiblock_IndustrialCuttingMachine = config.getBoolean(
+ "enableMultiblock_IndustrialCuttingMachine",
+ GregTech.ID,
+ true,
+ "Very fast and efficient Cutting Machine.");
+ enableMultiblock_IndustrialFishingPort = config
+ .getBoolean("enableMultiblock_IndustrialFishingPort", GregTech.ID, true, "Fish the seas, except on land.");
+ enableMultiblock_IndustrialExtrudingMachine = config.getBoolean(
+ "enableMultiblock_IndustrialExtrudingMachine",
+ GregTech.ID,
+ true,
+ "Very fast and efficient Extruding Machine.");
+ enableMultiblock_IndustrialMultiMachine = config.getBoolean(
+ "enableMultiblock_IndustrialMultiMachine",
+ GregTech.ID,
+ true,
+ "Can run recipes for 9 different types of machines.");
+ enableMultiblock_Cyclotron = config
+ .getBoolean("enableMultiblock_Cyclotron", GregTech.ID, true, "COMET - Scientific Cyclotron.");
+
+ // Features
+ enableCustomCapes = config.getBoolean("enableSupporterCape", "features", true, "Enables Custom GT++ Cape.");
+
+ enableWatchdogBGM = config.getInt(
+ "enableWatchdogBGM",
+ "features",
+ 0,
+ 0,
+ Short.MAX_VALUE,
+ "Set to a value greater than 0 to reduce the ticks taken to delay between BGM tracks. Acceptable Values are 1-32767, where 0 is disabled. Vanilla Uses 12,000 & 24,000. 200 is 10s.");
+ hideUniversalCells = config
+ .getBoolean("hideUniversalCells", "features", true, "Hides every filled IC2 Universal Cell from NEI.");
+
+ // Biomes
+ EVERGLADES_ID = config.getInt("darkworld_ID", "worldgen", 227, 1, 254, "The ID of the Dark Dimension.");
+ EVERGLADESBIOME_ID = config
+ .getInt("darkbiome_ID", "worldgen", 238, 1, 254, "The biome within the Dark Dimension.");
+
+ // Pollution
+ pollutionPerSecondMultiPackager = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiPackager",
+ pollutionPerSecondMultiPackager,
+ "pollution rate in gibbl/s for the Amazon warehousing depot")
+ .getInt(pollutionPerSecondMultiPackager);
+ pollutionPerSecondMultiIndustrialAlloySmelter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialAlloySmelter",
+ pollutionPerSecondMultiIndustrialAlloySmelter,
+ "pollution rate in gibbl/s for the Alloy blast smelter")
+ .getInt(pollutionPerSecondMultiIndustrialAlloySmelter);
+ pollutionPerSecondMultiIndustrialArcFurnace = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialArcFurnace",
+ pollutionPerSecondMultiIndustrialArcFurnace,
+ "pollution rate in gibbl/s for the High current arc furnace")
+ .getInt(pollutionPerSecondMultiIndustrialArcFurnace);
+ pollutionPerSecondMultiIndustrialCentrifuge = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCentrifuge",
+ pollutionPerSecondMultiIndustrialCentrifuge,
+ "pollution rate in gibbl/s for the Industrial centrifuge")
+ .getInt(pollutionPerSecondMultiIndustrialCentrifuge);
+ pollutionPerSecondMultiIndustrialCokeOven = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCokeOven",
+ pollutionPerSecondMultiIndustrialCokeOven,
+ "pollution rate in gibbl/s for the Industrial coke oven")
+ .getInt(pollutionPerSecondMultiIndustrialCokeOven);
+ pollutionPerSecondMultiIndustrialCuttingMachine = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCuttingMachine",
+ pollutionPerSecondMultiIndustrialCuttingMachine,
+ "pollution rate in gibbl/s for the Cutting factory")
+ .getInt(pollutionPerSecondMultiIndustrialCuttingMachine);
+ pollutionPerSecondMultiIndustrialDehydrator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialDehydrator",
+ pollutionPerSecondMultiIndustrialDehydrator,
+ "pollution rate in gibbl/s for the Utupu-Tanuri")
+ .getInt(pollutionPerSecondMultiIndustrialDehydrator);
+ pollutionPerSecondMultiIndustrialElectrolyzer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialElectrolyzer",
+ pollutionPerSecondMultiIndustrialElectrolyzer,
+ "pollution rate in gibbl/s for the Industrial electrolyzer")
+ .getInt(pollutionPerSecondMultiIndustrialElectrolyzer);
+ pollutionPerSecondMultiIndustrialExtruder = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialExtruder",
+ pollutionPerSecondMultiIndustrialExtruder,
+ "pollution rate in gibbl/s for the Industrial extrusion machine")
+ .getInt(pollutionPerSecondMultiIndustrialExtruder);
+ pollutionPerSecondMultiIndustrialMacerator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMacerator",
+ pollutionPerSecondMultiIndustrialMacerator,
+ "pollution rate in gibbl/s for the Maceration stack")
+ .getInt(pollutionPerSecondMultiIndustrialMacerator);
+ pollutionPerSecondMultiIndustrialMixer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMixer",
+ pollutionPerSecondMultiIndustrialMixer,
+ "pollution rate in gibbl/s for the Industrial mixing machine")
+ .getInt(pollutionPerSecondMultiIndustrialMixer);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal,
+ "pollution rate in gibbl/s for the Large processing factory in metal mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid,
+ "pollution rate in gibbl/s for the Large processing factory in fluid mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc,
+ "pollution rate in gibbl/s for the Large processing factory in misc mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc);
+ pollutionPerSecondMultiIndustrialPlatePress_ModeForming = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialPlatePress_ModeForming",
+ pollutionPerSecondMultiIndustrialPlatePress_ModeForming,
+ "pollution rate in gibbl/s for the Industrial material press in forming mode")
+ .getInt(pollutionPerSecondMultiIndustrialPlatePress_ModeForming);
+ pollutionPerSecondMultiIndustrialPlatePress_ModeBending = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialPlatePress_ModeBending",
+ pollutionPerSecondMultiIndustrialPlatePress_ModeBending,
+ "pollution rate in gibbl/s for the Industrial material press in bending mode")
+ .getInt(pollutionPerSecondMultiIndustrialPlatePress_ModeBending);
+ pollutionPerSecondMultiIndustrialForgeHammer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialForgeHammer",
+ pollutionPerSecondMultiIndustrialForgeHammer,
+ "pollution rate in gibbl/s for the Industrial Forge Hammer")
+ .getInt(pollutionPerSecondMultiIndustrialForgeHammer);
+ pollutionPerSecondMultiIndustrialSifter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialSifter",
+ pollutionPerSecondMultiIndustrialSifter,
+ "pollution rate in gibbl/s for the Large Sifter")
+ .getInt(pollutionPerSecondMultiIndustrialSifter);
+ pollutionPerSecondMultiIndustrialThermalCentrifuge = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialThermalCentrifuge",
+ pollutionPerSecondMultiIndustrialThermalCentrifuge,
+ "pollution rate in gibbl/s for the Large thermal refinery")
+ .getInt(pollutionPerSecondMultiIndustrialThermalCentrifuge);
+ pollutionPerSecondMultiIndustrialVacuumFreezer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialVacuumFreezer",
+ pollutionPerSecondMultiIndustrialVacuumFreezer,
+ "pollution rate in gibbl/s for the Cryogenic freezer")
+ .getInt(pollutionPerSecondMultiIndustrialVacuumFreezer);
+ pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath",
+ pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath,
+ "pollution rate in gibbl/s for the Ore washing plant in chemical bath mode")
+ .getInt(pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath);
+ pollutionPerSecondMultiIndustrialWashPlant_ModeWasher = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWashPlant_ModeWasher",
+ pollutionPerSecondMultiIndustrialWashPlant_ModeWasher,
+ "pollution rate in gibbl/s for the Ore washing plant in ore washer mode")
+ .getInt(pollutionPerSecondMultiIndustrialWashPlant_ModeWasher);
+ pollutionPerSecondMultiIndustrialWireMill = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWireMill",
+ pollutionPerSecondMultiIndustrialWireMill,
+ "pollution rate in gibbl/s for the Wire factory")
+ .getInt(pollutionPerSecondMultiIndustrialWireMill);
+ pollutionPerSecondMultiIsaMill = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIsaMill",
+ pollutionPerSecondMultiIsaMill,
+ "pollution rate in gibbl/s for the IsaMill grinding machine")
+ .getInt(pollutionPerSecondMultiIsaMill);
+ pollutionPerSecondMultiAdvDistillationTower_ModeDistillery = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvDistillationTower_ModeDistillery",
+ pollutionPerSecondMultiAdvDistillationTower_ModeDistillery,
+ "pollution rate in gibbl/s for the Dangote distillus in distillery mode")
+ .getInt(pollutionPerSecondMultiAdvDistillationTower_ModeDistillery);
+ pollutionPerSecondMultiAdvDistillationTower_ModeDT = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvDistillationTower_ModeDT",
+ pollutionPerSecondMultiAdvDistillationTower_ModeDT,
+ "pollution rate in gibbl/s for the Dangote distillus in distillation tower mode")
+ .getInt(pollutionPerSecondMultiAdvDistillationTower_ModeDT);
+ pollutionPerSecondMultiAdvEBF = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvEBF",
+ pollutionPerSecondMultiAdvEBF,
+ "pollution rate in gibbl/s for the Volcanus")
+ .getInt(pollutionPerSecondMultiAdvEBF);
+ pollutionPerSecondMultiAdvImplosion = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvImplosion",
+ pollutionPerSecondMultiAdvImplosion,
+ "pollution rate in gibbl/s for the Density^2")
+ .getInt(pollutionPerSecondMultiAdvImplosion);
+ pollutionPerSecondMultiABS = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiABS",
+ pollutionPerSecondMultiABS,
+ "pollution rate in gibbl/s for the Alloy blast furnace")
+ .getInt(pollutionPerSecondMultiABS);
+ pollutionPerSecondMultiCyclotron = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiCyclotron",
+ pollutionPerSecondMultiCyclotron,
+ "pollution rate in gibbl/s for the Cyclotron")
+ .getInt(pollutionPerSecondMultiCyclotron);
+ pollutionPerSecondMultiIndustrialFishingPond = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialFishingPond",
+ pollutionPerSecondMultiIndustrialFishingPond,
+ "pollution rate in gibbl/s for the Zuhai - fishing port")
+ .getInt(pollutionPerSecondMultiIndustrialFishingPond);
+ // pollutionPerSecondMultiLargeRocketEngine;
+ pollutionPerSecondMultiLargeSemiFluidGenerator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiLargeSemiFluidGenerator",
+ pollutionPerSecondMultiLargeSemiFluidGenerator,
+ "pollution rate in gibbl/s for the Large semifluid burner")
+ .getInt(pollutionPerSecondMultiLargeSemiFluidGenerator);
+ pollutionPerSecondMultiMassFabricator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiMassFabricator",
+ pollutionPerSecondMultiMassFabricator,
+ "pollution rate in gibbl/s for the Matter fabrication CPU")
+ .getInt(pollutionPerSecondMultiMassFabricator);
+ pollutionPerSecondMultiRefinery = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiRefinery",
+ pollutionPerSecondMultiRefinery,
+ "pollution rate in gibbl/s for the Reactor fuel processing plant")
+ .getInt(pollutionPerSecondMultiRefinery);
+ // pollutionPerSecondMultiGeneratorArray;
+ pollutionPerSecondMultiIndustrialRockBreaker = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialRockBreaker",
+ pollutionPerSecondMultiIndustrialRockBreaker,
+ "pollution rate in gibbl/s for the Industrial Rock Breaker")
+ .getInt(pollutionPerSecondMultiIndustrialRockBreaker);
+ pollutionPerSecondMultiIndustrialChisel = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialChisel",
+ pollutionPerSecondMultiIndustrialChisel,
+ "pollution rate in gibbl/s for the Industrial Chisel")
+ .getInt(pollutionPerSecondMultiIndustrialChisel);
+ pollutionPerSecondMultiTreeFarm = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiTreeFarm",
+ pollutionPerSecondMultiTreeFarm,
+ "pollution rate in gibbl/s for the Tree growth simulator")
+ .getInt(pollutionPerSecondMultiTreeFarm);
+ pollutionPerSecondMultiFrothFlotationCell = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiFrothFlotationCell",
+ pollutionPerSecondMultiFrothFlotationCell,
+ "pollution rate in gibbl/s for the Flotation cell regulator")
+ .getInt(pollutionPerSecondMultiFrothFlotationCell);
+ pollutionPerSecondMultiAutoCrafter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAutoCrafter",
+ pollutionPerSecondMultiAutoCrafter,
+ "pollution rate in gibbl/s for the Large-Scale auto assembler v1.01")
+ .getInt(pollutionPerSecondMultiAutoCrafter);
+ pollutionPerSecondMultiMolecularTransformer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiMolecularTransformer",
+ pollutionPerSecondMultiMolecularTransformer,
+ "pollution rate in gibbl/s for the Multiblock Molecular Transformer")
+ .getInt(pollutionPerSecondMultiMolecularTransformer);
+ pollutionPerSecondMultiThermalBoiler = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiThermalBoiler",
+ pollutionPerSecondMultiThermalBoiler,
+ "pollution rate in gibbl/s for the Thermal boiler")
+ .getInt(pollutionPerSecondMultiThermalBoiler);
+ pollutionPerSecondMultiAlgaePond = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAlgaePond",
+ pollutionPerSecondMultiAlgaePond,
+ "pollution rate in gibbl/s for the Algae farm")
+ .getInt(pollutionPerSecondMultiAlgaePond);
+ basePollutionPerSecondSemiFluidGenerator = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondSemiFluidGenerator",
+ basePollutionPerSecondSemiFluidGenerator,
+ "base pollution rate in gibbl/s for the single block semi fluid generators")
+ .getInt(basePollutionPerSecondSemiFluidGenerator);
+ pollutionReleasedByTierSemiFluidGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierSemiFluidGenerator",
+ pollutionReleasedByTierSemiFluidGenerator,
+ "coefficient applied to the base rate of the single block semi fluid generators based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ basePollutionPerSecondBoiler = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondBoiler",
+ basePollutionPerSecondBoiler,
+ "base pollution rate in gibbl/s for the single block boilers")
+ .getInt(basePollutionPerSecondBoiler);
+ pollutionReleasedByTierBoiler = config.get(
+ "pollution",
+ "pollutionReleasedByTierBoiler",
+ pollutionReleasedByTierBoiler,
+ "coefficient applied to the base rate of the single block semi fluid generators based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ baseMinPollutionPerSecondRocketFuelGenerator = config
+ .get(
+ "pollution",
+ "baseMinPollutionPerSecondRocketFuelGenerator",
+ baseMinPollutionPerSecondRocketFuelGenerator,
+ "minimum base pollution rate in gibbl/s for the single block rocket engines")
+ .getInt(baseMinPollutionPerSecondRocketFuelGenerator);
+ baseMaxPollutionPerSecondRocketFuelGenerator = config
+ .get(
+ "pollution",
+ "baseMaxPollutionPerSecondRocketFuelGenerator",
+ baseMaxPollutionPerSecondRocketFuelGenerator,
+ "maximum base pollution rate in gibbl/s for the single block rocket engines")
+ .getInt(baseMaxPollutionPerSecondRocketFuelGenerator);
+ pollutionReleasedByTierRocketFuelGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierRocketFuelGenerator",
+ pollutionReleasedByTierRocketFuelGenerator,
+ "coefficient applied to the base rate of the single block rocket engines based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ basePollutionPerSecondGeothermalGenerator = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondGeothermalGenerator",
+ basePollutionPerSecondGeothermalGenerator,
+ "base pollution rate in gibbl/s for the geothermal engines")
+ .getInt(basePollutionPerSecondGeothermalGenerator);
+ pollutionReleasedByTierGeothermalGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierGeothermalGenerator",
+ pollutionReleasedByTierGeothermalGenerator,
+ "coefficient applied to the base rate of the single block geothermal engines based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+
+ // Visual
+ enableAnimatedTextures = config
+ .getBoolean("enableAnimatedTextures", "visual", true, "Enables Animated GT++ Textures, Requires Restart");
+ config.save();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java b/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java
new file mode 100644
index 0000000000..f1e84f439f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java
@@ -0,0 +1,176 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryCircuitProgrammer;
+import gtPlusPlus.core.slots.SlotIntegratedCircuit;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+
+public class Container_CircuitProgrammer extends Container {
+
+ protected TileEntityCircuitProgrammer tile_entity;
+ public final InventoryCircuitProgrammer inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_OUTPUT = 25;
+
+ public static int StorageSlotNumber = 26; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_CircuitProgrammer(final InventoryPlayer inventory, final TileEntityCircuitProgrammer te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ Logger.INFO("1");
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 8;
+ int yStart = 5;
+
+ try {
+ // 0
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart, yStart));
+ // 1-10
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 18));
+ // 11-20
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 54));
+ // 21-24
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 54));
+ Logger.INFO("2");
+
+ // Add Output
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, SLOT_OUTPUT, xStart + (8 * 18), yStart + 54));
+ o++;
+ Logger.INFO("3");
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ Logger.INFO("4");
+ } catch (Throwable t) {}
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockCircuitProgrammer) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java b/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java
new file mode 100644
index 0000000000..d8bab9395a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.Inventory_DecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+public class Container_DecayablesChest extends Container {
+
+ protected TileEntityDecayablesChest tile_entity;
+ public final Inventory_DecayablesChest inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 15; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ private final int[] slotStorage = new int[15];
+
+ public Container_DecayablesChest(final InventoryPlayer inventory, final TileEntityDecayablesChest te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+ te.openInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+
+ int o = 0;
+
+ // Storage Side
+ for (var6 = 0; var6 < 3; var6++) {
+ for (var7 = 0; var7 < 5; var7++) {
+ this.slotStorage[o] = o;
+ this.addSlotToContainer(new Slot(this.inventoryChest, o++, 44 + (var7 * 18), 15 + (var6 * 18)));
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockDecayablesChest) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java b/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java
new file mode 100644
index 0000000000..881311897f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryFishTrap;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+
+public class Container_FishTrap extends Container {
+
+ protected TileEntityFishTrap tile_entity;
+ public final InventoryFishTrap inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 15; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ private final int[] slotStorage = new int[15];
+
+ public Container_FishTrap(final InventoryPlayer inventory, final TileEntityFishTrap te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ te.openInventory();
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+
+ int o = 0;
+
+ // Storage Side
+ for (var6 = 0; var6 < 3; var6++) {
+ for (var7 = 0; var7 < 5; var7++) {
+ this.slotStorage[o] = o;
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, 44 + (var7 * 18), 15 + (var6 * 18)));
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockFishTrap) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java b/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java
new file mode 100644
index 0000000000..d6afa0d68f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.gui.GT_Slot_Render;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryPestKiller;
+import gtPlusPlus.core.slots.SlotGeneric;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+
+public class Container_PestKiller extends Container {
+
+ public TileEntityPestKiller tile_entity;
+ public final InventoryPestKiller inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 3; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_PestKiller(final InventoryPlayer inventory, final TileEntityPestKiller te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+ te.openInventory();
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ int o = 0;
+
+ int aSlotX = 134;
+
+ this.addSlotToContainer(new SlotGeneric(this.inventoryChest, o++, aSlotX, 10));
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, aSlotX, 60));
+ addSlotToContainer(new GT_Slot_Render(tile_entity, o++, aSlotX, 35));
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ public FluidStack getFluidOfStoredTank() {
+ if (tile_entity != null) {
+ if (tile_entity.getTank() != null) {
+ return tile_entity.getTank()
+ .getFluid();
+ }
+ }
+ return null;
+ }
+
+ public int getFluidStoredAmount() {
+ FluidStack f = getFluidOfStoredTank();
+ return f == null ? 0 : f.amount;
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+ boolean fluid = false;
+ if (aSlotIndex == 2) {
+ fluid = true;
+ }
+ if (!fluid) {
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockPestKiller) {
+ return false;
+ }
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java b/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java
new file mode 100644
index 0000000000..1702be19ab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java
@@ -0,0 +1,196 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.InventoryCraftResult;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectMain;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectOutput;
+import gtPlusPlus.core.slots.SlotCraftingNoCollect;
+import gtPlusPlus.core.slots.SlotDataStick;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class Container_ProjectTable extends Container {
+
+ /** The crafting matrix inventory (3x3). */
+ public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
+
+ public IInventory craftResult = new InventoryCraftResult();
+
+ protected TileEntityProjectTable tile_entity;
+ public final InventoryProjectMain inventoryGrid;
+ public final InventoryProjectOutput inventoryOutputs;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ private final int[] slotOutputs = new int[2];
+ private final int[] slotGrid = new int[9];
+
+ public Container_ProjectTable(final InventoryPlayer inventory, final TileEntityProjectTable tile) {
+ this.tile_entity = tile;
+ this.inventoryGrid = tile.inventoryGrid;
+ this.inventoryOutputs = tile.inventoryOutputs;
+ this.tile_entity.setContainer(this);
+
+ int var6;
+ int var7;
+ this.worldObj = tile.getWorldObj();
+ this.posX = tile.xCoord;
+ this.posY = tile.yCoord;
+ this.posZ = tile.zCoord;
+
+ int nextFreeSlot = 0;
+
+ // Output slots
+ this.addSlotToContainer(new SlotDataStick(this.inventoryOutputs, 0, 26 + (18 * 6), 8));
+ this.addSlotToContainer(new SlotNoInput(this.inventoryOutputs, 1, 26 + (18 * 6), 44));
+
+ this.addSlotToContainer(
+ new SlotCraftingNoCollect(inventory.player, this.craftMatrix, this.craftResult, 0, 26 + (18 * 4), 25));
+
+ int o = 0;
+ // Storage Side
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 3; ++var7) {
+ this.addSlotToContainer(
+ new Slot(this.craftMatrix, nextFreeSlot, 8 + 18 + (var7 * 18), 8 + (var6 * 18)));
+ this.slotGrid[o] = nextFreeSlot;
+ nextFreeSlot++;
+ o++;
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ this.onCraftMatrixChanged(this.craftMatrix);
+ }
+
+ /**
+ * Callback for when the crafting matrix is changed.
+ */
+ @Override
+ public void onCraftMatrixChanged(IInventory p_75130_1_) {
+ this.craftResult.setInventorySlotContents(
+ 0,
+ CraftingManager.getInstance()
+ .findMatchingRecipe(this.craftMatrix, this.worldObj));
+ }
+
+ /**
+ * Called when the container is closed.
+ */
+ @Override
+ public void onContainerClosed(EntityPlayer p_75134_1_) {
+ super.onContainerClosed(p_75134_1_);
+ if (!this.worldObj.isRemote) {
+ for (int i = 0; i < 9; ++i) {
+ ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
+ if (itemstack != null) {
+ p_75134_1_.dropPlayerItemWithRandomChoice(itemstack, false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+
+ if (aSlotIndex == 0) {
+ Logger.INFO("Player Clicked on the Data Stick slot");
+ // TODO
+ }
+ if (aSlotIndex == 1) {
+ Logger.INFO("Player Clicked on the output slot");
+ // TODO
+ }
+
+ for (final int x : this.slotGrid) {
+ if (aSlotIndex == x) {
+ Logger.INFO("Player Clicked slot " + aSlotIndex + " in the crafting Grid");
+ }
+ }
+ }
+ // Utils.LOG_WARNING("Player Clicked slot "+aSlotIndex+" in the Grid");
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockProjectTable) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+
+ return null;
+
+ /*
+ * ItemStack var3 = null; final Slot var4 = (Slot)this.inventorySlots.get(par2); if ((var4 != null) &&
+ * var4.getHasStack()) { final ItemStack var5 = var4.getStack(); var3 = var5.copy(); if (par2 == 0) { if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null; }
+ * var4.onSlotChange(var5, var3); } else if ((par2 >= InOutputSlotNumber) && (par2 < InventoryOutSlotNumber)) {
+ * if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else if
+ * ((par2 >= InventoryOutSlotNumber) && (par2 < FullSlotNumber)) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, FullSlotNumber, false)) { return null; } if (var5.stackSize == 0) {
+ * var4.putStack((ItemStack)null); } else { var4.onSlotChanged(); } if (var5.stackSize == var3.stackSize) {
+ * return null; } var4.onPickupFromSlot(par1EntityPlayer, var5); } return var3;
+ */
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(ItemStack p_94530_1_, Slot p_94530_2_) {
+ return p_94530_2_.inventory != this.craftResult && super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+
+ public ItemStack getOutputContent() {
+ ItemStack output = this.craftResult.getStackInSlot(0);
+ if (output != null) {
+ return output;
+ }
+ return null;
+ }
+
+ public ItemStack[] getInputComponents() {
+ ItemStack inputs[] = new ItemStack[9];
+ for (int r = 0; r < this.craftMatrix.getSizeInventory(); r++) {
+ ItemStack temp = this.craftMatrix.getStackInSlot(r);
+ inputs[r] = temp;
+ }
+ return inputs;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java b/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java
new file mode 100644
index 0000000000..ab7525c897
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.inventories.Inventory_SuperJukebox;
+import gtPlusPlus.core.slots.SlotJukebox;
+import gtPlusPlus.core.slots.SlotNoInput;
+
+public class Container_SuperJukebox extends Container {
+
+ protected TileEntitySuperJukebox tile_entity;
+ public final Inventory_SuperJukebox inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_HOLO_PLAY = 18;
+ public static final int SLOT_HOLO_LOOP = 19;
+ public static final int SLOT_OUTPUT = 20;
+
+ public static int StorageSlotNumber = 26; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_SuperJukebox(final InventoryPlayer inventory, final TileEntitySuperJukebox te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ Logger.INFO("1");
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 9;
+ int yStart = 20;
+
+ try {
+
+ // Row One
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart));
+ }
+
+ // Row Two
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart + 18));
+ }
+
+ // Row Two
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart + 36));
+ }
+
+ // Controls
+ int c = 4;
+
+ // Two Control Buttons
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, SLOT_HOLO_PLAY, xStart + (18 * c), 12));
+ this.addSlotToContainer(
+ new SlotNoInput(this.inventoryChest, SLOT_HOLO_LOOP, xStart + (18 * c), 12 + (1 * 18)));
+
+ // Active playing slot for visual
+ this.addSlotToContainer(
+ new SlotJukebox(this.inventoryChest, SLOT_OUTPUT, xStart + (18 * c), 18 + (2 * 18), true));
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ Logger.INFO("3");
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockCustomJukebox) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+
+ @Override
+ public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ if (tile_entity == null || tile_entity.getWorldObj().isRemote) return null;
+ switch (aSlotIndex) {
+ case SLOT_HOLO_PLAY -> {
+ if (tile_entity == null) return null;
+ tile_entity.mIsPlaying = !tile_entity.mIsPlaying;
+ Logger.INFO("Jukebox | Playing: " + tile_entity.mIsPlaying);
+ tile_entity.jukeboxLogicUpdate();
+ return null;
+ }
+ case SLOT_HOLO_LOOP -> {
+ if (tile_entity == null) return null;
+ tile_entity.mIsLooping = !tile_entity.mIsLooping;
+ Logger.INFO("Jukebox | Looping: " + tile_entity.mIsLooping);
+ return null;
+ }
+ case 20 -> {
+ return null;
+ }
+ default -> {
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+ }
+ }
+
+ public boolean isPlaying;
+ public boolean isLooping;
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if (tile_entity == null || tile_entity.getWorldObj().isRemote) return;
+
+ isPlaying = tile_entity.mIsPlaying;
+ isLooping = tile_entity.mIsLooping;
+
+ for (Object crafter : this.crafters) {
+ ICrafting var1 = (ICrafting) crafter;
+ var1.sendProgressBarUpdate(this, 102, isPlaying ? 1 : 0);
+ var1.sendProgressBarUpdate(this, 103, isLooping ? 1 : 0);
+ }
+ }
+
+ @Override
+ public void addCraftingToCrafters(ICrafting par1ICrafting) {
+ super.addCraftingToCrafters(par1ICrafting);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void updateProgressBar(int par1, int par2) {
+ super.updateProgressBar(par1, par2);
+ switch (par1) {
+ case 102 -> isPlaying = (par2 != 0);
+ case 103 -> isLooping = (par2 != 0);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java b/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..0315967263
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java
@@ -0,0 +1,170 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.Inventory_VolumetricFlaskSetter;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.slots.SlotVolumetricFlask;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.util.Utils;
+
+public class Container_VolumetricFlaskSetter extends Container {
+
+ public TileEntityVolumetricFlaskSetter mTileEntity;
+ public final Inventory_VolumetricFlaskSetter inventoryChest;
+
+ public int mCustomValue;
+ private int oCustomValue;
+ private int mTimer;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_OUTPUT = 8;
+
+ public static int StorageSlotNumber = 8; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_VolumetricFlaskSetter(final InventoryPlayer inventory, final TileEntityVolumetricFlaskSetter te) {
+ this.mTileEntity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ // mCustomValue = te.getCustomValue();
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 26;
+ int yStart = 12;
+
+ try {
+ // 0
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart, yStart + 18));
+
+ // Add Output
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, 8 + (8 * 18), 59));
+ o++;
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ detectAndSendChanges();
+ } catch (Throwable t) {}
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockVolumetricFlaskSetter) {
+ return false;
+ }
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if ((Utils.isClient()) || (this.mTileEntity == null)) {
+ return;
+ }
+
+ mCustomValue = mTileEntity.getCustomValue();
+ mTimer++;
+
+ for (Object crafter : this.crafters) {
+ ICrafting var1 = (ICrafting) crafter;
+ if (mTimer % 20 == 10 || oCustomValue != mCustomValue) {
+ var1.sendProgressBarUpdate(this, 0, mCustomValue);
+ }
+ }
+
+ oCustomValue = mCustomValue;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void updateProgressBar(int par1, int par2) {
+ super.updateProgressBar(par1, par2);
+ switch (par1) {
+ case 0 -> mCustomValue = (short) par2;
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-Container] " + aString);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java b/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java
new file mode 100644
index 0000000000..fa0d3844b2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.core.creative;
+
+import net.minecraft.creativetab.CreativeTabs;
+
+import gregtech.api.util.GT_CreativeTab;
+
+public class AddToCreativeTab {
+
+ public static CreativeTabs tabBlock;
+ public static CreativeTabs tabMisc;
+ public static CreativeTabs tabTools;
+ public static CreativeTabs tabMachines;
+ public static CreativeTabs tabOther;
+ public static CreativeTabs tabBOP;
+
+ public static void initialiseTabs() {
+ // GT_CreativeTab
+ tabBlock = new GT_CreativeTab("GTPP_BLOCKS", "GT++ Blocks");
+ tabMisc = new GT_CreativeTab("GTPP_MISC", "GT++ Misc");
+ tabTools = new GT_CreativeTab("GTPP_TOOLS", "GT++ Tools");
+ tabMachines = new GT_CreativeTab("GTPP_MACHINES", "GT++ Machines");
+ tabOther = new GT_CreativeTab("GTPP_OTHER", "GT++ Other");
+ tabBOP = new GT_CreativeTab("GTPP_OTHER_2", "GT++ Other II");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java b/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java
new file mode 100644
index 0000000000..99a86c447a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java
@@ -0,0 +1,405 @@
+package gtPlusPlus.core.entity;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityTNTPrimed;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.world.explosions.ExplosionHandler;
+
+public class EntityPrimedMiningExplosive extends EntityTNTPrimed {
+
+ /** How long the fuse is */
+ private EntityLivingBase tntPlacedBy;
+
+ public EntityPrimedMiningExplosive(final World world) {
+ super(world);
+ this.fuse = 160;
+ this.preventEntitySpawning = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ public EntityPrimedMiningExplosive(final World world, final double x, final double y, final double z,
+ final EntityLivingBase placingEntity) {
+ this(world);
+ this.setPosition(x, y, z);
+ final float f = (float) (Math.random() * Math.PI * 2.0D);
+ this.motionX = -((float) Math.sin(f)) * 0.02F;
+ this.motionY = 0.20000000298023224D;
+ this.motionZ = -((float) Math.cos(f)) * 0.02F;
+ this.fuse = 160;
+ this.prevPosX = x;
+ this.prevPosY = y;
+ this.prevPosZ = z;
+ this.tntPlacedBy = placingEntity;
+ }
+
+ @Override
+ protected void entityInit() {}
+
+ /**
+ * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
+ * prevent them from trampling crops
+ */
+ @Override
+ protected boolean canTriggerWalking() {
+ return false;
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ /**
+ * Called to update the entity's position/logic.
+ */
+ @Override
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= 0.03999999910593033D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.9800000190734863D;
+ this.motionY *= 0.9800000190734863D;
+ this.motionZ *= 0.9800000190734863D;
+
+ if (this.onGround) {
+ this.motionX *= 0.699999988079071D;
+ this.motionZ *= 0.699999988079071D;
+ this.motionY *= -0.5D;
+ }
+
+ if (this.fuse-- <= 0) {
+ this.setDead();
+
+ if (!this.worldObj.isRemote) {
+ this.explode();
+ }
+ } else {
+
+ int t = MathUtils.randInt(0, 15);
+
+ if (t <= 2) {
+ int e = MathUtils.randInt(0, 3);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 4) {
+ int e = MathUtils.randInt(0, 5);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 6) {
+ int e = MathUtils.randInt(0, 4);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 8) {
+ int e = MathUtils.randInt(0, 1);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 10) {
+ int e = MathUtils.randInt(0, 6);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e >= 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ }
+
+ private void explode() {
+ final float f = 100.0F;
+
+ ExplosionHandler explode = new ExplosionHandler();
+ explode.createExplosion(this.worldObj, this, this.posX, this.posY, this.posZ, f, false, true);
+
+ /*
+ * this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, f, true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ */
+ }
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ protected void writeEntityToNBT(final NBTTagCompound tag) {
+ tag.setByte("Fuse", (byte) this.fuse);
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ protected void readEntityFromNBT(final NBTTagCompound tag) {
+ this.fuse = tag.getByte("Fuse");
+ }
+
+ /**
+ * returns null or the entityliving it was placed or ignited by
+ */
+ @Override
+ public EntityLivingBase getTntPlacedBy() {
+ return this.tntPlacedBy;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java b/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java
new file mode 100644
index 0000000000..a971541bc2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java
@@ -0,0 +1,64 @@
+package gtPlusPlus.core.entity;
+
+import cpw.mods.fml.common.registry.EntityRegistry;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+import gtPlusPlus.core.item.general.spawn.ItemCustomSpawnEgg;
+import gtPlusPlus.core.util.Utils;
+
+public class InternalEntityRegistry {
+
+ static int mEntityID = 0;
+
+ public static void registerEntities() {
+ Logger.INFO("Registering GT++ Entities.");
+
+ EntityRegistry.registerModEntity(
+ EntityPrimedMiningExplosive.class,
+ "MiningCharge",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+
+ EntityRegistry
+ .registerModEntity(EntityToxinballSmall.class, "toxinBall", mEntityID++, GTplusplus.instance, 64, 20, true);
+
+ EntityRegistry.registerModEntity(
+ EntityStaballoyConstruct.class,
+ "constructStaballoy",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+ ItemCustomSpawnEgg.registerEntityForSpawnEgg(
+ 0,
+ "constructStaballoy",
+ Utils.rgbtoHexValue(20, 200, 20),
+ Utils.rgbtoHexValue(20, 20, 20));
+
+ EntityRegistry
+ .registerModEntity(EntitySickBlaze.class, "sickBlaze", mEntityID++, GTplusplus.instance, 64, 20, true);
+ ItemCustomSpawnEgg.registerEntityForSpawnEgg(
+ 1,
+ "sickBlaze",
+ Utils.rgbtoHexValue(40, 180, 40),
+ Utils.rgbtoHexValue(75, 75, 75));
+
+ EntityRegistry.registerModEntity(
+ EntityLightningAttack.class,
+ "EntityLightningAttack",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java b/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java
new file mode 100644
index 0000000000..38940d3ad6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java
@@ -0,0 +1,224 @@
+package gtPlusPlus.core.entity.monster;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.monster.EntityMob;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+
+public class EntitySickBlaze extends EntityMob {
+
+ /** Random offset used in floating behaviour */
+ private float heightOffset = 0.5F;
+ /** ticks until heightOffset is randomized */
+ private int heightOffsetUpdateTime;
+
+ private int field_70846_g;
+ private final int mDataWatcherID = 30;
+
+ public EntitySickBlaze(World p_i1731_1_) {
+ super(p_i1731_1_);
+ this.isImmuneToFire = true;
+ this.experienceValue = 10;
+ }
+
+ @Override
+ protected void applyEntityAttributes() {
+ super.applyEntityAttributes();
+ this.getEntityAttribute(SharedMonsterAttributes.maxHealth)
+ .setBaseValue(20.0D);
+ this.getEntityAttribute(SharedMonsterAttributes.movementSpeed)
+ .setBaseValue(1.5D);
+ this.getEntityAttribute(SharedMonsterAttributes.attackDamage)
+ .setBaseValue(6.0D);
+ }
+
+ @Override
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(mDataWatcherID, 0);
+ }
+
+ /**
+ * Returns the sound this mob makes while it's alive.
+ */
+ @Override
+ protected String getLivingSound() {
+ return "mob.blaze.breathe";
+ }
+
+ /**
+ * Returns the sound this mob makes when it is hurt.
+ */
+ @Override
+ protected String getHurtSound() {
+ return "mob.blaze.hit";
+ }
+
+ /**
+ * Returns the sound this mob makes on death.
+ */
+ @Override
+ protected String getDeathSound() {
+ return "mob.blaze.death";
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBrightnessForRender(float p_70070_1_) {
+ return 15728880;
+ }
+
+ /**
+ * Gets how bright this entity is.
+ */
+ @Override
+ public float getBrightness(float p_70013_1_) {
+ return p_70013_1_;
+ }
+
+ /**
+ * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
+ * use this to react to sunlight and start to burn.
+ */
+ @Override
+ public void onLivingUpdate() {
+ if (!this.worldObj.isRemote) {
+ if (this.isWet()) {
+ this.attackEntityFrom(DamageSource.drown, 1.0F);
+ }
+
+ --this.heightOffsetUpdateTime;
+
+ if (this.heightOffsetUpdateTime <= 0) {
+ this.heightOffsetUpdateTime = 100;
+ this.heightOffset = 0.5F + (float) this.rand.nextGaussian() * 3.0F;
+ }
+
+ if (this.getEntityToAttack() != null && this.getEntityToAttack().posY + this.getEntityToAttack()
+ .getEyeHeight() > this.posY + this.getEyeHeight() + this.heightOffset) {
+ this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D;
+ }
+ }
+
+ if (!this.onGround && this.motionY < 0.0D) {
+ this.motionY *= 0.6D;
+ }
+
+ for (int i = 0; i < 2; ++i) {
+ this.worldObj.spawnParticle(
+ "crit",
+ this.posX + (this.rand.nextDouble() - 0.5D) * this.width,
+ this.posY + this.rand.nextDouble() * this.height,
+ this.posZ + (this.rand.nextDouble() - 0.5D) * this.width,
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ super.onLivingUpdate();
+ }
+
+ /**
+ * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack.
+ */
+ @Override
+ protected void attackEntity(Entity entity, float p_70785_2_) {
+ if (this.attackTime <= 0 && p_70785_2_ < 2.0F
+ && entity.boundingBox.maxY > this.boundingBox.minY
+ && entity.boundingBox.minY < this.boundingBox.maxY) {
+ this.attackTime = 20;
+ this.attackEntityAsMob(entity);
+ } else if (p_70785_2_ < 30.0F) {
+ double d0 = entity.posX - this.posX;
+ double d1 = entity.boundingBox.minY + entity.height / 2.0F - (this.posY + this.height / 2.0F);
+ double d2 = entity.posZ - this.posZ;
+
+ if (this.attackTime == 0) {
+ ++this.field_70846_g;
+
+ if (this.field_70846_g == 1) {
+ this.attackTime = 60;
+ } else if (this.field_70846_g <= 4) {
+ this.attackTime = 6;
+ } else {
+ this.attackTime = 100;
+ this.field_70846_g = 0;
+ }
+
+ if (this.field_70846_g > 1) {
+ float f1 = MathHelper.sqrt_float(p_70785_2_) * 0.5F;
+ this.worldObj.playAuxSFXAtEntity(null, 1009, (int) this.posX, (int) this.posY, (int) this.posZ, 0);
+
+ for (int i = 0; i < 1; ++i) {
+ EntityToxinballSmall entitysmalltoxinball = new EntityToxinballSmall(
+ this.worldObj,
+ this,
+ d0 + this.rand.nextGaussian() * f1,
+ d1,
+ d2 + this.rand.nextGaussian() * f1);
+ entitysmalltoxinball.posY = this.posY + this.height / 2.0F + 0.5D;
+ this.worldObj.spawnEntityInWorld(entitysmalltoxinball);
+ }
+ }
+ }
+
+ this.rotationYaw = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F;
+ this.hasAttacked = true;
+ }
+ }
+
+ /**
+ * Called when the mob is falling. Calculates and applies fall damage.
+ */
+ @Override
+ protected void fall(float p_70069_1_) {}
+
+ @Override
+ protected Item getDropItem() {
+ return Items.slime_ball;
+ }
+
+ /**
+ * Returns true if the entity is on fire. Used by render to add the fire effect on rendering.
+ */
+ @Override
+ public boolean isBurning() {
+ return false;
+ }
+
+ /**
+ * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param
+ * par2 - Level of Looting used to kill this mob.
+ */
+ @Override
+ protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) {
+ if (p_70628_1_) {
+ int j = this.rand.nextInt(2 + p_70628_2_);
+
+ for (int k = 0; k < j; ++k) {
+ this.dropItem(getDropItem(), 1);
+ }
+ }
+ }
+
+ /**
+ * Checks to make sure the light is not too bright where the mob is spawning
+ */
+ @Override
+ protected boolean isValidLightLevel() {
+ return true;
+ }
+
+ @Override
+ public int getMaxSpawnedInChunk() {
+ return 8;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java b/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java
new file mode 100644
index 0000000000..c58f5ba9df
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java
@@ -0,0 +1,652 @@
+package gtPlusPlus.core.entity.monster;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.ai.EntityAIAttackOnCollide;
+import net.minecraft.entity.ai.EntityAIHurtByTarget;
+import net.minecraft.entity.ai.EntityAILookIdle;
+import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction;
+import net.minecraft.entity.ai.EntityAIMoveTowardsTarget;
+import net.minecraft.entity.ai.EntityAINearestAttackableTarget;
+import net.minecraft.entity.ai.EntityAIWander;
+import net.minecraft.entity.ai.EntityAIWatchClosest;
+import net.minecraft.entity.effect.EntityLightningBolt;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.monster.IMob;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.village.Village;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.core.world.explosions.ExplosionHandler;
+
+public class EntityStaballoyConstruct extends EntityIronGolem {
+
+ /*
+ * Determines whether or not the entity is in a fluid at all.
+ */
+ private boolean inFluid = false;
+ private boolean mReflectFirstUpdate = true;
+ private boolean isReadyToExplode = false;
+ private int fuse = 60;
+ private int attackTimer;
+
+ public EntityStaballoyConstruct(World world) {
+ super(world);
+ this.experienceValue = 250;
+ this.setSize(1.4F, 2.9F);
+ this.getNavigator()
+ .setAvoidsWater(true);
+ this.getNavigator()
+ .setBreakDoors(true);
+ this.getNavigator()
+ .setCanSwim(false);
+ this.getNavigator()
+ .setAvoidSun(false);
+ this.tasks.addTask(1, new EntityAIAttackOnCollide(this, 1.0D, true));
+ this.tasks.addTask(2, new EntityAIMoveTowardsTarget(this, 0.9D, 32.0F));
+ // this.tasks.addTask(3, new EntityAIMoveThroughVillage(this, 0.6D, true));
+ this.tasks.addTask(3, new EntityAIMoveTowardsRestriction(this, 1.0D));
+ this.tasks.addTask(4, new EntityAIWander(this, 0.6D));
+ this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
+ this.tasks.addTask(6, new EntityAILookIdle(this));
+ this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));
+ this.targetTasks.addTask(
+ 2,
+ new EntityAINearestAttackableTarget(this, EntityLiving.class, 0, false, true, IMob.mobSelector));
+ }
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ public void writeEntityToNBT(NBTTagCompound p_70014_1_) {
+ super.writeEntityToNBT(p_70014_1_);
+ p_70014_1_.setBoolean("inFluid", this.inFluid);
+ p_70014_1_.setBoolean("isReadyToExplode", this.isReadyToExplode);
+ p_70014_1_.setInteger("fuse", this.fuse);
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ public void readEntityFromNBT(NBTTagCompound p_70037_1_) {
+ super.readEntityFromNBT(p_70037_1_);
+ this.inFluid = p_70037_1_.getBoolean("inFluid");
+ this.isReadyToExplode = p_70037_1_.getBoolean("isReadyToExplode");
+ this.fuse = p_70037_1_.getInteger("fuse");
+ }
+
+ @Override
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(17, Byte.valueOf((byte) 0));
+ }
+
+ /**
+ * Returns true if the newer Entity AI code should be run
+ */
+ @Override
+ public boolean isAIEnabled() {
+ return true;
+ }
+
+ /**
+ * main AI tick function, replaces updateEntityActionState
+ */
+ @Override
+ protected void updateAITick() {
+ super.updateAITick();
+ }
+
+ @Override
+ protected void applyEntityAttributes() {
+ super.applyEntityAttributes();
+ this.getEntityAttribute(SharedMonsterAttributes.maxHealth)
+ .setBaseValue(500.0D);
+ this.getEntityAttribute(SharedMonsterAttributes.movementSpeed)
+ .setBaseValue(0.5D);
+ }
+
+ /**
+ * Decrements the entity's air supply when underwater
+ */
+ @Override
+ protected int decreaseAirSupply(int p_70682_1_) {
+ return 0;
+ }
+
+ @Override
+ protected void collideWithEntity(Entity p_82167_1_) {
+ if (p_82167_1_ instanceof IMob && this.getRNG()
+ .nextInt(20) == 0) {
+ this.setAttackTarget((EntityLivingBase) p_82167_1_);
+ }
+
+ super.collideWithEntity(p_82167_1_);
+ }
+
+ /**
+ * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
+ * use this to react to sunlight and start to burn.
+ */
+ @Override
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+
+ if (this.attackTimer > 0) {
+ --this.attackTimer;
+ }
+
+ if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D
+ && this.rand.nextInt(5) == 0) {
+ int i = MathHelper.floor_double(this.posX);
+ int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - this.yOffset);
+ int k = MathHelper.floor_double(this.posZ);
+ Block block = this.worldObj.getBlock(i, j, k);
+
+ if (block.getMaterial() != Material.air) {
+ this.worldObj.spawnParticle(
+ "blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k),
+ this.posX + (this.rand.nextFloat() - 0.5D) * this.width,
+ this.boundingBox.minY + 0.1D,
+ this.posZ + (this.rand.nextFloat() - 0.5D) * this.width,
+ 4.0D * (this.rand.nextFloat() - 0.5D),
+ 0.5D,
+ (this.rand.nextFloat() - 0.5D) * 4.0D);
+ }
+ }
+ }
+
+ /**
+ * Returns true if this entity can attack entities of the specified class.
+ */
+ @Override
+ public boolean canAttackClass(Class clazz) {
+ return clazz.equals(this.getClass()) ? false : true;
+ }
+
+ @Override
+ public boolean attackEntityAsMob(Entity p_70652_1_) {
+ this.attackTimer = 10;
+ this.worldObj.setEntityState(this, (byte) 4);
+ boolean flag = p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), 7 + this.rand.nextInt(15));
+
+ if (flag) {
+ p_70652_1_.motionY += 0.4000000059604645D;
+ }
+
+ this.playSound("mob.irongolem.throw", 1.0F, 1.0F);
+ return flag;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void handleHealthUpdate(byte p_70103_1_) {
+ if (p_70103_1_ == 4) {
+ this.attackTimer = 10;
+ this.playSound("mob.irongolem.throw", 1.0F, 1.0F);
+ } else {
+ super.handleHealthUpdate(p_70103_1_);
+ }
+ }
+
+ @Override
+ public Village getVillage() {
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getAttackTimer() {
+ return this.attackTimer;
+ }
+
+ /**
+ * Returns the sound this mob makes when it is hurt.
+ */
+ @Override
+ protected String getHurtSound() {
+ return "mob.irongolem.hit";
+ }
+
+ /**
+ * Returns the sound this mob makes on death.
+ */
+ @Override
+ protected String getDeathSound() {
+ return "mob.irongolem.death";
+ }
+
+ @Override
+ protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) {
+ this.playSound("mob.irongolem.walk", 1.0F, 1.0F);
+ }
+
+ /**
+ * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param
+ * par2 - Level of Looting used to kill this mob.
+ */
+ @Override
+ protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) {
+ int lootingChance = p_70628_2_ + 1;
+ int j = this.rand.nextInt(3);
+ int k;
+
+ for (k = 0; k < j; ++k) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("blockStaballoy", 1), 0f);
+ }
+
+ k = 3 + this.rand.nextInt(3);
+
+ for (int l = 0; l < k; ++l) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("ingotStaballoy", lootingChance), 0f);
+ if (MathUtils.randInt(0, 2) == 0) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("plateStaballoy", lootingChance), 0f);
+ }
+ }
+ }
+
+ @Override
+ public boolean isPlayerCreated() {
+ return false;
+ }
+
+ @Override
+ public void setPlayerCreated(boolean p_70849_1_) {}
+
+ /**
+ * Called when the mob's health reaches 0.
+ */
+ @Override
+ public void onDeath(DamageSource p_70645_1_) {
+ super.onDeath(p_70645_1_);
+ }
+
+ @Override
+ protected String getLivingSound() { // TODO
+ return super.getLivingSound();
+ }
+
+ @Override
+ public int getTalkInterval() {
+ return 0;
+ }
+
+ @Override
+ protected boolean canDespawn() {
+ return true;
+ }
+
+ @Override
+ public void onEntityUpdate() {
+ // Set Fire Immunity
+ if (!this.isImmuneToFire) {
+ this.isImmuneToFire = true;
+ }
+
+ if (!this.worldObj.isRemote) {
+ final float hp = getHealth();
+ final float modifier = MathUtils.randInt(5, 10) / 100F;
+ final float amountToExplode = (hp * modifier);
+
+ if (hp <= amountToExplode && !isReadyToExplode) {
+ if (this.ticksExisted >= 50) {
+ // Logger.INFO("Construct has low hp, trying to enable explosions. HP: "+this.getHealth()+", Max:
+ // "+this.getMaxHealth()+", Mod: "+modifier);
+ // Logger.INFO("Construct required HP to be <= "+amountToExplode);
+ float r = MathUtils.randFloat(0, 10);
+ if (r <= 0.1) {
+ this.isReadyToExplode = true;
+ // Logger.INFO("Construct can now explode.");
+ }
+ }
+ }
+ // Handle Exploding
+ else if (hp <= amountToExplode && isReadyToExplode) {
+ // Logger.INFO("Trying to explode. ["+this.fuse+"]");
+ if (this.fuse-- <= 0) {
+ // Logger.INFO("Fuse has run out.");
+ this.setDead();
+ if (!this.worldObj.isRemote) {
+ this.explode();
+ }
+ } else {
+ // Logger.INFO("Ticking fuse and spawning particles.");
+
+ int maxFuse = 60;
+ int fuseUsed = maxFuse - this.fuse;
+ float var2 = (float) (fuseUsed * 0.1);
+
+ this.setSize(1.4F + (var2 / 2), 2.9F + (var2 / 2));
+
+ float r = MathUtils.randFloat(0, 1);
+ int r2 = MathUtils.randInt(5, 15);
+ for (int o = 0; o < r2; o++) {
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.6) {
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.5) {
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ } else {
+
+ }
+
+ // Get a private field from a super class if it exists.
+ if (mFirstUpdateField == null) {
+ mFirstUpdateField = ReflectionUtils.getField(this.getClass(), "firstUpdate");
+ }
+ if (mFirstUpdateField != null && mReflectFirstUpdate == true) {
+ try {
+ this.mReflectFirstUpdate = (boolean) mFirstUpdateField.get(this);
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ }
+ }
+ super.onEntityUpdate();
+ }
+
+ private static Field mFirstUpdateField;
+
+ @Override
+ public int getMaxSpawnedInChunk() {
+ return 1;
+ }
+
+ @Override
+ public boolean canBreatheUnderwater() {
+ return true;
+ }
+
+ @Override
+ public void knockBack(Entity p_70653_1_, float p_70653_2_, double p_70653_3_, double p_70653_5_) {}
+
+ @Override
+ protected void setOnFireFromLava() {
+ extinguish();
+ }
+
+ @Override
+ public void setFire(int p_70015_1_) {
+ extinguish();
+ }
+
+ @Override
+ protected void dealFireDamage(int p_70081_1_) {}
+
+ @Override
+ public boolean isInWater() {
+ if (super.isInWater()) {
+ return true;
+ } else {
+ this.moveForward *= 0.98F;
+ return false;
+ }
+ }
+
+ @Override
+ public boolean handleWaterMovement() {
+ this.moveForward *= 0.74F;
+ return handleFluidMovement(Material.water);
+ }
+
+ @Override
+ public boolean handleLavaMovement() {
+ this.moveForward *= 0.74F;
+ return handleFluidMovement(Material.lava);
+ }
+
+ /**
+ * Returns if this entity is in water and will end up adding the waters velocity to the entity
+ */
+ public boolean handleFluidMovement(Material fluid) {
+
+ if (this.worldObj.handleMaterialAcceleration(
+ this.boundingBox.expand(0.0D, -0.4000000059604645D, 0.0D)
+ .contract(0.001D, 0.001D, 0.001D),
+ fluid,
+ this)) {
+ if (!this.inFluid && !this.mReflectFirstUpdate) {
+ float f = MathHelper.sqrt_double(
+ this.motionX * this.motionX * 0.20000000298023224D + this.motionY * this.motionY
+ + this.motionZ * this.motionZ * 0.20000000298023224D)
+ * 0.2F;
+
+ if (f > 1.0F) {
+ f = 1.0F;
+ }
+
+ this.playSound(this.getSplashSound(), f, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float f1 = MathHelper.floor_double(this.boundingBox.minY);
+ int i;
+ float f2;
+ float f3;
+
+ for (i = 0; i < 1.0F + this.width * 20.0F; ++i) {
+ f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ f3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle(
+ "bubble",
+ this.posX + f2,
+ f1 + 1.0F,
+ this.posZ + f3,
+ this.motionX,
+ this.motionY - this.rand.nextFloat() * 0.2F,
+ this.motionZ);
+ }
+
+ for (i = 0; i < 1.0F + this.width * 20.0F; ++i) {
+ f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ f3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle(
+ "splash",
+ this.posX + f2,
+ f1 + 1.0F,
+ this.posZ + f3,
+ this.motionX,
+ this.motionY,
+ this.motionZ);
+ }
+ }
+ this.fallDistance = 0.0F;
+ this.inFluid = true;
+ } else {
+ this.inFluid = false;
+ }
+ return this.inFluid;
+ }
+
+ @Override
+ public void onChunkLoad() {
+ // TODO Auto-generated method stub
+ super.onChunkLoad();
+ }
+
+ @Override
+ public void onStruckByLightning(EntityLightningBolt p_70077_1_) {
+ this.isReadyToExplode = true;
+ this.fuse = 20;
+ }
+
+ private void explode() {
+ /*
+ * float f = 12.0F; this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, f, true);
+ */
+
+ if (!this.worldObj.isRemote) {
+ final float f = 6.5F;
+ ExplosionHandler explode = new ExplosionHandler();
+ explode.createExplosion(this.worldObj, this, this.posX, this.posY, this.posZ, f, true, true);
+
+ float r = MathUtils.randFloat(0, 1);
+ int r2 = MathUtils.randInt(20, 40);
+ for (int o = 0; o < r2; o++) {
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(0, 3),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.6) {
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.5) {
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean canAttackWithItem() {
+ return true;
+ }
+
+ @Override
+ public boolean canRenderOnFire() {
+ return false;
+ }
+
+ @Override
+ public boolean isPushedByWater() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java b/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java
new file mode 100644
index 0000000000..e1a4063f49
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.core.entity.projectile;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.projectile.EntityWitherSkull;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.EnumDifficulty;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class EntityLightningAttack extends EntityWitherSkull {
+
+ public EntityLightningAttack(World p_i1794_1_, EntityLivingBase p_i1794_2_, double p_i1794_3_, double p_i1794_5_,
+ double p_i1794_7_) {
+ super(p_i1794_1_, p_i1794_2_, p_i1794_3_, p_i1794_5_, p_i1794_7_);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public EntityLightningAttack(World p_i1795_1_, double p_i1795_2_, double p_i1795_4_, double p_i1795_6_,
+ double p_i1795_8_, double p_i1795_10_, double p_i1795_12_) {
+ super(p_i1795_1_, p_i1795_2_, p_i1795_4_, p_i1795_6_, p_i1795_8_, p_i1795_10_, p_i1795_12_);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected void onImpact(MovingObjectPosition p_70227_1_) {
+
+ if (!this.worldObj.isRemote) {
+ if (p_70227_1_.entityHit != null) {
+ if (this.shootingEntity != null) {
+ if (p_70227_1_.entityHit.attackEntityFrom(DamageSource.causeMobDamage(this.shootingEntity), 8.0F)
+ && !p_70227_1_.entityHit.isEntityAlive()) {
+ this.shootingEntity.heal(0.5F);
+ }
+ } else {
+ p_70227_1_.entityHit.attackEntityFrom(DamageSource.lava, 10.0F);
+ }
+
+ if (p_70227_1_.entityHit instanceof EntityLivingBase) {
+ byte b0 = 0;
+
+ if (this.worldObj.difficultySetting == EnumDifficulty.NORMAL) {
+ b0 = 10;
+ } else if (this.worldObj.difficultySetting == EnumDifficulty.HARD) {
+ b0 = 40;
+ }
+
+ if (b0 > 0) {
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.poison.id, 20 * b0, 1));
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.confusion.id, 20 * b0, 1));
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.weakness.id, 20 * b0, 1));
+ }
+ }
+ }
+
+ this.worldObj.newExplosion(
+ this,
+ this.posX,
+ this.posY,
+ this.posZ,
+ 1.0F,
+ false,
+ this.worldObj.getGameRules()
+ .getGameRuleBooleanValue("mobGriefing"));
+ this.setDead();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java b/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java
new file mode 100644
index 0000000000..a3b2f6f28b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java
@@ -0,0 +1,334 @@
+package gtPlusPlus.core.entity.projectile;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.projectile.EntityFireball;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public abstract class EntityToxinball extends EntityFireball {
+
+ protected int entityX = -1;
+ protected int entityY = -1;
+ protected int entityZ = -1;
+ private Block block;
+ private boolean inGround;
+ private int ticksAlive;
+ private int ticksInAir;
+
+ public EntityToxinball(World world) {
+ super(world);
+ this.setSize(1.0F, 1.0F);
+ }
+
+ @Override
+ protected void entityInit() {}
+
+ /**
+ * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
+ * length * 64 * renderDistanceWeight Args: distance
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean isInRangeToRenderDist(double p_70112_1_) {
+ double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D;
+ d1 *= 64.0D;
+ return p_70112_1_ < d1 * d1;
+ }
+
+ public EntityToxinball(World world, double x, double y, double z, double f1, double f2, double f3) {
+ super(world);
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch);
+ this.setPosition(x, y, z);
+ double d6 = MathHelper.sqrt_double(f1 * f1 + f2 * f2 + f3 * f3);
+ this.accelerationX = f1 / d6 * 0.1D;
+ this.accelerationY = f2 / d6 * 0.1D;
+ this.accelerationZ = f3 / d6 * 0.1D;
+ }
+
+ public EntityToxinball(World world, EntityLivingBase entity, double x, double y, double z) {
+ super(world);
+ this.shootingEntity = entity;
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
+ this.setPosition(this.entityX, this.entityY, this.entityZ);
+ this.yOffset = 0.0F;
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ x += this.rand.nextGaussian() * 0.4D;
+ y += this.rand.nextGaussian() * 0.4D;
+ z += this.rand.nextGaussian() * 0.4D;
+ double d3 = MathHelper.sqrt_double(x * x + y * y + z * z);
+ this.accelerationX = x / d3 * 0.1D;
+ this.accelerationY = y / d3 * 0.1D;
+ this.accelerationZ = z / d3 * 0.1D;
+ }
+
+ /**
+ * Called to update the entity's position/logic.
+ */
+ @Override
+ public void onUpdate() {
+ if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead
+ || !this.worldObj.blockExists(this.entityX, this.entityY, this.entityZ))) {
+ this.setDead();
+ } else {
+ super.onUpdate();
+ this.setFire(1);
+
+ if (this.inGround) {
+ if (this.worldObj.getBlock(this.entityX, this.entityY, this.entityZ) == this.block) {
+ ++this.ticksAlive;
+
+ if (this.ticksAlive == 600) {
+ this.setDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= this.rand.nextFloat() * 0.2F;
+ this.motionY *= this.rand.nextFloat() * 0.2F;
+ this.motionZ *= this.rand.nextFloat() * 0.2F;
+ this.ticksAlive = 0;
+ this.ticksInAir = 0;
+ } else {
+ ++this.ticksInAir;
+ }
+
+ Vec3 vec3 = Vec3.createVectorHelper(this.entityX, this.entityY, this.entityZ);
+ Vec3 vec31 = Vec3.createVectorHelper(
+ this.entityX + this.motionX,
+ this.entityY + this.motionY,
+ this.entityZ + this.motionZ);
+ MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31);
+ vec3 = Vec3.createVectorHelper(this.entityX, this.entityY, this.entityZ);
+ vec31 = Vec3.createVectorHelper(
+ this.entityX + this.motionX,
+ this.entityY + this.motionY,
+ this.entityZ + this.motionZ);
+
+ if (movingobjectposition != null) {
+ vec31 = Vec3.createVectorHelper(
+ movingobjectposition.hitVec.xCoord,
+ movingobjectposition.hitVec.yCoord,
+ movingobjectposition.hitVec.zCoord);
+ }
+
+ Entity entity = null;
+ List<?> list = this.worldObj.getEntitiesWithinAABBExcludingEntity(
+ this,
+ this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ)
+ .expand(1.0D, 1.0D, 1.0D));
+ double d0 = 0.0D;
+
+ for (Object o : list) {
+ Entity entity1 = (Entity) o;
+
+ if (entity1.canBeCollidedWith()
+ && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) {
+ float f = 0.3F;
+ AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f);
+ MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31);
+
+ if (movingobjectposition1 != null) {
+ double d1 = vec3.distanceTo(movingobjectposition1.hitVec);
+
+ if (d1 < d0 || d0 == 0.0D) {
+ entity = entity1;
+ d0 = d1;
+ }
+ }
+ }
+ }
+
+ if (entity != null) {
+ movingobjectposition = new MovingObjectPosition(entity);
+ }
+
+ if (movingobjectposition != null) {
+ this.onImpact(movingobjectposition);
+ }
+
+ this.entityX += this.motionX;
+ this.entityY += this.motionY;
+ this.entityZ += this.motionZ;
+ float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F;
+
+ for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI)
+ - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ ;
+ }
+
+ while (this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while (this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while (this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float f2 = this.getMotionFactor();
+
+ if (this.isInWater()) {
+ for (int j = 0; j < 4; ++j) {
+ float f3 = 0.25F;
+ this.worldObj.spawnParticle(
+ "bubble",
+ this.entityX - this.motionX * f3,
+ this.entityY - this.motionY * f3,
+ this.entityZ - this.motionZ * f3,
+ this.motionX,
+ this.motionY,
+ this.motionZ);
+ }
+
+ f2 = 0.8F;
+ }
+
+ this.motionX += this.accelerationX;
+ this.motionY += this.accelerationY;
+ this.motionZ += this.accelerationZ;
+ this.motionX *= f2;
+ this.motionY *= f2;
+ this.motionZ *= f2;
+ this.worldObj.spawnParticle("smoke", this.entityX, this.entityY + 0.5D, this.entityZ, 0.0D, 0.0D, 0.0D);
+ this.setPosition(this.entityX, this.entityY, this.entityZ);
+ }
+ }
+
+ /**
+ * Return the motion factor for this projectile. The factor is multiplied by the original motion.
+ */
+ @Override
+ protected float getMotionFactor() {
+ return 0.95F;
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected abstract void onImpact(MovingObjectPosition p_70227_1_);
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ public void writeEntityToNBT(NBTTagCompound aTag) {
+ aTag.setShort("xTile", (short) this.entityX);
+ aTag.setShort("yTile", (short) this.entityY);
+ aTag.setShort("zTile", (short) this.entityZ);
+ aTag.setByte("inTile", (byte) Block.getIdFromBlock(this.block));
+ aTag.setByte("inGround", (byte) (this.inGround ? 1 : 0));
+ aTag.setTag("direction", this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ }));
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ public void readEntityFromNBT(NBTTagCompound aTag) {
+ this.entityX = aTag.getShort("xTile");
+ this.entityY = aTag.getShort("yTile");
+ this.entityZ = aTag.getShort("zTile");
+ this.block = Block.getBlockById(aTag.getByte("inTile") & 255);
+ this.inGround = aTag.getByte("inGround") == 1;
+
+ if (aTag.hasKey("direction", 9)) {
+ NBTTagList nbttaglist = aTag.getTagList("direction", 6);
+ this.motionX = nbttaglist.func_150309_d(0);
+ this.motionY = nbttaglist.func_150309_d(1);
+ this.motionZ = nbttaglist.func_150309_d(2);
+ } else {
+ this.setDead();
+ }
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ @Override
+ public float getCollisionBorderSize() {
+ return 1.0F;
+ }
+
+ /**
+ * Called when the entity is attacked.
+ */
+ @Override
+ public boolean attackEntityFrom(DamageSource damage, float p_70097_2_) {
+ if (this.isEntityInvulnerable()) {
+ return false;
+ } else {
+ this.setBeenAttacked();
+
+ if (damage.getEntity() != null) {
+ Vec3 vec3 = damage.getEntity()
+ .getLookVec();
+
+ if (vec3 != null) {
+ this.motionX = vec3.xCoord;
+ this.motionY = vec3.yCoord;
+ this.motionZ = vec3.zCoord;
+ this.accelerationX = this.motionX * 0.1D;
+ this.accelerationY = this.motionY * 0.1D;
+ this.accelerationZ = this.motionZ * 0.1D;
+ }
+
+ if (damage.getEntity() instanceof EntityLivingBase) {
+ this.shootingEntity = (EntityLivingBase) damage.getEntity();
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public float getShadowSize() {
+ return 0.0F;
+ }
+
+ /**
+ * Gets how bright this entity is.
+ */
+ @Override
+ public float getBrightness(float p_70013_1_) {
+ return 1.0F;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBrightnessForRender(float p_70070_1_) {
+ return 15728880;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java b/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java
new file mode 100644
index 0000000000..44b2e8f694
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.core.entity.projectile;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+public class EntityToxinballSmall extends EntityToxinball {
+
+ public EntityToxinballSmall(World world, EntityLivingBase entity, double x, double y, double z) {
+ super(world, entity, x, y, z);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected void onImpact(MovingObjectPosition MoP) {
+ if (!this.worldObj.isRemote) {
+ if (MoP.entityHit != null) {
+ if (!MoP.entityHit.isImmuneToFire() && MoP.entityHit
+ .attackEntityFrom(DamageSource.causeFireballDamage(this, this.shootingEntity), 5.0F)) {
+ MoP.entityHit.setFire(5);
+ }
+ } else {
+ int i = MoP.blockX;
+ int j = MoP.blockY;
+ int k = MoP.blockZ;
+
+ switch (MoP.sideHit) {
+ case 0 -> --j;
+ case 1 -> ++j;
+ case 2 -> --k;
+ case 3 -> ++k;
+ case 4 -> --i;
+ case 5 -> ++i;
+ }
+
+ if (this.worldObj.isAirBlock(i, j, k)) {
+ this.worldObj.setBlock(i, j, k, Blocks.fire);
+ }
+ }
+
+ this.setDead();
+ }
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return false;
+ }
+
+ /**
+ * Called when the entity is attacked.
+ */
+ @Override
+ public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java b/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java
new file mode 100644
index 0000000000..b08889b42b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.fluids;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gtPlusPlus.core.block.ModBlocks.blockFluidSludge;
+import static gtPlusPlus.core.block.ModBlocks.fluidSludge;
+
+import net.minecraft.block.material.Material;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.block.general.fluids.BlockFluidSludge;
+
+public class FluidRegistryHandler {
+
+ // Fluids
+ /**
+ *
+ * Luminosity .setLuminosity(luminosity) How much light does the fluid emit. Default: 0, Lava uses 15 Density
+ * .setDensity(density) How dense is the fluid, the only effect is whether or not a fluid replaces another fluid
+ * when they flow into each other. Default: 1000, the density of water at 4 degrees Celsius in kg/m³ Temperature
+ * .setTemperature(temp) How hot, or cold is the fluid. Has currently no effect. Default: 295, the "normal" room
+ * temperature in degrees Kelvin, this is approximately 72°F or 22°C. Viscosity .setViscosity(viscosity) How thick
+ * the fluid is. Determines how fast it flows. Default: 1000 for water, lava uses 6000 Is Gaseous
+ * .setGaseous(boolean) Indicates if the fluid is gaseous. Used for rendering. Default: false
+ *
+ */
+ public static void registerFluids() {
+ run();
+ }
+
+ private static void run() {
+ fluidSludge();
+ }
+
+ private static void fluidSludge() {
+ // testFluid
+ fluidSludge.setLuminosity(8);
+ fluidSludge.setDensity(8196);
+ fluidSludge.setTemperature(295);
+ fluidSludge.setViscosity(3000);
+ fluidSludge.setGaseous(false);
+ fluidSludge.setUnlocalizedName("fluid.sludge");
+ FluidRegistry.registerFluid(fluidSludge);
+ blockFluidSludge = new BlockFluidSludge(fluidSludge, Material.cactus).setBlockName("fluidBlockSludge");
+ GameRegistry.registerBlock(
+ blockFluidSludge,
+ GTPlusPlus.ID + "_"
+ + blockFluidSludge.getUnlocalizedName()
+ .substring(5));
+ fluidSludge.setUnlocalizedName(blockFluidSludge.getUnlocalizedName());
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java b/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java
new file mode 100644
index 0000000000..379827a1db
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.gui;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.inventory.Container;
+
+public abstract class GUI_Base_Tile_Entity extends GuiContainer {
+
+ public final Container mContainer;
+
+ public GUI_Base_Tile_Entity(Container aContainer) {
+ super(aContainer);
+ mContainer = aContainer;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java b/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java
new file mode 100644
index 0000000000..7da3d1a35c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.core.gui.beta;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import gtPlusPlus.core.interfaces.IGuiManagerMiscUtils;
+
+public class Gui_ID_Registry {
+
+ private static final Map<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classMap = new HashMap<>();
+ private static final Map<Integer, MU_GuiId> idMap = new HashMap<>();
+ private static int nextId = 0;
+
+ static {}
+
+ private static void registerGuiHandlers(final Gui_Types MU_GuiType,
+ final List<Class<? extends IGuiManagerMiscUtils>> guiHandlerClasses) {
+ for (final Class<? extends IGuiManagerMiscUtils> tileGuiHandlerClass : guiHandlerClasses) {
+ final MU_GuiId guiId = new MU_GuiId(nextId++, MU_GuiType, tileGuiHandlerClass);
+ classMap.put(tileGuiHandlerClass, guiId);
+ idMap.put(Integer.valueOf(guiId.getId()), guiId);
+ }
+ }
+
+ public static MU_GuiId getGuiIdForGuiHandler(final IGuiManagerMiscUtils guiHandler) {
+ final Class<? extends IGuiManagerMiscUtils> guiHandlerClass = guiHandler.getClass();
+ MU_GuiId guiId = classMap.get(guiHandlerClass);
+ if (guiId == null) {
+ for (final Map.Entry<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classGuiIdEntry : classMap
+ .entrySet()) {
+ if (((Class<?>) classGuiIdEntry.getKey()).isAssignableFrom(guiHandlerClass)) {
+ guiId = classGuiIdEntry.getValue();
+ break;
+ }
+ }
+ }
+ if (guiId == null) {
+ throw new IllegalStateException("No gui ID for gui handler: " + guiHandler);
+ }
+ return guiId;
+ }
+
+ public static MU_GuiId getGuiId(final int id) {
+ return idMap.get(Integer.valueOf(id));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java b/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java
new file mode 100644
index 0000000000..f0bf946b23
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.gui.beta;
+
+public enum Gui_Types {
+
+ Item,
+ Tile,
+ Entity;
+
+ private Gui_Types() {}
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java b/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java
new file mode 100644
index 0000000000..8b15f5b937
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.gui.beta;
+
+import gtPlusPlus.core.interfaces.IGuiManagerMiscUtils;
+
+public class MU_GuiId {
+
+ private final int id;
+ private final Gui_Types MU_GuiType;
+ private final Class<? extends IGuiManagerMiscUtils> guiHandlerClass;
+
+ MU_GuiId(final int id, final Gui_Types MU_GuiType, final Class<? extends IGuiManagerMiscUtils> guiHandlerClass) {
+ this.id = id;
+ this.MU_GuiType = MU_GuiType;
+ this.guiHandlerClass = guiHandlerClass;
+ }
+
+ public Gui_Types getGuiType() {
+ return this.MU_GuiType;
+ }
+
+ public Class<? extends IGuiManagerMiscUtils> getGuiHandlerClass() {
+ return this.guiHandlerClass;
+ }
+
+ public int getId() {
+ return this.id;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java
new file mode 100644
index 0000000000..71d3b36470
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_CircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+
+@SideOnly(Side.CLIENT)
+public class GUI_CircuitProgrammer extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/CircuitProgrammer.png");
+
+ public GUI_CircuitProgrammer(final InventoryPlayer player_inventory, final TileEntityCircuitProgrammer te) {
+ super(new Container_CircuitProgrammer(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ super.drawGuiContainerForegroundLayer(i, j);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java
new file mode 100644
index 0000000000..60e0f0e67e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java
@@ -0,0 +1,54 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_DecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+@SideOnly(Side.CLIENT)
+public class GUI_DecayablesChest extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/FishTrap.png");
+
+ public GUI_DecayablesChest(final InventoryPlayer player_inventory, final TileEntityDecayablesChest te) {
+ super(new Container_DecayablesChest(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java
new file mode 100644
index 0000000000..d57ef408d0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_FishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+
+@SideOnly(Side.CLIENT)
+public class GUI_FishTrap extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/FishTrap.png");
+
+ public GUI_FishTrap(final InventoryPlayer player_inventory, final TileEntityFishTrap te) {
+ super(new Container_FishTrap(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {}
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java
new file mode 100644
index 0000000000..bed8707fc4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java
@@ -0,0 +1,175 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.awt.Color;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.IFluidTank;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_PestKiller;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.util.math.MathUtils;
+
+@SideOnly(Side.CLIENT)
+public class GUI_PestKiller extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/PestKiller.png");
+ private final TileEntityPestKiller mTileKiller;
+
+ public GUI_PestKiller(final InventoryPlayer player_inventory, final TileEntityPestKiller te) {
+ super(new Container_PestKiller(player_inventory, te));
+ mTileKiller = te;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ if (mTileKiller != null) {
+ this.fontRendererObj.drawString(I18n.format(mTileKiller.getInventoryName(), new Object[0]), 4, 6, 4210752);
+ drawFluidTank(mTileKiller.getTank(), 134, 35);
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+
+ private void drawFluidTank(IFluidTank tank, int x, int y) {
+ Color startGrad = new Color(50, 50, 50);
+ Color endGrad = new Color(20, 20, 20);
+ Container_PestKiller aCont = (Container_PestKiller) this.inventorySlots;
+
+ double aPercentage = 0;
+ double aDivisor = (100 / 16);
+ int aFrameHeight = 16;
+
+ boolean didRender = false;
+ if (aCont != null) {
+ TileEntityPestKiller aTile = mTileKiller;
+ if (aTile != null) {
+ FluidTank aTank = aTile.getTank();
+ int aTier = aTile.getTier();
+ drawGradientRect(x, y, x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ if (aTier <= 0 || aTier > 2) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ this.fontRendererObj.drawString("Tier: 0", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 1x1", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: None", 4, 42, 4210752);
+ this.fontRendererObj.drawString("Amount: 0", 4, 64, 4210752);
+ didRender = true;
+ } else if (aTier == 1) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ startGrad = new Color(240, 50, 240);
+ endGrad = new Color(130, 30, 130);
+ drawGradientRect(x, y + (16 - aFrameHeight), x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 1", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 5x5", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: ", 4, 42, 4210752);
+ this.fontRendererObj.drawString(
+ "" + aTile.getTank()
+ .getFluid()
+ .getLocalizedName(),
+ 4,
+ 54,
+ 4210752);
+ this.fontRendererObj.drawString(
+ "Amount: " + aTile.getTank()
+ .getFluidAmount(),
+ 4,
+ 64,
+ 4210752);
+ didRender = true;
+ } else if (aTier == 2) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ short[] aRGB = MISC_MATERIALS.HYDROGEN_CYANIDE.getRGB();
+ startGrad = new Color(aRGB[0], aRGB[1], aRGB[2]);
+ endGrad = new Color(Math.max(aRGB[0], 0), Math.max(aRGB[1], 0), Math.max(aRGB[2], 0));
+ drawGradientRect(x, y + (16 - aFrameHeight), x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 2", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 9x9", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: ", 4, 42, 4210752);
+ this.fontRendererObj.drawString(
+ "" + aTile.getTank()
+ .getFluid()
+ .getLocalizedName(),
+ 4,
+ 54,
+ 4210752);
+ this.fontRendererObj.drawString(
+ "Amount: " + aTile.getTank()
+ .getFluidAmount(),
+ 4,
+ 64,
+ 4210752);
+ didRender = true;
+ }
+ }
+ }
+ if (!didRender) {
+ startGrad = new Color(255, 30, 120);
+ endGrad = new Color(255, 0, 50);
+ drawGradientRect(x, y, x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 0", 4, 18, 4210752);
+ }
+
+ /*
+ * FluidStack fluid = tank.getFluid(); TextureManager manager = mc.getTextureManager(); if (fluid != null) {
+ * manager.bindTexture(manager.getResourceLocation(0)); float amount = fluid.amount; float capacity =
+ * tank.getCapacity(); float scale = amount / capacity; int fluidTankHeight = 60; int fluidAmount = (int) (scale
+ * * fluidTankHeight); drawFluid(x, y + fluidTankHeight - fluidAmount, fluid.getFluid().getIcon(fluid), 16,
+ * fluidAmount); }
+ */
+ }
+
+ private void drawFluid(int x, int y, IIcon icon, int width, int height) {
+ int i = 0;
+ int j = 0;
+ int drawHeight = 0;
+ int drawWidth = 0;
+ for (i = 0; i < width; i += 16) {
+ for (j = 0; j < height; j += 16) {
+ drawWidth = Math.min(width - i, 16);
+ drawHeight = Math.min(height - j, 16);
+ drawTexturedModelRectFromIcon(x + i, y + j, icon, drawWidth, drawHeight);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java
new file mode 100644
index 0000000000..3707855641
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+@SideOnly(Side.CLIENT)
+public class GUI_ProjectTable extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/ProjectTable.png");
+
+ public GUI_ProjectTable(final InventoryPlayer player_inventory, final TileEntityProjectTable tile) {
+ super(new Container_ProjectTable(player_inventory, tile));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+
+ @Override
+ protected void actionPerformed(final GuiButton B) {}
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java
new file mode 100644
index 0000000000..9afa2b4ce1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java
@@ -0,0 +1,88 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.container.Container_SuperJukebox;
+import gtPlusPlus.core.gui.GUI_Base_Tile_Entity;
+
+@SideOnly(Side.CLIENT)
+public class GUI_SuperJukebox extends GUI_Base_Tile_Entity {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/SuperJukebox.png");
+ private final Container_SuperJukebox mThisContainer;
+
+ public GUI_SuperJukebox(final InventoryPlayer player_inventory, final TileEntitySuperJukebox te) {
+ super(new Container_SuperJukebox(player_inventory, te));
+ mThisContainer = (Container_SuperJukebox) this.mContainer;
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int par1, final int par2) {
+ super.drawGuiContainerForegroundLayer(par1, par2);
+
+ boolean a = mThisContainer.isPlaying;
+ boolean b = mThisContainer.isLooping;
+
+ if (a && b) {
+ this.fontRendererObj.drawString("[X] [X]", 72, 74, 4210752);
+ } else if (a && !b) {
+ this.fontRendererObj.drawString("[X] [ ]", 72, 74, 4210752);
+ } else if (!a && b) {
+ this.fontRendererObj.drawString("[ ] [X]", 72, 74, 4210752);
+ } else {
+ this.fontRendererObj.drawString("[ ] [ ]", 72, 74, 4210752);
+ }
+
+ this.drawTooltip(par1, par2);
+ }
+
+ private void drawTooltip(final int x2, final int y2) {
+ final int xStart = (this.width - this.xSize) / 2;
+ final int yStart = (this.height - this.ySize) / 2;
+ final int x3 = x2 - xStart;
+ final int y3 = y2 - yStart + 5;
+ final List<String> list = new ArrayList<>();
+
+ if (y3 >= 17 && y3 <= 33) {
+ if (x3 >= 80 && x3 <= 96) {
+ list.add("Play");
+ }
+ }
+ if (y3 >= 35 && y3 <= 53) {
+ if (x3 >= 80 && x3 <= 96) {
+ list.add("Loop");
+ }
+ }
+ if (!list.isEmpty()) {
+ this.drawHoveringText(list, x3, y3, this.fontRendererObj);
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float par1, final int par2, final int par3) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java b/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..6595b510c0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java
@@ -0,0 +1,228 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.gui.widget.GuiValueField;
+import gtPlusPlus.core.handler.PacketHandler;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+
+@SideOnly(Side.CLIENT)
+public class GUI_VolumetricFlaskSetter extends GuiContainer {
+
+ private static final ResourceLocation mGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/VolumetricFlaskSetter.png");
+ private Container_VolumetricFlaskSetter mContainer;
+ private boolean mIsOpen = false;
+ private GuiValueField mText;
+ private TileEntityVolumetricFlaskSetter mTile;
+
+ public GUI_VolumetricFlaskSetter(Container_VolumetricFlaskSetter aContainer) {
+ super(aContainer);
+ mContainer = aContainer;
+ mTile = mContainer.mTileEntity;
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(mGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ super.drawGuiContainerForegroundLayer(i, j);
+ this.mText.drawTextBox();
+ this.fontRendererObj.drawString(I18n.format("container.VolumetricFlaskSetter", new Object[0]), 4, 3, 4210752);
+ int aYVal = 49;
+ this.fontRendererObj.drawString(I18n.format("0 = 16l", new Object[0]), 8, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("4 = 576l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("1 = 36l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("5 = 720l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("2 = 144l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("6 = 864l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("3 = 432l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("-> = Custom", new Object[0]), 59, aYVal, 4210752);
+ }
+
+ @Override
+ public void drawScreen(int par1, int par2, float par3) {
+ this.drawDefaultBackground();
+ super.drawScreen(par1, par2, par3);
+ }
+
+ protected String getText() {
+ return this.mText.getText();
+ }
+
+ @Override
+ public void initGui() {
+ super.initGui();
+ // Keyboard.enableRepeatEvents(true);
+ mIsOpen = true;
+ this.mText = new GuiValueField(
+ this.fontRendererObj,
+ 26,
+ 31,
+ this.width / 2 - 62,
+ this.height / 2 - 52,
+ 106,
+ 14,
+ this);
+ mText.setMaxStringLength(5);
+ mText.setEnableBackgroundDrawing(true);
+ mText.setText("0");
+ mText.setFocused(true);
+ }
+
+ public boolean isNumber(char c) {
+ boolean isNum = ((c >= 48 && c <= 57) || c == 45);
+ if (isNum) {
+ log("Found Digit: " + c + " | char value");
+ } else {
+ switch (c) {
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
+ log("Found Digit: " + c + " | char switch");
+ return true;
+ }
+ }
+ }
+ return isNum;
+ }
+
+ public boolean isNumber(int c) {
+ switch (c) {
+ case Keyboard.KEY_0, Keyboard.KEY_1, Keyboard.KEY_2, Keyboard.KEY_3, Keyboard.KEY_4, Keyboard.KEY_5, Keyboard.KEY_6, Keyboard.KEY_7, Keyboard.KEY_8, Keyboard.KEY_9, Keyboard.KEY_NUMPAD0, Keyboard.KEY_NUMPAD1, Keyboard.KEY_NUMPAD2, Keyboard.KEY_NUMPAD3, Keyboard.KEY_NUMPAD4, Keyboard.KEY_NUMPAD5, Keyboard.KEY_NUMPAD6, Keyboard.KEY_NUMPAD7, Keyboard.KEY_NUMPAD8, Keyboard.KEY_NUMPAD9 -> {
+ log("Found Digit: " + Keyboard.getKeyName(c) + " | LWJGL Keybinding");
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void keyTyped(char par1, int par2) {
+ if (mIsOpen) {
+ log("Pressed " + par1 + " | " + par2);
+ if (mText.isFocused()) {
+ log("Text box has focus.");
+ if (par2 == Keyboard.KEY_RETURN) {
+ log("Pressed Enter, unfocusing.");
+ mText.setFocused(false);
+ } else if (par2 == Keyboard.KEY_BACK) {
+ log("Pressed Backspace.");
+ String aCurrentText = getText();
+ if (aCurrentText.length() > 0) {
+ this.mText.setText(aCurrentText.substring(0, aCurrentText.length() - 1));
+ if (getText().length() <= 0) {
+ setText(0);
+ }
+ sendUpdateToServer();
+ }
+ } else {
+ if (isNumber(par2) || isNumber(par1)) {
+ log("Pressed number.");
+ if (this.mText.getText()
+ .equals("0")) {
+ this.mText.textboxKeyTyped(par1, par2);
+ sendUpdateToServer();
+ } else {
+ this.mText.textboxKeyTyped(par1, par2);
+ sendUpdateToServer();
+ }
+ } else {
+ log("Pressed unused key.");
+ super.keyTyped(par1, par2);
+ }
+ }
+ } else {
+ log("Text box not focused.");
+ super.keyTyped(par1, par2);
+ }
+ } else {
+ log("Gui is not open?");
+ }
+ }
+
+ @Override
+ protected void mouseClicked(int x, int y, int btn) {
+ if (mIsOpen) {
+ log("Clicked.");
+ this.mText.mouseClicked(x, y, btn);
+ if (!mText.didClickInTextField(x, y)) {
+ log("Did not click in text box, passing to super.");
+ super.mouseClicked(x, y, btn);
+ }
+ } else {
+ log("Gui is not open?");
+ }
+ }
+
+ @Override
+ public void onGuiClosed() {
+ mIsOpen = false;
+ mText.setEnabled(false);
+ mText.setVisible(false);
+ super.onGuiClosed();
+ // Keyboard.enableRepeatEvents(false);
+ }
+
+ public int parse(String aValue) {
+ try {
+ return Integer.parseInt(getText());
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ public void sendUpdateToServer() {
+ if (getText().length() > 0) {
+ PacketHandler.sendToServer(new Packet_VolumetricFlaskGui(mTile, parse(getText())));
+ }
+ }
+
+ public void setText(int aValue) {
+ this.mText.setText("" + aValue);
+ }
+
+ @Override
+ public void updateScreen() {
+ super.updateScreen();
+ // Update Textbox to 0 if Empty
+ if (getText().length() <= 0) {
+ this.mText.setText("0");
+ sendUpdateToServer();
+ }
+ this.mText.updateCursorCounter();
+
+ // Check TextBox Value is correct
+ if (getText().length() > 0) {
+ int aCustomValue = parse(getText());
+ int aTileValue = ((Container_VolumetricFlaskSetter) mContainer).mCustomValue;
+ if (mContainer != null) {
+ if (aTileValue != aCustomValue) {
+ setText(aTileValue);
+ }
+ }
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-GUI] " + aString);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java b/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java
new file mode 100644
index 0000000000..698aa1951a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java
@@ -0,0 +1,104 @@
+package gtPlusPlus.core.gui.widget;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiTextField;
+
+import gtPlusPlus.core.gui.machine.GUI_VolumetricFlaskSetter;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class GuiValueField extends GuiTextField {
+
+ private final FontRenderer mFontRenderer;
+ private final int mScreenLocationX;
+ private final int mScreenLocationY;
+ private final GUI_VolumetricFlaskSetter mGUI;
+
+ public GuiValueField(FontRenderer aFontRenderer, int aX, int aY, int aScreenLocationX, int aScreenLocationY,
+ int aWidth, int aHeight, GUI_VolumetricFlaskSetter aGUI) {
+ super(aFontRenderer, aX, aY, aWidth, aHeight);
+ mFontRenderer = aFontRenderer;
+ mScreenLocationX = aScreenLocationX;
+ mScreenLocationY = aScreenLocationY;
+ mGUI = aGUI;
+ }
+
+ @Override
+ public boolean isFocused() {
+ return super.isFocused();
+ }
+
+ public boolean isBackgroundDrawingEnabled() {
+ Field enableBackgroundDrawing = ReflectionUtils.getField(
+ GuiTextField.class,
+ !CORE_Preloader.DEV_ENVIRONMENT ? "field_146215_m" : "enableBackgroundDrawing");
+ if (enableBackgroundDrawing != null) {
+ return ReflectionUtils.getFieldValue(enableBackgroundDrawing, this);
+ }
+ return true;
+ }
+
+ public int getLineScrollOffset() {
+ Field lineScrollOffset = ReflectionUtils
+ .getField(GuiTextField.class, !CORE_Preloader.DEV_ENVIRONMENT ? "field_146225_q" : "lineScrollOffset");
+ if (lineScrollOffset != null) {
+ return (int) ReflectionUtils.getFieldValue(lineScrollOffset, this);
+ }
+ return 0;
+ }
+
+ public boolean didClickInTextField(int aX, int aY) {
+ mGUI.log("Clicked at X:" + aX + ", Y:" + aY);
+ boolean aDidClick = aX >= this.mScreenLocationX && aX < this.mScreenLocationX + this.width
+ && aY >= this.mScreenLocationY
+ && aY < this.mScreenLocationY + this.height;
+ mGUI.log("Did click in textbox? " + aDidClick);
+ mGUI.log("Expected Region: X:" + mScreenLocationX + "-" + (this.mScreenLocationX + this.width));
+ mGUI.log("Expected Region: Y:" + mScreenLocationY + "-" + (this.mScreenLocationY + this.height));
+ return aDidClick;
+ }
+
+ /**
+ * Args: x, y, buttonClicked
+ */
+ @Override
+ public void mouseClicked(int aX, int aY, int aButton) {
+ boolean aDidClick = didClickInTextField(aX, aY);
+
+ mGUI.log("Did click inside text box? " + aDidClick);
+ mGUI.log("Focus 1: " + this.isFocused());
+ this.setFocused(aDidClick);
+ mGUI.log("Focus 2: " + this.isFocused());
+ if (isFocused()) {
+ int l = aX - this.mScreenLocationX;
+ if (isBackgroundDrawingEnabled()) {
+ l -= 4;
+ }
+ if (aButton == 0) {
+ mGUI.log("Left clicked in text box.");
+ String s = this.mFontRenderer.trimStringToWidth(
+ this.getText()
+ .substring(getLineScrollOffset()),
+ this.getWidth());
+ this.setCursorPosition(
+ this.mFontRenderer.trimStringToWidth(s, l)
+ .length() + getLineScrollOffset());
+ } else if (aButton == 1) {
+ mGUI.log("Right clicked in text box.");
+ mGUI.setText(0);
+ mGUI.sendUpdateToServer();
+ String s = this.mFontRenderer.trimStringToWidth(
+ this.getText()
+ .substring(getLineScrollOffset()),
+ this.getWidth());
+ this.setCursorPosition(
+ this.mFontRenderer.trimStringToWidth(s, l)
+ .length() + getLineScrollOffset());
+ }
+ } else {
+ mGUI.log("Clicked, but no focus.");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java b/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java
new file mode 100644
index 0000000000..41513163a0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java
@@ -0,0 +1,491 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.Achievement;
+import net.minecraftforge.common.AchievementPage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class AchievementHandler {
+
+ public ConcurrentHashMap<String, Achievement> achievementList = new ConcurrentHashMap<>();
+
+ public int adjX = 5;
+ public int adjY = 9;
+
+ private static final String aBaseAchievementName = "gtpp.start";
+
+ public AchievementHandler() {
+
+ Logger.INFO("Initializing GT++ achievements");
+ GT_Log.out.println("Initializing GT++ achievements");
+
+ // register first
+ this.registerAchievement(
+ aBaseAchievementName,
+ 0,
+ 0,
+ MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ANGLE_GRINDER,
+ 1,
+ Materials.Osmium,
+ Materials.Osmium,
+ null),
+ "",
+ true);
+
+ this.registerAchievement(
+ "hatch.dynamo.buffered",
+ 2,
+ -2,
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.get(1),
+ aBaseAchievementName,
+ false);
+ // First multi anyone really needs
+ this.registerAchievement(
+ "multi.abs",
+ -4,
+ -2,
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(1),
+ aBaseAchievementName,
+ true);
+
+ // Material Advancement
+ this.registerAchievement("dust.potin", 0, 2, ALLOY.POTIN.getDust(1), aBaseAchievementName, false);
+ this.registerAchievement("dust.eglin", 0, 4, ALLOY.EGLIN_STEEL.getDust(1), "dust.potin", false);
+ this.registerAchievement("dust.staballoy", 0, 6, ALLOY.STABALLOY.getDust(1), "dust.eglin", false);
+ this.registerAchievement("dust.quantum", 0, 8, ALLOY.QUANTUM.getDust(1), "dust.staballoy", true);
+ this.registerAchievement("dust.hypogen", 0, 10, ELEMENT.STANDALONE.HYPOGEN.getDust(1), "dust.quantum", true);
+
+ // Blocks
+ this.registerAchievement(
+ "block.fishtrap",
+ -2,
+ 2,
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap),
+ "dust.potin",
+ false);
+ this.registerAchievement(
+ "block.withercage",
+ -2,
+ 4,
+ ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard),
+ "dust.eglin",
+ false);
+
+ // Machines (-10/-8/-6)
+ this.registerAchievement("rtg", -16, -10, GregtechItemList.RTG.get(1), aBaseAchievementName, false);
+ this.registerAchievement(
+ "dehydrate",
+ -15,
+ -10,
+ GregtechItemList.GT_Dehydrator_HV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "semifluid",
+ -14,
+ -10,
+ GregtechItemList.Generator_SemiFluid_HV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "earlywasher",
+ -13,
+ -10,
+ GregtechItemList.SimpleDustWasher_ULV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "advancedsteam",
+ -12,
+ -10,
+ GregtechItemList.Boiler_Advanced_MV.get(1),
+ aBaseAchievementName,
+ false);
+ if (PollutionUtils.isPollutionEnabled()) {
+ this.registerAchievement(
+ "pollutionremoval",
+ -11,
+ -10,
+ GregtechItemList.Pollution_Cleaner_IV.get(1),
+ aBaseAchievementName,
+ false);
+ }
+ this.registerAchievement(
+ "hiampxform",
+ -10,
+ -10,
+ GregtechItemList.Transformer_HA_HV_MV.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Multis (-4/-2/0)
+ this.registerAchievement("multi.pss", -16, -7, GregtechItemList.PowerSubStation.get(1), "multi.abs", false);
+ this.registerAchievement("multi.cyclo", -15, -7, GregtechItemList.COMET_Cyclotron.get(1), "multi.abs", false);
+ this.registerAchievement(
+ "multi.sifter",
+ -14,
+ -7,
+ GregtechItemList.Industrial_Sifter.get(1),
+ "dust.eglin",
+ false);
+ this.registerAchievement(
+ "multi.cokeoven",
+ -13,
+ -7,
+ GregtechItemList.Industrial_CokeOven.get(1),
+ "multi.abs",
+ false);
+ this.registerAchievement(
+ "multi.boiler.thermal",
+ -12,
+ -7,
+ GregtechItemList.GT4_Thermal_Boiler.get(1),
+ "multi.abs",
+ false);
+ this.registerAchievement(
+ "multi.zhuhai",
+ -11,
+ -7,
+ GregtechItemList.Industrial_FishingPond.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Casings
+ this.registerAchievement(
+ "casing.abs",
+ 2,
+ -10,
+ GregtechItemList.Casing_Coil_BlastSmelter.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.cyclotron.coil",
+ 3,
+ -10,
+ GregtechItemList.Casing_Cyclotron_Coil.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.multiuse",
+ 4,
+ -10,
+ GregtechItemList.Casing_Multi_Use.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.containment",
+ 5,
+ -10,
+ GregtechItemList.Casing_Containment.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Radioactive
+ this.registerAchievement(
+ "decay.neptunium238",
+ 11,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustNeptunium238),
+ "multi.cyclo",
+ false);
+ this.registerAchievement(
+ "decay.radium226",
+ 12,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustRadium226),
+ "multi.cyclo",
+ false);
+ this.registerAchievement(
+ "decay.molybdenum99",
+ 13,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustMolybdenum99),
+ "multi.cyclo",
+ false);
+
+ AchievementPage.registerAchievementPage(
+ new AchievementPage(
+ "GT++",
+ this.achievementList.values()
+ .toArray(new Achievement[0])));
+ MinecraftForge.EVENT_BUS.register(this);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+
+ public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, String requirement,
+ boolean special) {
+ Achievement achievement = new Achievement(
+ textId,
+ textId,
+ this.adjX + x,
+ this.adjY + y,
+ icon,
+ this.getAchievement(requirement));
+ if (special) {
+ achievement.setSpecial();
+ }
+
+ achievement.registerStat();
+ if (CORE.DEVENV) {
+ GT_Log.out.println("achievement." + textId + "=");
+ GT_Log.out.println("achievement." + textId + ".desc=");
+ }
+
+ this.achievementList.put(textId, achievement);
+ return achievement;
+ }
+
+ public void issueAchievement(EntityPlayer entityplayer, String textId) {
+ if (entityplayer != null) {
+ entityplayer.triggerAchievement(this.achievementList.get(textId));
+ }
+ }
+
+ public Achievement getAchievement(String textId) {
+ return this.achievementList.get(textId);
+ }
+
+ /**
+ * A generic handler that will give an achievement for an item. Useful to only write this once, then call it from
+ * all handlers.
+ *
+ * @param aStack - The Itemstack to check for achievements.
+ * @param aPlayer - The player to unlock for.
+ */
+ private void handleAchivement(ItemStack aStack, EntityPlayer aPlayer) {
+
+ if (aPlayer != null && aStack != null) {
+ /*
+ * Copy this to all events because I am lazy - Alk 2019
+ */
+
+ // Safe name
+ String aUnlocalName = ItemUtils.getUnlocalizedItemName(aStack);
+
+ boolean isValid = false;
+ // Check if valid name // mod
+ String aModID = ItemUtils.getModId(aStack);
+
+ if (aModID == null || aModID.isEmpty()) {
+ return;
+ }
+
+ if (ItemUtils.getModId(aStack)
+ .equals(GTPlusPlus.ID)
+ || ItemUtils.getModId(aStack)
+ .equalsIgnoreCase(GregTech.ID)) {
+ isValid = true;
+ }
+ if (!isValid) {
+ return;
+ }
+
+ // Should unlock base achievement from *ANY* GT++ item. (Too lazy to special case GT machineBlocks though)
+ if (ItemUtils.getModId(aStack)
+ .equals(GTPlusPlus.ID)) {
+ this.issueAchievement(aPlayer, aBaseAchievementName);
+ }
+
+ if (aUnlocalName.contains("item.")) {
+ aUnlocalName = aUnlocalName.substring(5);
+ } else if (aUnlocalName.contains("tile.")) {
+ aUnlocalName = aUnlocalName.substring(5);
+ }
+
+ /*
+ * Misc Blocks
+ */
+ if (aUnlocalName.equals("blockFishTrap")) {
+ this.issueAchievement(aPlayer, "block.fishtrap");
+ }
+ if (aUnlocalName.equals("blockBlackGate")) {
+ this.issueAchievement(aPlayer, "block.withercage");
+ }
+
+ /*
+ * Decayables
+ */
+ if (aUnlocalName.equals("dustNeptunium238")) {
+ this.issueAchievement(aPlayer, "decay.neptunium238");
+ } else if (aUnlocalName.equals("dustRadium226")) {
+ this.issueAchievement(aPlayer, "decay.radium226");
+ } else if (aUnlocalName.equals("dustMolybdenum99")) {
+ this.issueAchievement(aPlayer, "decay.molybdenum99");
+ } else if (aUnlocalName.equals("dustTechnetium99M")) {
+ this.issueAchievement(aPlayer, "decay.technetium99m");
+ } else if (aUnlocalName.equals("dustTechnetium99")) {
+ this.issueAchievement(aPlayer, "decay.technetium99");
+ }
+
+ /*
+ * Random Materials worthy of Achievements
+ */
+ else if (aUnlocalName.equals("itemDustPotin")) {
+ this.issueAchievement(aPlayer, "dust.potin");
+ } else if (aUnlocalName.equals("itemDustEglinSteel")) {
+ this.issueAchievement(aPlayer, "dust.eglin");
+ } else if (aUnlocalName.equals("itemDustStaballoy")) {
+ this.issueAchievement(aPlayer, "dust.staballoy");
+ } else if (aUnlocalName.equals("itemDustQuantum")) {
+ this.issueAchievement(aPlayer, "dust.quantum");
+ } else if (aUnlocalName.equals("itemDustHypogen")) {
+ this.issueAchievement(aPlayer, "dust.hypogen");
+ }
+
+ /*
+ * Machines
+ */
+ else if (aUnlocalName.startsWith("gt.blockmachines.")) {
+
+ // Readability
+ String aStartsWith = "gt.blockmachines.";
+
+ /*
+ * Single Blocks
+ */
+
+ // RTG
+ if (aUnlocalName.startsWith(aStartsWith + "basicgenerator.rtg")) {
+ this.issueAchievement(aPlayer, "rtg");
+ }
+ // Dehydrator
+ else if (aUnlocalName.startsWith(aStartsWith + "machine.dehydrator.tier.")) {
+ this.issueAchievement(aPlayer, "dehydrate");
+ }
+ // SemiFluids
+ else if (aUnlocalName.startsWith(aStartsWith + "basicgenerator.semifluid.tier.")) {
+ this.issueAchievement(aPlayer, "semifluid");
+ }
+ // Simple Washer
+ else if (aUnlocalName.startsWith(aStartsWith + "simplewasher.01.tier.")) {
+ this.issueAchievement(aPlayer, "earlywasher");
+ }
+ // Advanced Boilers
+ else if (aUnlocalName.startsWith(aStartsWith + "electricboiler.")) {
+ this.issueAchievement(aPlayer, "advancedsteam");
+ }
+ // Scrubers
+ else if (aUnlocalName.startsWith(aStartsWith + "pollutioncleaner.01.tier.")) {
+ this.issueAchievement(aPlayer, "pollutionremoval");
+ }
+ // High-amp xformers
+ else if (aUnlocalName.startsWith(aStartsWith + "transformer.ha.tier.")) {
+ this.issueAchievement(aPlayer, "hiampxform");
+ }
+ // Buffered Dynamos
+ else if (aUnlocalName.startsWith(aStartsWith + "hatch.dynamo.buffer.tier.")) {
+ this.issueAchievement(aPlayer, "hatch.dynamo.buffered");
+ }
+ // Control Core Hatch
+ else if (aUnlocalName.startsWith(aStartsWith + "hatch.control.adv")) {
+ this.issueAchievement(aPlayer, "hatch.control");
+ }
+
+ /*
+ * Multis
+ */
+
+ // ABS
+ else if (aUnlocalName.equals(aStartsWith + "industrialsalloyamelter.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.abs");
+ }
+ // PSS
+ else if (aUnlocalName.equals(aStartsWith + "substation.01.input.single")) {
+ this.issueAchievement(aPlayer, "multi.pss");
+ }
+ // Cyclotron
+ else if (aUnlocalName.startsWith(aStartsWith + "cyclotron.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.cyclo");
+ }
+ // Sifter
+ else if (aUnlocalName.equals(aStartsWith + "industrialsifter.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.sifter");
+ }
+ // Coke Oven
+ else if (aUnlocalName.equals(aStartsWith + "industrialcokeoven.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.cokeoven");
+ }
+ // Thermal Boiler
+ else if (aUnlocalName.equals(aStartsWith + "gtplusplus.thermal.boiler")) {
+ this.issueAchievement(aPlayer, "multi.boiler.thermal");
+ }
+ // Zhuhai
+ else if (aUnlocalName.equals(aStartsWith + "industrial.fishpond.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.zhuhai");
+ }
+
+ }
+
+ /*
+ * Casings
+ */
+ else if (aUnlocalName.equals("gtplusplus.blockcasings.14")) {
+ this.issueAchievement(aPlayer, "casing.abs");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.2.9")) {
+ this.issueAchievement(aPlayer, "casing.cyclotron.coil");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.3.2")) {
+ this.issueAchievement(aPlayer, "casing.multiuse");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.3.15")) {
+ this.issueAchievement(aPlayer, "casing.containment");
+ }
+ }
+ }
+
+ /*
+ * Handle achievements for all vanilla types of obtianment.
+ */
+
+ @SubscribeEvent
+ public void onCrafting(ItemCraftedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.crafting;
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+
+ @SubscribeEvent
+ public void onSmelting(ItemSmeltedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.smelting;
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+
+ @SubscribeEvent
+ public void onItemPickup(EntityItemPickupEvent event) {
+ EntityPlayer player = event.entityPlayer;
+ ItemStack stack = event.item.getEntityItem();
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/BookHandler.java b/src/main/java/gtPlusPlus/core/handler/BookHandler.java
new file mode 100644
index 0000000000..5725c1c710
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/BookHandler.java
@@ -0,0 +1,486 @@
+package gtPlusPlus.core.handler;
+
+import static gtPlusPlus.core.util.Utils.addBookPagesLocalization;
+import static gtPlusPlus.core.util.Utils.addBookTitleLocalization;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class BookHandler {
+
+ public static int mBookKeeperCount = 0;
+
+ public static Map<Integer, BookTemplate> mBookMap = new HashMap<>();
+
+ public static BookTemplate book_ThermalBoiler;
+ public static BookTemplate book_MultiPowerStation;
+ public static BookTemplate book_ModularBauble;
+ public static BookTemplate book_MultiMachineManual;
+ public static BookTemplate book_NuclearManual;
+ public static BookTemplate book_MultiChemicalPlant;
+
+ public static void run() {
+
+ Logger.INFO("Writing books.");
+
+ // Thermal Boiler
+ book_ThermalBoiler = writeBookTemplate(
+ "Manual_Thermal_Boiler",
+ "Thermal Boiler Manual",
+ "GregoriusT",
+ new String[] {
+ "This Book explains how to set up and run your Thermal Boiler. We are not responsible for any Damage done by this Book itself nor its content.",
+ "First you need to craft the following things for a Thermal Boiler to Function: The Main Boiler Block, 20 Thermal Containment Casings, two Input Hatches, two Output Hatches, a bunch of different Tools and a Maintenance Hatch.",
+ "To begin the building, lay out the first 3x3 layer of Machine Casings on the ground (with a Hatch in the Middle), then place the Boiler Block facing outward in the middle of one of the 3m wide Sides.",
+ "Now grab 3 other Hatches and place them on the remaining three 3m wide Sides also facing outwards. And now the four corners of the Machine need also a Machine Casing. There should only be a Hole left in the middle of the Cube.",
+ "So, now place a 3x3 of Machine Casings on top, at the 3rd Layer with the last Hatch in the middle facing outwards as well.",
+ "When accessing the Boiler Block, it should now stop telling you, that the structure is incomplete (bottom Line of that Screen). Now go with a bunch of different Tools (Metal Hammer, Rubber Hammer, Screwdriver, Wrench, Soldering Iron and Crowbar)",
+ "to the Maintenance Hatch and access it. After that you grab the 6 Tools and rightclick the Slot with each of them in your Hand in the Maintenance GUI. Note that you need Soldering Tin/Lead in your Inventory to use the Soldering Iron.",
+ "The Main Block should now tell you that you need to use the Rubber Hammer on it to (re)activate the Machine. The Rubber Hammer can enable and disable Machines. The Machine disables itself after something important broke.",
+ "If you want to use Lava with this Device, then you should add a Lava Filter to extract additional Resources from the Lava. If the Filter breaks, the Machine won't explode like a Turbine would. If you use molten Salt, then you won't need a Filter.",
+ "You will get Obsidian when processing Lava, however if a Filter is used, you will get sometimes an Ingot instead of a Block of Obsidian. When using molten Salt, you will get the Salt back.",
+ "So, now for the Maintenance. After a few Hours of running nonstop, your Boiler will get small Problems, which don't prevent it from running, these Problems just decrease Efficiency. Every Problem listed on the Screen does -10% Efficiency.",
+ "To fix these Problems, just go to the Maintenance Hatch and click with the problem corresponding Tool on the Slot to repair. If all six possible runtime Problems happen, the Machine will auto-shutdown no matter what. No Explosion, it's just stopping.",
+ "The Thermal Boiler will produce 800 Liters of Steam per tick for about 5 or 6 Liters of Water per tick at reaching 100% Efficiency. In case of Lava it consumes 1666 Liters every Second.",
+ "A Thermal Boiler is worth about 33 small Thermal Generators, and as the Boilers get much less Efficient, when not having enough Fuel, you should consider making a large Nether Pump for Lava, or a good Nuclear Reactor for molten Salt.",
+ "Input and Output Slots are fully optional, you can place multiple ones of them or even none on the Machine. A Machine without Input couldn't process any Recipes, while a Machine without Output just voids all outputted Items and Liquids.",
+ "It might be useful to use the Screwdriver on the Output Hatches to determine what is outputted where." });
+
+ // Test Novel
+ book_MultiPowerStation = writeBookTemplate(
+ "Manual_Multi_PowerStation",
+ "Power Storage & You [Version 0.64]",
+ "Alkalus",
+ new String[] {
+ // Page 1
+ """
+ So, when it comes to power storage you really have three separate options:
+ \s
+ Battery Buffers,
+ Energy Buffers,
+ The Power Sub-Station
+ """,
+ // Page 2
+ """
+ Battery Buffer
+ \s
+ Is rather portable. Allowing you to throw set one up and insert batteries where ever you may need.
+ They output 1A for each battery stored inside, up to a maximum of 16A.""",
+ // Page 3
+ """
+ Energy Buffer
+ \s
+ Is a more optimal choice for storage in your base. Once placed down, they cannot be moved without losing all stored power.
+ Energy Buffers can output 4A from the output side, however accept 16A as input.""",
+ // Page 4
+ """
+ The Power Sub-Station\s
+ Is used for storing Insane amounts of power later game.
+ Consumes 2% of the average voltage of all energy type hatches every tick.
+ """,
+ // Page 5
+ """
+ Allows Insertion/Removal of power from the rear face of the controller, swap with a screwdriver.
+ Variable Height Structure, between 4-16Y. Inserted Redox Cells dictate max energy tier of structure.
+ """,
+ // Page 6
+ """
+ Redox Cells cannot be placed into the Top or Bottom layer and only take up 3xhx3 internally.
+ Different Tier cells CANNOT be mixed together.
+ """,
+ // Page 7
+ """
+ All Hatches Must be HV at a Minimum, this minimum tier is in place to stop people abusing ULV/LV hatches to lower the avg/t.
+ Currently the GUI will NOT display anything at all until the structure forms, this is a known bug.
+ """,
+ // Page 8
+ """
+ Valid Hatches:
+ Energy Hatch,
+ Dynamo Hatch,
+ Charging Bus,
+ Discharging Bus,
+ Dynamo Buffer,
+ Multi-Amp Dynamo Hatch.
+
+
+ Structure MUST contain at least one energy input and one energy output hatch.""" });
+
+ // Test Novel
+ book_ModularBauble = writeBookTemplate(
+ "Manual_Modular_Bauble",
+ "How to: Modular Baubles",
+ "Alkalus",
+ new String[] {
+ """
+ Concept: This idea came from wanting flexibility.\s
+ First step, Build a Modularity table to begin customisation of your Bauble.\s
+ After this has been constructed, you can now combine the upgrades listed within this book to improve the baubles level/100.""",
+ """
+ Defence:
+ Can be upgraded by combining metal plates with the bauble.\s
+ | +1 | Aluminium\s
+ | +2 | Stainless Steel\s
+ | +3 | Tungsten\s
+ | +4 | Tungsten Steel\s
+ | +5 | Naquadah\s
+ """, "There was once a sad and lonely oak tree. \n", "There was once a sad and lonely oak tree. \n",
+ "There was once a sad and lonely oak tree. \n" });
+
+ // Test Novel
+ // 20/21/22
+ book_MultiMachineManual = writeBookTemplate(
+ "Manual_Multi_Machine",
+ "Multi-Machine Manual",
+ "Alkalus",
+ new String[] {
+ "This Multiblock, depending upon the mode used, can function as a variety of different machines. The idea behind this, was that most of these machines are rather niche compared to any others, as such, not used often.",
+ "To build, you need to construct a hollow 3x3x3 structure made from Multi-Use casings, With a minimum of 6. Any Casing position can be substituted out with an Input Hatch/Bus, an Output Hatch/Bus, Muffler, Maint. Hatch or Energy Injector Hatch.",
+ "The Mode can be set by using a Screwdriver on the controller block. Each mode allows the use of Numbered Circuits, to allow a different machine 'type' for each input bus.",
+ "[Metal Work] Mode Metal - Allows the multiblock to function as a Compressor, a Lathe or an Electro-Magnet. To allow a hatch to run in Compressor mode, insert a No. 20 circuit. For Lathe, use No. 21 and for Electro-Magnet use No. 22.",
+ "[Fluid Work] Mode Fluid - Allows the multiblock to function as a Fermenter, a Fluid Extractor or an Extractor. To allow a hatch to run in Fermenter mode, insert a No. 20 circuit. For Fluid Extractor, use No. 21 and for Extractor use No. 22.",
+ "[Misc. Work] Mode Misc - Allows the multiblock to function as a Laser Engraver, an Autoclave or a Fluid Solidifier. To allow a hatch to run in Laser Engraver mode, insert a No. 20 circuit. For Autoclave, use No. 21 and for Solidifier use No. 22.", });
+
+ book_NuclearManual = writeBookTemplate(
+ "Manual_NuclearStuff_1",
+ "Nuclear Chemistry [FFPP]",
+ "Alkalus",
+ new String[] {
+ // Page 1
+ """
+ Fission Fuel Processing Plant
+ Size: 3x9x3 [LxHxW]
+ Controller: Center, Bottom
+ 4x Input Hatch
+ 2x Output Hatch
+ 1x Output Bus
+ 1x ZPM+ Muffler
+ 1x Maintenance Hatch
+ 1x Energy Hatch
+ """,
+ // Page 2
+ """
+ [1] 7x Hastelloy-X or I/O
+ [2] 5x Incoloy-DS Fluid Containment
+ [3] 4x Zeron-100 Shielding
+ [4] 17x Hastelloy-N Sealant Case
+ Multiblock Construction
+ Convention is [LxHxW]
+
+ """,
+ // Page 3
+ """
+ Layer 1/2:
+ [1][1][1]
+ [1][1][1]
+ [1][1][1]
+
+ Layer 3/5/6
+ [ ][4][ ]
+ [4][2][4]
+ [ ][4][ ]
+
+ """,
+ // Page 4
+ """
+ Layer 4
+ [ ][3][ ]
+ [3][2][3]
+ [ ][3][ ]
+
+ Layer 7/8/9
+ [ ][ ][ ]
+ [ ][3][ ]
+ [ ][ ][ ]
+ """,
+ // Page 5
+ """
+ Fission Fuel
+ Processing Plant----------------------
+ This structure is used to produce the Molten Salts required to run a Liquid Fluorine Thorium Reactor [LFTR].""" });
+
+ book_MultiChemicalPlant = writeBookTemplate(
+ "book_Multi_ChemicalPlant",
+ "Chemical Plant Manual",
+ "Alkalus",
+ new String[] {
+
+ // Intro
+ "This book will explain how the Chemical Plant is constructed, which blocks are valid to upgrade it and also how the upgrades work.",
+
+ // Info
+ """
+ Solid Casings = Plant tier
+ Machine Casings = Hatch tier
+ Higher tier coils More Speed
+ T1 50% , T2 100% , T3 150%, etc
+ """, """
+ Higher tier pipe casings boost parallel
+ and reduce catalyst consumption.
+ +2 parallel per tier, 20% extra chance of
+ not damaging catalyst per tier.""", """
+ Awakened Draconium Coil (or above) with
+ Tungstensteel Pipe Casing
+ does not damage catalyst at all.""",
+
+ // Machine Casings
+ """
+ Valid Solid Machine Casings:
+ 1 - Strong Bronze
+ 2 - Solid Steel
+ 3 - Sturdy Aluminium
+ 4 - Clean Stainless Steel
+ 5 - Stable Titanium
+ 6 - Robust Tungstensteel
+ 7 - Vigorous Laurenium
+ 8 - Rugged Botmium""",
+
+ // Machine Casings
+ "Valid Tiered Machine Casings:" + "\n"
+ + "\n"
+ + "1 - "
+ + GT_Values.VN[0]
+ + "\n"
+ + "2 - "
+ + GT_Values.VN[1]
+ + "\n"
+ + "3 - "
+ + GT_Values.VN[2]
+ + "\n"
+ + "4 - "
+ + GT_Values.VN[3]
+ + "\n"
+ + "5 - "
+ + GT_Values.VN[4]
+ + "\n"
+ + "6 - "
+ + GT_Values.VN[5]
+ + "\n"
+ + "7 - "
+ + GT_Values.VN[6]
+ + "\n"
+ + "8 - "
+ + GT_Values.VN[7]
+ + "\n"
+ + "9 - "
+ + GT_Values.VN[8]
+ + "\n"
+ + "10 - "
+ + GT_Values.VN[9],
+
+ // Pipe Casings
+ """
+ Valid Pipe Casings:
+
+ 1 - Bronze
+ 2 - Steel
+ 3 - Titanium
+ 4 - Tungstensteel""",
+
+ // Coils
+ """
+ Valid Coils:
+
+ 1 - Cupronickel
+ 2 - Kanthal
+ 3 - Nichrome
+ 4 - TPV-Alloy
+ 5 - HSS-G
+ 6 - HSS-S
+ 7 - Naquadah
+ 8 - Naquadah Alloy
+ 9 - Trinium
+ 10 - Fluxed Electrum""", """
+ 11 - Awakened Draconium
+ 12 - Infinity
+ 13 - Hypogen
+ 14 - Eternal""",
+
+ // Requirements
+ """
+ Multiblock Requirements:
+
+ 27x Coils
+ 18x Pipe Casings
+ 57x Tiered Machine Casings
+ 70+ Solid Casings
+ 1x Catalyst Housing (Catalysts cannot go inside an Input Bus)""",
+
+ // Construction Guide
+ """
+ Construction Guide Pt1:
+
+ Controller is placed on a middle casing in the bottom layer
+ Hatches can only be placed on the bottom layer edges""", """
+ Construction Guide Pt2:
+
+ 7x7x7 Hollow frame of solid casings
+ 5x1x5 layer of solid casings (fills in top layer)
+ 5x1x5 layer of machine casings (fills in bottom layer)""", """
+ Construction Guide Pt3:
+ In the central 3x5x3:
+ 3x1x3 layer of Coils, surrounded by ring of Machine Casings
+ 3x1x3 layer of Pipe Casings
+ 3x1x3 layer of Coils
+ 3x1x3 layer of Pipe Casings
+ 3x1x3 layer of Coils, surrounded by ring of Machine Casings""",
+
+ // Construction Guide Info
+ """
+ Information:
+
+ A = Air
+ X = Solid Casing
+ M = Machine Casing
+ P = Pipe Casing
+ C = Coil Casing""", """
+ Layer 1:
+
+ XXXXXXX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XXXXXXX""", """
+ Layer 2:
+
+ XAAAAAX
+ AMMMMMA
+ AMCCCMA
+ AMCCCMA
+ AMCCCMA
+ AMMMMMA
+ XAAAAAX""", """
+ Layer 3:
+
+ XAAAAAX
+ AAAAAAA
+ AAPPPAA
+ AAPPPAA
+ AAPPPAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 4:
+
+ XAAAAAX
+ AAAAAAA
+ AACCCAA
+ AACCCAA
+ AACCCAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 5:
+
+ XAAAAAX
+ AAAAAAA
+ AAPPPAA
+ AAPPPAA
+ AAPPPAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 6:
+
+ XAAAAAX
+ AMMMMMA
+ AMCCCMA
+ AMCCCMA
+ AMCCCMA
+ AMMMMMA
+ XAAAAAX""", """
+ Layer 7:
+
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX""", });
+ }
+
+ public static ItemStack ItemBookWritten_ThermalBoiler;
+ public static ItemStack ItemBookWritten_NuclearManual;
+ public static ItemStack ItemBookWritten_ModularBaubles;
+ public static ItemStack ItemBookWritten_MultiPowerStorage;
+ public static ItemStack ItemBookWritten_MultiMachineManual;
+ public static ItemStack ItemBookWritten_MultiChemicalPlant;
+
+ public static void runLater() {
+ ItemBookWritten_ThermalBoiler = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 0, 1);
+ ItemBookWritten_MultiPowerStorage = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 1, 1);
+ ItemBookWritten_ModularBaubles = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 2, 1);
+ ItemBookWritten_MultiMachineManual = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 3, 1);
+ ItemBookWritten_NuclearManual = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 4, 1);
+ ItemBookWritten_MultiChemicalPlant = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 5, 1);
+
+ // Multiblock Manuals
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getSimpleStack(Items.lava_bucket) },
+ ItemBookWritten_ThermalBoiler);
+ GT_ModHandler.addCraftingRecipe(
+ ItemBookWritten_MultiMachineManual,
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "Xw", 'X', ItemUtils.getSimpleStack(Items.writable_book) });
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireGt01Tin", 1) },
+ ItemBookWritten_MultiPowerStorage);
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1) },
+ ItemBookWritten_NuclearManual);
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireGt01Copper", 1) },
+ ItemBookWritten_MultiChemicalPlant);
+
+ for (int i = 0; i < mBookKeeperCount; i++) {
+ ItemStack bookstack = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, i, 1);
+ GT_OreDictUnificator.registerOre("bookWritten", bookstack);
+ GT_OreDictUnificator.registerOre("craftingBook", bookstack);
+ }
+ }
+
+ private static BookTemplate writeBookTemplate(String aMapping, String aTitle, String aAuthor, String[] aPages) {
+ mBookKeeperCount++;
+ for (int i = 0; i < aPages.length; i++) {
+ aPages[i] = aPages[i].replaceAll("\n", "<BR>");
+ }
+ addBookTitleLocalization(aTitle);
+ addBookPagesLocalization(aTitle, aPages);
+ BookTemplate mTemp = new BookTemplate(mBookKeeperCount, aMapping, aTitle, aAuthor, aPages);
+ mBookMap.put(mBookKeeperCount - 1, mTemp);
+ return mTemp;
+ }
+
+ public static class BookTemplate {
+
+ public final int mMeta;
+ public final String mMapping;
+ public final String mTitle;
+ public final String mAuthor;
+ public final String[] mPages;
+
+ BookTemplate(int aMeta, String aMapping, String aTitle, String aAuthor, String[] aPages) {
+ this.mMeta = aMeta;
+ this.mMapping = aMapping;
+ this.mTitle = aTitle;
+ this.mAuthor = aAuthor;
+ this.mPages = aPages;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java b/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java
new file mode 100644
index 0000000000..8e3377b5f9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.handler;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.IFuelHandler;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BurnableFuelHandler implements IFuelHandler {
+
+ @Override
+ public int getBurnTime(ItemStack aStack) {
+ // Iterate over my burnables.
+ for (Pair<Integer, ItemStack> temp : CORE.burnables) {
+ int aStackID = Item.getIdFromItem(aStack.getItem());
+ int burnID = Item.getIdFromItem(
+ temp.getValue()
+ .getItem());
+ if (aStackID == burnID) {
+ int burn = temp.getKey();
+ ItemStack fuel = temp.getValue();
+ ItemStack testItem = ItemUtils.getSimpleStack(fuel, aStack.stackSize);
+
+ if (aStack.isItemEqual(testItem)) {
+ return burn;
+ }
+ }
+ }
+
+ // If it's not my fuel, return 0.
+ return 0;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java b/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java
new file mode 100644
index 0000000000..cf276d90a1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java
@@ -0,0 +1,299 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.Witchery;
+
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.common.compat.COMPAT_ExtraUtils;
+import gtPlusPlus.core.common.compat.COMPAT_HarvestCraft;
+import gtPlusPlus.core.common.compat.COMPAT_IC2;
+import gtPlusPlus.core.common.compat.COMPAT_Thaumcraft;
+import gtPlusPlus.core.common.compat.COMPAT_Witchery;
+import gtPlusPlus.core.handler.Recipes.LateRegistrationHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.RECIPES_GREGTECH;
+import gtPlusPlus.core.recipe.RECIPES_LaserEngraver;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_FluidCanning;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Recycling;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_ChemicalSkips;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_GTNH;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_GlueLine;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_Nuclear;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.Gregtech4Content;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAdvancedBoilers;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAlgaeContent;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAmazonWarehouse;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechBufferDynamos;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechCustomHatches;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechCyclotron;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechDehydrator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechEnergyBuffer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechFactoryGradeReplacementMultis;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechGeothermalThermalGenerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechHiAmpTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialAlloySmelter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialArcFurnace;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialBlastSmelter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCentrifuge;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialChisel;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCokeOven;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCuttingFactory;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialElectrolyzer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialElementDuplicator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialExtruder;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFishPond;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFluidHeater;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialForgeHammer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFuelRefinery;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMacerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMassFabricator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMixer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMultiMachine;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialPlatePress;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialRockBreaker;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialSifter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialThermalCentrifuge;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialTreeFarm;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialWashPlant;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialWiremill;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIsaMill;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechLFTR;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechLargeTurbinesAndHeatExchanger;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechMolecularTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechNuclearSaltProcessingPlant;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechPollutionDevices;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechPowerSubStation;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechQuantumForceTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechRTG;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechRocketFuelGenerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSemiFluidgenerators;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSimpleWasher;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSolarTower;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSteamMultis;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSuperChests;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechThaumcraftDevices;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechThreadedBuffers;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechTieredFluidTanks;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechTreeFarmerTE;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechWirelessChargers;
+
+public class COMPAT_HANDLER {
+
+ public static Queue<Object> RemoveRecipeQueue = new LinkedList<>();
+ public static Queue<ShapedRecipeObject> AddRecipeQueue = new LinkedList<>();
+ public static Boolean areInitItemsLoaded = false;
+
+ public static void registerMyModsOreDictEntries() {
+
+ Logger.INFO("Registering Materials with OreDict.");
+ // In-house
+
+ for (int i = 1; i <= 10; i++) {
+ GT_OreDictUnificator.registerOre(
+ "bufferCore_" + GT_Values.VN[i - 1],
+ new ItemStack(ItemUtils.getItemFromFQRN("miscutils:item.itemBufferCore" + i)));
+ }
+ }
+
+ public static void registerGregtechMachines() {
+ // Free IDs
+ /*
+ * --- 859 to 868 --- 911 to 940
+ */
+
+ new RECIPES_LaserEngraver();
+ GregtechEnergyBuffer.run();
+ GregtechLFTR.run();
+ GregtechNuclearSaltProcessingPlant.run();
+ GregtechIndustrialCentrifuge.run();
+ GregtechIndustrialCokeOven.run();
+ GregtechIndustrialPlatePress.run();
+ GregtechRocketFuelGenerator.run();
+ GregtechIndustrialElectrolyzer.run();
+ GregtechIndustrialMacerator.run();
+ GregtechIndustrialWiremill.run();
+ GregtechIndustrialMassFabricator.run();
+ GregtechIndustrialBlastSmelter.run();
+ GregtechQuantumForceTransformer.run();
+ GregtechPowerSubStation.run();
+ GregtechDehydrator.run();
+ GregtechAdvancedBoilers.run();
+ GregtechPollutionDevices.run();
+ GregtechTieredFluidTanks.run();
+ GregtechGeothermalThermalGenerator.run();
+ Gregtech4Content.run();
+ GregtechIndustrialFuelRefinery.run();
+ GregtechTreeFarmerTE.run();
+ GregtechIndustrialTreeFarm.run();
+ GregtechIndustrialSifter.run();
+ GregtechSimpleWasher.run();
+ GregtechRTG.run();
+ GregtechCyclotron.run();
+ GregtechHiAmpTransformer.run();
+ GregtechIndustrialThermalCentrifuge.run();
+ GregtechIndustrialWashPlant.run();
+ GregtechSemiFluidgenerators.run();
+ GregtechWirelessChargers.run();
+ GregtechIndustrialCuttingFactory.run();
+ GregtechSuperChests.run();
+ GregtechIndustrialFishPond.run();
+ GregtechIndustrialExtruder.run();
+ GregtechIndustrialMultiMachine.run();
+ GregtechBufferDynamos.run();
+ GregtechAmazonWarehouse.run();
+ GregtechFactoryGradeReplacementMultis.run();
+ GregtechThaumcraftDevices.run();
+ GregtechThreadedBuffers.run();
+ GregtechIndustrialMixer.run();
+ GregtechCustomHatches.run();
+ GregtechIndustrialArcFurnace.run();
+ GregtechSolarTower.run();
+ GregtechLargeTurbinesAndHeatExchanger.run();
+ GregtechAlgaeContent.run();
+ GregtechIndustrialAlloySmelter.run();
+ GregtechIsaMill.run();
+ GregtechSteamMultis.run();
+ GregtechIndustrialForgeHammer.run();
+ GregtechMolecularTransformer.run();
+ GregtechIndustrialElementDuplicator.run();
+ GregtechIndustrialRockBreaker.run();
+ GregtechIndustrialChisel.run();
+ GregtechIndustrialFluidHeater.run();
+ }
+
+ // InterMod
+ public static void intermodOreDictionarySupport() {
+ if (Thaumcraft.isModLoaded()) {
+ COMPAT_Thaumcraft.OreDict();
+ }
+ if (ExtraUtilities.isModLoaded()) {
+ COMPAT_ExtraUtils.OreDict();
+ }
+ if (PamsHarvestCraft.isModLoaded()) {
+ COMPAT_HarvestCraft.OreDict();
+ }
+ COMPAT_IC2.OreDict();
+ if (Witchery.isModLoaded()) {
+ COMPAT_Witchery.OreDict();
+ }
+ }
+
+ public static void RemoveRecipesFromOtherMods() {
+ // Removal of Recipes
+ for (final Object item : RemoveRecipeQueue) {
+ RecipeUtils.removeCraftingRecipe(item);
+ }
+ }
+
+ public static void InitialiseHandlerThenAddRecipes() {
+ RegistrationHandler.run();
+ }
+
+ public static void InitialiseLateHandlerThenAddRecipes() {
+ LateRegistrationHandler.run();
+ }
+
+ public static void startLoadingGregAPIBasedRecipes() {
+ // Add hand-made recipes
+ RECIPES_GREGTECH.run();
+ RecipeLoader_GTNH.generate();
+ RecipeLoader_Nuclear.generate();
+ RecipeLoader_GlueLine.generate();
+ RecipeLoader_ChemicalSkips.generate();
+ // Add autogenerated Recipes from Item Components
+ for (Set<RunnableWithInfo<Material>> m : MaterialGenerator.mRecipeMapsToGenerate) {
+ for (RunnableWithInfo<Material> r : m) {
+ try {
+ r.run();
+ Logger.INFO(
+ "[FIND] " + r.getInfoData()
+ .getLocalizedName() + " recipes generated.");
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO(
+ "[ERROR] " + r.getInfoData()
+ .getLocalizedName() + " recipes failed to generated.");
+ }
+ }
+ }
+ RecipeGen_Recycling.executeGenerators();
+ runQueuedMisc();
+
+ // Do Fluid Canning Last, because they're not executed on demand, but rather queued.
+ RecipeGen_FluidCanning.init();
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ runQueuedOnLoadComplete(event);
+ }
+
+ public static final AutoMap<RunnableWithInfo<String>> mRecipesToGenerate = new AutoMap<>();
+ public static final AutoMap<RunnableWithInfo<String>> mGtRecipesToGenerate = new AutoMap<>();
+
+ public static final AutoMap<RunnableWithInfo<String>> mObjectsToRunInPostInit = new AutoMap<>();
+ public static final AutoMap<ItemPackage> mObjectsToRunInOnLoadComplete = new AutoMap<>();
+
+ public static void runQueuedRecipes() {
+ // Add autogenerated Recipes from Item Components
+ for (RunnableWithInfo<String> m : mRecipesToGenerate) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData() + " recipe failed to generated.");
+ }
+ }
+ for (RunnableWithInfo<String> m : mGtRecipesToGenerate) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData() + " recipe failed to generated.");
+ }
+ }
+ }
+
+ public static void runQueuedMisc() {
+ for (RunnableWithInfo<String> m : mObjectsToRunInPostInit) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData());
+ }
+ }
+ }
+
+ /**
+ * Generally used to register GT recipe map changes after they've been populated.
+ */
+ public static void runQueuedOnLoadComplete(FMLLoadCompleteEvent event) {
+ for (ItemPackage m : mObjectsToRunInOnLoadComplete) {
+ try {
+ m.onLoadComplete(event);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData());
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java b/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java
new file mode 100644
index 0000000000..af09762c08
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.handler;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.recipes.RecipeRemovals;
+import gtPlusPlus.xmod.bartcrops.HANDLER_CropsPlusPlus;
+import gtPlusPlus.xmod.bop.HANDLER_BiomesOPlenty;
+import gtPlusPlus.xmod.forestry.HANDLER_FR;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+import gtPlusPlus.xmod.ic2.HANDLER_IC2;
+import gtPlusPlus.xmod.railcraft.HANDLER_Railcraft;
+import gtPlusPlus.xmod.thermalfoundation.HANDLER_TF;
+import gtPlusPlus.xmod.tinkers.HANDLER_Tinkers;
+
+public class COMPAT_IntermodStaging {
+
+ public static void preInit(FMLPreInitializationEvent preinit) {
+ HANDLER_GT.preInit();
+ HANDLER_TF.preInit();
+ HANDLER_FR.preInit();
+ HANDLER_IC2.preInit();
+ HANDLER_BiomesOPlenty.preInit();
+ HANDLER_CropsPlusPlus.preInit(preinit);
+ HANDLER_Railcraft.preInit();
+ }
+
+ public static void init(FMLInitializationEvent init) {
+ HANDLER_GT.init();
+ HANDLER_TF.init();
+ }
+
+ public static void postInit(FMLPostInitializationEvent postinit) {
+ HANDLER_GT.postInit();
+ HANDLER_TF.postInit();
+ HANDLER_FR.postInit();
+ HANDLER_IC2.postInit();
+ HANDLER_BiomesOPlenty.postInit();
+ HANDLER_Tinkers.postInit();
+ HANDLER_CropsPlusPlus.postInit(postinit);
+ HANDLER_Railcraft.postInit();
+ RecipeRemovals.postInit();
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ HANDLER_GT.onLoadComplete(event);
+ RecipeRemovals.onLoadComplete();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/GuiHandler.java b/src/main/java/gtPlusPlus/core/handler/GuiHandler.java
new file mode 100644
index 0000000000..d5d0859472
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/GuiHandler.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.core.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.IGuiHandler;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.container.Container_CircuitProgrammer;
+import gtPlusPlus.core.container.Container_DecayablesChest;
+import gtPlusPlus.core.container.Container_FishTrap;
+import gtPlusPlus.core.container.Container_PestKiller;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.container.Container_SuperJukebox;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.gui.beta.Gui_ID_Registry;
+import gtPlusPlus.core.gui.beta.MU_GuiId;
+import gtPlusPlus.core.gui.machine.GUI_CircuitProgrammer;
+import gtPlusPlus.core.gui.machine.GUI_DecayablesChest;
+import gtPlusPlus.core.gui.machine.GUI_FishTrap;
+import gtPlusPlus.core.gui.machine.GUI_PestKiller;
+import gtPlusPlus.core.gui.machine.GUI_ProjectTable;
+import gtPlusPlus.core.gui.machine.GUI_SuperJukebox;
+import gtPlusPlus.core.gui.machine.GUI_VolumetricFlaskSetter;
+import gtPlusPlus.core.interfaces.IGuiManager;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class GuiHandler implements IGuiHandler {
+
+ public static final int GUI1 = 0; // Project Table
+ public static final int GUI2 = 1; // None
+ public static final int GUI3 = 2; // None
+ public static final int GUI4 = 3; // Workbench
+ public static final int GUI5 = 4; // Workbench Adv
+ public static final int GUI6 = 5; // Fish trap
+ public static final int GUI7 = 6; // None
+ public static final int GUI8 = 7; // Circuit Programmer
+ public static final int GUI9 = 8; // None
+ public static final int GUI10 = 9; // None
+ public static final int GUI11 = 10; // None
+ public static final int GUI12 = 11; // None
+ public static final int GUI13 = 12; // Decayables Chest
+ public static final int GUI14 = 13; // Super Jukebox
+ public static final int GUI15 = 14; // Pest Killer
+ public static final int GUI16 = 15; // None
+ public static final int GUI17 = 16; // None
+ public static final int GUI18 = 17; // Volumetric Flask Setter
+
+ public static void init() {
+ Logger.INFO("Registering GUIs.");
+ NetworkRegistry.INSTANCE.registerGuiHandler(GTplusplus.instance, new GuiHandler());
+ }
+
+ @Override // ContainerModTileEntity
+ public Object getServerGuiElement(final int ID, final EntityPlayer player, final World world, final int x,
+ final int y, final int z) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+
+ if (te != null) {
+ if (ID == GUI1) {
+ return new Container_ProjectTable(player.inventory, (TileEntityProjectTable) te);
+ } else if (ID == GUI2) {}
+ }
+
+ if (te != null) {
+ if (ID == GUI5) {
+ Logger.INFO("sad");
+ // return new Container_WorkbenchAdvanced(player.inventory, (TileEntityWorkbenchAdvanced) te);
+ } else if (ID == GUI6) {
+ return new Container_FishTrap(player.inventory, (TileEntityFishTrap) te);
+ } else if (ID == GUI8) {
+ return new Container_CircuitProgrammer(player.inventory, (TileEntityCircuitProgrammer) te);
+ } else if (ID == GUI13) {
+ return new Container_DecayablesChest(player.inventory, (TileEntityDecayablesChest) te);
+ } else if (ID == GUI14) {
+ return new Container_SuperJukebox(player.inventory, (TileEntitySuperJukebox) te);
+ } else if (ID == GUI15) {
+ return new Container_PestKiller(player.inventory, (TileEntityPestKiller) te);
+ } else if (ID == GUI18) {
+ return new Container_VolumetricFlaskSetter(player.inventory, (TileEntityVolumetricFlaskSetter) te);
+ }
+ }
+
+ return null;
+ }
+
+ @Override // GuiModTileEntity
+ public Object getClientGuiElement(final int ID, final EntityPlayer player, final World world, final int x,
+ final int y, final int z) {
+ Logger.WARNING(
+ "getClientGuiElement Called by: " + player
+ + ", in world: "
+ + player.dimension
+ + " at x:"
+ + x
+ + ", y:"
+ + y
+ + ", z:"
+ + z
+ + ".");
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (te != null) {
+ if (ID == GUI1) {
+ return new GUI_ProjectTable(player.inventory, (TileEntityProjectTable) te);
+ }
+ }
+
+ if (te != null) {
+ if (ID == GUI6) {
+ return new GUI_FishTrap(player.inventory, (TileEntityFishTrap) te);
+ } else if (ID == GUI8) {
+ return new GUI_CircuitProgrammer(player.inventory, (TileEntityCircuitProgrammer) te);
+ } else if (ID == GUI13) {
+ return new GUI_DecayablesChest(player.inventory, (TileEntityDecayablesChest) te);
+ } else if (ID == GUI14) {
+ return new GUI_SuperJukebox(player.inventory, (TileEntitySuperJukebox) te);
+ } else if (ID == GUI15) {
+ return new GUI_PestKiller(player.inventory, (TileEntityPestKiller) te);
+ } else if (ID == GUI18) {
+ return new GUI_VolumetricFlaskSetter(
+ new Container_VolumetricFlaskSetter(player.inventory, (TileEntityVolumetricFlaskSetter) te));
+ }
+ }
+
+ return null;
+ }
+
+ // New Methods
+ public static void openGui(final EntityPlayer entityplayer, final IGuiManager guiHandler) {
+ openGui(entityplayer, guiHandler, (short) 0);
+ }
+
+ public static void openGui(final EntityPlayer entityplayer, final IGuiManager guiHandler, final short data) {
+ final int guiData = encodeGuiData(guiHandler, data);
+ final ChunkCoordinates coordinates = guiHandler.getCoordinates();
+ entityplayer.openGui(
+ GTplusplus.instance,
+ guiData,
+ entityplayer.worldObj,
+ coordinates.posX,
+ coordinates.posY,
+ coordinates.posZ);
+ }
+
+ private static int encodeGuiData(final IGuiManager guiHandler, final short data) {
+ final MU_GuiId guiId = Gui_ID_Registry.getGuiIdForGuiHandler(guiHandler);
+ return (data << 16) | guiId.getId();
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/PacketHandler.java b/src/main/java/gtPlusPlus/core/handler/PacketHandler.java
new file mode 100644
index 0000000000..af6a376f1a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/PacketHandler.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+
+import cpw.mods.fml.common.network.NetworkRegistry;
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractClientMessageHandler;
+import gtPlusPlus.core.network.packet.AbstractPacket;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui2;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class PacketHandler {
+
+ private static byte packetId = 0;
+
+ private static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(GTPlusPlus.ID);
+
+ public static final void init() {
+ registerMessage(Packet_VolumetricFlaskGui.class, Packet_VolumetricFlaskGui.class);
+ registerMessage(Packet_VolumetricFlaskGui2.class, Packet_VolumetricFlaskGui2.class);
+ }
+
+ /**
+ * Registers a message and message handler
+ */
+ private static void registerMessage(Class handlerClass, Class messageClass) {
+ Side side = AbstractClientMessageHandler.class.isAssignableFrom(handlerClass) ? Side.CLIENT : Side.SERVER;
+ registerMessage(handlerClass, messageClass, side);
+ }
+
+ private static void registerMessage(Class handlerClass, Class messageClass, Side side) {
+ INSTANCE.registerMessage(handlerClass, messageClass, packetId++, side);
+ if (AbstractPacket.class.isInstance(messageClass.getClass())) {
+ AbstractPacket aPacket = ReflectionUtils.createNewInstanceFromConstructor(
+ ReflectionUtils.getConstructor(messageClass, new Class[] {}),
+ new Object[] {});
+ if (aPacket != null) {
+ Logger.INFO("Registered Packet: " + aPacket.getPacketName());
+ }
+ }
+ }
+
+ /**
+ * Send this message to the specified player. See {@link SimpleNetworkWrapper#sendTo(IMessage, EntityPlayerMP)}
+ */
+ public static final void sendTo(IMessage message, EntityPlayerMP player) {
+ INSTANCE.sendTo(message, player);
+ }
+
+ /**
+ * Send this message to everyone within a certain range of a point. See
+ * {@link SimpleNetworkWrapper#sendToDimension(IMessage, NetworkRegistry.TargetPoint)}
+ */
+ public static final void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) {
+ INSTANCE.sendToAllAround(message, point);
+ }
+
+ /**
+ * Sends a message to everyone within a certain range of the coordinates in the same dimension.
+ */
+ public static final void sendToAllAround(IMessage message, int dimension, double x, double y, double z,
+ double range) {
+ sendToAllAround(message, new NetworkRegistry.TargetPoint(dimension, x, y, z, range));
+ }
+
+ /**
+ * Sends a message to everyone within a certain range of the player provided.
+ */
+ public static final void sendToAllAround(IMessage message, EntityPlayer player, double range) {
+ sendToAllAround(message, player.worldObj.provider.dimensionId, player.posX, player.posY, player.posZ, range);
+ }
+
+ /**
+ * Send this message to everyone within the supplied dimension. See
+ * {@link SimpleNetworkWrapper#sendToDimension(IMessage, int)}
+ */
+ public static final void sendToDimension(IMessage message, int dimensionId) {
+ INSTANCE.sendToDimension(message, dimensionId);
+ }
+
+ /**
+ * Send this message to the server. See {@link SimpleNetworkWrapper#sendToServer(IMessage)}
+ */
+ public static final void sendToServer(IMessage message) {
+ INSTANCE.sendToServer(message);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java b/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java
new file mode 100644
index 0000000000..e50a76d5d5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class DecayableRecipe {
+
+ public static final AutoMap<DecayableRecipe> mRecipes = new AutoMap<>();
+
+ public final int mTime;
+ public final ItemStack mInput;
+ public final ItemStack mOutput;
+
+ public DecayableRecipe(int time, ItemStack input, ItemStack output) {
+ mTime = time;
+ mInput = input;
+ mOutput = output;
+ mRecipes.put(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof DecayableRecipe i) {
+ if (i.mTime == this.mTime && GT_Utility.areStacksEqual(mInput, i.mInput)
+ && GT_Utility.areStacksEqual(mOutput, i.mOutput)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isValid() {
+ return (mTime > 0 && ItemUtils.checkForInvalidItems(mInput) && ItemUtils.checkForInvalidItems(mOutput));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java b/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java
new file mode 100644
index 0000000000..9eb3a1826e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java
@@ -0,0 +1,27 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+
+public class LateRegistrationHandler {
+
+ public static int recipesSuccess = 0;
+ public static int recipesFailed = 0;
+
+ public static void run() {
+ init();
+ }
+
+ private static void init() {
+ for (final ShapedRecipeObject item : COMPAT_HANDLER.AddRecipeQueue) {
+ item.buildRecipe();
+ }
+ try {
+ Thread.sleep(10);
+ } catch (final InterruptedException e) {
+ Logger.INFO(e.toString());
+ }
+ Logger.INFO("Late Recipes Loaded: " + recipesSuccess + " Failed: " + recipesFailed);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java b/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java
new file mode 100644
index 0000000000..abf7300f7a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.RECIPES_General;
+import gtPlusPlus.core.recipe.RECIPES_Machines;
+import gtPlusPlus.core.recipe.RECIPE_Batteries;
+
+public class RegistrationHandler {
+
+ public static int recipesSuccess = 0;
+ public static int recipesFailed = 0;
+
+ public static void run() {
+ init();
+ }
+
+ private static void init() {
+ RECIPES_General.loadRecipes();
+ RECIPES_Machines.loadRecipes();
+ RECIPE_Batteries.loadRecipes();
+ Logger.INFO("Loaded: " + recipesSuccess + " Failed: " + recipesFailed);
+ COMPAT_HANDLER.areInitItemsLoaded = true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java b/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java
new file mode 100644
index 0000000000..390efe0b35
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java
@@ -0,0 +1,144 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.util.MovementInputFromOptions;
+
+/*
+ * Replacement for MovementInputFromOptions - Built from the source of ToggleSneak 3.0.3
+ */
+
+public class CustomMovementHandler {
+
+ public boolean isDisabled;
+ public boolean canDoubleTap;
+
+ public boolean sprint = false;
+ public boolean sprintHeldAndReleased = false;
+ public boolean sprintDoubleTapped = false;
+
+ private long lastPressed;
+ private long lastSprintPressed;
+ private boolean handledSneakPress;
+ private boolean handledSprintPress;
+ private boolean wasRiding;
+
+ /*
+ * MovementInputFromOptions.updatePlayerMoveState()
+ */
+ public void update(final Minecraft mc, final MovementInputFromOptions options, final EntityPlayerSP thisPlayer) {
+ options.moveStrafe = 0.0F;
+ options.moveForward = 0.0F;
+
+ final GameSettings settings = mc.gameSettings;
+
+ if (settings.keyBindForward.getIsKeyPressed()) {
+ ++options.moveForward;
+ }
+
+ if (settings.keyBindBack.getIsKeyPressed()) {
+ --options.moveForward;
+ }
+
+ if (settings.keyBindLeft.getIsKeyPressed()) {
+ ++options.moveStrafe;
+ }
+
+ if (settings.keyBindRight.getIsKeyPressed()) {
+ --options.moveStrafe;
+ }
+
+ options.jump = settings.keyBindJump.getIsKeyPressed();
+
+ //
+ // Sneak Toggle - Essentially the same as old ToggleSneak
+ //
+
+ // Check to see if Enabled - Added 6/17/14 to provide option to disable Sneak Toggle
+ final boolean isSneaking = SneakManager.get(thisPlayer)
+ .Sneaking();
+ if (isSneaking) {
+ // Key Pressed
+ if (settings.keyBindSneak.getIsKeyPressed() && !this.handledSneakPress) {
+ // Descend if we are flying, note if we were riding (so we can unsneak once dismounted)
+ if (thisPlayer.isRiding() || thisPlayer.capabilities.isFlying) {
+ options.sneak = true;
+ this.wasRiding = thisPlayer.isRiding();
+ } else {
+ options.sneak = !options.sneak;
+ }
+
+ this.lastPressed = System.currentTimeMillis();
+ this.handledSneakPress = true;
+ }
+
+ // Key Released
+ if (!settings.keyBindSneak.getIsKeyPressed() && this.handledSneakPress) {
+ // If we are flying or riding, stop sneaking after descent/dismount.
+ if (thisPlayer.capabilities.isFlying || this.wasRiding) {
+ options.sneak = false;
+ this.wasRiding = false;
+ }
+ // If the key was held down for more than 300ms, stop sneaking upon release.
+ else if ((System.currentTimeMillis() - this.lastPressed) > 300L) {
+ options.sneak = false;
+ }
+
+ this.handledSneakPress = false;
+ }
+ } else {
+ options.sneak = settings.keyBindSneak.getIsKeyPressed();
+ }
+
+ if (options.sneak || SneakManager.get(thisPlayer)
+ .Sneaking()) {
+ options.moveStrafe = (float) (options.moveStrafe * 0.3D);
+ options.moveForward = (float) (options.moveForward * 0.3D);
+ }
+
+ //
+ // Sprint Toggle - Updated 6/18/2014
+ //
+
+ // Establish conditions where we don't want to start a sprint - sneaking, riding, flying, hungry
+ final boolean enoughHunger = (thisPlayer.getFoodStats()
+ .getFoodLevel() > 6.0F) || thisPlayer.capabilities.isFlying;
+ final boolean canSprint = !options.sneak && !thisPlayer.isRiding()
+ && !thisPlayer.capabilities.isFlying
+ && enoughHunger;
+
+ this.isDisabled = !SneakManager.get(thisPlayer)
+ .Sprinting();
+ this.canDoubleTap = SneakManager.get(thisPlayer).optionDoubleTap;
+
+ // Key Pressed
+ if ((canSprint || this.isDisabled) && settings.keyBindSprint.getIsKeyPressed() && !this.handledSprintPress) {
+ if (!this.isDisabled) {
+ this.sprint = !this.sprint;
+ this.lastSprintPressed = System.currentTimeMillis();
+ this.handledSprintPress = true;
+ this.sprintHeldAndReleased = false;
+ }
+ }
+
+ // Key Released
+ if ((canSprint || this.isDisabled) && !settings.keyBindSprint.getIsKeyPressed() && this.handledSprintPress) {
+ // Was key held for longer than 300ms? If so, mark it so we can resume vanilla behavior
+ if ((System.currentTimeMillis() - this.lastSprintPressed) > 300L) {
+ this.sprintHeldAndReleased = true;
+ }
+ this.handledSprintPress = false;
+ }
+ }
+
+ public void UpdateSprint(final boolean newValue, final boolean doubleTapped, SneakManager aSneak) {
+ if (!aSneak.Sprinting()) {
+ this.sprint = false;
+ this.sprintDoubleTapped = doubleTapped;
+ } else {
+ this.sprint = newValue;
+ this.sprintDoubleTapped = doubleTapped;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java b/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java
new file mode 100644
index 0000000000..07b027faa1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraftforge.event.entity.living.LivingDropsEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class EnderDragonDeathHandler {
+
+ private static final String mDragonClassName = "chylex.hee.entity.boss.EntityBossDragon";
+ private static final boolean mHEE;
+ private static final Class mHardcoreDragonClass;
+
+ private static final String mChaosDragonClassName = "com.brandon3055.draconicevolution.common.entity.EntityCustomDragon";
+ private static final boolean mDE;
+ private static final Class mChaoseDragonClass;
+
+ static {
+ mHEE = ReflectionUtils.doesClassExist(mDragonClassName);
+ mHardcoreDragonClass = (mHEE ? ReflectionUtils.getClass(mDragonClassName) : null);
+ mDE = ReflectionUtils.doesClassExist(mChaosDragonClassName);
+ mChaoseDragonClass = (mDE ? ReflectionUtils.getClass(mChaosDragonClassName) : null);
+ }
+
+ @SubscribeEvent
+ public void onEntityDrop(LivingDropsEvent event) {
+
+ int aCountTotal = 0;
+
+ if (mHEE && mHardcoreDragonClass != null && mHardcoreDragonClass.isInstance(event.entityLiving)) {
+ for (int y = 0; y < MathUtils.randInt(100, 250); y++) {
+ int aAmount = MathUtils.randInt(5, 25);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getNugget(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ } else if (mDE && mChaoseDragonClass != null && mChaoseDragonClass.isInstance(event.entityLiving)) {
+ for (int y = 0; y < MathUtils.randInt(100, 200); y++) {
+ int aAmount = MathUtils.randInt(1, 5);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getIngot(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ } else if (event.entityLiving instanceof EntityDragon) {
+ for (int y = 0; y < MathUtils.randInt(25, 50); y++) {
+ int aAmount = MathUtils.randInt(1, 10);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getNugget(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ }
+ if (aCountTotal > 0) {
+ PlayerUtils
+ .messageAllPlayers(aCountTotal + " Shards of Dragons Blood have crystalized into a metallic form.");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java b/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java
new file mode 100644
index 0000000000..20d64f2b36
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.core.handler.events;
+
+import java.util.HashMap;
+import java.util.HashSet;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.event.entity.living.LivingDropsEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Triplet;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class EntityDeathHandler {
+
+ private static final HashMap<Class, AutoMap<Triplet<ItemStack, Integer, Integer>>> mMobDropMap = new HashMap<>();
+ private static final HashSet<Class> mInternalClassKeyCache = new HashSet<>();
+
+ /**
+ * Provides the ability to provide custom drops upon the death of EntityLivingBase objects.
+ *
+ * @param aMobClass - The Base Class you want to drop this item.
+ * @param aStack - The ItemStack, stack size is not respected.
+ * @param aMaxAmount - The maximum size of the ItemStack which drops.
+ * @param aChance - Chance out of 10000, where 100 is 1%. (1 = 0.01% - this is ok)
+ */
+ public static void registerDropsForMob(Class aMobClass, ItemStack aStack, int aMaxAmount, int aChance) {
+ Triplet<ItemStack, Integer, Integer> aData = new Triplet<>(aStack, aMaxAmount, aChance);
+ AutoMap<Triplet<ItemStack, Integer, Integer>> aDataMap = mMobDropMap.get(aMobClass);
+ if (aDataMap == null) {
+ aDataMap = new AutoMap<>();
+ }
+ aDataMap.put(aData);
+ mMobDropMap.put(aMobClass, aDataMap);
+
+ Logger.INFO(
+ "[Loot] Registered " + aStack
+ .getDisplayName() + " (1-" + aMaxAmount + ") as a valid drop for " + aMobClass.getCanonicalName());
+
+ mInternalClassKeyCache.add(aMobClass);
+ }
+
+ private static ItemStack processItemDropTriplet(Triplet<ItemStack, Integer, Integer> aData) {
+ ItemStack aLoot = aData.getValue_1();
+ int aMaxDrop = aData.getValue_2();
+ int aChanceOutOf10000 = aData.getValue_3();
+ if (MathUtils.randInt(0, 10000) <= aChanceOutOf10000) {
+ aLoot = ItemUtils.getSimpleStack(aLoot, MathUtils.randInt(1, aMaxDrop));
+ if (ItemUtils.checkForInvalidItems(aLoot)) {
+ return aLoot;
+ }
+ }
+ return null;
+ }
+
+ private static boolean processDropsForMob(EntityLivingBase entityLiving) {
+ AutoMap<Triplet<ItemStack, Integer, Integer>> aMobData = mMobDropMap.get(entityLiving.getClass());
+ boolean aDidDrop = false;
+ if (aMobData != null) {
+ if (!aMobData.isEmpty()) {
+ ItemStack aPossibleDrop;
+ for (Triplet<ItemStack, Integer, Integer> g : aMobData) {
+ aPossibleDrop = processItemDropTriplet(g);
+ if (aPossibleDrop != null) {
+ if (entityLiving.entityDropItem(aPossibleDrop, MathUtils.randFloat(0, 1)) != null) {
+ aDidDrop = true;
+ }
+ }
+ }
+ }
+ }
+ return aDidDrop;
+ }
+
+ private static void dropMeatFromPlayer(EntityPlayer aPlayer) {
+
+ // always drop some meat.
+ int aBigMeatStackSize1 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize1),
+ MathUtils.randInt(0, 1));
+
+ // additional chances for more meat.
+ if (MathUtils.randInt(0, 10) < 7) {
+ int aBigMeatStackSize2 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize2),
+ MathUtils.randInt(0, 1));
+ }
+ if (MathUtils.randInt(0, 10) < 4) {
+ int aBigMeatStackSize3 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize3),
+ MathUtils.randInt(0, 1));
+ }
+ if (MathUtils.randInt(0, 10) < 2) {
+ int aBigMeatStackSize4 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize4),
+ MathUtils.randInt(0, 1));
+ }
+ }
+
+ @SubscribeEvent
+ public void onEntityDrop(LivingDropsEvent event) {
+ if (event == null || event.entityLiving == null) {
+ return;
+ }
+ if (PlayerUtils.isRealPlayer(event.entityLiving)) {
+ EntityPlayer aPlayer = (EntityPlayer) event.entityLiving;
+ dropMeatFromPlayer(aPlayer);
+ } else {
+ for (Class<?> c : mInternalClassKeyCache) {
+ if (c.isInstance(event.entityLiving)) {
+ processDropsForMob(event.entityLiving);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java b/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java
new file mode 100644
index 0000000000..650fd70efd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.item.Item;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+
+import advsolar.common.AdvancedSolarPanel;
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enums.Mods;
+
+public class GeneralTooltipEventHandler {
+
+ @Optional.Method(modid = Mods.Names.ADVANCED_SOLAR_PANEL)
+ @SuppressWarnings("unused")
+ public static void molecularTransformer(ItemTooltipEvent event) {
+ if (event.itemStack.getItem() == Item.getItemFromBlock(AdvancedSolarPanel.blockMolecularTransformer)) {
+ event.toolTip.add("" + EnumChatFormatting.RED + "Disabled, Use the multiblock");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java b/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java
new file mode 100644
index 0000000000..0ca315cc72
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.core.handler.events;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
+import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.potion.GtPotionEffect;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class PlayerSleepEventHandler {
+
+ private static Field sEffectDuration = ReflectionUtils
+ .getField(PotionEffect.class, !CORE_Preloader.DEV_ENVIRONMENT ? "field_76460_b" : "duration");
+ private static ArrayList<Potion> sPositiveEffects = new ArrayList<>();
+ private static ArrayList<Potion> sNegativeEffects = new ArrayList<>();
+
+ public static void init() {
+ Utils.registerEvent(new PlayerSleepEventHandler());
+ sPositiveEffects.add(Potion.moveSpeed);
+ sPositiveEffects.add(Potion.waterBreathing);
+ sPositiveEffects.add(Potion.resistance);
+ sPositiveEffects.add(Potion.regeneration);
+ sPositiveEffects.add(Potion.damageBoost);
+ sPositiveEffects.add(Potion.digSpeed);
+ sPositiveEffects.add(Potion.fireResistance);
+ sPositiveEffects.add(Potion.field_76434_w); // Health Boost
+ sPositiveEffects.add(Potion.field_76444_x); // Absorption
+ sNegativeEffects.add(Potion.blindness);
+ sNegativeEffects.add(Potion.confusion);
+ sNegativeEffects.add(Potion.digSlowdown);
+ sNegativeEffects.add(Potion.harm);
+ sNegativeEffects.add(Potion.hunger);
+ sNegativeEffects.add(Potion.moveSlowdown);
+ sNegativeEffects.add(Potion.poison);
+ sNegativeEffects.add(Potion.weakness);
+ sNegativeEffects.add(Potion.wither);
+ }
+
+ @SubscribeEvent
+ public void sleep(PlayerSleepInBedEvent event) {}
+
+ @SubscribeEvent
+ public void wake(PlayerWakeUpEvent event) {
+ EntityPlayer aPlayer = event.entityPlayer;
+ if (aPlayer != null && !aPlayer.worldObj.isRemote) {
+ if (event.entityPlayer.getEntityWorld()
+ .getWorldTime() % 24000 != 0) {
+ return;
+ }
+ boolean aRemovedBad = false;
+ try {
+ Collection<PotionEffect> aActive = aPlayer.getActivePotionEffects();
+ for (PotionEffect aEffect : aActive) {
+ for (Potion aBadPotion : sNegativeEffects) {
+ if (aEffect.getPotionID() == aBadPotion.getId()) {
+ ReflectionUtils.setField(aEffect, sEffectDuration, 1);
+ aRemovedBad = true;
+ Logger.INFO("Set duration of " + aEffect.getEffectName() + " to 1 tick");
+ }
+ }
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ if (aRemovedBad) {
+ messagePlayer(aPlayer, "sleep.event.downsides");
+ } else {
+ // Try Heal
+ float aCurrentHP = aPlayer.getHealth();
+ float aMaxHP = aPlayer.getMaxHealth();
+ if (aCurrentHP < aMaxHP) {
+ float aDamage = aMaxHP - aCurrentHP;
+ float aToHeal = MathUtils.randFloat(1, aDamage);
+ if (aToHeal > 0) {
+ aPlayer.heal(aToHeal);
+ messagePlayer(aPlayer, (aToHeal >= aDamage / 2 ? "sleep.event.good" : "sleep.event.okay"));
+ }
+ }
+ // Already healed, try give a buff
+ else {
+ int aRandomBuff = MathUtils.randInt(0, sPositiveEffects.size() - 1);
+ Potion aPotionToApply = sPositiveEffects.get(aRandomBuff);
+ if (aPotionToApply != null) {
+ aPlayer.addPotionEffect(
+ new GtPotionEffect(aPotionToApply.id, MathUtils.randInt(60, 180), MathUtils.randInt(0, 2)));
+ messagePlayer(aPlayer, "sleep.event.wellrested");
+ }
+ }
+ }
+ }
+ }
+
+ private static void messagePlayer(EntityPlayer aPlayer, String aChatKey) {
+ PlayerUtils.messagePlayer(aPlayer, new ChatComponentTranslation(aChatKey, new Object[0]));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java b/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java
new file mode 100644
index 0000000000..7af831c675
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.core.handler.events;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class SneakManager {
+
+ // We make this a singleton for clientside data storage.
+
+ public static ConcurrentHashMap<String, SneakManager> mPlayerCache = new ConcurrentHashMap<>();
+
+ private static void addPlayer(EntityPlayer aPlayer) {
+ String aKey = getKey(aPlayer);
+ if (!mPlayerCache.containsKey(aKey)) {
+ mPlayerCache.put(aKey, new SneakManager(aPlayer));
+ }
+ }
+
+ public static SneakManager get(EntityPlayer aPlayer) {
+
+ String aKey = getKey(aPlayer);
+ if (!mPlayerCache.containsKey(aKey)) {
+ addPlayer(aPlayer);
+ }
+ return mPlayerCache.get(aKey);
+ }
+
+ private static String getKey(EntityPlayer aPlayer) {
+ return "" + aPlayer.getGameProfile()
+ .getId()
+ .toString();
+ }
+
+ public SneakManager instance;
+ public EntityPlayer owner;
+ public boolean canSprint = true;
+ public boolean isSneaking = true;
+ public boolean optionDoubleTap = true;
+ public boolean wasSprintDisabled = false;
+ public boolean mIsWearingRing = false;
+
+ private State Sprinting = State.ON;
+ private State Crouching = State.OFF;
+
+ public SneakManager(EntityPlayer aPlayer) {
+ owner = aPlayer;
+ }
+
+ public boolean Sneaking() {
+ return Crouching.getState();
+ }
+
+ public boolean Sprinting() {
+ return Sprinting.getState();
+ }
+
+ public State getSneakingState() {
+ return Crouching;
+ }
+
+ public State getSprintingDisabledState() {
+ return Sprinting;
+ }
+
+ public void toggleSneaking() {
+ toggleState(Crouching);
+ }
+
+ public void toggleSprinting() {
+ toggleState(Sprinting);
+ }
+
+ private State toggleState(final State state) {
+ Logger.INFO("State Toggle");
+ if (state == State.ON) {
+ return State.OFF;
+ }
+ return State.ON;
+ }
+
+ private State setCrouchingStateON() {
+ return Crouching = State.ON;
+ }
+
+ private State setCrouchingStateOFF() {
+ return Crouching = State.OFF;
+ }
+
+ private State setSprintingStateON() {
+ return Sprinting = State.ON;
+ }
+
+ private State setSprintingStateOFF() {
+ return Sprinting = State.OFF;
+ }
+
+ public void putRingOn() {
+ mIsWearingRing = true;
+ setSprintingStateOFF();
+ setCrouchingStateON();
+ }
+
+ public void takeRingOff() {
+ mIsWearingRing = false;
+ setSprintingStateON();
+ setCrouchingStateOFF();
+ }
+
+ public boolean isWearingRing() {
+ return mIsWearingRing;
+ }
+
+ public static enum State {
+
+ ON(true),
+ OFF(false);
+
+ private final boolean STATE;
+
+ private State(final boolean State) {
+ this.STATE = State;
+ }
+
+ public boolean getState() {
+ return this.STATE;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java b/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java
new file mode 100644
index 0000000000..6933c0f82d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java
@@ -0,0 +1,161 @@
+package gtPlusPlus.core.handler.workbench;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapedRecipes;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraft.world.World;
+
+public class Workbench_CraftingHandler {
+
+ private static final Workbench_CraftingHandler instance = new Workbench_CraftingHandler();
+ private final List<IRecipe> recipes = new ArrayList<>();
+
+ public static final Workbench_CraftingHandler getInstance() {
+ return instance;
+ }
+
+ public Workbench_CraftingHandler() {
+
+ // just a example recipe so you know how to add them
+ this.addRecipe(
+ new ItemStack(Blocks.iron_block),
+ new Object[] { "###", "###", "###", Character.valueOf('#'), Items.iron_ingot });
+
+ // another example Recipe, but shapeless
+ this.addShapelessRecipe(new ItemStack(Items.cake), new Object[] { Items.stick });
+ }
+
+ void addRecipe(final ItemStack par1ItemStack, final Object par2ArrayOfObj[]) {
+ String s = "";
+ int i = 0;
+ int j = 0;
+ int k = 0;
+
+ if (par2ArrayOfObj[i] instanceof String[]) {
+ final String as[] = (String[]) par2ArrayOfObj[i++];
+
+ for (final String s2 : as) {
+ k++;
+ j = s2.length();
+ s = (new StringBuilder()).append(s)
+ .append(s2)
+ .toString();
+ }
+ } else {
+ while (par2ArrayOfObj[i] instanceof String) {
+ final String s1 = (String) par2ArrayOfObj[i++];
+ k++;
+ j = s1.length();
+ s = (new StringBuilder()).append(s)
+ .append(s1)
+ .toString();
+ }
+ }
+
+ final HashMap<Character, ItemStack> hashmap = new HashMap<>();
+
+ for (; i < par2ArrayOfObj.length; i += 2) {
+ final Character character = (Character) par2ArrayOfObj[i];
+ ItemStack itemstack = null;
+
+ if (par2ArrayOfObj[i + 1] instanceof Item) {
+ itemstack = new ItemStack((Item) par2ArrayOfObj[i + 1]);
+ } else if (par2ArrayOfObj[i + 1] instanceof Block) {
+ itemstack = new ItemStack((Block) par2ArrayOfObj[i + 1], 1, -1);
+ } else if (par2ArrayOfObj[i + 1] instanceof ItemStack) {
+ itemstack = (ItemStack) par2ArrayOfObj[i + 1];
+ }
+
+ hashmap.put(character, itemstack);
+ }
+
+ final ItemStack aitemstack[] = new ItemStack[j * k];
+
+ for (int i1 = 0; i1 < (j * k); i1++) {
+ final char c = s.charAt(i1);
+
+ if (hashmap.containsKey(Character.valueOf(c))) {
+ aitemstack[i1] = hashmap.get(Character.valueOf(c))
+ .copy();
+ } else {
+ aitemstack[i1] = null;
+ }
+ }
+
+ this.recipes.add(new ShapedRecipes(j, k, aitemstack, par1ItemStack));
+ }
+
+ public void addShapelessRecipe(final ItemStack par1ItemStack, final Object par2ArrayOfObj[]) {
+ final ArrayList<ItemStack> arraylist = new ArrayList<>();
+ final Object aobj[] = par2ArrayOfObj;
+ final int i = aobj.length;
+
+ for (final Object obj : aobj) {
+ if (obj instanceof ItemStack) {
+ arraylist.add(((ItemStack) obj).copy());
+ continue;
+ }
+
+ if (obj instanceof Item) {
+ arraylist.add(new ItemStack((Item) obj));
+ continue;
+ }
+
+ if (obj instanceof Block) {
+ arraylist.add(new ItemStack((Block) obj));
+ } else {
+ throw new RuntimeException("Invalid shapeless recipe!");
+ }
+ }
+
+ this.recipes.add(new ShapelessRecipes(par1ItemStack, arraylist));
+ }
+
+ public ItemStack findMatchingRecipe(final InventoryCrafting par1InventoryCrafting, final World par2World) {
+ int i = 0;
+ for (int j = 0; j < par1InventoryCrafting.getSizeInventory(); j++) {
+ final ItemStack itemstack2 = par1InventoryCrafting.getStackInSlot(j);
+
+ if (itemstack2 == null) {
+ continue;
+ }
+
+ if (i == 0) {}
+
+ if (i == 1) {}
+
+ i++;
+ }
+
+ // TODO - Update from itemIDs
+ /*
+ * if (i == 2 && itemstack.itemID == itemstack1.itemID && itemstack.stackSize == 1 && itemstack1.stackSize == 1
+ * && Item.itemsList[itemstack.itemID].isDamageable()) { Item item = Item.itemsList[itemstack.itemID]; int l =
+ * item.getMaxDamage() - itemstack.getItemDamageForDisplay(); int i1 = item.getMaxDamage() -
+ * itemstack1.getItemDamageForDisplay(); int j1 = l + i1 + (item.getMaxDamage() * 10) / 100; int k1 =
+ * item.getMaxDamage() - j1; if (k1 < 0) { k1 = 0; } return new ItemStack(itemstack.itemID, 1, k1); }
+ */
+
+ for (final IRecipe irecipe : this.recipes) {
+ if (irecipe.matches(par1InventoryCrafting, par2World)) {
+ return irecipe.getCraftingResult(par1InventoryCrafting);
+ }
+ }
+
+ return null;
+ }
+
+ public List<IRecipe> getRecipeList() {
+ return this.recipes;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java b/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java
new file mode 100644
index 0000000000..599ed6b59b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.core.interfaces;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+public abstract interface IGuiManager extends IGuiManagerMiscUtils {
+
+ public abstract ChunkCoordinates getCoordinates();
+
+ public abstract World getWorld();
+
+ public abstract Object getGui(EntityPlayer paramEntityPlayer, int paramInt);
+
+ public abstract Object getContainer(EntityPlayer paramEntityPlayer, int paramInt);
+}
diff --git a/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java b/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java
new file mode 100644
index 0000000000..f7f1194b9a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java
@@ -0,0 +1,4 @@
+package gtPlusPlus.core.interfaces;
+
+public abstract interface IGuiManagerMiscUtils {
+}
diff --git a/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java b/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java
new file mode 100644
index 0000000000..b0fa752f3f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.interfaces;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public interface IItemBlueprint {
+
+ /**
+ * The inventory size for the blueprint~
+ */
+ public int INV_SIZE = 9;
+
+ /**
+ * Meta Compatible function to allow meta items to be blueprints
+ *
+ * @param stack yourMetaItem
+ * @return true if it is a Blueprint
+ */
+ public boolean isBlueprint(ItemStack stack);
+
+ /**
+ * Sets the blueprint for this itemstack.
+ *
+ * @param stack yourMetaItem
+ * @return true if blueprint is set successfully
+ */
+ public boolean setBlueprint(ItemStack stack, IInventory craftingTable, ItemStack output);
+
+ /**
+ * Sets the name of the recipe/blueprint
+ *
+ * @param String Blueprint Name
+ * @return N/A
+ */
+ public void setBlueprintName(ItemStack stack, String name);
+
+ /**
+ * Does this itemstack hold a blueprint?
+ *
+ * @param stack yourMetaItem
+ * @return true if is holding a Blueprint
+ */
+ public boolean hasBlueprint(ItemStack stack);
+
+ /**
+ * Gets the recipe held by the item
+ *
+ * @param stack yourMetaItem
+ * @return the blueprints contents
+ */
+ public ItemStack[] getBlueprint(ItemStack stack);
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java b/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java
new file mode 100644
index 0000000000..180df60e81
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gtPlusPlus.core.slots.SlotIntegratedCircuit;
+
+public class InventoryCircuitProgrammer implements IInventory {
+
+ private final String name = "Circuit Programmer";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 26;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return SlotIntegratedCircuit.isItemValidForSlot(itemstack);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java b/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java
new file mode 100644
index 0000000000..e4797d67bc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryFishTrap implements IInventory {
+
+ private final String name = "Fishtrap";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java b/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java
new file mode 100644
index 0000000000..b508de1d6d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryPestKiller implements IInventory {
+
+ private final String name = "Pest Killer";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 3;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java b/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java
new file mode 100644
index 0000000000..83b3631fe9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class Inventory_DecayablesChest implements IInventory {
+
+ private final String name = "DecayablesChest";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java b/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java
new file mode 100644
index 0000000000..04a95a4f9a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class Inventory_EggBox implements IInventory {
+
+ private final String name = "EggBox";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java b/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java
new file mode 100644
index 0000000000..bd44e89776
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class Inventory_SuperJukebox implements IInventory {
+
+ private final String name = "Sir Mixalot";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 21;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java b/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..25a03aa212
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.inventories;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class Inventory_VolumetricFlaskSetter implements IInventory {
+
+ private final String name = "Volumetric Flask Setter";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 16;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return VolumetricFlaskHelper.isVolumetricFlask(itemstack);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java b/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java
new file mode 100644
index 0000000000..40e848dc3c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.core.inventories.projecttable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryProjectMain implements IInventory {
+
+ private final String name = "Inventory Grid";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryProjectMain() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ // Utils.LOG_INFO("getStackInSlot["+slot+"]");
+ try {
+ if (slot >= this.inventory.length) {
+ // Utils.LOG_INFO("Returning invalid slot item.");
+ return null;
+ }
+ return this.inventory[slot];
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ if (slot >= this.inventory.length) {
+ return;
+ }
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java b/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java
new file mode 100644
index 0000000000..77bcbd1e35
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.inventories.projecttable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryProjectOutput implements IInventory {
+
+ private final String name = "Inventory Output";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 2;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryProjectOutput() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java b/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java
new file mode 100644
index 0000000000..24dd053e31
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.core.inventories.tradetable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryTradeMain implements IInventory {
+
+ private final String name = "Inventory Grid";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryTradeMain() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ // Utils.LOG_INFO("getStackInSlot["+slot+"]");
+ try {
+ if (slot >= this.inventory.length) {
+ // Utils.LOG_INFO("Returning invalid slot item.");
+ return null;
+ }
+ return this.inventory[slot];
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ if (slot >= this.inventory.length) {
+ return;
+ }
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java b/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java
new file mode 100644
index 0000000000..edfbe7602e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.inventories.tradetable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class InventoryTradeOutput implements IInventory {
+
+ private final String name = "Inventory Output";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 2;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryTradeOutput() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/ModItems.java b/src/main/java/gtPlusPlus/core/item/ModItems.java
new file mode 100644
index 0000000000..0fabf375a2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/ModItems.java
@@ -0,0 +1,988 @@
+package gtPlusPlus.core.item;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.common.compat.COMPAT_Baubles;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.BaseItemDamageable;
+import gtPlusPlus.core.item.base.BaseItemTCShard;
+import gtPlusPlus.core.item.base.CoreItem;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust;
+import gtPlusPlus.core.item.base.foil.BaseItemFoil;
+import gtPlusPlus.core.item.base.gears.BaseItemSmallGear;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot_OLD;
+import gtPlusPlus.core.item.base.plates.BaseItemPlate;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDouble;
+import gtPlusPlus.core.item.bauble.BatteryPackBaseBauble;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.CoalTar;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.item.chemistry.MilledOreProcessing;
+import gtPlusPlus.core.item.chemistry.NuclearChem;
+import gtPlusPlus.core.item.chemistry.RocketFuels;
+import gtPlusPlus.core.item.chemistry.StandardBaseParticles;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.food.BaseItemMetaFood;
+import gtPlusPlus.core.item.general.BufferCore;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.item.general.ItemBasicScrubberTurbine;
+import gtPlusPlus.core.item.general.ItemBlueprint;
+import gtPlusPlus.core.item.general.ItemEmpty;
+import gtPlusPlus.core.item.general.ItemGenericToken;
+import gtPlusPlus.core.item.general.ItemHalfCompleteCasings;
+import gtPlusPlus.core.item.general.ItemLavaFilter;
+import gtPlusPlus.core.item.general.ItemMagicFeather;
+import gtPlusPlus.core.item.general.books.ItemBaseBook;
+import gtPlusPlus.core.item.general.chassis.ItemBoilerChassis;
+import gtPlusPlus.core.item.general.chassis.ItemDehydratorCoil;
+import gtPlusPlus.core.item.general.chassis.ItemDehydratorCoilWire;
+import gtPlusPlus.core.item.general.spawn.ItemCustomSpawnEgg;
+import gtPlusPlus.core.item.init.ItemsFoods;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.item.tool.misc.GregtechPump;
+import gtPlusPlus.core.item.wearable.WearableLoader;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.everglades.GTplusplus_Everglades;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechItems;
+
+public final class ModItems {
+
+ public static Item ZZZ_Empty;
+ public static Item AAA_Broken;
+
+ public static Item itemAlkalusDisk;
+ public static ItemCustomSpawnEgg itemCustomSpawnEgg;
+
+ public static Item itemIngotBatteryAlloy;
+
+ public static Item itemBedLocator_Base;
+ public static Item itemBaseItemWithCharge;
+
+ public static Item itemPersonalCloakingDevice;
+ public static Item itemPersonalHealingDevice;
+ public static Item itemSupremePizzaGloves;
+
+ public static ItemBlueprint itemBlueprintBase;
+
+ public static Item dustLithiumCarbonate;
+ public static Item dustLithiumHydroxide;
+ public static Item dustLithiumPeroxide;
+
+ public static Item dustQuicklime;
+ public static Item dustCalciumHydroxide;
+ public static Item dustCalciumCarbonate;
+ public static Item dustLi2CO3CaOH2;
+ public static Item dustLi2BeF4;
+
+ public static Item dustTumbagaMix;
+
+ public static Item dustAer;
+ public static Item dustIgnis;
+ public static Item dustTerra;
+ public static Item dustAqua;
+
+ public static Item cellHydrogenChlorideMix;
+
+ public static Item shardAer;
+ public static Item shardIgnis;
+ public static Item shardTerra;
+ public static Item shardAqua;
+
+ // Zirconium
+ public static Item itemZirconiumChlorideCinterPellet;
+ public static Item dustZrCl4;
+ public static Item dustCookedZrCl4;
+
+ public static Item dustCalciumSulfate;
+
+ public static Item dustFertUN18;
+ public static Item dustFertUN32;
+ public static Fluid fluidNuclearWaste;
+
+ // Possibly missing base items that GT may be missing.
+
+ public static Item itemSmallWroughtIronGear;
+ public static Item itemPlateRawMeat;
+ public static Item itemPlateClay;
+ public static Item itemPlateLithium;
+ public static Item itemPlateEuropium;
+ public static Item itemPlateVanadium;
+ public static Item itemDoublePlateClay;
+ public static Item itemDoublePlateEuropium;
+ public static Item itemFoilUranium235;
+ public static Item itemDustIndium;
+ public static BlockBaseModular blockRawMeat;
+
+ public static Item itemBoilerChassis;
+ public static Item itemDehydratorCoilWire;
+ public static Item itemDehydratorCoil;
+
+ public static Item itemLavaFilter;
+ public static Item itemAirFilter;
+
+ public static Item itemCoalCoke;
+ public static Item itemCactusCharcoal;
+ public static Item itemSugarCharcoal;
+ public static Item itemCactusCoke;
+ public static Item itemSugarCoke;
+
+ public static Item itemCircuitLFTR;
+ public static Item itemBasicTurbine;
+
+ public static Item itemHalfCompleteCasings;
+
+ public static Item itemCustomBook;
+
+ // Unstable Elements & Related Content
+ public static Item dustNeptunium238;
+ public static Item dustDecayedRadium226;
+ public static Item dustRadium226;
+ public static Item dustProtactinium233;
+
+ public static GregtechPump toolGregtechPump;
+
+ public static ItemGenericToken itemGenericToken;
+
+ public static ItemStack itemHotTitaniumIngot;
+
+ public static Fluid fluidZrF4;
+ public static Fluid fluidFertBasic;
+ public static Fluid fluidFertUN32;
+ public static Fluid fluidFertUN18;
+
+ public static DustDecayable dustMolybdenum99;
+ public static DustDecayable dustTechnetium99;
+ public static DustDecayable dustTechnetium99M;
+
+ public static IonParticles itemIonParticleBase;
+ public static StandardBaseParticles itemStandarParticleBase;
+
+ public static BatteryPackBaseBauble itemChargePack_Low_1;
+ public static BatteryPackBaseBauble itemChargePack_Low_2;
+ public static BatteryPackBaseBauble itemChargePack_Low_3;
+ public static BatteryPackBaseBauble itemChargePack_Low_4;
+ public static BatteryPackBaseBauble itemChargePack_Low_5;
+ public static BatteryPackBaseBauble itemChargePack_High_1;
+ public static BatteryPackBaseBauble itemChargePack_High_2;
+ public static BatteryPackBaseBauble itemChargePack_High_3;
+ public static BatteryPackBaseBauble itemChargePack_High_4;
+
+ public static ItemDummyResearch itemDummyResearch;
+
+ public static BaseItemMetaFood itemMetaFood;
+
+ public static ItemMagicFeather itemMagicFeather;
+
+ static {
+ Logger.INFO("Items!");
+ // Default item used when recipes fail, handy for debugging. Let's make sure they exist when this class is
+ // called upon.
+ AAA_Broken = new BaseItemIngot_OLD(
+ "AAA_Broken",
+ "Errors - Tell Alkalus",
+ Utils.rgbtoHexValue(128, 128, 128),
+ 0);
+ ZZZ_Empty = new ItemEmpty();
+ }
+
+ public static void init() {
+
+ itemMagicFeather = new ItemMagicFeather();
+
+ itemAlkalusDisk = new BaseItemDamageable(
+ "itemAlkalusDisk",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 0,
+ "Unknown Use",
+ EnumRarity.rare,
+ EnumChatFormatting.AQUA,
+ false,
+ null);
+
+ itemGenericToken = new ItemGenericToken();
+ itemDummyResearch = new ItemDummyResearch();
+ itemCustomSpawnEgg = new ItemCustomSpawnEgg();
+
+ // Register meta item, because we need them for everything.
+ MetaGeneratedGregtechItems.INSTANCE.generateMetaItems();
+
+ // Register Hydrogen Blobs first, so we can replace old helium blobs.
+ // Register Old Helium Blob, this will be replaced when held by a player.
+
+ // Load Wearable Items
+ WearableLoader.run();
+
+ itemBlueprintBase = new ItemBlueprint("itemBlueprint");
+
+ itemHalfCompleteCasings = new ItemHalfCompleteCasings(
+ "itemHalfCompleteCasings",
+ AddToCreativeTab.tabMisc,
+ 32,
+ 0,
+ "This isn't quite finished yet.",
+ EnumRarity.common,
+ EnumChatFormatting.GRAY,
+ false,
+ Utils.rgbtoHexValue(255, 255, 255)).setTextureName(GregTech.ID + ":" + "gt.metaitem.01/" + "761");
+
+ // Start meta Item Generation
+ ItemsFoods.load();
+
+ try {
+
+ registerCustomMaterialComponents();
+
+ // Elements generate first so they can be used in compounds.
+ // Missing Elements
+ MaterialGenerator.generate(ELEMENT.getInstance().SELENIUM); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().BROMINE);
+ MaterialGenerator.generate(ELEMENT.getInstance().KRYPTON); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().STRONTIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().ZIRCONIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().RUTHENIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().IODINE); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().HAFNIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().DYSPROSIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().ERBIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().PRASEODYMIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().TELLURIUM); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().RHODIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().RHENIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().THALLIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().GERMANIUM);
+
+ // RADIOACTIVE ELEMENTS
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().POLONIUM, false);
+ // MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().RADON, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().RADIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PROMETHIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PROTACTINIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().CURIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().CALIFORNIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().NEPTUNIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().FERMIUM, false);
+
+ // Nuclear Isotopes
+
+ // Lithium-7 is used as a part of the molten lithium fluoride in molten salt reactors: liquid-fluoride
+ // nuclear reactors.
+ // The large neutron-absorption cross-section of lithium-6 (about 940 barns[5]) as compared with the very
+ // small
+ // neutron cross-section of lithium-7 (about 45 millibarns) makes high separation of lithium-7 from natural
+ // lithium a
+ // strong requirement for the possible use in lithium fluoride reactors.
+ MaterialGenerator.generate(ELEMENT.getInstance().LITHIUM7, false);
+ // Thorium-232 is the most stable isotope of Thorium, purified for nuclear fuel use in this case.
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().THORIUM232);
+ // Production of 233U (through the neutron irradiation of 232Th) invariably produces small amounts of 232U
+ // as an impurity
+ // because of parasitic (n,2n) reactions on uranium-233 itself, or on protactinium-233, or on thorium-232:
+ MaterialGenerator.generate(ELEMENT.getInstance().URANIUM232);
+ // Uranium-233 is a fissile isotope of uranium that is bred from thorium-232 as part of the thorium fuel
+ // cycle.
+ MaterialGenerator.generate(ELEMENT.getInstance().URANIUM233);
+ // Plutonium-238 is a very powerful alpha emitter. This makes the plutonium-238 isotope suitable for usage
+ // in radioisotope thermoelectric generators (RTGs)
+ // and radioisotope heater units - one gram of plutonium-238 generates approximately 0.5 W of thermal power.
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PLUTONIUM238, false);
+
+ // Custom Materials that will have standalone refinery processes
+ MaterialGenerator.generate(ELEMENT.STANDALONE.ADVANCED_NITINOL, false);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.ASTRAL_TITANIUM);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.HYPOGEN);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Custom Materials that are from Runescape
+ MaterialGenerator.generate(ELEMENT.STANDALONE.BLACK_METAL);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialGenerator.generateOreMaterialWithAllExcessComponents(ELEMENT.STANDALONE.GRANITE);
+ MaterialGenerator.generateOreMaterialWithAllExcessComponents(ELEMENT.STANDALONE.RUNITE);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.DRAGON_METAL, false);
+
+ MISC_MATERIALS.run();
+
+ MaterialGenerator.generate(ALLOY.SILICON_CARBIDE);
+ MaterialGenerator.generate(ALLOY.ZIRCONIUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.TANTALUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.NIOBIUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.TUNGSTEN_TITANIUM_CARBIDE);
+
+ // LFTR Fuel components
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.AMMONIUM_BIFLUORIDE); // LFTR fuel component
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.BERYLLIUM_HYDROXIDE); // LFTR fuel component
+ // MaterialGenerator.generateNuclearDusts(FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE); // LFTR fuel component
+
+ // Generate Fluorides
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.BERYLLIUM_FLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.LITHIUM_FLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.THORIUM_TETRAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.THORIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.URANIUM_TETRAFLUORIDE, false);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.URANIUM_HEXAFLUORIDE, false);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE);
+ // LFTR Fluoride outputs
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.NEPTUNIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.TECHNETIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.SELENIUM_HEXAFLUORIDE);
+
+ // Generate Reactor Fuel Salts
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ZrF4U235);
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ZrF4UF4);
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ThF4UF4);
+ // MaterialGenerator.generateNuclearMaterial(NUCLIDE.Li2BeF4, false);
+
+ // Generate some Alloys
+
+ // Misc Alloys
+ MaterialGenerator.generate(ALLOY.ENERGYCRYSTAL);
+ MaterialGenerator.generate(ALLOY.BLOODSTEEL);
+
+ MaterialGenerator.generate(ALLOY.ZERON_100);
+ // Tumbaga was the name given by Spaniards to a non-specific alloy of gold and copper
+ MaterialGenerator.generate(ALLOY.TUMBAGA);
+ // Potin is traditionally an alloy of bronze, tin and lead, with varying quantities of each possible
+ MaterialGenerator.generate(ALLOY.POTIN);
+
+ // Staballoy & Tantalloy
+ MaterialGenerator.generate(ALLOY.STABALLOY);
+ MaterialGenerator.generate(ALLOY.TANTALLOY_60);
+ MaterialGenerator.generate(ALLOY.TANTALLOY_61);
+
+ // Inconel
+ MaterialGenerator.generate(ALLOY.INCONEL_625);
+ MaterialGenerator.generate(ALLOY.INCONEL_690);
+ MaterialGenerator.generate(ALLOY.INCONEL_792);
+
+ // Steels
+ MaterialGenerator.generateDusts(ALLOY.EGLIN_STEEL_BASE);
+ MaterialGenerator.generate(ALLOY.EGLIN_STEEL);
+ MaterialGenerator.generate(ALLOY.MARAGING250);
+ MaterialGenerator.generate(ALLOY.MARAGING300);
+ MaterialGenerator.generate(ALLOY.MARAGING350);
+ MaterialGenerator.generate(ALLOY.AQUATIC_STEEL);
+
+ MaterialGenerator.generate(ALLOY.NITINOL_60, true);
+
+ // Composite Alloys
+ MaterialGenerator.generate(ALLOY.STELLITE);
+ MaterialGenerator.generate(ALLOY.TALONITE);
+
+ // Hastelloy
+ MaterialGenerator.generate(ALLOY.HASTELLOY_W);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_X);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_C276);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_N);
+
+ // Incoloy
+ MaterialGenerator.generate(ALLOY.INCOLOY_020);
+ MaterialGenerator.generate(ALLOY.INCOLOY_DS);
+ MaterialGenerator.generate(ALLOY.INCOLOY_MA956);
+
+ // Leagrisium
+ MaterialGenerator.generate(ALLOY.LEAGRISIUM);
+
+ // Super Conductor
+ MaterialGenerator.generate(ALLOY.HG1223, false, false);
+
+ // Generate Fictional Materials
+ MaterialGenerator.generate(ALLOY.TRINIUM_TITANIUM);
+ MaterialGenerator.generate(ALLOY.TRINIUM_NAQUADAH, false);
+ MaterialGenerator.generate(ALLOY.TRINIUM_NAQUADAH_CARBON);
+ MaterialGenerator.generate(ALLOY.TRINIUM_REINFORCED_STEEL);
+
+ // Top Tier Alloys
+ MaterialGenerator.generate(ALLOY.HELICOPTER);
+ MaterialGenerator.generate(ALLOY.LAFIUM);
+ MaterialGenerator.generate(ALLOY.CINOBITE);
+ MaterialGenerator.generate(ALLOY.PIKYONIUM);
+ MaterialGenerator.generate(ALLOY.ABYSSAL);
+ MaterialGenerator.generate(ALLOY.LAURENIUM);
+
+ // abs recipe in RECIPES_GREGTECH.java
+ MaterialGenerator.generate(ALLOY.BOTMIUM, true, false);
+
+ MaterialGenerator.generate(ALLOY.HS188A);
+
+ MaterialGenerator.generate(ALLOY.TITANSTEEL);
+ MaterialGenerator.generate(ALLOY.ARCANITE);
+ MaterialGenerator.generate(ALLOY.OCTIRON);
+
+ MaterialGenerator.generate(ALLOY.BABBIT_ALLOY, false);
+ MaterialGenerator.generate(ALLOY.BLACK_TITANIUM, false);
+ MaterialGenerator.generate(ALLOY.INDALLOY_140, false, false);
+
+ // High Level Bioplastic
+ MaterialGenerator.generate(ELEMENT.STANDALONE.RHUGNOR, false, false);
+
+ // Must be the final Alloy to Generate
+ MaterialGenerator.generate(ALLOY.QUANTUM);
+
+ // Ores
+ MaterialGenerator.generateOreMaterial(FLUORIDES.FLUORITE);
+ MaterialGenerator.generateOreMaterial(ALLOY.KOBOLDITE);
+ GTplusplus_Everglades.GenerateOreMaterials();
+
+ // formula override
+ ALLOY.TUNGSTEN_TITANIUM_CARBIDE.vChemicalFormula = StringUtils.subscript("(CW)7Ti3");
+ ALLOY.TITANSTEEL.vChemicalFormula = StringUtils.subscript("((CW)7Ti3)3???");
+
+ // Werkstoff bridge
+ ELEMENT.getInstance().ZIRCONIUM.setWerkstoffID((short) 3);
+ ELEMENT.getInstance().THORIUM232.setWerkstoffID((short) 30);
+ ELEMENT.getInstance().RUTHENIUM.setWerkstoffID((short) 64);
+ ELEMENT.getInstance().HAFNIUM.setWerkstoffID((short) 11000);
+ ELEMENT.getInstance().IODINE.setWerkstoffID((short) 11012);
+
+ } catch (final Throwable r) {
+ Logger.INFO("Failed to Generated a Material. " + r.getMessage());
+ r.printStackTrace();
+ }
+
+ // Generates four elemental shards when TC is not installed.
+ if (!Thaumcraft.isModLoaded()) {
+ shardAer = new BaseItemTCShard("Aer", Utils.rgbtoHexValue(225, 225, 5));
+ shardIgnis = new BaseItemTCShard("Ignis", Utils.rgbtoHexValue(255, 5, 5));
+ shardTerra = new BaseItemTCShard("Terra", Utils.rgbtoHexValue(5, 255, 5));
+ shardAqua = new BaseItemTCShard("Aqua", Utils.rgbtoHexValue(5, 5, 255));
+ } else {
+ shardAer = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Air Shard", 0, 1)
+ .getItem();
+ shardIgnis = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Fire Shard", 1, 1)
+ .getItem();
+ shardAqua = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Warer Shard", 2, 1)
+ .getItem();
+ shardTerra = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Earth Shard", 3, 1)
+ .getItem();
+ }
+ // Generates a set of four special dusts to be used in my recipes.
+ dustAer = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().AER, true)[0];
+ dustIgnis = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().IGNIS, true)[0];
+ dustTerra = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().TERRA, true)[0];
+ dustAqua = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().AQUA, true)[0];
+
+ ItemUtils.generateSpecialUseDusts(MISC_MATERIALS.WOODS_GLASS, false);
+ cellHydrogenChlorideMix = MISC_MATERIALS.HYDROGEN_CHLORIDE_MIX.getCell(1)
+ .getItem();
+
+ // Nuclear Fuel Dusts
+ dustLithiumCarbonate = ItemUtils.generateSpecialUseDusts(
+ "LithiumCarbonate",
+ "Lithium Carbonate",
+ "Li2CO3",
+ Utils.rgbtoHexValue(240, 240, 240))[0]; // https://en.wikipedia.org/wiki/Lithium_carbonate
+ dustLithiumPeroxide = ItemUtils.generateSpecialUseDusts(
+ "LithiumPeroxide",
+ "Lithium Peroxide",
+ "Li2O2",
+ Utils.rgbtoHexValue(250, 250, 250))[0]; // https://en.wikipedia.org/wiki/Lithium_peroxide
+ dustLithiumHydroxide = ItemUtils.generateSpecialUseDusts(
+ "LithiumHydroxide",
+ "Lithium Hydroxide",
+ "LiOH",
+ Utils.rgbtoHexValue(250, 250, 250))[0]; // https://en.wikipedia.org/wiki/Lithium_hydroxide
+
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ dustQuicklime = ItemUtils
+ .generateSpecialUseDusts("Quicklime", "Quicklime", "CaO", Utils.rgbtoHexValue(255, 255, 175))[0]; // https://en.wikipedia.org/wiki/Calcium_oxide
+ }
+ dustCalciumHydroxide = ItemUtils.generateSpecialUseDusts(
+ "CalciumHydroxide",
+ "Hydrated Lime",
+ "Ca(OH)2",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_hydroxide
+ dustCalciumCarbonate = ItemUtils.generateSpecialUseDusts(
+ "CalciumCarbonate",
+ "Calcium Carbonate",
+ "CaCO3",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_carbonate
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGypsum", 1) == null)
+ || (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustCalciumSulfate", 1) == null)) {
+ dustCalciumSulfate = ItemUtils.generateSpecialUseDusts(
+ "Gypsum",
+ "Calcium Sulfate (Gypsum)",
+ "CaSO4",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_sulfate
+ GT_OreDictUnificator.registerOre("dustCalciumSulfate", ItemUtils.getSimpleStack(dustCalciumSulfate));
+ } else {
+ GT_OreDictUnificator
+ .registerOre("dustCalciumSulfate", ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGypsum", 1));
+ }
+ dustLi2CO3CaOH2 = ItemUtils.generateSpecialUseDusts(
+ "Li2CO3CaOH2",
+ "Li2CO3 + Ca(OH)2 Compound",
+ "Li2CO3CaOH2",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_carbonate
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(FLUORIDES.SODIUM_FLUORIDE, false);
+ // FLiBe Fuel Compounds
+ dustLi2BeF4 = ItemUtils.generateSpecialUseDusts(
+ "Li2BeF4",
+ "Lithium Tetrafluoroberyllate Fuel Compound",
+ "Li2BeF4",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/FLiBe
+ Material.registerComponentForMaterial(NUCLIDE.Li2BeF4, OrePrefixes.dust, ItemUtils.getSimpleStack(dustLi2BeF4));
+ // fluidFLiBeSalt = ("Li2BeF4", "Li2BeF4", 7430, new short[]{255, 255, 255, 100}, 0);
+ // fluidFLiBeSalt = FluidUtils.addGTFluidNoPrefix("Li2BeF4", "Lithium Tetrafluoroberyllate", new short[]{255,
+ // 255, 255, 100}, 0, 743, null, CI.emptyCells(1), 1000, true);
+ // fluidFLiBeSaltBurnt = FluidUtils.addGTFluidNoPrefix("Li2BeF2UF4", "Li2BeF2UF4", new short[]{50, 255, 50,
+ // 100}, 0, 743, null, CI.emptyCells(1), 1000, true);
+
+ // LFTR Core Fluid Processing
+ // fluidLftrCore1 = FluidUtils.addGTFluidNoPrefix("LiBeF2UF4FP", "LiBeF2UF4FP", new short[]{110, 255, 110, 100},
+ // 0, 800, null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore2 = FluidUtils.addGTFluidNoPrefix("UF6F2FP", "UF6F2FP", new short[]{150, 255, 150, 100}, 0, 800,
+ // null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore3 = FluidUtils.addGTFluidNoPrefix("LiFBeF2", "LiFBeF2", new short[]{100, 255, 50, 100}, 0, 800,
+ // null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore4 = FluidUtils.addGTFluidNoPrefix("LiFBeF2UF4", "LiFBeF2UF4", new short[]{50, 255, 100, 100}, 0,
+ // 800, null, CI.emptyCells(1), 1000, true);
+ // LFTR Blanket Fluid Processing
+ fluidNuclearWaste = FluidUtils.addGTFluidNoPrefix(
+ "nuclear.waste",
+ "Nuclear Waste",
+ new short[] { 10, 250, 10, 100 },
+ 0,
+ 1000,
+ null,
+ CI.emptyCells(1),
+ 1000,
+ true);
+
+ // LFTR Control Circuit
+ itemCircuitLFTR = new CoreItem(
+ "itemCircuitLFTR",
+ "" + EnumChatFormatting.GREEN + "Control Circuit",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 0,
+ new String[] { "Keeps Multiblocks Stable" },
+ EnumRarity.epic,
+ EnumChatFormatting.DARK_GREEN,
+ false,
+ null);
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ itemBasicTurbine = new ItemBasicScrubberTurbine();
+ }
+
+ // Zirconium
+ // Cinter Pellet.
+ itemZirconiumChlorideCinterPellet = new CoreItem(
+ "itemZirconiumPellet",
+ "Zirconium Pellet [" + StringUtils.subscript("ZrCl4") + "]",
+ tabMisc).setTextureName(GTPlusPlus.ID + ":itemShard");
+ GT_OreDictUnificator.registerOre("pelletZirconium", new ItemStack(itemZirconiumChlorideCinterPellet));
+ // Zirconium Chloride
+ dustZrCl4 = ItemUtils.generateSpecialUseDusts("ZrCl4", "ZrCl4", "ZrCl4", Utils.rgbtoHexValue(180, 180, 180))[0]; // http://www.iaea.org/inis/collection/NCLCollectionStore/_Public/39/036/39036750.pdf
+ dustCookedZrCl4 = ItemUtils
+ .generateSpecialUseDusts("CookedZrCl4", "Cooked ZrCl4", "ZrCl4", Utils.rgbtoHexValue(180, 180, 180))[0]; // http://www.iaea.org/inis/collection/NCLCollectionStore/_Public/39/036/39036750.pdf
+
+ // Zirconium Tetrafluoride
+ /*
+ * GT_OreDictUnificator.registerOre("cellZrF4",
+ * ItemUtils.getItemStackOfAmountFromOreDict("cellZirconiumTetrafluoride", 1));
+ * GT_OreDictUnificator.registerOre("dustZrF4",
+ * ItemUtils.getItemStackOfAmountFromOreDict("dustZirconiumTetrafluoride", 1));
+ */
+ fluidZrF4 = FluidUtils.generateFluidNoPrefix(
+ "ZirconiumTetrafluoride",
+ "Zirconium Tetrafluoride",
+ 500,
+ new short[] { 170, 170, 140, 100 }); // https://en.wikipedia.org/wiki/Zirconium_tetrafluoride
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.setFluid(fluidZrF4);
+
+ // Coolant Salt
+ // NaBF4 - NaF - 621C
+ // dustNaBF4NaF = ItemUtils.generateSpecialUseDusts("NaBF4NaF", "NaBF4NaF", Utils.rgbtoHexValue(45, 45, 90))[0];
+ // //https://en.wikipedia.org/wiki/Zirconium_tetrafluoride
+
+ // Load Tree Farmer
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) { // https://en.wikipedia.org/wiki/UAN
+ dustFertUN18 = ItemUtils
+ .generateSpecialUseDusts("UN18Fertiliser", "UN-18 Fertiliser", Utils.rgbtoHexValue(60, 155, 60))[0];
+ dustFertUN32 = ItemUtils
+ .generateSpecialUseDusts("UN32Fertiliser", "UN-32 Fertiliser", Utils.rgbtoHexValue(55, 190, 55))[0];
+
+ ItemStack temp1 = ItemUtils.getCorrectStacktype("IC2:itemFertilizer", 1);
+ ItemStack temp2 = null;
+
+ if (Forestry.isModLoaded()) {
+ temp2 = ItemUtils.getCorrectStacktype("Forestry:fertilizerCompound", 1);
+ }
+ if (temp1 != null) {
+ fluidFertBasic = FluidUtils.generateFluidNonMolten(
+ "Fertiliser",
+ "Fertiliser",
+ 32,
+ new short[] { 45, 170, 45, 100 },
+ temp1,
+ null,
+ true);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(temp2)
+ .fluidOutputs(new FluidStack(fluidFertBasic, 36))
+ .duration(5 * TICKS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+ fluidFertUN32 = FluidUtils.generateFluidNonMolten(
+ "UN32Fertiliser",
+ "UN-32 Fertiliser",
+ 24,
+ new short[] { 55, 190, 55, 100 },
+ null,
+ null,
+ true);
+ fluidFertUN18 = FluidUtils.generateFluidNonMolten(
+ "UN18Fertiliser",
+ "UN-18 Fertiliser",
+ 22,
+ new short[] { 60, 155, 60, 100 },
+ null,
+ null,
+ true);
+
+ /*
+ * GT_Values.RA.addMixerRecipe( arg0, //Item In arg1, arg2, arg3, arg4, //Fluid in arg5, //Fluid Out arg6,
+ * //Item out arg7, //Eu arg8); //Time
+ */
+
+ }
+
+ // Juice
+ FluidUtils.generateFluidNonMolten(
+ "RaisinJuice",
+ "Raisin Juice",
+ 2,
+ new short[] { 51, 0, 51, 100 },
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foodRaisins", 1),
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("fruitRaisins", 1),
+ 50,
+ true);
+
+ // Test items
+ toolGregtechPump = new GregtechPump();
+ toolGregtechPump.registerPumpType(0, "Simple Hand Pump", 0, 0);
+ toolGregtechPump.registerPumpType(1, "Advanced Hand Pump", 32000, 1);
+ toolGregtechPump.registerPumpType(2, "Super Hand Pump", 128000, 2);
+ toolGregtechPump.registerPumpType(3, "Ultimate Hand Pump", 512000, 3);
+
+ // Xp Fluids - Dev
+ if (!FluidRegistry.isFluidRegistered("mobessence")) {
+ FluidUtils.generateFluidNoPrefix("mobessence", "Mob Essence", 0, new short[] { 125, 175, 125, 100 });
+ }
+
+ dustNeptunium238 = new DustDecayable(
+ "dustNeptunium238",
+ Utils.rgbtoHexValue(175, 240, 75),
+ 50640,
+ new String[] { StringUtils.superscript("238Np"),
+ "Result: Plutonium 238 (" + StringUtils.superscript("238Pu") + ")" },
+ ELEMENT.getInstance().PLUTONIUM238.getDust(1)
+ .getItem(),
+ 5);
+ dustDecayedRadium226 = ItemUtils.generateSpecialUseDusts(
+ "DecayedRadium226",
+ "Decayed Radium-226",
+ "Contains Radon (" + StringUtils.superscript("222Rn") + ")",
+ ELEMENT.getInstance().RADIUM.getRgbAsHex())[0];
+ dustRadium226 = new DustDecayable(
+ "dustRadium226",
+ ELEMENT.getInstance().RADIUM.getRgbAsHex(),
+ 90000,
+ new String[] { StringUtils.superscript("226Ra"),
+ "Result: Radon (" + StringUtils.superscript("222Rn") + ")" },
+ ItemUtils.getSimpleStack(dustDecayedRadium226)
+ .getItem(),
+ 5);
+ dustProtactinium233 = new DustDecayable(
+ "dustProtactinium233",
+ ELEMENT.getInstance().PROTACTINIUM.getRgbAsHex(),
+ 32000,
+ new String[] { StringUtils.superscript("233Pa"),
+ "Result: Uranium 233(" + StringUtils.superscript("233U") + ")" },
+ ELEMENT.getInstance().URANIUM233.getDust(1)
+ .getItem(),
+ 6);
+ dustMolybdenum99 = new DustDecayable(
+ "dustMolybdenum99",
+ ELEMENT.getInstance().MOLYBDENUM.getRgbAsHex(),
+ 16450,
+ new String[] { StringUtils.superscript("99Mo"),
+ "Result: Technicium 99ᵐ (" + StringUtils.superscript("99ᵐTc") + ")" },
+ dustTechnetium99M,
+ 4);
+
+ itemIonParticleBase = new IonParticles();
+ itemStandarParticleBase = new StandardBaseParticles();
+
+ Item a8kFlask = VolumetricFlaskHelper.generateNewFlask("Volumetric_Flask_8k", "Large Volumetric Flask", 8000);
+ Item a64kFlask = VolumetricFlaskHelper
+ .generateNewFlask("Volumetric_Flask_32k", "Gigantic Volumetric Flask", 32000);
+ GregtechItemList.VOLUMETRIC_FLASK_8k.set(a8kFlask);
+ GregtechItemList.VOLUMETRIC_FLASK_32k.set(a64kFlask);
+
+ itemBoilerChassis = new ItemBoilerChassis();
+ itemDehydratorCoilWire = new ItemDehydratorCoilWire();
+ itemDehydratorCoil = new ItemDehydratorCoil();
+
+ itemAirFilter = new ItemAirFilter();
+ itemLavaFilter = new ItemLavaFilter();
+
+ // Chemistry
+ new CoalTar();
+ new RocketFuels();
+
+ // Nuclear Processing
+ new NuclearChem();
+
+ // Farm Animal Fun
+ new AgriculturalChem();
+
+ // General Chemistry
+ new GenericChem();
+
+ // Milled Ore Processing
+ new MilledOreProcessing();
+
+ // IC2 Exp
+ Logger.INFO("IndustrialCraft2 Found - Loading Resources.");
+
+ // Baubles Mod Test
+ try {
+ final Class<?> baublesTest = ReflectionUtils.getClass("baubles.api.IBauble");
+ if (baublesTest != null) {
+ COMPAT_Baubles.run();
+ } else {
+ Logger.INFO("Baubles Not Found - Skipping Resources.");
+ }
+ } catch (final Throwable T) {
+ Logger.INFO("Baubles Not Found - Skipping Resources.");
+ }
+
+ // Buffer Cores!
+ Item itemBufferCore;
+ for (int i = 1; i <= 10; i++) {
+ itemBufferCore = new BufferCore("itemBufferCore", i).setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerItem(itemBufferCore, itemBufferCore.getUnlocalizedName());
+ }
+
+ itemCustomBook = new ItemBaseBook();
+ registerCustomTokens();
+ }
+
+ public static void registerCustomTokens() {
+ itemGenericToken.register(0, "BitCoin", 16, "Can be used on the dark web");
+ itemGenericToken.register(1, "Hand Pump Trade Token I", 1, "Craft into a Tier I Hand pump");
+ itemGenericToken.register(2, "Hand Pump Trade Token II", 1, "Craft into a Tier II Hand pump");
+ itemGenericToken.register(3, "Hand Pump Trade Token III", 1, "Craft into a Tier III Hand pump");
+ itemGenericToken.register(4, "Hand Pump Trade Token IV", 1, "Craft into a Tier IV Hand pump");
+ }
+
+ public static void registerCustomMaterialComponents() {
+ // Custom GT++ Crafting Components
+
+ /*
+ * Try to generate dusts for missing rare earth materials if they don't exist
+ */
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGadolinium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Gadolinium",
+ "Gadolinium",
+ Materials.Gadolinium.mElement.name(),
+ Utils.rgbtoHexValue(226, 172, 9));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustYtterbium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Ytterbium",
+ "Ytterbium",
+ Materials.Ytterbium.mElement.name(),
+ Utils.rgbtoHexValue(
+ Materials.Yttrium.mRGBa[0] - 60,
+ Materials.Yttrium.mRGBa[1] - 60,
+ Materials.Yttrium.mRGBa[2] - 60));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustSamarium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Samarium",
+ "Samarium",
+ Materials.Samarium.mElement.name(),
+ Utils.rgbtoHexValue(161, 168, 114));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustLanthanum", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Lanthanum",
+ "Lanthanum",
+ Materials.Lanthanum.mElement.name(),
+ Utils.rgbtoHexValue(106, 127, 163));
+ }
+
+ // Just an unusual plate needed for some black magic.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateClay", 1) == null) {
+ itemPlateClay = new BaseItemPlate(NONMATERIAL.CLAY);
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateDoubleClay", 1) == null) {
+ itemDoublePlateClay = new BaseItemPlateDouble(NONMATERIAL.CLAY);
+ }
+
+ // Need this for Mutagenic Frames
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foilUranium235", 1) == null) {
+ itemFoilUranium235 = new BaseItemFoil(ELEMENT.getInstance().URANIUM235);
+ }
+
+ // A small gear needed for wizardry.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("gearGtSmallWroughtIron", 1) == null) {
+ itemSmallWroughtIronGear = new BaseItemSmallGear(NONMATERIAL.WROUGHT_IRON);
+ }
+ // Krypton Processing
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotHotTitanium", 1) == null) {
+ itemHotTitaniumIngot = ItemUtils
+ .getSimpleStack(new BaseItemIngot(ELEMENT.getInstance().TITANIUM, ComponentTypes.HOTINGOT));
+ } else {
+ itemHotTitaniumIngot = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotHotTitanium", 1);
+ }
+
+ // Need this for Laurenium
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustIndium", 1) == null) {
+ itemDustIndium = new BaseItemDust(ELEMENT.getInstance().INDIUM);
+ }
+
+ // Springs
+ MaterialUtils
+ .generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.NITINOL_60);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.AQUATIC_STEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.EGLIN_STEEL);
+
+ // Small Springs
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.MARAGING250);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.NICHROME);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.STABALLOY);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.STEEL_BLACK);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.BLACK_TITANIUM);
+
+ // Fine Wire
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.getInstance().PALLADIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.getInstance().ZIRCONIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.LEAGRISIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.BABBIT_ALLOY);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.KOBOLDITE);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.HG1223);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.QUANTUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.HYPOGEN);
+ MaterialUtils
+ .generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Foil
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.BLACK_TITANIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.BOTMIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.TITANSTEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.NITINOL_60);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.QUANTUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.LAURENIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.HYPOGEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.ASTRAL_TITANIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.RHUGNOR);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.ADVANCED_NITINOL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.PIKYONIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.CINOBITE);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.LAFIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.TRINIUM_REINFORCED_STEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Special Sillyness
+ if (true) {
+
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateSodium", 1) == null) {
+ new BaseItemPlate(ELEMENT.getInstance().SODIUM);
+ }
+
+ Material meatRaw = NONMATERIAL.MEAT;
+ // A plate of Meat.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateMeatRaw", 1) == null) {
+ itemPlateRawMeat = new BaseItemPlate(meatRaw);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(itemPlateRawMeat), 100);
+ }
+ // A Block of Meat.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("blockMeatRaw", 1) == null) {
+ blockRawMeat = new BlockBaseModular(meatRaw, BlockTypes.STANDARD);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(blockRawMeat), 900);
+ }
+ }
+
+ // A plate of Vanadium.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateVanadium", 1) == null) {
+ itemPlateVanadium = new BaseItemPlate(ELEMENT.getInstance().VANADIUM);
+ }
+
+ // A plate of Lithium.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateLithium", 1) == null) {
+ itemPlateLithium = new BaseItemPlate(ELEMENT.getInstance().LITHIUM);
+ }
+
+ // A plate of Europium.
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateEuropium", 1) == null)
+ && CORE.ConfigSwitches.enableCustom_Pipes) {
+ itemPlateEuropium = new BaseItemPlate(ELEMENT.getInstance().EUROPIUM);
+ }
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateDoubleEuropium", 1) == null)
+ && CORE.ConfigSwitches.enableCustom_Pipes) {
+ itemDoublePlateEuropium = new BaseItemPlateDouble(ELEMENT.getInstance().EUROPIUM);
+ }
+
+ // Tumbaga Mix (For Simple Crafting)
+ dustTumbagaMix = ItemUtils
+ .generateSpecialUseDusts("MixTumbaga", "Tumbaga Mix", "Au2Cu", Utils.rgbtoHexValue(255, 150, 80))[0];
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java
new file mode 100644
index 0000000000..8bbc5a3b08
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.item.base;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemBurnable extends CoreItem {
+
+ protected final int meta;
+
+ public BaseItemBurnable(String unlocalizedName, String displayName, CreativeTabs creativeTab, int stackSize,
+ int maxDmg, String description, String oredictName, int burnTime, int meta) {
+ super(unlocalizedName, creativeTab, stackSize, maxDmg, description);
+ this.itemName = displayName;
+ this.meta = meta;
+ if (oredictName != null && !oredictName.equals("")) {
+ registerOrdictionary(oredictName);
+ }
+ registerFuel(burnTime);
+ }
+
+ public void registerFuel(int burn) {
+ CORE.burnables.add(new Pair<>(burn, ItemUtils.getSimpleStack(this, 1)));
+ }
+
+ public final void registerOrdictionary(String name) {
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), name);
+ }
+
+ @Override
+ public int getDamage(ItemStack stack) {
+ return this.meta;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java
new file mode 100644
index 0000000000..d391207a56
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java
@@ -0,0 +1,100 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+
+public class BaseItemColourable extends Item {
+
+ private final EnumRarity rarity;
+ private final EnumChatFormatting descColour;
+ private final boolean hasEffect;
+ public final int componentColour;
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return this.componentColour;
+ }
+
+ // 5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public BaseItemColourable(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg, final String description, final EnumRarity regRarity, final EnumChatFormatting colour,
+ final boolean Effect, int rgb) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.setHasSubtypes(true);
+ this.rarity = regRarity;
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip", description);
+ this.descColour = colour;
+ this.hasEffect = Effect;
+ this.componentColour = rgb;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ // 6
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public BaseItemColourable(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final int stackSize, final int maxDmg, final String description, final EnumRarity regRarity,
+ final EnumChatFormatting colour, final boolean Effect, int rgb) {
+ this.setUnlocalizedName(unlocalizedName);
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".name", displayName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip", description);
+ this.descColour = colour;
+ this.hasEffect = Effect;
+ this.componentColour = rgb;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(
+ this.descColour
+ + GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip"));
+ // super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ return this.hasEffect;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".name")
+ .equals(GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".name"))) {
+ return GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".name");
+ } else return super.getItemStackDisplayName(tItem);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java
new file mode 100644
index 0000000000..6846f8febb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java
@@ -0,0 +1,459 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.awt.Color;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+
+public class BaseItemComponent extends Item {
+
+ private static final Class<TextureSet> mTextureSetPreload;
+
+ static {
+ mTextureSetPreload = TextureSet.class;
+ }
+
+ public final Material componentMaterial;
+ public final String materialName;
+ public final String unlocalName;
+ public final String translatedMaterialName;
+ public final ComponentTypes componentType;
+ public final int componentColour;
+ public Object extraData;
+
+ protected IIcon base;
+ protected IIcon overlay;
+
+ public BaseItemComponent(final Material material, final ComponentTypes componentType) {
+ this.componentMaterial = material;
+ this.unlocalName = "item" + componentType.COMPONENT_NAME + material.getUnlocalizedName();
+ this.materialName = material.getLocalizedName();
+ this.translatedMaterialName = material.getTranslatedName();
+ this.componentType = componentType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(64);
+ // this.setTextureName(this.getCorrectTextures());
+ this.componentColour = material.getRgbAsHex();
+ GameRegistry.registerItem(this, this.unlocalName);
+
+ // if (componentType != ComponentTypes.DUST)
+
+ GT_OreDictUnificator.registerOre(
+ componentType.getOreDictName() + material.getUnlocalizedName(),
+ ItemUtils.getSimpleStack(this));
+ if (componentType == ComponentTypes.GEAR) {
+ GT_OreDictUnificator.registerOre("gear" + material.getUnlocalizedName(), ItemUtils.getSimpleStack(this));
+ }
+ registerComponent();
+
+ GT_LanguageManager.addStringLocalization("gtplusplus.item." + unlocalName + ".name", getFormattedLangName());
+ }
+
+ // For Cell Generation
+ public BaseItemComponent(final String unlocalName, final String localName, final short[] RGBA) {
+
+ // Handles .'s from fluid internal names.
+ String aFormattedNameForFluids;
+ if (unlocalName.contains(".")) {
+ aFormattedNameForFluids = StringUtils.splitAndUppercase(unlocalName, ".");
+ } else {
+ aFormattedNameForFluids = unlocalName;
+ }
+ Material aTempMaterial = Material.mMaterialCache.get(localName.toLowerCase());
+ Logger.INFO("Attempted to get " + localName + " cell material from cache. Valid? " + (aTempMaterial != null));
+ this.componentMaterial = aTempMaterial;
+ this.unlocalName = "itemCell" + aFormattedNameForFluids;
+ this.materialName = localName;
+ this.translatedMaterialName = getFluidName(
+ "fluid." + this.materialName.toLowerCase()
+ .replace(" ", ""));
+ this.componentType = ComponentTypes.CELL;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(aFormattedNameForFluids);
+ this.setMaxStackSize(64);
+ this.componentColour = MathUtils.getRgbAsHex(RGBA);
+ this.extraData = RGBA;
+
+ this.setTextureName(GTPlusPlus.ID + ":" + "item" + ComponentTypes.CELL.COMPONENT_NAME);
+ GameRegistry.registerItem(this, aFormattedNameForFluids);
+ GT_OreDictUnificator.registerOre(
+ ComponentTypes.CELL.getOreDictName() + Utils.sanitizeStringKeepBrackets(localName),
+ ItemUtils.getSimpleStack(this));
+ registerComponent();
+
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus.item." + this.unlocalName + ".name", getFormattedLangName());
+ }
+
+ private String getFormattedLangName() {
+ return componentType.getName()
+ .replace("@", "%material");
+ }
+
+ public boolean registerComponent() {
+ if (this.componentMaterial == null) {
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = componentType.getGtOrePrefix()
+ .name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ if (componentType == ComponentTypes.PLATE) {
+ GregTech_API.registerCover(
+ componentMaterial.getPlate(1),
+ new GT_RenderedTexture(
+ componentMaterial.getTextureSet().mTextures[71],
+ componentMaterial.getRGBA(),
+ false),
+ null);
+ } else if (componentType == ComponentTypes.PLATEDOUBLE) {
+ GregTech_API.registerCover(
+ componentMaterial.getPlateDouble(1),
+ new GT_RenderedTexture(
+ componentMaterial.getTextureSet().mTextures[72],
+ componentMaterial.getRGBA(),
+ false),
+ null);
+ }
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ public String getCorrectTextures() {
+ if (!CORE.ConfigSwitches.useGregtechTextures) {
+ return GTPlusPlus.ID + ":" + "item" + this.componentType.COMPONENT_NAME;
+ }
+ String metType = "9j4852jyo3rjmh3owlhw9oe";
+ if (this.componentMaterial != null) {
+ TextureSet u = this.componentMaterial.getTextureSet();
+ if (u != null) {
+ metType = u.mSetName;
+ }
+ }
+ metType = (metType.equals("9j4852jyo3rjmh3owlhw9oe") ? "METALLIC" : metType);
+ return GregTech.ID + ":" + "materialicons/" + metType + "/" + this.componentType.getOreDictName();
+
+ // return GregTech.ID + ":" + "materialicons/"+metType+"/" + this.componentType.COMPONENT_NAME.toLowerCase();
+ }
+
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack p_77653_1_) { if (this.componentType ==
+ * ComponentTypes.SMALLGEAR){ return "Small " + this.materialName+" Gear"; } if (this.componentMaterial != null) {
+ * return (this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME); } return
+ * this.materialName+" Cell"; }
+ */
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ public String getFluidName(String aKey) {
+ String trans;
+ trans = GT_LanguageManager.getTranslation(aKey);
+ if (!trans.equals(aKey)) return trans;
+ aKey = "fluid." + aKey;
+ trans = GT_LanguageManager.getTranslation(aKey);
+ if (!trans.equals(aKey)) return trans;
+ return GT_LanguageManager.addStringLocalization(
+ "gtplusplus.fluid." + this.materialName.toLowerCase()
+ .replace(" ", ""),
+ this.materialName);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GT_LanguageManager.getTranslation("gtplusplus.item." + unlocalName + ".name")
+ .replace("%s", "%temp")
+ .replace("%material", translatedMaterialName)
+ .replace("%temp", "%s");
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+
+ try {
+
+ if (this.componentMaterial == null) {
+ if (this.materialName != null) {
+ // list.add(Utils.sanitizeStringKeepBrackets(materialName));
+ }
+ }
+
+ if ((this.materialName != null) && (this.materialName != "")
+ && !this.materialName.equals("")
+ && (this.componentMaterial != null)) {
+
+ if (this.componentMaterial != null) {
+ if (!this.componentMaterial.vChemicalFormula.contains("?")) {
+ list.add(Utils.sanitizeStringKeepBrackets(this.componentMaterial.vChemicalFormula));
+ } else if (this.componentMaterial.vChemicalFormula.contains("?")) {
+ String temp = componentMaterial.vChemicalFormula;
+ temp = temp.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ list.add(temp);
+ }
+
+ if (this.componentMaterial.isRadioactive) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+
+ if (this.componentType == ComponentTypes.INGOT || this.componentType == ComponentTypes.HOTINGOT) {
+ if ((this.materialName != null) && (this.materialName != "")
+ && !this.materialName.equals("")
+ && this.unlocalName.toLowerCase()
+ .contains("hot")) {
+ list.add(
+ EnumChatFormatting.GRAY + "Warning: "
+ + EnumChatFormatting.RED
+ + "Very hot! "
+ + EnumChatFormatting.GRAY
+ + " Avoid direct handling..");
+ }
+ }
+ } else {
+ String aChemicalFormula = Material.sChemicalFormula.get(materialName.toLowerCase());
+ if (aChemicalFormula != null && aChemicalFormula.length() > 0) {
+ list.add(Utils.sanitizeStringKeepBrackets(aChemicalFormula));
+ }
+ }
+
+ // Hidden Tooltip
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ if (this.componentMaterial != null) {
+ String type = this.componentMaterial.getTextureSet().mSetName;
+ String output = type.substring(0, 1)
+ .toUpperCase() + type.substring(1);
+ list.add(EnumChatFormatting.GRAY + "Material Type: " + output + ".");
+ list.add(
+ EnumChatFormatting.GRAY + "Material State: "
+ + this.componentMaterial.getState()
+ .name()
+ + ".");
+ list.add(
+ EnumChatFormatting.GRAY + "Radioactivity Level: "
+ + this.componentMaterial.vRadiationLevel
+ + ".");
+ }
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+ }
+ } catch (Throwable t) {}
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.componentMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ * Handle Custom Rendering
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return (CORE.ConfigSwitches.useGregtechTextures ? true : false);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+
+ if (this.componentType == ComponentTypes.CELL || this.componentType == ComponentTypes.PLASMACELL) {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ }
+
+ try {
+ if (this.componentMaterial == null) {
+ if (extraData != null) {
+ if (short.class.isInstance(extraData)) {
+ short[] abc = (short[]) extraData;
+ return Utils.rgbtoHexValue(abc[0], abc[1], abc[2]);
+ }
+ }
+ return this.componentColour;
+ }
+
+ if (this.componentMaterial.getRGBA()[3] <= 1) {
+ return this.componentColour;
+ } else {
+ // Mild Glow Effect
+ if (this.componentMaterial.getRGBA()[3] == 2) {
+ // 4 sec cycle, 200 control point. 20ms interval.
+ int currentFrame = (int) ((System.nanoTime() % 4_000_000_000L) / 20_000_000L);
+ int value = currentFrame < 50 ? currentFrame + 1
+ : currentFrame < 100 ? 50 : currentFrame < 150 ? 149 - currentFrame : 0;
+ return Utils.rgbtoHexValue(
+ Math.min(255, Math.max(componentMaterial.getRGBA()[0] + value, 0)),
+ Math.min(255, Math.max(componentMaterial.getRGBA()[1] + value, 0)),
+ Math.min(255, Math.max(componentMaterial.getRGBA()[2] + value, 0)));
+ }
+
+ // Rainbow Hue Cycle
+ else if (this.componentMaterial.getRGBA()[3] == 3) {
+ return Color.HSBtoRGB((float) (System.nanoTime() % 8_000_000_000L) / 8_000_000_000f, 1, 1);
+ }
+ }
+
+ } catch (Throwable t) {
+
+ }
+ return this.componentColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+ return this.base;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(getCorrectTextures());
+ this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ } else {
+ this.base = i.registerIcon(getCorrectTextures());
+ // this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ }
+ }
+
+ public static enum ComponentTypes {
+
+ DUST("Dust", "@ Dust", "dust", OrePrefixes.dust),
+ DUSTSMALL("DustSmall", "Small Pile of @ Dust", "dustSmall", OrePrefixes.dustSmall),
+ DUSTTINY("DustTiny", "Tiny Pile of @ Dust", "dustTiny", OrePrefixes.dustTiny),
+ INGOT("Ingot", "@ Ingot", "ingot", OrePrefixes.ingot),
+ HOTINGOT("HotIngot", "Hot @ Ingot", "ingotHot", OrePrefixes.ingotHot),
+ PLATE("Plate", "@ Plate", "plate", OrePrefixes.plate),
+ PLATEDOUBLE("PlateDouble", "Double @ Plate", "plateDouble", OrePrefixes.plateDouble),
+ ROD("Rod", "@ Rod", "stick", OrePrefixes.stick),
+ RODLONG("RodLong", "Long @ Rod", "stickLong", OrePrefixes.stickLong),
+ GEAR("Gear", "@ Gear", "gearGt", OrePrefixes.gearGt),
+ SMALLGEAR("SmallGear", "Small @ Gear", "gearGtSmall", OrePrefixes.gearGtSmall), // TODO
+ SCREW("Screw", "@ Screw", "screw", OrePrefixes.screw),
+ BOLT("Bolt", "@ Bolt", "bolt", OrePrefixes.bolt),
+ ROTOR("Rotor", "@ Rotor", "rotor", OrePrefixes.rotor),
+ RING("Ring", "@ Ring", "ring", OrePrefixes.ring),
+ FOIL("Foil", "@ Foil", "foil", OrePrefixes.foil),
+ PLASMACELL("CellPlasma", "@ Plasma Cell", "cellPlasma", OrePrefixes.cellPlasma),
+ CELL("Cell", "@ Cell", "cell", OrePrefixes.cell),
+ NUGGET("Nugget", "@ Nugget", "nugget", OrePrefixes.nugget),
+ SPRING("Spring", "@ Spring", "spring", OrePrefixes.spring),
+ SMALLSPRING("SmallSpring", "Small @ Spring", "springSmall", OrePrefixes.springSmall),
+ FINEWIRE("FineWire", "Fine @ Wire", "wireFine", OrePrefixes.wireFine),
+ PLATEDENSE("PlateDense", "Dense @ Plate", "plateDense", OrePrefixes.plateDense),;
+
+ private final String COMPONENT_NAME;
+ private final String DISPLAY_NAME;
+ private final String OREDICT_NAME;
+ private final OrePrefixes a_GT_EQUAL;
+
+ private ComponentTypes(final String LocalName, final String DisplayName, final String OreDictName,
+ final OrePrefixes aPrefix) {
+ this.COMPONENT_NAME = LocalName;
+ this.DISPLAY_NAME = DisplayName;
+ this.OREDICT_NAME = OreDictName;
+ this.a_GT_EQUAL = aPrefix;
+ }
+
+ public String getComponent() {
+ return this.COMPONENT_NAME;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME;
+ }
+
+ public String getOreDictName() {
+ return this.OREDICT_NAME;
+ }
+
+ public OrePrefixes getGtOrePrefix() {
+ return this.a_GT_EQUAL;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java
new file mode 100644
index 0000000000..9a4109a1de
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+
+public class BaseItemDamageable extends Item {
+
+ private final EnumRarity rarity;
+ private final String itemDescription;
+ protected String itemName;
+ private final boolean hasEffect;
+
+ public BaseItemDamageable(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg, final String description, final EnumRarity regRarity, final EnumChatFormatting colour,
+ final boolean Effect, final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(251);
+ this.setNoRepair();
+ this.rarity = regRarity;
+ this.itemDescription = description;
+ this.hasEffect = Effect;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ public String getItemDescription() {
+ return this.itemDescription;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ int dmg = (int) getItemDamage(stack);
+ if (dmg <= 3) {
+ list.add(EnumChatFormatting.GRAY + this.itemDescription);
+ }
+ if (dmg > 3 && dmg <= 25) {
+ list.add(
+ EnumChatFormatting.GRAY
+ + "You have discovered that smashing this against valuable stones has some function..");
+ } else if (dmg > 0) {
+ int maxDamage = 250;
+ list.add(
+ EnumChatFormatting.GRAY + ""
+ + (maxDamage - getItemDamage(stack))
+ + "/"
+ + maxDamage
+ + " gems remaining.");
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ int dmg = (int) getItemDamage(par1ItemStack);
+ if (dmg > 200) {
+ return EnumRarity.epic;
+ }
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ int dmg = (int) getItemDamage(par1ItemStack);
+ if (dmg > 200) {
+ return true;
+ }
+ return this.hasEffect;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if ((this.itemName == null) || this.itemName.equals("")) {
+ return super.getItemStackDisplayName(tItem);
+ }
+ return this.itemName;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Value", 0);
+ tagMain.setTag("Damage", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getItemDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Damage");
+ if (aNBT != null) {
+ return aNBT.getLong("Value");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setItemDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Damage");
+ if (aNBT != null) {
+ aNBT.setLong("Value", aDamage);
+ return true;
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getItemDamage(stack);
+ double durabilitypercent = currentDamage / 100;
+ double inverse = (100 - durabilitypercent);
+ return durabilitypercent;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ int dmg = (int) getItemDamage(stack);
+ if (dmg <= 20) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public static ItemStack damageItem(ItemStack item) {
+ if (item != null) {
+ long currentUse = BaseItemDamageable.getItemDamage(item);
+ if (currentUse >= 0 && currentUse <= 250) {
+ BaseItemDamageable.setItemDamage(item, currentUse + 1);
+ return item;
+ } else {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) {
+ Logger.INFO("Does Leave Table? " + stack.getDisplayName());
+ return true;
+ }
+
+ @Override
+ public boolean getShareTag() {
+ return true;
+ }
+
+ @Override
+ public boolean hasContainerItem(ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack itemStack) {
+ ItemStack stack = itemStack.copy();
+ // stack.setItemDamage(stack.getItemDamage() + 1);
+ damageItem(stack);
+ stack.stackSize = 1;
+ return stack;
+ }
+
+ @Override
+ public int getDamage(ItemStack stack) {
+ return (int) getItemDamage(stack);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java
new file mode 100644
index 0000000000..3ecb6960d6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemTCShard extends Item {
+
+ public final String unlocalName;
+ public final String displayName;
+ public final int itemColour;
+
+ public BaseItemTCShard(final String DisplayName, final int colour) {
+ this(DisplayName, colour, null);
+ }
+
+ public BaseItemTCShard(final String DisplayName, final int colour, final String[] Description) {
+ this.unlocalName = "item" + Utils.sanitizeString(DisplayName);
+ this.displayName = DisplayName;
+ this.itemColour = colour;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ if (Description != null) {
+ for (int i = 0; i < Description.length; i++) {
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + getUnlocalizedName() + ".tooltip." + i, Description[i]);
+ }
+ }
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemShard");
+ GameRegistry.registerItem(this, this.unlocalName);
+ GT_OreDictUnificator.registerOre("shard" + DisplayName, ItemUtils.getSimpleStack(this));
+ GT_OreDictUnificator.registerOre("gemInfused" + DisplayName, ItemUtils.getSimpleStack(this));
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return this.itemColour;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {}
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java
new file mode 100644
index 0000000000..8417eba3d1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java
@@ -0,0 +1,332 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BaseItemTickable extends CoreItem {
+
+ public final String[] descriptionString;
+ public final int itemColour;
+ public final int maxTicks;
+ public final boolean twoRenderPasses;
+ public final boolean ticksInContainers;
+
+ public IIcon[] mIcon = new IIcon[2];
+
+ public BaseItemTickable(boolean twoPass, final String unlocalName, final int colour, final int maxTicks) {
+ this(false, twoPass, unlocalName, colour, maxTicks, new String[] {});
+ }
+
+ public BaseItemTickable(boolean containerTick, boolean twoPass, final String unlocalName, final int colour,
+ final int maxTicks) {
+ this(containerTick, twoPass, unlocalName, colour, maxTicks, new String[] {});
+ }
+
+ public BaseItemTickable(boolean containerTick, boolean twoPass, final String unlocalName, final int colour,
+ final int maxTicks, final String[] Description) {
+ super(
+ unlocalName,
+ AddToCreativeTab.tabMisc,
+ 1,
+ 999999999,
+ Description,
+ EnumRarity.epic,
+ EnumChatFormatting.DARK_RED,
+ true,
+ null);
+ this.itemColour = colour;
+ this.descriptionString = Description;
+ this.maxTicks = maxTicks;
+ this.twoRenderPasses = twoPass;
+ this.ticksInContainers = containerTick;
+ this.maxStackSize = 1;
+ // setGregtechItemList();
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ boolean active = isTicking(world, iStack);
+ if (active) {
+ tickItemTag(world, iStack);
+ }
+ }
+
+ /*
+ * private final boolean setGregtechItemList() { ItemList.Component_LavaFilter.set(this); return
+ * ItemList.Component_LavaFilter.get(1) != null ? true : false; }
+ */
+
+ /**
+ *
+ * Handle Custom Rendering
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return this.twoRenderPasses;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 1 && this.twoRenderPasses) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ return this.itemColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (this.twoRenderPasses) {
+ if (pass == 0) {
+ return this.mIcon[0];
+ }
+ return this.mIcon[1];
+ }
+ return this.mIcon[0];
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (this.twoRenderPasses) {
+ this.mIcon[0] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName());
+ this.mIcon[1] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "_OVERLAY");
+ } else {
+ this.mIcon[0] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName());
+ // this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ }
+ }
+
+ protected int getMaxTicks(ItemStack aStack) {
+ return maxTicks;
+ }
+
+ protected boolean createNBT(World world, ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Tick", 0);
+ tagNBT.setLong("maxTick", getMaxTicks(rStack));
+ tagNBT.setBoolean("isActive", true);
+
+ // Try set world time
+ if (world != null) {
+ // tagNBT.setLong("CreationDate", world.getTotalWorldTime());
+ }
+
+ tagMain.setTag("TickableItem", tagNBT);
+ rStack.setTagCompound(tagMain);
+ Logger.INFO("Created Tickable NBT data.");
+ return true;
+ }
+
+ public final long getTicks(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getLong("Tick");
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return 0L;
+ }
+
+ public final boolean setTicks(World world, final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setLong("Tick", aDamage);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean isTicking(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getBoolean("isActive");
+ }
+ } else {
+ return createNBT(world, aStack);
+ }
+ return true;
+ }
+
+ public final boolean setTicking(World world, final ItemStack aStack, final boolean active) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setBoolean("isActive", active);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean getTicksInContainer(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getBoolean("ticksInContainer");
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean setTicksInContainer(World world, final ItemStack aStack, final boolean active) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setBoolean("ticksInContainer", active);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final long getDifferenceInWorldTimeToCreationTime(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return (world.getTotalWorldTime() - aNBT.getLong("CreationDate"));
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return 0L;
+ }
+
+ public final boolean setItemStackCreationTime(final ItemStack aStack, World world) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setLong("CreationDate", world.getTotalWorldTime());
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean tickItemTag(World world, ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ if (aNBT.hasKey("TickableItem")) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ // Done Ticking
+ if (getMaxTicks(aStack) - getTicks(world, aStack) <= 0) {
+ setTicking(world, aStack, false);
+ return false;
+ }
+ if (isTicking(world, aStack)) {
+ if (aNBT != null) {
+ aNBT.setLong("Tick", getTicks(world, aStack) + 1);
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ return createNBT(world, aStack);
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ // createNBT(null, stack);
+ return 0;
+ }
+ double currentDamage = getTicks(null, stack);
+ double durabilitypercent = currentDamage / getMaxTicks(stack);
+ return durabilitypercent;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, @SuppressWarnings("rawtypes") List list,
+ boolean bool) {
+ World world = player.getEntityWorld();
+ if (this.descriptionString.length > 0) {
+ list.add(EnumChatFormatting.GRAY + this.descriptionString[0]);
+ }
+ long maxTicks = getMaxTicks(stack);
+ long ticks = 0;
+ if (stack.hasTagCompound()) {
+ ticks = getTicks(world, stack);
+ }
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (maxTicks - ticks > (maxTicks * 0.8)) {
+ durability = EnumChatFormatting.GRAY;
+ } else if (maxTicks - ticks > (maxTicks * 0.6)) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (maxTicks - ticks > (maxTicks * 0.4)) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (maxTicks - ticks > (maxTicks * 0.2)) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (maxTicks - ticks > 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + ((maxTicks - ticks) / 20) + EnumChatFormatting.GRAY + " seconds until decay");
+
+ if (this.descriptionString.length > 1) {
+ for (int h = 1; h < this.descriptionString.length; h++) {
+ list.add(EnumChatFormatting.GRAY + this.descriptionString[h]);
+ }
+ }
+
+ // super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java b/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java
new file mode 100644
index 0000000000..0e1b0ab0f2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public class BaseItemWithDamageValue extends Item {
+
+ public BaseItemWithDamageValue(final String unlocalizedName) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(100);
+ }
+
+ @Override
+ public void setDamage(final ItemStack stack, final int damage) {
+ super.setDamage(stack, damage);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java b/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java
new file mode 100644
index 0000000000..b564d60424
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java
@@ -0,0 +1,238 @@
+package gtPlusPlus.core.item.base;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IEntityLivingData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemMonsterPlacer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Facing;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BasicSpawnEgg extends ItemMonsterPlacer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon theIcon;
+
+ protected int colorBase = 0x000000;
+ protected int colorSpots = 0xFFFFFF;
+ protected String entityMODID = "";
+ protected String entityToSpawnName = "";
+ protected String entityToSpawnNameFull = "";
+ protected EntityLiving entityToSpawn = null;
+
+ public BasicSpawnEgg() {
+ super();
+ }
+
+ public BasicSpawnEgg(final String MODID, final String parEntityToSpawnName, final int parPrimaryColor,
+ final int parSecondaryColor) {
+ this.setHasSubtypes(false);
+ this.maxStackSize = 64;
+ this.setCreativeTab(AddToCreativeTab.tabOther);
+ this.setEntityToSpawnName(parEntityToSpawnName);
+ this.colorBase = parPrimaryColor;
+ this.colorSpots = parSecondaryColor;
+ this.entityMODID = MODID;
+
+ // DEBUG
+ Logger.WARNING("Spawn egg constructor for " + this.entityToSpawnName);
+ }
+
+ /**
+ * Callback for item usage. If the item does something special on right clicking,
+ *
+ * he will have one of those. Return True if something happen and false if it don't. This is for ITEMS, not BLOCKS
+ */
+ @Override
+ public boolean onItemUse(final ItemStack par1ItemStack, final EntityPlayer par2EntityPlayer, final World par3World,
+ int par4, int par5, int par6, final int par7, final float par8, final float par9, final float par10) {
+ if (par3World.isRemote) {
+ return true;
+ }
+ final Block block = par3World.getBlock(par4, par5, par6);
+ par4 += Facing.offsetsXForSide[par7];
+ par5 += Facing.offsetsYForSide[par7];
+ par6 += Facing.offsetsZForSide[par7];
+ double d0 = 0.0D;
+
+ if ((par7 == 1) && (block.getRenderType() == 11)) {
+ d0 = 0.5D;
+ }
+
+ final Entity entity = this.spawnEntity(par3World, par4 + 0.5D, par5 + d0, par6 + 0.5D);
+
+ if (entity != null) {
+ if ((entity instanceof EntityLivingBase) && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par2EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Called whenever this item is equipped and the right mouse button is pressed.
+ *
+ * Args: itemStack, world, entityPlayer
+ */
+ @Override
+ public ItemStack onItemRightClick(final ItemStack par1ItemStack, final World par2World,
+ final EntityPlayer par3EntityPlayer) {
+ if (par2World.isRemote) {
+ return par1ItemStack;
+ }
+ final MovingObjectPosition movingobjectposition = this
+ .getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, true);
+
+ if (movingobjectposition == null) {
+ return par1ItemStack;
+ }
+ if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
+
+ final int i = movingobjectposition.blockX;
+ final int j = movingobjectposition.blockY;
+ final int k = movingobjectposition.blockZ;
+
+ if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) {
+ return par1ItemStack;
+ }
+
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) {
+ return par1ItemStack;
+ }
+
+ if (par2World.getBlock(i, j, k) instanceof BlockLiquid) {
+ final Entity entity = this.spawnEntity(par2World, i, j, k);
+
+ if (entity != null) {
+ if ((entity instanceof EntityLivingBase) && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par3EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+ }
+ }
+
+ return par1ItemStack;
+ }
+
+ /**
+ * Spawns the creature specified by the egg's type in the location specified by
+ *
+ * the last three parameters. Parameters: world, entityID, x, y, z.
+ */
+ public Entity spawnEntity(final World parWorld, final double parX, final double parY, final double parZ) {
+
+ if (!parWorld.isRemote) // never spawn entity on client side
+ {
+ this.entityToSpawnNameFull = this.entityMODID + "." + this.entityToSpawnName;
+ if (EntityList.stringToClassMapping.containsKey(this.entityToSpawnNameFull)) {
+ this.entityToSpawn = (EntityLiving) EntityList.createEntityByName(this.entityToSpawnNameFull, parWorld);
+
+ this.entityToSpawn.setLocationAndAngles(
+ parX,
+ parY,
+ parZ,
+ MathHelper.wrapAngleTo180_float(parWorld.rand.nextFloat() * 360.0F),
+ 0.0F);
+
+ parWorld.spawnEntityInWorld(this.entityToSpawn);
+ this.entityToSpawn.onSpawnWithEgg((IEntityLivingData) null);
+ this.entityToSpawn.playLivingSound();
+ } else {
+ // DEBUG
+ Logger.WARNING("Entity not found " + this.entityToSpawnName);
+ }
+ }
+
+ return this.entityToSpawn;
+ }
+
+ /**
+ * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item parItem, final CreativeTabs parTab, final List parList) {
+ parList.add(new ItemStack(parItem, 1, 0));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(final ItemStack par1ItemStack, final int parColorType) {
+ return (parColorType == 0) ? this.colorBase : this.colorSpots;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ // Doing this override means that there is no localization for language
+ // unless you specifically check for localization here and convert
+ public String getItemStackDisplayName(final ItemStack par1ItemStack) {
+ return "Spawn " + this.entityToSpawnName;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ super.registerIcons(par1IconRegister);
+ this.theIcon = par1IconRegister.registerIcon(this.getIconString() + "_overlay");
+ }
+
+ /**
+ * Gets an icon index based on an item's damage value and the given render pass
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamageForRenderPass(final int parDamageVal, final int parRenderPass) {
+ return parRenderPass > 0 ? this.theIcon : super.getIconFromDamageForRenderPass(parDamageVal, parRenderPass);
+ }
+
+ public void setColors(final int parColorBase, final int parColorSpots) {
+ this.colorBase = parColorBase;
+ this.colorSpots = parColorSpots;
+ }
+
+ public int getColorBase() {
+ return this.colorBase;
+ }
+
+ public int getColorSpots() {
+ return this.colorSpots;
+ }
+
+ public final void setEntityToSpawnName(final String parEntityToSpawnName) {
+ this.entityToSpawnName = parEntityToSpawnName;
+ this.entityToSpawnNameFull = this.entityMODID + "." + this.entityToSpawnName;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/CoreItem.java b/src/main/java/gtPlusPlus/core/item/base/CoreItem.java
new file mode 100644
index 0000000000..4745fda281
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/CoreItem.java
@@ -0,0 +1,286 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class CoreItem extends Item {
+
+ private final EnumRarity rarity;
+ private final EnumChatFormatting descColour;
+ protected String itemName;
+ private final boolean hasEffect;
+
+ // Replace Item - What does this item turn into when held.
+ private final ItemStack turnsInto;
+
+ // 0
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab) {
+ this(unlocalizedName, creativeTab, 64, 0); // Calls 3
+ }
+
+ // 0
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab) {
+ this(unlocalizedName, creativeTab, 64, 0); // Calls 3
+ this.itemName = displayName;
+ }
+
+ // 0.1
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final ItemStack OverrideItem) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ 64,
+ 0,
+ new String[] {
+ "This item will be replaced by another when held by a player, it is old and should not be used in recipes." },
+ EnumRarity.uncommon,
+ EnumChatFormatting.UNDERLINE,
+ false,
+ OverrideItem); // Calls 5
+ }
+
+ // 0.1
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final ItemStack OverrideItem) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ 64,
+ 0,
+ new String[] {
+ "This item will be replaced by another when held by a player, it is old and should not be used in recipes." },
+ EnumRarity.uncommon,
+ EnumChatFormatting.UNDERLINE,
+ false,
+ OverrideItem); // Calls 5
+ this.itemName = displayName;
+ }
+
+ // 1
+ /*
+ * Name, Tab, Stack - 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize) {
+ this(unlocalizedName, creativeTab, stackSize, 0); // Calls 3
+ }
+
+ // 2
+ /*
+ * Name, Tab, Stack, Description - 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final String[] description) {
+ this(unlocalizedName, creativeTab, stackSize, 0, description); // Calls 4
+ }
+
+ // 3
+ /*
+ * Name, Tab, Stack, Dmg - Description
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, String string) {
+ this(unlocalizedName, creativeTab, stackSize, new String[] { string });
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] {}); // Calls 4
+ }
+
+ // 4 //Not Rare + basic tooltip
+ /*
+ * Name, Tab, Stack, Dmg, Description
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg, String string) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] { string });
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ stackSize,
+ maxDmg,
+ description,
+ EnumRarity.common,
+ EnumChatFormatting.GRAY,
+ false,
+ null); // Calls 4.5
+ }
+
+ // 4.5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Text Colour - Common
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumChatFormatting colour) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, description, EnumRarity.common, colour, false, null); // Calls
+ // 5
+ }
+
+ // 4.75
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity - Gray text
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg, String string,
+ EnumRarity uncommon) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] { string }, uncommon);
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumRarity rarity) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ stackSize,
+ maxDmg,
+ description,
+ rarity,
+ EnumChatFormatting.GRAY,
+ false,
+ null); // Calls 5
+ }
+
+ // 5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumRarity regRarity, final EnumChatFormatting colour, final boolean Effect,
+ final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ this.setItemDescription(description);
+ this.descColour = colour != null ? colour : EnumChatFormatting.RESET;
+ this.hasEffect = Effect;
+ this.turnsInto = OverrideItem;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ // 6
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final int stackSize, final int maxDmg, final String[] description, final EnumRarity regRarity,
+ final EnumChatFormatting colour, final boolean Effect, final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.itemName = displayName;
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ this.setItemDescription(description);
+ this.descColour = colour != null ? colour : EnumChatFormatting.RESET;
+ this.hasEffect = Effect;
+ this.turnsInto = OverrideItem;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ return this.hasEffect;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.turnsInto != null) {
+ if (entityHolding instanceof EntityPlayer) {
+
+ Logger.INFO("Replacing " + iStack.getDisplayName() + " with " + this.turnsInto.getDisplayName() + ".");
+ final ItemStack tempTransform = this.turnsInto;
+ if (iStack.stackSize == 64) {
+ tempTransform.stackSize = 64;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ for (int l = 0; l < 64; l++) {
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+
+ } else {
+ tempTransform.stackSize = 1;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ public ItemStack getStack() {
+ return ItemUtils.getSimpleStack(this);
+ }
+
+ public void setItemDescription(String[] description) {
+ for (int i = 0; i < description.length; i++) {
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i,
+ description[i]);
+ }
+ }
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack tItem) { if ((this.itemName == null) ||
+ * this.itemName.equals("")) { return super.getItemStackDisplayName(tItem); } return this.itemName; }
+ */
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java b/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java
new file mode 100644
index 0000000000..74ff99a7fe
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.bolts;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemBolt extends BaseItemComponent {
+
+ public BaseItemBolt(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.BOLT);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java b/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java
new file mode 100644
index 0000000000..1140390375
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.core.item.base.cell;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.core.Ic2Items;
+
+public class BaseItemCell extends BaseItemComponent {
+
+ ComponentTypes Cell = ComponentTypes.CELL;
+
+ public BaseItemCell(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.CELL);
+ this.fluidColour = (short[]) material.getRGBA();
+ }
+
+ public BaseItemCell(final String unlocalName, final String localName, final short[] RGBa) {
+ super(unlocalName, localName, RGBa);
+ this.fluidColour = RGBa;
+ FluidStack aFluid = FluidUtils.getFluidStack(unlocalName.toLowerCase(), 1000);
+ if (aFluid != null) {
+ FluidContainerRegistry.registerFluidContainer(aFluid, ItemUtils.getSimpleStack(this), Ic2Items.cell.copy());
+ }
+ }
+
+ public BaseItemCell(final String unlocalName, final String localName, final short[] RGBa, final Fluid cellFluid) {
+ super(unlocalName, localName, RGBa);
+ this.fluidColour = RGBa;
+ FluidContainerRegistry.registerFluidContainer(
+ FluidUtils.getFluidStack(cellFluid, 1000),
+ ItemUtils.getSimpleStack(this),
+ Ic2Items.cell.copy());
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "cell");
+ this.overlay = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "cell_OVERLAY");
+ } else {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.Cell.getComponent());
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.Cell.getComponent() + "_Overlay");
+ }
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ private final short[] fluidColour;
+ boolean upwards = true;
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java b/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java
new file mode 100644
index 0000000000..151f3f3860
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.core.item.base.cell;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+
+public class BaseItemPlasmaCell extends BaseItemComponent {
+
+ private IIcon base;
+ private IIcon overlay;
+ ComponentTypes PlasmaCell = ComponentTypes.PLASMACELL;
+ private int tickCounter = 0;
+ private final int tickCounterMax = 200;
+ private final short[] fluidColour;
+
+ public BaseItemPlasmaCell(final Material material) {
+ super(material, ComponentTypes.PLASMACELL);
+ this.fluidColour = (short[]) material.getRGBA();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.PlasmaCell.getComponent());
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.PlasmaCell.getComponent() + "_Overlay");
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 0) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (!world.isRemote) {
+ if (this.tickCounter < this.tickCounterMax) {
+ this.tickCounter++;
+ } else if (this.tickCounter >= this.tickCounterMax) {
+ entityHolding.attackEntityFrom(DamageSource.onFire, 2);
+ this.tickCounter = 0;
+ }
+ }
+ }
+ super.onUpdate(iStack, world, entityHolding, p_77663_4_, p_77663_5_);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java b/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java
new file mode 100644
index 0000000000..fd52fe78c4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.item.base.dusts;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemDust extends BaseItemComponent {
+
+ private BaseItemComponent[] mSizedDusts = new BaseItemComponent[2];
+
+ public BaseItemDust(Material aMat) {
+ this(aMat, true);
+ }
+
+ public BaseItemDust(Material aMat, boolean generateSmallDusts) {
+ super(aMat, ComponentTypes.DUST);
+ if (generateSmallDusts) {
+ mSizedDusts[0] = new BaseItemComponent(aMat, ComponentTypes.DUSTSMALL);
+ mSizedDusts[1] = new BaseItemComponent(aMat, ComponentTypes.DUSTTINY);
+ }
+ }
+
+ public BaseItemDust(DustState aState, Material aMat) {
+ super(aMat, ComponentTypes.DUST);
+ if (aState.generatesSmallDust()) {
+ mSizedDusts[0] = new BaseItemComponent(aMat, ComponentTypes.DUSTSMALL);
+ }
+ if (aState.generatesTinyDust()) {
+ mSizedDusts[1] = new BaseItemComponent(aMat, ComponentTypes.DUSTTINY);
+ }
+ }
+
+ private BaseItemDust(String unlocalizedName, String materialName, Material matInfo, int colour, String pileSize,
+ int tier, boolean addRecipes) {
+ super(matInfo, ComponentTypes.DUST);
+ }
+
+ public static class DustState {
+
+ static final int NORMAL = (1);
+ static final int SMALL = (10);
+ static final int TINY = (100);
+ final int MIXTURE;
+ final boolean[] doesThings = new boolean[3];
+
+ public DustState(boolean genDust, boolean genSmallDust, boolean genDustTiny) {
+ int aTotal = 0;
+ if (genDust) {
+ aTotal += NORMAL;
+ doesThings[0] = true;
+ } else {
+ doesThings[0] = false;
+ }
+ if (genSmallDust) {
+ aTotal += SMALL;
+ doesThings[1] = true;
+ } else {
+ doesThings[1] = false;
+ }
+ if (genDustTiny) {
+ aTotal += TINY;
+ doesThings[2] = true;
+ } else {
+ doesThings[2] = false;
+ }
+ MIXTURE = aTotal;
+ }
+
+ public boolean generatesDust() {
+ return doesThings[0];
+ }
+
+ public boolean generatesSmallDust() {
+ return doesThings[1];
+ }
+
+ public boolean generatesTinyDust() {
+ return doesThings[2];
+ }
+
+ private DustState(int amount) {
+
+ if (amount == 1) {
+ doesThings[0] = true;
+ doesThings[1] = false;
+ doesThings[2] = false;
+
+ } else if (amount == 10) {
+ doesThings[0] = false;
+ doesThings[1] = true;
+ doesThings[2] = false;
+ } else if (amount == 100) {
+ doesThings[0] = false;
+ doesThings[1] = false;
+ doesThings[2] = true;
+
+ } else if (amount == 11) {
+ doesThings[0] = true;
+ doesThings[1] = true;
+ doesThings[2] = false;
+
+ } else if (amount == 101) {
+ doesThings[0] = true;
+ doesThings[1] = false;
+ doesThings[2] = true;
+
+ } else if (amount == 110) {
+ doesThings[0] = false;
+ doesThings[1] = true;
+ doesThings[2] = true;
+
+ } else if (amount == 111) {
+ doesThings[0] = true;
+ doesThings[1] = true;
+ doesThings[2] = true;
+ } else {
+ doesThings[0] = false;
+ doesThings[1] = false;
+ doesThings[2] = false;
+ }
+ MIXTURE = amount;
+ }
+
+ public DustState get(int a) {
+ if (a == 1) {
+ return new DustState(NORMAL);
+ } else if (a == 10) {
+ return new DustState(SMALL);
+ } else if (a == 100) {
+ return new DustState(TINY);
+ } else {
+ return new DustState(MIXTURE);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java b/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java
new file mode 100644
index 0000000000..2592fe3cf7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java
@@ -0,0 +1,164 @@
+package gtPlusPlus.core.item.base.dusts;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemDustUnique extends Item {
+
+ protected final int colour;
+ protected final int sRadiation;
+ protected final String materialName;
+ protected final String chemicalNotation;
+
+ public BaseItemDustUnique(final String unlocalizedName, final String materialName, final int colour,
+ final String pileSize) {
+ this(unlocalizedName, materialName, "NullFormula", colour, pileSize);
+ }
+
+ public BaseItemDustUnique(final String unlocalizedName, final String materialName, final String mChemicalFormula,
+ final int colour, final String pileSize) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setMaxStackSize(64);
+ this.setTextureName(this.getCorrectTexture(pileSize));
+ this.setCreativeTab(tabMisc);
+ this.colour = colour;
+ this.materialName = materialName;
+ if (mChemicalFormula == null || mChemicalFormula.equals("") || mChemicalFormula.equals("NullFormula")) {
+ this.chemicalNotation = StringUtils.subscript(materialName);
+ } else {
+ this.chemicalNotation = StringUtils.subscript(mChemicalFormula);
+ }
+ this.sRadiation = ItemUtils.getRadioactivityLevel(materialName);
+ GameRegistry.registerItem(this, unlocalizedName);
+
+ String type;
+ if (this.getUnlocalizedName()
+ .contains("DustTiny")) {
+ type = "Tiny Pile of %material Dust";
+ } else if (this.getUnlocalizedName()
+ .contains("DustSmall")) {
+ type = "Small Pile of %material Dust";
+ } else {
+ type = "%material Dust";
+ }
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".name", type);
+
+ String temp = "";
+ Logger.WARNING("Unlocalized name for OreDict nameGen: " + this.getUnlocalizedName());
+ if (this.getUnlocalizedName()
+ .contains("item.")) {
+ temp = this.getUnlocalizedName()
+ .replace("item.", "");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else {
+ temp = this.getUnlocalizedName();
+ }
+ if (temp.contains("DustTiny")) {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else if (temp.contains("DustSmall")) {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ }
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ registerComponent();
+ }
+
+ public boolean registerComponent() {
+ if (this.materialName == null) {
+ return false;
+ }
+ String aName = materialName;
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(aName);
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = OrePrefixes.dust.name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS("Registering a material component. Item: [" + aName + "] Map: [" + aKey + "]");
+ Material.mComponentMap.put(aName, aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack iStack) {
+ return GT_LanguageManager.getTranslation("gtplusplus." + getUnlocalizedName() + ".name")
+ .replace("%material", GT_LanguageManager.getTranslation("gtplusplus.material." + materialName));
+ }
+
+ private String getCorrectTexture(final String pileSize) {
+ if (!CORE.ConfigSwitches.useGregtechTextures) {
+ if ((pileSize.equals("dust")) || (pileSize.equals("Dust"))) {
+ this.setTextureName(GTPlusPlus.ID + ":" + "dust");
+ } else {
+ this.setTextureName(GTPlusPlus.ID + ":" + "dust" + pileSize);
+ }
+ }
+ if (pileSize.toLowerCase()
+ .contains("small")) {
+ return GregTech.ID + ":" + "materialicons/SHINY/dustSmall";
+ } else if (pileSize.toLowerCase()
+ .contains("tiny")) {
+ return GregTech.ID + ":" + "materialicons/SHINY/dustTiny";
+ }
+ return GregTech.ID + ":" + "materialicons/SHINY/dust";
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.sRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ if (this.chemicalNotation.length() > 0 && !chemicalNotation.equals("")
+ && !chemicalNotation.equals("NullFormula")) {
+ list.add(this.chemicalNotation);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ public final String getMaterialName() {
+ return StringUtils.subscript(this.materialName);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java b/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java
new file mode 100644
index 0000000000..9b55461cfd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.foil;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemFoil extends BaseItemComponent {
+
+ public BaseItemFoil(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.FOIL);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java b/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java
new file mode 100644
index 0000000000..d759c7f116
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.gears;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemGear extends BaseItemComponent {
+
+ public BaseItemGear(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.GEAR);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java b/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java
new file mode 100644
index 0000000000..ddfdbd7534
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.gears;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemSmallGear extends BaseItemComponent {
+
+ public BaseItemSmallGear(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.SMALLGEAR);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java
new file mode 100644
index 0000000000..fc2748ec23
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemIngot extends BaseItemComponent {
+
+ protected final String materialName;
+ protected final String unlocalName;
+
+ public BaseItemIngot(final Material material) {
+ this(material, ComponentTypes.INGOT);
+ }
+
+ public BaseItemIngot(final Material material, final ComponentTypes type) {
+ super(material, type);
+ this.materialName = material.getLocalizedName();
+ this.unlocalName = material.getUnlocalizedName();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java
new file mode 100644
index 0000000000..9d22c0faf8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemIngotHot extends BaseItemIngot {
+
+ private final ItemStack outputIngot;
+ private int tickCounter = 0;
+ private final int tickCounterMax = 200;
+ private final int mTier;
+
+ private IIcon base;
+ private IIcon overlay;
+
+ public BaseItemIngotHot(final Material material) {
+ super(material, ComponentTypes.HOTINGOT);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemIngotHot");
+ this.outputIngot = material.getIngot(1);
+ this.mTier = material.vTier;
+ this.generateRecipe();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return super.getItemStackDisplayName(p_77653_1_);
+ // return ("Hot "+this.materialName+ " Ingot");
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return Utils.rgbtoHexValue(225, 225, 225);
+ }
+
+ private void generateRecipe() {
+ Logger.WARNING("Adding Vacuum Freezer recipe for a Hot Ingot of " + this.materialName + ".");
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(this))
+ .itemOutputs(this.outputIngot.copy())
+ .duration(Math.max(this.componentMaterial.getMass() * 3L, 1L) * TICKS)
+ .eut(this.componentMaterial.vVoltageMultiplier)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding != null && entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyHeatDamageToEntity(1, world, entityHolding);
+ }
+ }
+ }
+ super.onUpdate(iStack, world, entityHolding, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "ingotHot");
+ this.overlay = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "ingotHot_OVERLAY");
+ } else {
+ this.base = i
+ .registerIcon(GTPlusPlus.ID + ":" + "item" + BaseItemComponent.ComponentTypes.HOTINGOT.getComponent());
+ }
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0 && CORE.ConfigSwitches.useGregtechTextures) {
+ return this.base;
+ } else if (pass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return this.overlay;
+ } else {
+ return this.overlay;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java
new file mode 100644
index 0000000000..6335820c9a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemIngot_OLD extends Item {
+
+ protected int colour;
+ protected String materialName;
+ protected String unlocalName;
+
+ public BaseItemIngot_OLD(final String unlocalizedName, final String materialName, final int colour,
+ final int sRadioactivity) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.unlocalName = unlocalizedName;
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemIngot");
+ this.colour = colour;
+ this.materialName = materialName;
+ this.sRadiation = sRadioactivity;
+ GameRegistry.registerItem(this, unlocalizedName);
+ String temp = "";
+ if (this.unlocalName.contains("itemIngot")) {
+ temp = this.unlocalName.replace("itemI", "i");
+ } else if (this.unlocalName.contains("itemHotIngot")) {
+ temp = this.unlocalName.replace("itemHotIngot", "ingotHot");
+ }
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ // this.generateCompressorRecipe();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+
+ return (this.materialName + " Ingot");
+ }
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+
+ private void generateCompressorRecipe() {
+ if (this.unlocalName.contains("itemIngot")) {
+ final ItemStack tempStack = ItemUtils.getSimpleStack(this, 9);
+ ItemStack tempOutput = null;
+ String temp = this.getUnlocalizedName()
+ .replace("item.itemIngot", "block");
+ Logger.WARNING("Unlocalized name for OreDict nameGen: " + this.getUnlocalizedName());
+ if (this.getUnlocalizedName()
+ .contains("item.")) {
+ temp = this.getUnlocalizedName()
+ .replace("item.", "");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ }
+ temp = temp.replace("itemIngot", "block");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ if ((temp != null) && !temp.equals("")) {
+ tempOutput = ItemUtils.getItemStackOfAmountFromOreDict(temp, 1);
+ if (tempOutput != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tempStack)
+ .itemOutputs(tempOutput)
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ }
+ } else if (this.unlocalName.contains("itemHotIngot")) {
+ return;
+ }
+ }
+
+ protected final int sRadiation;
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java
new file mode 100644
index 0000000000..cf50da52a3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java
@@ -0,0 +1,51 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+
+public class ItemBlockBasicTile extends ItemBlock {
+
+ private final int mID;
+
+ public ItemBlockBasicTile(final Block block) {
+ super(block);
+ this.mID = ((ITileTooltip) block).getTooltipID();
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.mID == 0) { // Fish trap
+ list.add("This trap catches fish faster if surrounded by more water blocks");
+ list.add("Can also be placed beside upto 4 other fish traps");
+ list.add("Requires at least two faces touching water");
+ list.add("1/1000 chance to produce triple loot.");
+ } else if (this.mID == 4) { // Circuit Table
+ list.add("Easy Circuit Configuration");
+ list.add("Change default setting with a Screwdriver");
+ list.add("Default is used to select slot for auto-insertion");
+ } else if (this.mID == 5) { // Decayables Chest
+ list.add("Chest which holds radioactive materials");
+ list.add("Items which decay will tick while inside");
+ list.add("Place with right click");
+ } else if (this.mID == 6) { // Butterfly Killer
+ list.add("Kills Forestry Butterflies, Bats and other pests");
+ list.add("Use either Formaldehyde or Hydrogen cyanide");
+ list.add("Be weary of your neighbours");
+ } else if (this.mID == 8) { // Volumetric Flask Setter
+ list.add("Easy Flask Configuration");
+ list.add("Configure default input slot with a screwdriver");
+ } else if (this.mID == 9) {
+
+ } else {
+ list.add("Bad Tooltip ID - " + mID);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java
new file mode 100644
index 0000000000..98c652a1ba
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+
+public class ItemBlockGtBlock extends ItemBlock {
+
+ public static HashMap<String, String> sNameCache = new HashMap<>();
+
+ protected final int blockColour;
+ private int sRadiation;
+
+ private Material mMaterial;
+ protected BlockTypes thisBlockType;
+
+ private final Block thisBlock;
+ private boolean isOre = false;
+ private boolean isModular = false;
+
+ public ItemBlockGtBlock(final Block block) {
+ super(block);
+ this.thisBlock = block;
+ if (block instanceof BlockBaseOre) {
+ this.isOre = true;
+ } else if (block instanceof BlockBaseModular) {
+ this.isModular = true;
+ }
+ final BlockBaseModular baseBlock = (BlockBaseModular) block;
+ if (isModular) {
+ this.blockColour = baseBlock.getRenderColor(0);
+ } else if (isOre) {
+ this.blockColour = block.getBlockColor();
+ } else {
+ this.blockColour = block.getBlockColor();
+ }
+
+ if (block instanceof BlockBaseModular g) {
+ this.mMaterial = g.getMaterialEx();
+ this.thisBlockType = g.thisBlock;
+ } else {
+ this.mMaterial = null;
+ this.thisBlockType = BlockTypes.STANDARD;
+ }
+ }
+
+ public int getBlockTypeMeta() {
+ if (this.thisBlockType.equals(BlockTypes.STANDARD)) {
+ return 0;
+ } else if (this.thisBlockType.equals(BlockTypes.FRAME)) {
+ return 1;
+ } else if (this.thisBlockType.equals(BlockTypes.ORE)) {
+ return 2;
+ }
+ return 0;
+ }
+
+ public String getUnlocalizedBlockName() {
+ return "block." + mMaterial.getUnlocalizedName()
+ + "."
+ + this.thisBlockType.name()
+ .toLowerCase();
+ }
+
+ public String GetProperName() {
+ String tempIngot = sNameCache.get(getUnlocalizedBlockName());
+ if (tempIngot == null) {
+ tempIngot = "BAD.UNLOCAL.NAME";
+ }
+ return tempIngot;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return this.thisBlock.getLocalizedName();
+ }
+
+ public int getRenderColor(final int aMeta) {
+ return this.blockColour;
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ if (this.mMaterial != null) {
+ list.add(this.mMaterial.vChemicalFormula);
+ } else {
+
+ try {
+ BlockBaseModular g = (BlockBaseModular) thisBlock;
+ this.mMaterial = g.getMaterialEx();
+ } catch (Throwable t) {
+
+ }
+
+ // list.add("Material is Null.");
+ }
+
+ if (this.isOre) {
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+
+ String aTool = b.getHarvestTool(stack.getItemDamage());
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+
+ if (this.mMaterial != null) {
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ list.add("Contains: ");
+ if (mMaterial.getComposites()
+ .isEmpty()) {
+ list.add("- " + mMaterial.getLocalizedName());
+ } else {
+ for (MaterialStack m : mMaterial.getComposites()) {
+ list.add(
+ "- " + m.getStackMaterial()
+ .getLocalizedName() + " x" + m.getPartsPerOneHundred());
+ }
+ }
+ }
+ }
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+ } else {
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+ String aTool = b.getHarvestTool(stack.getItemDamage());
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ }
+ }
+
+ if (this.mMaterial != null) {
+ if (this.mMaterial.vRadiationLevel > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ }
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+
+ if (!isModular && !isOre) {
+ mMaterial = null;
+ } else {
+ if (this.mMaterial == null) {
+ Block b = Block.getBlockFromItem(iStack.getItem());
+ if (isOre) {
+ mMaterial = ((BlockBaseOre) b).getMaterialEx();
+ } else {
+ mMaterial = ((BlockBaseModular) b).getMaterialEx();
+ }
+ if (mMaterial != null) {
+ this.sRadiation = mMaterial.vRadiationLevel;
+ } else {
+ this.sRadiation = 0;
+ }
+ }
+ if (this.sRadiation > 0) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java
new file mode 100644
index 0000000000..54cfefbac2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlockWithMetadata;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class ItemBlockMeta extends ItemBlockWithMetadata {
+
+ private final Block mBlock;
+ private HashMap<Integer, AutoMap<String>> aTooltips = new LinkedHashMap<>();
+
+ public ItemBlockMeta(final Block aBlock) {
+ super(aBlock, aBlock);
+ this.mBlock = aBlock;
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ if (aBlock instanceof ITileTooltip aTooltip) {
+ // aTooltips.put(aTooltip.getTooltipID(), aTooltip.getTooltipMap());
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ Block aThis = Block.getBlockFromItem(stack.getItem());
+ if (aThis != null) {
+ if (!aTooltips.isEmpty()) {
+ AutoMap<String> h = aTooltips.get(stack.getItemDamage());
+ if (h != null && !h.isEmpty()) {
+ for (String s : h) {
+ list.add(s);
+ }
+ }
+ }
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ /**
+ * Gets an icon index based on an item's damage value
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(final int p_77617_1_) {
+ return this.mBlock.getIcon(2, p_77617_1_);
+ }
+
+ /**
+ * Returns the metadata of the block which this Item (ItemBlock) can place
+ */
+ @Override
+ public int getMetadata(final int p_77647_1_) {
+ return p_77647_1_;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack stack) {
+ return this.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java
new file mode 100644
index 0000000000..0cee16b3f6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java
@@ -0,0 +1,148 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Ore_Layer;
+
+public class ItemBlockOre extends ItemBlock {
+
+ private final BlockBaseOre mThisOre;
+ private final Material mThisMaterial;
+ private final int mThisRadiation;
+
+ public ItemBlockOre(final Block block) {
+ super(block);
+ if (block instanceof BlockBaseOre) {
+ this.mThisOre = (BlockBaseOre) block;
+ this.mThisMaterial = this.mThisOre.getMaterialEx();
+ this.mThisRadiation = this.mThisMaterial.vRadiationLevel;
+ } else {
+ this.mThisOre = null;
+ this.mThisMaterial = null;
+ this.mThisRadiation = 0;
+ }
+ }
+
+ private static Map<String, AutoMap<String>> mMapOreBlockItemToDimName = new LinkedHashMap<>();
+ private static boolean mInitOres_Everglades = false;
+ private AutoMap<String> mDimsForThisOre = new AutoMap<>();
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ if (!mInitOres_Everglades) {
+ for (WorldGen_GT_Ore_Layer f : gtPlusPlus.everglades.gen.gt.WorldGen_Ores.validOreveins.values()) {
+ Material[] m2 = new Material[] { f.mPrimary, f.mSecondary, f.mBetween, f.mSporadic };
+ for (Material m1 : m2) {
+ AutoMap<String> aMap = mMapOreBlockItemToDimName.get(
+ m1.getUnlocalizedName()
+ .toLowerCase());
+ if (aMap == null) {
+ aMap = new AutoMap<>();
+ }
+ String aDimName = "Everglades";
+ if (!aMap.containsValue(aDimName)) {
+ aMap.put(aDimName);
+ }
+ mMapOreBlockItemToDimName.put(
+ m1.getUnlocalizedName()
+ .toLowerCase(),
+ aMap);
+ }
+ }
+ mInitOres_Everglades = true;
+ }
+
+ if (this.mThisMaterial != null) {
+ list.add(this.mThisMaterial.vChemicalFormula);
+ }
+
+ // Radioactive?
+ if (this.mThisRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+
+ if (this.mThisMaterial != null) {
+ list.add("Ore contains: ");
+ if (mThisMaterial.getComposites()
+ .isEmpty()) {
+ list.add("- " + mThisMaterial.getLocalizedName());
+ } else {
+ for (MaterialStack m : mThisMaterial.getComposites()) {
+ list.add(
+ "- " + m.getStackMaterial()
+ .getLocalizedName() + " x" + m.getPartsPerOneHundred());
+ }
+ }
+ }
+
+ if (KeyboardUtils.isCtrlKeyDown()) {
+
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+ if (aMiningLevel1 != 0) {
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ }
+ }
+
+ if (mDimsForThisOre.isEmpty()) {
+ AutoMap<String> A = mMapOreBlockItemToDimName.get(
+ this.mThisMaterial.getUnlocalizedName()
+ .toLowerCase());
+ if (A != null) {
+ mDimsForThisOre = A;
+ }
+ }
+
+ list.add("Found: ");
+ if (!mDimsForThisOre.isEmpty()) {
+ for (String m : mDimsForThisOre) {
+ list.add("- " + m);
+ }
+ } else {
+ list.add("- Unknown");
+ }
+
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.mThisMaterial != null) {
+ if (this.mThisRadiation > 0) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.mThisMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java b/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java
new file mode 100644
index 0000000000..020becc687
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.item.base.misc;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemMisc extends Item {
+
+ public final String displayName;
+ public final String unlocalName;
+ public final MiscTypes miscType;
+ public final Object componentColour;
+
+ public BaseItemMisc(final String displayName, final short[] RGB, final int maxStackSize, final MiscTypes miscType,
+ String[] description) {
+
+ // Set-up the Misc Generic Item
+ this.displayName = displayName;
+ String unlocalName = Utils.sanitizeString(displayName);
+ this.unlocalName = "item" + miscType.TYPE + unlocalName;
+ this.miscType = miscType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(maxStackSize);
+ // this.setTextureName(this.getCorrectTextures());
+ if (RGB != null) {
+ this.componentColour = Utils.rgbtoHexValue(RGB[0], RGB[1], RGB[2]);
+ } else {
+ this.componentColour = null;
+ }
+ if (description != null) {
+ for (int i = 0; i < description.length; i++) {
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip." + i, description[i]);
+ }
+ }
+ GameRegistry.registerItem(this, this.unlocalName);
+ GT_OreDictUnificator.registerOre(miscType.getOreDictPrefix() + unlocalName, ItemUtils.getSimpleStack(this));
+ }
+
+ private String getCorrectTextures() {
+ return GTPlusPlus.ID + ":" + "item" + this.miscType.TYPE;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return this.miscType == MiscTypes.DROP;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return (this.miscType == MiscTypes.DROP) ? 2 : 1;
+ }
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ if (this.miscType == MiscTypes.DROP && Forestry.isModLoaded()) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:honeyDrop.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:honeyDrop.1");
+ } else {
+ this.itemIcon = par1IconRegister.registerIcon(getCorrectTextures());
+ }
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ // Returns default colour if a custom one is not set.
+ if (this.componentColour == null) {
+ return 16777215;
+ } else {
+ return (int) this.componentColour;
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ // Nothing Fancy here yet.
+ }
+
+ public static enum MiscTypes {
+
+ POTION("Potion", " Potion", "potion"),
+ KEY("Key", " Key", "key"),
+ BIGKEY("KeyBig", " Big Key", "bosskey"),
+ BOTTLE("Bottle", " Bottle", "bottle"),
+ GEM("Gem", " Gemstone", "gem"),
+ DROP("Droplet", " Droplet", "droplet"),
+ MUSHROOM("Mushroom", " Mushroom", "mushroom");
+
+ private final String TYPE;
+ private final String DISPLAY_NAME_SUFFIX;
+ private final String OREDICT_PREFIX;
+
+ private MiscTypes(final String LocalName, final String DisplayNameSuffix, final String OreDictPrefix) {
+ this.TYPE = LocalName;
+ this.DISPLAY_NAME_SUFFIX = DisplayNameSuffix;
+ this.OREDICT_PREFIX = OreDictPrefix;
+ }
+
+ public String getType() {
+ return this.TYPE;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME_SUFFIX;
+ }
+
+ public String getOreDictPrefix() {
+ return this.OREDICT_PREFIX;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java b/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java
new file mode 100644
index 0000000000..b6292c695e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java
@@ -0,0 +1,66 @@
+package gtPlusPlus.core.item.base.misc;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public abstract class BaseItemParticle extends CoreItem {
+
+ protected static final Map<Integer, Integer> aColourMap = new LinkedHashMap<>();
+ private final int aMaxCount;
+
+ public BaseItemParticle(String aType, int aCount, EnumRarity aRarity) {
+ super(
+ "particle" + aType,
+ aType,
+ AddToCreativeTab.tabOther,
+ 64,
+ 0,
+ new String[] {},
+ aRarity,
+ EnumChatFormatting.DARK_AQUA,
+ false,
+ null);
+ this.setTextureName(GTPlusPlus.ID + ":" + "science/Atom");
+ aMaxCount = aCount;
+ this.setHasSubtypes(true);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return aColourMap.get(stack.getItemDamage());
+ }
+
+ public int getColorFromParentClass(ItemStack stack, int aaa) {
+ return super.getColorFromItemStack(stack, aaa);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < aMaxCount; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public final String getItemStackDisplayName(final ItemStack tItem) {
+ String aReturnValue = super.getItemStackDisplayName(tItem);
+ String[] a2 = getAffixes();
+ aReturnValue = (a2[0] + aReturnValue + a2[1]);
+ return aReturnValue;
+ }
+
+ public abstract String[] getAffixes();
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java b/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java
new file mode 100644
index 0000000000..b0537f022f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.nugget;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemNugget extends BaseItemComponent {
+
+ public BaseItemNugget(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.NUGGET);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java
new file mode 100644
index 0000000000..9a72f62040
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemCentrifugedCrushedOre extends BaseOreComponent {
+
+ public BaseItemCentrifugedCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHEDCENTRIFUGED);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java
new file mode 100644
index 0000000000..e9588f9f96
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemCrushedOre extends BaseOreComponent {
+
+ public BaseItemCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHED);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java
new file mode 100644
index 0000000000..f80e392703
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemImpureDust extends BaseOreComponent {
+
+ public BaseItemImpureDust(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.DUSTIMPURE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java
new file mode 100644
index 0000000000..90235a18b3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.core.item.base.ore;
+
+import net.minecraft.item.Item;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class BaseItemMilledOre extends BaseOreComponent {
+
+ public BaseItemMilledOre(final Material material, int aMaterialEU) {
+ super(material, BaseOreComponent.ComponentTypes.MILLED);
+ CORE.RA.addMillingRecipe(material, aMaterialEU);
+ }
+
+ public static Item generate(Materials aMat, int aMaterialEU) {
+ return generate(MaterialUtils.generateMaterialFromGtENUM(aMat), aMaterialEU);
+ }
+
+ public static Item generate(Material aMat, int aMaterialEU) {
+ return new BaseItemMilledOre(aMat, aMaterialEU);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java
new file mode 100644
index 0000000000..744b204d43
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPurifiedCrushedOre extends BaseOreComponent {
+
+ public BaseItemPurifiedCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHEDPURIFIED);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java
new file mode 100644
index 0000000000..4b94b98e64
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPurifiedDust extends BaseOreComponent {
+
+ public BaseItemPurifiedDust(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.DUSTPURE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java
new file mode 100644
index 0000000000..bca44d0045
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRawOre extends BaseOreComponent {
+
+ public BaseItemRawOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.RAWORE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java b/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java
new file mode 100644
index 0000000000..2074bb2ede
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java
@@ -0,0 +1,272 @@
+package gtPlusPlus.core.item.base.ore;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseOreComponent extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon base;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon overlay;
+
+ public final Material componentMaterial;
+ public final String materialName;
+ public final String unlocalName;
+ public final ComponentTypes componentType;
+ public final int componentColour;
+ public Object extraData;
+
+ public BaseOreComponent(final Material material, final ComponentTypes componentType) {
+ this.componentMaterial = material;
+ this.unlocalName = componentType.COMPONENT_NAME + material.getUnlocalizedName();
+ this.materialName = material.getLocalizedName();
+ this.componentType = componentType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(64);
+ this.componentColour = material.getRgbAsHex();
+ GameRegistry.registerItem(this, this.unlocalName);
+ registerComponent();
+ GT_OreDictUnificator
+ .registerOre(componentType.getComponent() + material.getUnlocalizedName(), ItemUtils.getSimpleStack(this));
+ }
+
+ public boolean registerComponent() {
+ Logger.MATERIALS("Attempting to register " + this.getUnlocalizedName() + ".");
+ if (this.componentMaterial == null) {
+ Logger.MATERIALS("Tried to register " + this.getUnlocalizedName() + " but the material was null.");
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = "Invalid";
+ switch (componentType) {
+ case CRUSHED -> aKey = OrePrefixes.crushed.name();
+ case CRUSHEDCENTRIFUGED -> aKey = OrePrefixes.crushedCentrifuged.name();
+ case CRUSHEDPURIFIED -> aKey = OrePrefixes.crushedPurified.name();
+ case DUST -> aKey = OrePrefixes.dust.name();
+ case DUSTIMPURE -> aKey = OrePrefixes.dustImpure.name();
+ case DUSTPURE -> aKey = OrePrefixes.dustPure.name();
+ case MILLED -> aKey = OrePrefixes.milled.name();
+ case RAWORE -> aKey = OrePrefixes.rawOre.name();
+ }
+
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack p_77653_1_) { return
+ * (this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME); }
+ */
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ if (this.materialName != null && !this.materialName.equals("")) {
+ if (this.componentMaterial != null) {
+ if (!this.componentMaterial.vChemicalFormula.contains("?")) {
+ list.add(Utils.sanitizeStringKeepBrackets(this.componentMaterial.vChemicalFormula));
+ } else if (this.componentMaterial.vChemicalFormula.contains("?")) {
+ String temp = componentMaterial.vChemicalFormula;
+ temp = temp.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ list.add(temp);
+ }
+ if (this.componentMaterial.isRadioactive) {
+ list.add(CORE.GT_Tooltip_Radioactive.get() + " | Level: " + this.componentMaterial.vRadiationLevel);
+ }
+ } else {
+ String aChemicalFormula = Material.sChemicalFormula.get(materialName.toLowerCase());
+ if (aChemicalFormula != null && aChemicalFormula.length() > 0) {
+ list.add(Utils.sanitizeStringKeepBrackets(aChemicalFormula));
+ }
+ }
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.componentMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+
+ /**
+ * Rendering Related
+ *
+ * @author Alkalus
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ if (this.componentType.hasOverlay()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ if (this.componentType == ComponentTypes.MILLED) {
+ this.base = par1IconRegister.registerIcon(GTPlusPlus.ID + ":" + "processing/MilledOre/milled");
+ if (this.componentType.hasOverlay()) {
+ this.overlay = par1IconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + "processing/MilledOre/milled_OVERLAY");
+ }
+ } else if (CORE.ConfigSwitches.useGregtechTextures) {
+ // Logger.MATERIALS(this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME+"
+ // is using `"+GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME+"' as the
+ // layer 0 texture path.");
+ this.base = par1IconRegister
+ .registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME);
+ if (this.componentType.hasOverlay()) {
+ // Logger.MATERIALS(this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME+"
+ // is using `"+GregTech.ID + ":" + "materialicons/METALLIC/" +
+ // this.componentType.COMPONENT_NAME+"_OVERLAY"+"' as the layer 1 texture path.");
+ this.overlay = par1IconRegister.registerIcon(
+ GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME + "_OVERLAY");
+ }
+ } else {
+ this.base = par1IconRegister.registerIcon(GTPlusPlus.ID + ":" + "item" + this.componentType.getComponent());
+ if (this.componentType.hasOverlay()) {
+ this.overlay = par1IconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + "item" + this.componentType.getComponent() + "_Overlay");
+ }
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (this.componentType == ComponentTypes.MILLED) {
+ if (renderPass == 1) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ } else {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return this.componentColour;
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ public static enum ComponentTypes {
+
+ DUST("dust", "", " Dust", true),
+ DUSTIMPURE("dustImpure", "Impure ", " Dust", true),
+ DUSTPURE("dustPure", "Purified ", " Dust", true),
+ CRUSHED("crushed", "Crushed ", " Ore", true),
+ CRUSHEDCENTRIFUGED("crushedCentrifuged", "Centrifuged Crushed ", " Ore", true),
+ CRUSHEDPURIFIED("crushedPurified", "Purified Crushed ", " Ore", true),
+ RAWORE("oreRaw", "Raw ", " Ore", true),
+ MILLED("milled", "Milled ", " Ore", true);
+
+ private final String COMPONENT_NAME;
+ private final String PREFIX;
+ private final String DISPLAY_NAME;
+ private final boolean HAS_OVERLAY;
+
+ private ComponentTypes(final String LocalName, final String prefix, final String DisplayName,
+ final boolean overlay) {
+ this.COMPONENT_NAME = LocalName;
+ this.PREFIX = prefix;
+ this.DISPLAY_NAME = DisplayName;
+ this.HAS_OVERLAY = overlay;
+ // dust + Dirty, Impure, Pure, Refined
+ // crushed + centrifuged, purified
+ }
+
+ public String getComponent() {
+ return this.COMPONENT_NAME;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME;
+ }
+
+ public boolean hasOverlay() {
+ return this.HAS_OVERLAY;
+ }
+
+ public String getPrefix() {
+ return this.PREFIX;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java
new file mode 100644
index 0000000000..0fad7a8258
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class BaseItemPlate extends BaseItemComponent {
+
+ public BaseItemPlate(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.PLATE);
+ }
+
+ public BaseItemPlate(final String unlocalizedName, final String materialName, final MaterialState state,
+ final short[] colour, final int tier, final int sRadioactivity) {
+ this(
+ MaterialUtils.generateQuickMaterial(
+ materialName,
+ state,
+ new short[] { colour[0], colour[1], colour[2], 0 },
+ sRadioactivity));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java
new file mode 100644
index 0000000000..580e028c00
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPlateDense extends BaseItemComponent {
+
+ public BaseItemPlateDense(Material material) {
+ super(material, ComponentTypes.PLATEDENSE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java
new file mode 100644
index 0000000000..4f5bc12829
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPlateDouble extends BaseItemComponent {
+
+ public BaseItemPlateDouble(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.PLATEDOUBLE);
+ this.setMaxStackSize(32);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java
new file mode 100644
index 0000000000..168d5236c6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.core.item.base.plates;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemPlate_OLD extends Item {
+
+ protected final int colour;
+ protected final int sRadiation;
+ protected final String materialName;
+ protected final String unlocalName;
+ protected final String chemicalNotation;
+
+ public BaseItemPlate_OLD(final String unlocalizedName, final String materialName, final int colour,
+ final int sRadioactivity) {
+ this(unlocalizedName, materialName, "NullFormula", colour, sRadioactivity);
+ }
+
+ public BaseItemPlate_OLD(final String unlocalizedName, final String materialName, final String mChemicalFormula,
+ final int colour, final int sRadioactivity) {
+ this.setUnlocalizedName("itemPlate" + unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.unlocalName = "itemPlate" + unlocalizedName;
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemPlate");
+ this.setMaxStackSize(64);
+ this.colour = colour;
+ this.materialName = materialName;
+ if (mChemicalFormula.equals("") || mChemicalFormula.equals("NullFormula")) {
+ this.chemicalNotation = StringUtils.subscript(materialName);
+ } else {
+ this.chemicalNotation = StringUtils.subscript(mChemicalFormula);
+ }
+ this.sRadiation = sRadioactivity;
+ GameRegistry.registerItem(this, "itemPlate" + unlocalizedName);
+ String temp;
+ if (this.unlocalName.toLowerCase()
+ .contains("itemplate")) {
+ temp = this.unlocalName.replace("itemP", "p");
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ }
+ }
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.sRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ if (StringUtils.containsSuperOrSubScript(this.chemicalNotation)) {
+ list.add(this.chemicalNotation);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java b/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java
new file mode 100644
index 0000000000..d25ea02d52
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rings;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRing extends BaseItemComponent {
+
+ public BaseItemRing(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.RING);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java b/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java
new file mode 100644
index 0000000000..9a9998d63a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rods;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRod extends BaseItemComponent {
+
+ public BaseItemRod(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.ROD);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java b/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java
new file mode 100644
index 0000000000..bf7dd3bccc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rods;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRodLong extends BaseItemComponent {
+
+ public BaseItemRodLong(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.RODLONG);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java b/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java
new file mode 100644
index 0000000000..c2fae0fc8b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rotors;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRotor extends BaseItemComponent {
+
+ public BaseItemRotor(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.ROTOR);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java b/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java
new file mode 100644
index 0000000000..7f0ba8c504
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.screws;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemScrew extends BaseItemComponent {
+
+ public BaseItemScrew(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.SCREW);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java b/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java
new file mode 100644
index 0000000000..3e2cee49a9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.wire;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemFineWire extends BaseItemComponent {
+
+ public BaseItemFineWire(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.FINEWIRE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java b/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java
new file mode 100644
index 0000000000..92468aa6d8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.item.bauble;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.event.entity.living.LivingAttackEvent;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import baubles.common.container.InventoryBaubles;
+import baubles.common.lib.PlayerHandler;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public class BaseBauble extends Item implements IBauble {
+
+ /**
+ * Implementation suggestions taken from Botania.
+ */
+ private BaubleType mThisBauble;
+
+ private List<String> damageNegations = new ArrayList<>();
+ Multimap<String, AttributeModifier> attributes = HashMultimap.create();
+
+ public BaseBauble(BaubleType type) {
+ this.mThisBauble = type;
+ Utils.registerEvent(this);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String key = "gtplusplus." + getUnlocalizedName() + ".name";
+ if (key.equals(GT_LanguageManager.getTranslation(key))) {
+ return super.getItemStackDisplayName(tItem).replaceAll(".name", "");
+ }
+ return GT_LanguageManager.getTranslation(key);
+ }
+
+ @SubscribeEvent
+ public void onPlayerAttacked(LivingAttackEvent event) {
+ if (event.entityLiving instanceof EntityPlayer player) {
+ if (getCorrectBauble(player) != null && damageNegations.contains(event.source.damageType))
+ event.setCanceled(true);
+ }
+ }
+
+ @Override
+ public boolean canEquip(ItemStack arg0, EntityLivingBase arg1) {
+ return arg1 instanceof EntityPlayer;
+ }
+
+ @Override
+ public boolean canUnequip(ItemStack arg0, EntityLivingBase arg1) {
+ return arg1 instanceof EntityPlayer;
+ }
+
+ @Override
+ public BaubleType getBaubleType(ItemStack arg0) {
+ return mThisBauble;
+ }
+
+ @Override
+ public void onEquipped(ItemStack stack, EntityLivingBase entity) {
+ if (entity instanceof EntityPlayer) {
+ onEquippedOrLoadedIntoWorld(entity);
+ setPlayerHashcode(stack, entity.hashCode());
+ }
+ }
+
+ @Override
+ public void onWornTick(ItemStack stack, EntityLivingBase player) {
+ if (getPlayerHashcode(stack) != player.hashCode()) {
+ onEquippedOrLoadedIntoWorld(player);
+ setPlayerHashcode(stack, player.hashCode());
+ }
+ }
+
+ public void onEquippedOrLoadedIntoWorld(EntityLivingBase player) {
+ attributes.clear();
+ player.getAttributeMap()
+ .applyAttributeModifiers(attributes);
+ }
+
+ @Override
+ public void onUnequipped(ItemStack stack, EntityLivingBase player) {
+ attributes.clear();
+ player.getAttributeMap()
+ .removeAttributeModifiers(attributes);
+ }
+
+ public ItemStack getCorrectBauble(EntityPlayer player) {
+ InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player);
+ ItemStack stack1 = baubles.getStackInSlot(1);
+ ItemStack stack2 = baubles.getStackInSlot(2);
+ return isCorrectBauble(stack1) ? stack1 : isCorrectBauble(stack2) ? stack2 : null;
+ }
+
+ private boolean isCorrectBauble(ItemStack stack) {
+ return stack != null && (stack.getItem() == this);
+ }
+
+ @Override
+ public int getEntityLifespan(ItemStack itemStack, World world) {
+ return Integer.MAX_VALUE;
+ }
+
+ public static int getPlayerHashcode(ItemStack stack) {
+ return NBTUtils.getInteger(stack, "mPlayerHashcode");
+ }
+
+ public static void setPlayerHashcode(ItemStack stack, int hash) {
+ NBTUtils.setInteger(stack, "mPlayerHashcode", hash);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java b/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java
new file mode 100644
index 0000000000..881146b15d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java
@@ -0,0 +1,261 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class BatteryPackBaseBauble extends ElectricBaseBauble {
+
+ public BatteryPackBaseBauble(int tier) {
+ super(BaubleType.BELT, tier, GT_Values.V[tier] * 20 * 300, "GTPP.BattPack.0" + tier + ".name");
+ String aUnlocalName = "GTPP.BattPack.0" + tier + ".name";
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
+ ItemStack itemStack = new ItemStack(this, 1);
+ ItemStack charged;
+ if (this.getEmptyItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, 0.0D, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ if (this.getChargedItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, Double.POSITIVE_INFINITY, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ double aItemCharge = ElectricItem.manager.getCharge(itemStack);
+ return aItemCharge > 0;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return (EnumChatFormatting.BLUE + super.getItemStackDisplayName(p_77653_1_) + EnumChatFormatting.GRAY);
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public int secondsLeft(final ItemStack stack) {
+ double r = 0;
+ r = this.getCharge(stack) / (10000 * 20);
+ return (int) MathUtils.decimalRounding(r);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ String aString1 = StatCollector.translateToLocal("GTPP.battpack.tooltip.1");
+ String aString2 = StatCollector.translateToLocal("GTPP.battpack.tooltip.2");
+ String aString3 = StatCollector.translateToLocal("GTPP.battpack.tooltip.3");
+ String aString4 = StatCollector.translateToLocal("GTPP.battpack.tooltip.4");
+
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+
+ list.add(EnumChatFormatting.GREEN + aString1 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GREEN + aString2
+ + " "
+ + (int) getTransferLimit(stack)
+ + aEUT
+ + " "
+ + aString3
+ + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.GREEN + aString4 + EnumChatFormatting.GRAY);
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack aBaubleStack, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+
+ try {
+
+ if (this.getCharge(aBaubleStack) >= getTransferLimit(aBaubleStack)) {
+ // Try Iterate Armour Slots of Player
+ if (aPlayer instanceof EntityPlayer) {
+
+ // amour
+ for (final ItemStack aInvStack : ((EntityPlayer) aPlayer).inventory.armorInventory) {
+ if (aInvStack != null) {
+ if (aInvStack == aBaubleStack) {
+ continue;
+ }
+ if (ChargingHelper.isItemValid(aInvStack)) {
+ double aTransferRate = 0;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+ if (electricItem != null) {
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ double aItemCharge = ElectricItem.manager.getCharge(aInvStack);
+ if (aItemCharge >= 0 && aItemCharge != electricItem.getMaxCharge(aInvStack)) {
+ if (aItemCharge <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ if (ElectricItem.manager.getCharge(aBaubleStack) >= aTransferRate) {
+ if (ElectricItem.manager.getCharge(aInvStack)
+ <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ double d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate * 16, mTier, false, true);
+ if (d > 0) {
+ d = ElectricItem.manager.charge(
+ aInvStack,
+ aTransferRate * 16,
+ mTier,
+ false,
+ false);
+ ElectricItem.manager
+ .discharge(aBaubleStack, d, mTier, false, true, false);
+ // Logger.INFO("Charging " + aInvStack.getDisplayName() + "
+ // | " + d + " | "+electricItem.getMaxCharge(aInvStack));
+ }
+ } else {
+ // Logger.INFO("5");
+ }
+ } else {
+ // Logger.INFO("4");
+ }
+ } else {
+ // Logger.INFO("3");
+ }
+
+ } else {
+ // Logger.INFO("1");
+ }
+ }
+ }
+ }
+ if (this.getCharge(aBaubleStack) > 0) {
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ // Hotbar Slots
+ int aSlotCounter = 0;
+ for (final ItemStack aInvStack : ((EntityPlayer) aPlayer).inventory.mainInventory) {
+ if (aSlotCounter > (InventoryPlayer.getHotbarSize() - 1)) {
+ break;
+ }
+ aSlotCounter++;
+ if (aInvStack != null) {
+ if (aInvStack == aBaubleStack) {
+ continue;
+ }
+ if (ChargingHelper.isItemValid(aInvStack)) {
+ double aTransferRate = 0;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+ if (electricItem != null) {
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ double aItemCharge = ElectricItem.manager.getCharge(aInvStack);
+ if (aItemCharge >= 0 && aItemCharge != electricItem.getMaxCharge(aInvStack)) {
+ if (aItemCharge <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ if (ElectricItem.manager.getCharge(aBaubleStack) >= aTransferRate) {
+ if (ElectricItem.manager.getCharge(aInvStack)
+ <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ double d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate, mTier, false, true);
+ if (d > 0) {
+ d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate, mTier, false, false);
+ ElectricItem.manager
+ .discharge(aBaubleStack, d, mTier, false, true, false);
+ // Logger.INFO("Charging " + aInvStack.getDisplayName() + "
+ // | " + d + " | "+electricItem.getMaxCharge(aInvStack));
+ }
+ } else {
+ // Logger.INFO("5");
+ }
+ } else {
+ // Logger.INFO("4");
+ }
+ } else {
+ // Logger.INFO("3");
+ }
+
+ } else {
+ // Logger.INFO("1");
+ }
+ }
+ }
+ }
+ if (this.getCharge(aBaubleStack) > 0) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+
+ }
+ }
+ }
+
+ @Override
+ public String getTextureNameForBauble() {
+ return "chargepack/" + mTier;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java b/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java
new file mode 100644
index 0000000000..ab17e91232
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java
@@ -0,0 +1,220 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public abstract class ElectricBaseBauble extends BaseBauble implements IElectricItem, IElectricItemManager, IBauble {
+
+ public final int mTier;
+ private final double maxValueEU;
+ private final BaubleType mType;
+
+ public ElectricBaseBauble(BaubleType aType, int aTier, double aMaxEU, String aUnlocalName) {
+ super(aType);
+ mType = aType;
+ mTier = aTier;
+ maxValueEU = aMaxEU;
+ this.setUnlocalizedName(aUnlocalName);
+ this.setTextureName(GTPlusPlus.ID + ":" + getTextureNameForBauble());
+ this.setMaxDamage(27);
+ this.setMaxStackSize(1);
+ this.setNoRepair();
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ public abstract String getTextureNameForBauble();
+
+ @SuppressWarnings("unchecked")
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
+ ItemStack itemStack = new ItemStack(this, 1);
+ ItemStack charged;
+ if (this.getEmptyItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, 0.0D, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ if (this.getChargedItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, Double.POSITIVE_INFINITY, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ double aItemCharge = ElectricItem.manager.getCharge(itemStack);
+ return aItemCharge > 0;
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(27);
+ return x.getItem();
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public final int getTier(final ItemStack itemStack) {
+ return mTier;
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack itemStack) {
+ return GT_Values.V[mTier];
+ }
+
+ @Override
+ public final double getDurabilityForDisplay(final ItemStack stack) {
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ String aEuInfo = StatCollector.translateToLocal("GTPP.info.euInfo");
+ String aTier = StatCollector.translateToLocal("GTPP.machines.tier");
+ String aInputLimit = StatCollector.translateToLocal("GTPP.info.inputLimit");
+ String aCurrentPower = StatCollector.translateToLocal("GTPP.info.currentPower");
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+
+ list.add(EnumChatFormatting.GOLD + aEuInfo + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GRAY + aTier
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTier(stack))
+ + EnumChatFormatting.GRAY
+ + "] "
+ + aInputLimit
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTransferLimit(stack))
+ + EnumChatFormatting.GRAY
+ + aEUT
+ + "]");
+ list.add(
+ EnumChatFormatting.GRAY + aCurrentPower
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getCharge(stack))
+ + EnumChatFormatting.GRAY
+ + aEU
+ + "] ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack)))
+ + EnumChatFormatting.GRAY
+ + "%]");
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public final double charge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean simulate) {
+ /*
+ * if (!simulate) { ElectricItem.manager.charge(stack, amount, tier, true, simulate); }
+ */
+
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public final double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ /*
+ * if (!simulate) { ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally,
+ * simulate); }
+ */
+
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public final double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public final boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ // return ElectricItem.manager.getToolTip(stack);
+ return null;
+ }
+
+ @Override
+ public final BaubleType getBaubleType(final ItemStack arg0) {
+ return mType;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java b/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java
new file mode 100644
index 0000000000..c3c371ae35
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java
@@ -0,0 +1,120 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class FireProtectionBauble extends BaseBauble {
+
+ private static Field isImmuneToFire;
+
+ static {
+ isImmuneToFire = ReflectionUtils
+ .getField(Entity.class, !CORE_Preloader.DEV_ENVIRONMENT ? "func_70045_F" : "isImmuneToFire");
+ }
+
+ public static boolean fireImmune(Entity aEntity) {
+ return aEntity.isImmuneToFire();
+ }
+
+ public static boolean setEntityImmuneToFire(Entity aEntity, boolean aImmune) {
+ try {
+ return ReflectionUtils.setField(aEntity, isImmuneToFire, aImmune);
+ } catch (Throwable t) {}
+ return false;
+ }
+
+ public FireProtectionBauble() {
+ super(BaubleType.RING);
+ String aUnlocalName = "GTPP.bauble.fireprotection.0" + ".name";
+ this.setUnlocalizedName(aUnlocalName);
+ this.setTextureName(GTPlusPlus.ID + ":" + getTextureNameForBauble());
+ this.setMaxDamage(100);
+ this.setMaxStackSize(1);
+ this.setNoRepair();
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return (EnumChatFormatting.DARK_RED + super.getItemStackDisplayName(p_77653_1_) + EnumChatFormatting.GRAY);
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase aPlayer) {}
+
+ @Override
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+ if (aPlayer instanceof EntityPlayer bPlayer) {
+ if (bPlayer.isPotionActive(Potion.fireResistance)) {
+ bPlayer.removePotionEffect(Potion.fireResistance.id);
+ }
+ setEntityImmuneToFire(bPlayer, false);
+ }
+ }
+ }
+
+ @Override
+ public void onWornTick(final ItemStack aBaubleStack, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+ if (aPlayer instanceof EntityPlayer bPlayer) {
+ if (!fireImmune(bPlayer)) {
+ setEntityImmuneToFire(bPlayer, true);
+ }
+ if (!bPlayer.isPotionActive(Potion.fireResistance)) {
+ bPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 100, 4));
+ }
+ }
+ }
+ }
+
+ public String getTextureNameForBauble() {
+ return "baubles/itemFireProtectGlovesBetter";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java b/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java
new file mode 100644
index 0000000000..e14d9f7f08
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java
@@ -0,0 +1,667 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.circuit.GTPP_IntegratedCircuit_Item;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+import gtPlusPlus.plugin.agrichem.item.algae.ItemAgrichemBase;
+import gtPlusPlus.plugin.agrichem.item.algae.ItemAlgaeBase;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class AgriculturalChem extends ItemPackage {
+
+ private static boolean aBOP;
+ private static boolean aTiCon;
+
+ private static AutoMap<FluidStack> mBloodFluids = new AutoMap<>();
+
+ /**
+ * Fluids
+ */
+
+ // Poop Juice
+ public static Fluid PoopJuice;
+ // Manure Slurry
+ public static Fluid ManureSlurry;
+ // Fertile Manure Slurry
+ public static Fluid FertileManureSlurry;
+ // Blood
+ public static Fluid CustomBlood;
+ // Red Mud
+ public static Fluid RedMud;
+ /**
+ * Items
+ */
+
+ // Manure Byproducts
+ public static Item dustManureByproducts;
+ // Organic Fertilizer
+ public static Item dustOrganicFertilizer;
+ // Dirt
+ public static Item dustDirt;
+
+ // Poop Juice
+ // vv - Centrifuge
+ // Manure Slurry && Manure Byproducts -> (Elements) Centrifuge to several tiny
+ // piles
+ // vv - Chem Reactor - Add Peat, Meat
+ // Organic Fertilizer
+ // vv - Dehydrate
+ // Fertilizer
+
+ // Poop Juice
+ // vv - Mixer - Add Blood, Bone, Meat (1000L Poo, 200L Blood, x2 Bone, x3 Meat)
+ // Fertile Manure Slurry
+ // vv - Chem Reactor - Add Peat x1.5
+ // Organic Fertilizer x3
+ // vv - Dehydrate
+ // Fertilizer
+
+ public static Item mAlgae;
+ public static Item mBioCircuit;
+ public static Item mAgrichemItem1;
+
+ /*
+ * 0 - Algae Biomass 1 - Green Algae Biomass 2 - Brown Algae Biomass 3 - Golden-Brown Algae Biomass 4 - Red Algae
+ * Biomass 5 - Cellulose Fiber 6 - Golden-Brown Cellulose Fiber 7 - Red Cellulose Fiber 8 - Compost 9 - Wood Pellet
+ * 10 - Wood Brick 11 - Cellulose Pulp 12 - Raw Bio Resin 13 - Catalyst Carrier 14 - Green Metal Catalyst 15 -
+ * Alginic Acid 16 - Alumina 17 - Aluminium Pellet 18 - Sodium Aluminate 19 - Sodium Hydroxide // Exists in Newer GT
+ * 20 - Sodium Carbonate 21 - Lithium Chloride 22 - Pellet Mold 23 - Clean Aluminium Mix 24 - Pinecone
+ */
+
+ public static ItemStack mAlgaeBiosmass;
+ public static ItemStack mGreenAlgaeBiosmass;
+ public static ItemStack mBrownAlgaeBiosmass;
+ public static ItemStack mGoldenBrownAlgaeBiosmass;
+ public static ItemStack mRedAlgaeBiosmass;
+ public static ItemStack mCelluloseFiber;
+ public static ItemStack mGoldenBrownCelluloseFiber;
+ public static ItemStack mRedCelluloseFiber;
+ public static ItemStack mCompost;
+ public static ItemStack mWoodPellet;
+ public static ItemStack mWoodBrick;
+ public static ItemStack mCellulosePulp;
+ public static ItemStack mRawBioResin;
+ public static ItemStack mCatalystCarrier;
+ public static ItemStack mGreenCatalyst;
+ public static ItemStack mAlginicAcid;
+ public static ItemStack mAlumina;
+ public static ItemStack mAluminiumPellet;
+ public static ItemStack mSodiumAluminate;
+ public static ItemStack mSodiumHydroxide;
+ public static ItemStack mSodiumCarbonate;
+ public static ItemStack mLithiumChloride;
+ public static ItemStack mPelletMold;
+ public static ItemStack mCleanAluminiumMix;
+ public static ItemStack mPinecone;
+ public static ItemStack mCrushedPine;
+
+ @Override
+ public void items() {
+ // Nitrogen, Ammonium Nitrate, Phosphates, Calcium, Copper, Carbon
+ dustManureByproducts = ItemUtils.generateSpecialUseDusts(
+ "ManureByproducts",
+ "Manure Byproduct",
+ "(N2H4O3)N2P2Ca3CuC8",
+ Utils.rgbtoHexValue(110, 75, 25))[0];
+
+ // Basically Guano
+ dustOrganicFertilizer = ItemUtils.generateSpecialUseDusts(
+ "OrganicFertilizer",
+ "Organic Fertilizer",
+ "Ca5(PO4)3(OH)",
+ Utils.rgbtoHexValue(240, 240, 240))[0];
+
+ // Dirt Dust :)
+ dustDirt = ItemUtils.generateSpecialUseDusts("Dirt", "Dried Earth", Utils.rgbtoHexValue(65, 50, 15))[0];
+
+ mAlgae = new ItemAlgaeBase();
+ mAgrichemItem1 = new ItemAgrichemBase();
+ mBioCircuit = new GTPP_IntegratedCircuit_Item("BioRecipeSelector", "bioscience/BioCircuit");
+ GregtechItemList.Circuit_BioRecipeSelector.set(mBioCircuit);
+
+ mAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 0, 1);
+ mGreenAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 1, 1);
+ mBrownAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 2, 1);
+ mGoldenBrownAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 3, 1);
+ mRedAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 4, 1);
+ mCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 5, 1);
+ mGoldenBrownCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 6, 1);
+ mRedCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 7, 1);
+ mCompost = ItemUtils.simpleMetaStack(mAgrichemItem1, 8, 1);
+ mWoodPellet = ItemUtils.simpleMetaStack(mAgrichemItem1, 9, 1);
+ mWoodBrick = ItemUtils.simpleMetaStack(mAgrichemItem1, 10, 1);
+ mCellulosePulp = ItemUtils.simpleMetaStack(mAgrichemItem1, 11, 1);
+ mRawBioResin = ItemUtils.simpleMetaStack(mAgrichemItem1, 12, 1);
+ mCatalystCarrier = ItemUtils.simpleMetaStack(mAgrichemItem1, 13, 1);
+ mGreenCatalyst = ItemUtils.simpleMetaStack(mAgrichemItem1, 14, 1);
+ mAlginicAcid = ItemUtils.simpleMetaStack(mAgrichemItem1, 15, 1);
+ mAlumina = ItemUtils.simpleMetaStack(mAgrichemItem1, 16, 1);
+ mAluminiumPellet = ItemUtils.simpleMetaStack(mAgrichemItem1, 17, 1);
+ mSodiumAluminate = ItemUtils.simpleMetaStack(mAgrichemItem1, 18, 1);
+
+ /*
+ * If It exists, don't add a new one.
+ */
+ if (OreDictionary.doesOreNameExist("dustSodiumHydroxide_GT5U")
+ || OreDictionary.doesOreNameExist("dustSodiumHydroxide")) {
+ List<ItemStack> aTest = OreDictionary.getOres("dustSodiumHydroxide", false);
+ ItemStack aTestStack;
+ if (aTest.isEmpty()) {
+ aTest = OreDictionary.getOres("dustSodiumHydroxide_GT5U", false);
+ if (aTest.isEmpty()) {
+ aTestStack = ItemUtils.simpleMetaStack(mAgrichemItem1, 19, 1);
+ } else {
+ aTestStack = aTest.get(0);
+ }
+ } else {
+ aTestStack = aTest.get(0);
+ }
+ mSodiumHydroxide = aTestStack;
+ } else {
+ mSodiumHydroxide = ItemUtils.simpleMetaStack(mAgrichemItem1, 19, 1);
+ }
+ mSodiumCarbonate = ItemUtils.simpleMetaStack(mAgrichemItem1, 20, 1);
+ mLithiumChloride = ItemUtils.simpleMetaStack(mAgrichemItem1, 21, 1);
+ mPelletMold = ItemUtils.simpleMetaStack(mAgrichemItem1, 22, 1);
+ mCleanAluminiumMix = ItemUtils.simpleMetaStack(mAgrichemItem1, 23, 1);
+ mPinecone = ItemUtils.simpleMetaStack(mAgrichemItem1, 24, 1);
+ mCrushedPine = ItemUtils.simpleMetaStack(mAgrichemItem1, 25, 1);
+
+ ItemUtils.addItemToOreDictionary(mGreenAlgaeBiosmass, "biomassGreenAlgae");
+ ItemUtils.addItemToOreDictionary(mBrownAlgaeBiosmass, "biomassBrownAlgae");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownAlgaeBiosmass, "biomassGoldenBrownAlgae");
+ ItemUtils.addItemToOreDictionary(mRedAlgaeBiosmass, "biomassRedAlgae");
+
+ ItemUtils.addItemToOreDictionary(mCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownCelluloseFiber, "fiberGoldenBrownCellulose");
+ ItemUtils.addItemToOreDictionary(mRedCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mRedCelluloseFiber, "fiberRedCellulose");
+
+ ItemUtils.addItemToOreDictionary(mWoodPellet, "pelletWood");
+ ItemUtils.addItemToOreDictionary(mWoodBrick, "brickWood");
+ ItemUtils.addItemToOreDictionary(mCellulosePulp, "pulpCellulose");
+
+ ItemUtils.addItemToOreDictionary(mCatalystCarrier, "catalystEmpty");
+ ItemUtils.addItemToOreDictionary(mGreenCatalyst, "catalystAluminiumSilver");
+ ItemUtils.addItemToOreDictionary(mAlginicAcid, "dustAlginicAcid");
+ ItemUtils.addItemToOreDictionary(mAlumina, "dustAlumina");
+ ItemUtils.addItemToOreDictionary(mAluminiumPellet, "pelletAluminium");
+
+ ItemUtils.addItemToOreDictionary(mSodiumAluminate, "dustSodiumAluminate");
+ ItemUtils.addItemToOreDictionary(mSodiumHydroxide, "dustSodiumHydroxide");
+ ItemUtils.addItemToOreDictionary(mSodiumCarbonate, "dustSodiumCarbonate");
+ ItemUtils.addItemToOreDictionary(mLithiumChloride, "dustLithiumChloride");
+ ItemUtils.addItemToOreDictionary(mPinecone, "pinecone");
+ ItemUtils.addItemToOreDictionary(mCrushedPine, "crushedPineMaterial");
+
+ // Handle GT NaOH dusts
+ List<ItemStack> NaOHSmall = OreDictionary.getOres("dustSmallSodiumHydroxide_GT5U", false);
+ if (!NaOHSmall.isEmpty()) {
+ ItemUtils.addItemToOreDictionary(NaOHSmall.get(0), "dustSmallSodiumHydroxide");
+ }
+ List<ItemStack> NaOHTiny = OreDictionary.getOres("dustTinySodiumHydroxide_GT5U", false);
+ if (!NaOHTiny.isEmpty()) {
+ ItemUtils.addItemToOreDictionary(NaOHTiny.get(0), "dustTinySodiumHydroxide");
+ }
+ }
+
+ @Override
+ public void blocks() {
+ // None yet
+ }
+
+ @Override
+ public void fluids() {
+ // Sewage
+ PoopJuice = FluidUtils.generateFluidNonMolten(
+ "raw.waste",
+ "Raw Animal Waste",
+ 32 + 175,
+ new short[] { 100, 70, 30, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ // Sewage
+ ManureSlurry = FluidUtils.generateFluidNonMolten(
+ "manure.slurry",
+ "Manure Slurry",
+ 39 + 175,
+ new short[] { 75, 45, 15, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ // Sewage
+ FertileManureSlurry = FluidUtils.generateFluidNonMolten(
+ "fertile.manure.slurry",
+ "Fertile Manure Slurry",
+ 45 + 175,
+ new short[] { 65, 50, 15, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ RedMud = FluidUtils.generateFluidNoPrefix(
+ "mud.red.slurry",
+ "Red Mud Slurry",
+ 32 + 175,
+ new short[] { 180, 35, 25, 100 },
+ true);
+ }
+
+ public AgriculturalChem() {
+ super();
+
+ aBOP = BiomesOPlenty.isModLoaded();
+ aTiCon = TinkerConstruct.isModLoaded();
+
+ Logger.INFO("Adding Agrochemical content");
+
+ FluidStack aBlood;
+ if (aBOP) {
+ aBlood = FluidUtils.getFluidStack("hell_blood", 100);
+ if (aBlood != null) {
+ Logger.INFO("Found Biome's o Plenty, enabled Blood support.");
+ CustomBlood = aBlood.getFluid();
+ mBloodFluids.put(aBlood);
+ }
+ }
+
+ if (aTiCon) {
+ aBlood = FluidUtils.getFluidStack("blood", 100);
+ if (aBlood != null) {
+ Logger.INFO("Found Tinker's Construct, enabled Blood support.");
+ CustomBlood = aBlood.getFluid();
+ mBloodFluids.put(FluidUtils.getFluidStack("blood", 100));
+ }
+ }
+
+ // Handle Blood Internally, Create if required.
+ if (mBloodFluids.isEmpty() || CustomBlood == null) {
+ Logger.INFO(
+ "Did not find any existing Blood fluids. Trying to wildcard search the fluid registry, then generate our own if that fails.");
+ FluidStack aTempBlood = FluidUtils.getWildcardFluidStack("blood", 100);
+ if (aTempBlood != null) {
+ CustomBlood = aTempBlood.getFluid();
+ } else {
+ aTempBlood = FluidUtils.getWildcardFluidStack("hell_blood", 100);
+ if (aTempBlood == null) {
+ CustomBlood = FluidUtils
+ .generateFluidNoPrefix("blood", "Blood", 32 + 175, new short[] { 175, 25, 25, 100 }, true);
+ } else {
+ CustomBlood = aTempBlood.getFluid();
+ }
+ }
+ Logger.INFO("Using " + CustomBlood.getName());
+ mBloodFluids.put(FluidUtils.getFluidStack(CustomBlood, 100));
+ }
+ }
+
+ private static final AutoMap<ItemStack> mMeats = new AutoMap<>();
+ private static final AutoMap<ItemStack> mFish = new AutoMap<>();
+ private static final AutoMap<ItemStack> mFruits = new AutoMap<>();
+ private static final AutoMap<ItemStack> mVege = new AutoMap<>();
+ private static final AutoMap<ItemStack> mNuts = new AutoMap<>();
+ private static final AutoMap<ItemStack> mSeeds = new AutoMap<>();
+ private static final AutoMap<ItemStack> mPeat = new AutoMap<>();
+ private static final AutoMap<ItemStack> mBones = new AutoMap<>();
+ private static final AutoMap<ItemStack> mBoneMeal = new AutoMap<>();
+
+ private static final AutoMap<ItemStack> mList_Master_Meats = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_FruitVege = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_Seeds = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_Bones = new AutoMap<>();
+
+ private static void processAllOreDict() {
+ processOreDict("listAllmeatraw", mMeats);
+ processOreDict("listAllfishraw", mFish);
+ processOreDict("listAllfruit", mFruits);
+ processOreDict("listAllVeggie", mVege);
+ processOreDict("listAllnut", mNuts);
+ processOreDict("listAllSeed", mSeeds);
+ processOreDict("brickPeat", mPeat);
+ processOreDict("bone", mBones);
+ processOreDict("dustBone", mBoneMeal);
+ // Just make a mega list, makes life easier.
+ if (!mMeats.isEmpty()) {
+ for (ItemStack g : mMeats) {
+ mList_Master_Meats.put(g);
+ }
+ }
+ if (!mFish.isEmpty()) {
+ for (ItemStack g : mFish) {
+ mList_Master_Meats.put(g);
+ }
+ }
+ if (!mFruits.isEmpty()) {
+ for (ItemStack g : mFruits) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mVege.isEmpty()) {
+ for (ItemStack g : mVege) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mNuts.isEmpty()) {
+ for (ItemStack g : mNuts) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mSeeds.isEmpty()) {
+ for (ItemStack g : mSeeds) {
+ mList_Master_Seeds.put(g);
+ }
+ }
+ if (!mBoneMeal.isEmpty()) {
+ for (ItemStack g : mBoneMeal) {
+ mList_Master_Bones.put(g);
+ }
+ }
+ if (!mBones.isEmpty()) {
+ for (ItemStack g : mBones) {
+ mList_Master_Bones.put(g);
+ }
+ }
+ }
+
+ private static void processOreDict(String aOreName, AutoMap<ItemStack> aMap) {
+ ArrayList<ItemStack> aTemp = OreDictionary.getOres(aOreName);
+ if (!aTemp.isEmpty()) {
+ for (ItemStack stack : aTemp) {
+ aMap.put(stack);
+ }
+ }
+ }
+
+ private static void addBasicSlurryRecipes() {
+
+ ItemStack aManureByprod1 = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ ItemStack aManureByprod2 = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ ItemStack aDirtDust = ItemUtils.getSimpleStack(dustDirt, 1);
+
+ // Poop Juice to Basic Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(aDirtDust, aDirtDust, aManureByprod1, aManureByprod1, aManureByprod1, aManureByprod1)
+ .outputChances(2000, 2000, 500, 500, 250, 250)
+ .fluidInputs(FluidUtils.getFluidStack(PoopJuice, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(ManureSlurry, 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+
+ // More Efficient way to get byproducts, less Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(aDirtDust, aDirtDust, aManureByprod1, aManureByprod1, aManureByprod2, aManureByprod2)
+ .outputChances(4000, 3000, 1250, 1250, 675, 675)
+ .fluidInputs(FluidUtils.getFluidStack(PoopJuice, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(ManureSlurry, 50))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(centrifugeRecipes);
+ }
+
+ private static void addAdvancedSlurryRecipes() {
+
+ ItemStack aCircuit = GT_Utility.getIntegratedCircuit(10);
+ ItemStack aBone;
+ ItemStack aMeat;
+ ItemStack aEmptyCells = Materials.Empty.getCells(2);
+ ItemStack aInputCells = ItemUtils.getItemStackOfAmountFromOreDict("cellRawAnimalWaste", 2);
+ FluidStack aOutput = FluidUtils.getFluidStack(FertileManureSlurry, 1000);
+
+ for (FluidStack aBloodStack : mBloodFluids) {
+ for (ItemStack aBoneStack : mList_Master_Bones) {
+ aBone = ItemUtils.getSimpleStack(aBoneStack, 2);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 5);
+ // Poop Juice to Fertile Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aCircuit, aBone, aMeat, aInputCells)
+ .itemOutputs(aEmptyCells)
+ .fluidInputs(aBloodStack)
+ .fluidOutputs(aOutput)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(mixerRecipes);
+ }
+ }
+ }
+ }
+
+ private static void addBasicOrganiseFertRecipes() {
+ FluidStack aInputFluid = FluidUtils.getFluidStack(ManureSlurry, 1000);
+ ItemStack aOutputDust = ItemUtils.getSimpleStack(dustOrganicFertilizer, 3);
+ ItemStack aPeat;
+ ItemStack aMeat;
+ for (ItemStack aPeatStack : mPeat) {
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 3);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 5);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+ }
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 2);
+ for (ItemStack aMeatStack : mList_Master_FruitVege) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 9);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+ }
+ }
+ }
+
+ private static void addAdvancedOrganiseFertRecipes() {
+ FluidStack aInputFluid = FluidUtils.getFluidStack(FertileManureSlurry, 1000);
+ ItemStack aOutputDust = ItemUtils.getSimpleStack(dustOrganicFertilizer, 7);
+ ItemStack aPeat;
+ ItemStack aMeat;
+ for (ItemStack aPeatStack : mPeat) {
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 5);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 7);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(10 * SECONDS)
+ .eut(140)
+ .addTo(UniversalChemical);
+ }
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 3);
+ for (ItemStack aMeatStack : mList_Master_FruitVege) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 12);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(5 * SECONDS)
+ .eut(140)
+ .addTo(UniversalChemical);
+ }
+ }
+ }
+
+ public static ItemStack aFertForestry;
+ public static ItemStack aFertIC2;
+
+ private static void addMiscRecipes() {
+
+ ItemStack aDustOrganicFert = ItemUtils.getSimpleStack(dustOrganicFertilizer, 1);
+ ItemStack aManureByprod = ItemUtils.getSimpleStack(dustManureByproducts, 1);
+
+ // Dehydrate Organise Fert to Normal Fert.
+
+ /*
+ * Forestry Support
+ */
+ if (Forestry.isModLoaded()) {
+ Field aItemField = ReflectionUtils
+ .getField(ReflectionUtils.getClass("forestry.plugins.PluginCore"), "items");
+ try {
+ Object aItemRegInstance = aItemField != null ? aItemField.get(aItemField) : null;
+ if (aItemRegInstance != null) {
+ Field aFertField = ReflectionUtils.getField(aItemRegInstance.getClass(), "fertilizerCompound");
+ Object aItemInstance = aFertField.get(aItemRegInstance);
+ if (aItemInstance instanceof Item aForestryFert) {
+ aFertForestry = ItemUtils.getSimpleStack((Item) aItemInstance);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(11),
+ ItemUtils.getSimpleStack(aDustOrganicFert, 4) },
+ null,
+ null,
+ new ItemStack[] { ItemUtils.getSimpleStack(aForestryFert, 3), aManureByprod,
+ aManureByprod },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 20,
+ 240);
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+
+ }
+ }
+
+ /*
+ * IC2 Support
+ */
+ aFertIC2 = ItemUtils.getItemStackFromFQRN("IC2:itemFertilizer", 1);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(12), ItemUtils.getSimpleStack(aDustOrganicFert, 4) },
+ null,
+ null,
+ new ItemStack[] { ItemUtils.getItemStackFromFQRN("IC2:itemFertilizer", 3), aManureByprod, aManureByprod },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 20,
+ 240);
+
+ // Dirt Production
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(dustDirt, 9))
+ .itemOutputs(ItemUtils.getSimpleStack(Blocks.dirt))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(compressorRecipes);
+
+ // Centrifuge Byproducts
+
+ // Ammonium Nitrate, Phosphates, Calcium, Copper, Carbon
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(aManureByprod, 4), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Calcium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L),
+ ItemUtils.getSimpleStack(dustDirt, 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAmmoniumNitrate", 1))
+ .outputChances(2500, 2500, 750, 1000, 5000, 250)
+ .fluidInputs(Materials.SulfuricAcid.getFluid(250))
+ .fluidOutputs(FluidUtils.getFluidStack("sulfuricapatite", 50))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(centrifugeRecipes);
+
+ // Add Fuel Usages
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(PoopJuice, 1000), 12);
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(ManureSlurry, 1000), 24);
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(FertileManureSlurry, 1000), 32);
+
+ // Red Slurry / Tailings Processing
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedBioCircuit(10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Tin, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Nickel, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lead, 1L))
+ .outputChances(3000, 3000, 2000, 2000, 1000, 1000)
+ .fluidInputs(FluidUtils.getFluidStack(AgriculturalChem.RedMud, 1000))
+ .fluidOutputs(Materials.Water.getFluid(500))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for AgroChem.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ if (mBloodFluids.isEmpty()) {
+ Logger.INFO("Could not find, nor create Blood fluid. Unable to add recipes.");
+ return false;
+ }
+
+ // Organise OreDict
+ processAllOreDict();
+
+ // Slurry Production
+ addBasicSlurryRecipes();
+ addAdvancedSlurryRecipes();
+
+ // Organic Fert. Production
+ addBasicOrganiseFertRecipes();
+ addAdvancedOrganiseFertRecipes();
+
+ addMiscRecipes();
+
+ BioRecipes.init();
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java b/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java
new file mode 100644
index 0000000000..1fafbb5088
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java
@@ -0,0 +1,319 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class CoalTar extends ItemPackage {
+
+ public static Fluid Coal_Gas;
+ public static Fluid Coal_Oil;
+ public static Fluid Ethylene;
+ public static Fluid Ethylbenzene;
+ public static Fluid Anthracene;
+ public static Fluid Toluene;
+ public static Fluid Coal_Tar;
+ public static Fluid Coal_Tar_Oil;
+ public static Fluid Sulfuric_Coal_Tar_Oil;
+ public static Fluid Naphthalene;
+
+ public static void recipeCreateEthylene() {
+
+ FluidStack bioEth1 = FluidUtils.getFluidStack("fluid.bioethanol", 1000);
+ FluidStack bioEth2 = FluidUtils.getFluidStack("bioethanol", 1000);
+
+ // C2H6O = C2H4 + H2O
+ if (bioEth1 != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 1) },
+ bioEth1,
+ FluidUtils.getWater(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 1) },
+ new int[] { 10000 },
+ 120 * 20,
+ 80);
+ }
+
+ if (bioEth2 != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(18),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 1) },
+ bioEth2,
+ FluidUtils.getWater(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 1) },
+ new int[] { 10000 },
+ 120 * 20,
+ 80);
+ }
+ }
+
+ public static void recipeCreateBenzene() {
+ // C7H8 + 2H = CH4 + C6H6
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Toluene.getCells(1))
+ .itemOutputs(Materials.Benzene.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(Materials.Methane.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(90)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ public static void recipeCreateEthylbenzene() {
+ // C2H4 + C6H6 = C8H10
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 2),
+ ItemUtils.getGregtechCircuit(1),
+ FluidUtils.getFluidStack("benzene", 2000),
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 2000),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 2),
+ 300);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellBenzene", 2),
+ ItemUtils.getGregtechCircuit(1),
+ FluidUtils.getFluidStack("ethylene", 2000),
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 2000),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 2),
+ 300);
+ }
+
+ public static void recipeCoalToCoalTar() {
+ // Charcoal
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 32L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDirt", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 800),
+ 15,
+ 120);
+ // Lignite
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 16L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDarkAsh", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 800),
+ 45,
+ 60);
+
+ // Coal
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 12L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDarkAsh", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 2200),
+ 30,
+ 120);
+
+ // Coke
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 8),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallAsh", 3),
+ FluidUtils.getFluidStack("fluid.coaltar", 3400),
+ 15,
+ 240);
+ }
+
+ private static void recipeCoalTarToCoalTarOil() {
+ // v - Distill (60% Tar oil/15% Naphtha/20% Ethylbenzene/5% Anthracene) +60% Kerosene
+ // Create Coal Tar Oil
+
+ FluidStack[] distOutputs = new FluidStack[] { FluidUtils.getFluidStack("fluid.coaltaroil", 600),
+ FluidUtils.getFluidStack("liquid_naphtha", 150), FluidUtils.getFluidStack("fluid.ethylbenzene", 200),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), FluidUtils.getFluidStack("fluid.kerosene", 600) };
+ for (int i = 0; i < distOutputs.length; i++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1))
+ .fluidInputs(FluidUtils.getFluidStack("fluid.coaltar", 1000))
+ .fluidOutputs(distOutputs[i])
+ .duration(30 * SECONDS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+ }
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("fluid.coaltar", 1000))
+ .fluidOutputs(distOutputs)
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+ }
+
+ private static void recipeCoalTarOilToSulfuricOilToNaphthalene() {
+ // SulfuricCoalTarOil
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTarOil", 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricAcid", 8),
+ null,
+ null,
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricCoalTarOil", 16),
+ 20 * 16);
+ GT_Values.RA.addDistilleryRecipe(
+ CI.getNumberedCircuit(6), // Circuit
+ FluidUtils.getFluidStack("fluid.sulfuriccoaltaroil", 1000), // aInput
+ FluidUtils.getFluidStack("fluid.naphthalene", 1000), // aOutput
+ 1200, // aDuration
+ 30, // aEUt
+ false // Hidden?
+ );
+ }
+
+ private static void recipeNaphthaleneToPhthalicAcid() {
+ // SulfuricCoalTarOil
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Lithium.getDust(5))
+ .fluidInputs(FluidUtils.getFluidStack(Naphthalene, 2000))
+ .fluidOutputs(Materials.PhthalicAcid.getFluid(2500))
+ .eut(30)
+ .duration(16 * SECONDS)
+ .noOptimize()
+ .addTo(UniversalChemical);
+ }
+
+ private static void recipePhthalicAcidToPhthalicAnhydride() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(15) },
+ Materials.PhthalicAcid.getFluid(1000),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPhthalicAnhydride", 15) },
+ new int[] { 10000 },
+ 60 * 20,
+ 120);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Coal Science!";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ recipeCreateEthylene();
+ recipeCreateBenzene();
+ recipeCreateEthylbenzene();
+
+ recipeCoalToCoalTar();
+ recipeCoalTarToCoalTarOil();
+ recipeCoalTarOilToSulfuricOilToNaphthalene();
+ recipeNaphthaleneToPhthalicAcid();
+ recipePhthalicAcidToPhthalicAnhydride();
+
+ // Burn the coal gas!
+ GT_Values.RA.addFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalGas", 1), null, 96, 1);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricCoalTarOil", 1), 64);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTarOil", 1), 32);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTar", 1), 16);
+
+ return true;
+ }
+
+ @Override
+ public void items() {
+ // v - Dehydrate at 180C+
+ // Create Phthalic Anhydride
+ ItemUtils.generateSpecialUseDusts(
+ "PhthalicAnhydride",
+ "Phthalic Anhydride",
+ "C6H4(CO)2O",
+ Utils.rgbtoHexValue(175, 175, 175));
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ ItemUtils.generateSpecialUseDusts(
+ "LithiumHydroperoxide",
+ "Lithium Hydroperoxide",
+ "HLiO2",
+ Utils.rgbtoHexValue(125, 125, 125));
+ // v - Dehydrate
+ // Lithium Peroxide - 2 LiOOH → Li2O2 + H2O2 + 2 H2O
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ // Create Coal Gas
+ Coal_Gas = FluidUtils
+ .generateFluidNonMolten("CoalGas", "Coal Gas", 500, new short[] { 48, 48, 48, 100 }, null, null);
+ // Ethanol
+ // v - Dehydrate cells to remove water
+
+ // Create Ethylene
+ if (!FluidUtils.doesFluidExist("ethylene")) {
+ Ethylene = FluidUtils
+ .generateFluidNonMolten("ethylene", "Ethylene", -103, new short[] { 255, 255, 255, 100 }, null, null);
+ } else {
+ Ethylene = FluidUtils.getWildcardFluidStack("ethylene", 1)
+ .getFluid();
+ }
+
+ // Create Ethylbenzene - Ethylbenzene is produced in on a large scale by combining benzene and ethylene in an
+ // acid-catalyzed chemical reaction
+ // Use Chemical Reactor
+ Ethylbenzene = FluidUtils.generateFluidNonMolten(
+ "Ethylbenzene",
+ "Ethylbenzene",
+ 136,
+ new short[] { 255, 255, 255, 100 },
+ null,
+ null);
+ // Create Anthracene
+ Anthracene = FluidUtils
+ .generateFluidNonMolten("Anthracene", "Anthracene", 340, new short[] { 255, 255, 255, 100 }, null, null);
+ // Toluene
+ if (!FluidUtils.doesFluidExist("liquid_toluene")) {
+ Toluene = FluidUtils
+ .generateFluidNonMolten("liquid_toluene", "Toluene", -95, new short[] { 140, 70, 20, 100 }, null, null);
+ } else {
+ Toluene = FluidUtils.getWildcardFluidStack("liquid_toluene", 1)
+ .getFluid();
+ }
+
+ // Create Coal Tar
+ Coal_Tar = FluidUtils
+ .generateFluidNonMolten("CoalTar", "Coal Tar", 450, new short[] { 32, 32, 32, 100 }, null, null);
+ // v - Distill (60% Tar oil/15% Naphtha/20% Ethylbenzene/5% Anthracene)
+ // Create Coal Tar Oil
+ Coal_Tar_Oil = FluidUtils
+ .generateFluidNonMolten("CoalTarOil", "Coal Tar Oil", 240, new short[] { 240, 240, 150, 100 }, null, null);
+ // v - Wash With Sulfuric Acid
+ // Create Sulfuric Coal Tar Oil
+ Sulfuric_Coal_Tar_Oil = FluidUtils.generateFluidNonMolten(
+ "SulfuricCoalTarOil",
+ "Sulfuric Coal Tar Oil",
+ 240,
+ new short[] { 250, 170, 12, 100 },
+ null,
+ null);
+ // v - Distill (No loss, just time consuming)
+ // Create Naphthalene
+ Naphthalene = FluidUtils
+ .generateFluidNonMolten("Naphthalene", "Naphthalene", 115, new short[] { 210, 185, 135, 100 }, null, null);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java b/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java
new file mode 100644
index 0000000000..31ea030c64
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java
@@ -0,0 +1,961 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.item.circuit.GTPP_IntegratedCircuit_Item;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GenericChem extends ItemPackage {
+
+ /**
+ * Materials
+ */
+
+ // Refined PTFE
+ public static final Material TEFLON = new Material(
+ "Teflon",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 75, 45, 75 },
+ 330,
+ 640,
+ -1,
+ -1,
+ false,
+ null,
+ 0,
+ new MaterialStack(NONMATERIAL.PTFE, 75),
+ new MaterialStack(NONMATERIAL.PLASTIC, 15),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 5),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 5));
+
+ /**
+ * Fluids
+ */
+ public static Fluid Benzene;
+
+ public static Fluid NitroBenzene;
+ public static Fluid Aniline;
+ public static Fluid Polyurethane;
+ public static Fluid Phenol; // https://en.wikipedia.org/wiki/Phenol#Uses
+ public static Fluid Cyclohexane; // https://en.wikipedia.org/wiki/Cyclohexane
+ public static Fluid Cyclohexanone; // https://en.wikipedia.org/wiki/Cyclohexanone
+ public static Fluid Cadaverine; // https://en.wikipedia.org/wiki/Cadaverine
+ public static Fluid Putrescine; // https://en.wikipedia.org/wiki/Putrescine
+ public static Fluid BoricAcid;
+ public static Fluid HydrochloricAcid;
+
+ public static Fluid Ethylanthraquinone2;
+ public static Fluid Ethylanthrahydroquinone2;
+ public static Fluid Hydrogen_Peroxide;
+ public static Fluid Lithium_Peroxide;
+ public static Fluid Carbon_Disulfide;
+
+ /**
+ * Items
+ */
+
+ // Phenol Byproducts
+
+ public static ItemGenericChemBase mGenericChemItem1;
+ public static Item mAdvancedCircuit;
+
+ private ItemStack mCatalystCarrier;
+
+ public static ItemStack mRedCatalyst;
+ public static ItemStack mYellowCatalyst;
+ public static ItemStack mBlueCatalyst;
+ public static ItemStack mOrangeCatalyst;
+ public static ItemStack mPurpleCatalyst;
+ public static ItemStack mBrownCatalyst;
+ public static ItemStack mPinkCatalyst;
+ public static ItemStack mFormaldehydeCatalyst;
+ public static ItemStack mSolidAcidCatalyst;
+ public static ItemStack mInfiniteMutationCatalyst;
+
+ // QFT Catalysts
+ public static ItemStack mPlatinumGroupCatalyst;
+ public static ItemStack mPlasticPolymerCatalyst;
+ public static ItemStack mRubberPolymerCatalyst;
+ public static ItemStack mAdhesionPromoterCatalyst;
+ public static ItemStack mTitaTungstenIndiumCatalyst;
+ public static ItemStack mRadioactivityCatalyst;
+ public static ItemStack mRareEarthGroupCatalyst;
+ public static ItemStack mLimpidWaterCatalyst;
+ public static ItemStack mSimpleNaquadahCatalyst;
+ public static ItemStack mAdvancedNaquadahCatalyst;
+ public static ItemStack mRawIntelligenceCatalyst;
+ public static ItemStack mParticleAccelerationCatalyst;
+ public static ItemStack mUltimatePlasticCatalyst;
+ public static ItemStack mBiologicalIntelligenceCatalyst;
+ public static ItemStack mFlawlessWaterCatalyst;
+ public static ItemStack TemporalHarmonyCatalyst;
+ public static ItemStack mSynchrotronCapableCatalyst;
+ public static ItemStack mAlgagenicGrowthPromoterCatalyst;
+
+ public static ItemStack mMillingBallAlumina;
+ public static ItemStack mMillingBallSoapstone;
+
+ public static ItemStack mSodiumEthoxide;
+ public static ItemStack mSodiumEthylXanthate;
+ public static ItemStack mPotassiumEthylXanthate;
+ public static ItemStack mPotassiumHydroxide;
+
+ @Override
+ public void items() {
+
+ MaterialGenerator.generate(TEFLON, false);
+
+ mGenericChemItem1 = new ItemGenericChemBase();
+ mAdvancedCircuit = new GTPP_IntegratedCircuit_Item("T3RecipeSelector", "science/general/AdvancedCircuit");
+ GregtechItemList.Circuit_T3RecipeSelector.set(mAdvancedCircuit);
+
+ registerItemStacks();
+ registerOreDict();
+
+ GregtechItemList.Milling_Ball_Alumina.set(mMillingBallAlumina);
+ GregtechItemList.Milling_Ball_Soapstone.set(mMillingBallSoapstone);
+ }
+
+ public void registerItemStacks() {
+
+ mCatalystCarrier = ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 13, 1);
+
+ mRedCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 0, 1);
+ mYellowCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 1, 1);
+ mBlueCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 2, 1);
+ mOrangeCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 3, 1);
+ mPurpleCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 4, 1);
+ mBrownCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 5, 1);
+ mPinkCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 6, 1);
+ mMillingBallAlumina = ItemUtils.simpleMetaStack(mGenericChemItem1, 7, 1);
+ mMillingBallSoapstone = ItemUtils.simpleMetaStack(mGenericChemItem1, 8, 1);
+ mSodiumEthoxide = ItemUtils.simpleMetaStack(mGenericChemItem1, 9, 1);
+ mSodiumEthylXanthate = ItemUtils.simpleMetaStack(mGenericChemItem1, 10, 1);
+ mPotassiumEthylXanthate = ItemUtils.simpleMetaStack(mGenericChemItem1, 11, 1);
+ mPotassiumHydroxide = ItemUtils.simpleMetaStack(mGenericChemItem1, 12, 1);
+ mFormaldehydeCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 13, 1);
+ mSolidAcidCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 14, 1);
+ mInfiniteMutationCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 15, 1);
+
+ // QFT Catalysts
+ mPlatinumGroupCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 16, 1);
+ mPlasticPolymerCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 17, 1);
+ mRubberPolymerCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 18, 1);
+ mAdhesionPromoterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 19, 1);
+ mTitaTungstenIndiumCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 20, 1);
+ mRadioactivityCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 21, 1);
+ mRareEarthGroupCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 22, 1);
+ mSimpleNaquadahCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 23, 1);
+ mAdvancedNaquadahCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 24, 1);
+ mRawIntelligenceCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 25, 1);
+ mUltimatePlasticCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 26, 1);
+ mBiologicalIntelligenceCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 27, 1);
+ TemporalHarmonyCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 28, 1);
+ mLimpidWaterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 29, 1);
+ mFlawlessWaterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 30, 1);
+ mParticleAccelerationCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 31, 1);
+ mSynchrotronCapableCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 32, 1);
+ mAlgagenicGrowthPromoterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 33, 1);
+ }
+
+ public void registerOreDict() {
+
+ ItemUtils.addItemToOreDictionary(mRedCatalyst, "catalystIronCopper");
+ ItemUtils.addItemToOreDictionary(mYellowCatalyst, "catalystTungstenNickel");
+ ItemUtils.addItemToOreDictionary(mBlueCatalyst, "catalystCobaltTitanium");
+ ItemUtils.addItemToOreDictionary(mOrangeCatalyst, "catalystVanadiumPalladium");
+ ItemUtils.addItemToOreDictionary(mPurpleCatalyst, "catalystIridiumRuthenium");
+ ItemUtils.addItemToOreDictionary(mBrownCatalyst, "catalystNickelAluminium");
+ ItemUtils.addItemToOreDictionary(mPinkCatalyst, "catalystPlatinumRhodium");
+ ItemUtils.addItemToOreDictionary(mMillingBallAlumina, "millingballAlumina");
+ ItemUtils.addItemToOreDictionary(mMillingBallSoapstone, "millingballSoapstone");
+ ItemUtils.addItemToOreDictionary(mSodiumEthoxide, "dustSodiumEthoxide");
+ ItemUtils.addItemToOreDictionary(mSodiumEthylXanthate, "dustSodiumEthylXanthate");
+ ItemUtils.addItemToOreDictionary(mPotassiumEthylXanthate, "dustPotassiumEthylXanthate");
+ ItemUtils.addItemToOreDictionary(mPotassiumHydroxide, "dustPotassiumHydroxide");
+ ItemUtils.addItemToOreDictionary(mFormaldehydeCatalyst, "catalystFormaldehyde");
+ ItemUtils.addItemToOreDictionary(mSolidAcidCatalyst, "catalystSolidAcid");
+ ItemUtils.addItemToOreDictionary(mInfiniteMutationCatalyst, "catalystInfiniteMutation");
+ ItemUtils.addItemToOreDictionary(mPlatinumGroupCatalyst, "catalystPlatinumGroup");
+ ItemUtils.addItemToOreDictionary(mPlasticPolymerCatalyst, "catalystPlasticPolymer");
+ ItemUtils.addItemToOreDictionary(mRubberPolymerCatalyst, "catalystRubberPolymer");
+ ItemUtils.addItemToOreDictionary(mAdhesionPromoterCatalyst, "catalystAdhesionPromoter");
+ ItemUtils.addItemToOreDictionary(mTitaTungstenIndiumCatalyst, "catalystTitaTungstenIndium");
+ ItemUtils.addItemToOreDictionary(mRadioactivityCatalyst, "catalystRadioactivity");
+ ItemUtils.addItemToOreDictionary(mRareEarthGroupCatalyst, "catalystRareEarthGroup");
+ ItemUtils.addItemToOreDictionary(mSimpleNaquadahCatalyst, "catalystSimpleNaquadah");
+ ItemUtils.addItemToOreDictionary(mAdvancedNaquadahCatalyst, "catalystAdvancedNaquadah");
+ ItemUtils.addItemToOreDictionary(mRawIntelligenceCatalyst, "catalystRawIntelligence");
+ ItemUtils.addItemToOreDictionary(mUltimatePlasticCatalyst, "catalystUltimatePlastic");
+ ItemUtils.addItemToOreDictionary(mBiologicalIntelligenceCatalyst, "catalystBiologicalIntelligence");
+ ItemUtils.addItemToOreDictionary(TemporalHarmonyCatalyst, "catalystTemporalHarmony");
+ ItemUtils.addItemToOreDictionary(mLimpidWaterCatalyst, "catalystLimpidWater");
+ ItemUtils.addItemToOreDictionary(mFlawlessWaterCatalyst, "catalystFlawlessWater");
+ ItemUtils.addItemToOreDictionary(mParticleAccelerationCatalyst, "catalystParticleAcceleration");
+ ItemUtils.addItemToOreDictionary(mSynchrotronCapableCatalyst, "catalystSynchrotronCapable");
+ ItemUtils.addItemToOreDictionary(mAlgagenicGrowthPromoterCatalyst, "catalystAlgagenicGrowthPromoter");
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ if (!FluidRegistry.isFluidRegistered("benzene")) {
+ Benzene = FluidUtils
+ .generateFluidNoPrefix("benzene", "Benzene", 278, new short[] { 100, 70, 30, 100 }, true);
+ } else {
+ Benzene = FluidRegistry.getFluid("benzene");
+ }
+
+ NitroBenzene = FluidUtils
+ .generateFluidNoPrefix("nitrobenzene", "Nitrobenzene", 278, new short[] { 70, 50, 40, 100 }, true);
+
+ Aniline = FluidUtils.generateFluidNoPrefix("aniline", "Aniline", 266, new short[] { 100, 100, 30, 100 }, true);
+
+ BoricAcid = FluidUtils
+ .generateFluidNoPrefix("boricacid", "Boric Acid", 278, new short[] { 90, 30, 120, 100 }, true);
+
+ Polyurethane = FluidUtils
+ .generateFluidNoPrefix("polyurethane", "Polyurethane", 350, new short[] { 100, 70, 100, 100 }, true);
+
+ if (!FluidRegistry.isFluidRegistered("phenol")) {
+ Phenol = FluidUtils.generateFluidNoPrefix("phenol", "Phenol", 313, new short[] { 100, 70, 30, 100 }, true);
+ } else {
+ Phenol = FluidRegistry.getFluid("phenol");
+ }
+
+ // Use GT's if it exists, else make our own.
+ if (FluidRegistry.isFluidRegistered("hydrochloricacid_gt5u")) {
+ HydrochloricAcid = FluidRegistry.getFluid("hydrochloricacid_gt5u");
+ } else {
+ HydrochloricAcid = FluidUtils.generateFluidNoPrefix(
+ "hydrochloricacid",
+ "Hydrochloric Acid",
+ 285,
+ new short[] { 183, 200, 196, 100 },
+ true);
+ }
+
+ Cyclohexane = FluidUtils
+ .generateFluidNoPrefix("cyclohexane", "Cyclohexane", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+ Cyclohexanone = FluidUtils
+ .generateFluidNoPrefix("cyclohexanone", "Cyclohexanone", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+
+ Cadaverine = FluidUtils
+ .generateFluidNoPrefix("cadaverine", "Cadaverine", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+ Putrescine = FluidUtils
+ .generateFluidNoPrefix("putrescine", "Putrescine", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+
+ // Create 2-Ethylanthraquinone
+ // 2-Ethylanthraquinone is prepared from the reaction of phthalic anhydride and ethylbenzene
+ Ethylanthraquinone2 = FluidUtils.generateFluidNonMolten(
+ "2Ethylanthraquinone",
+ "2-Ethylanthraquinone",
+ 415,
+ new short[] { 227, 255, 159, 100 },
+ null,
+ null);
+ // Create 2-Ethylanthrahydroquinone
+ // Palladium plate + Hydrogen(250) + 2-Ethylanthraquinone(500) = 600 Ethylanthrahydroquinone
+ Ethylanthrahydroquinone2 = FluidUtils.generateFluidNonMolten(
+ "2Ethylanthrahydroquinone",
+ "2-Ethylanthrahydroquinone",
+ 415,
+ new short[] { 207, 225, 129, 100 },
+ null,
+ null);
+ // Create Hydrogen Peroxide
+ // Compressed Air(1500) + Ethylanthrahydroquinone(500) + Anthracene(5) = 450 Ethylanthraquinone && 200 Peroxide
+ Hydrogen_Peroxide = FluidUtils.generateFluidNonMolten(
+ "HydrogenPeroxide",
+ "Hydrogen Peroxide",
+ 150,
+ new short[] { 210, 255, 255, 100 },
+ null,
+ null);
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ // ItemUtils.generateSpecialUseDusts("LithiumHydroperoxide", "Lithium Hydroperoxide", "HLiO2",
+ // Utils.rgbtoHexValue(125, 125, 125));
+ // v - Dehydrate
+ // Lithium Peroxide - 2 LiOOH → Li2O2 + H2O2 + 2 H2O
+ Lithium_Peroxide = FluidUtils.generateFluidNonMolten(
+ "LithiumPeroxide",
+ "Lithium Peroxide",
+ 446,
+ new short[] { 135, 135, 135, 100 },
+ null,
+ null);
+
+ Carbon_Disulfide = FluidUtils
+ .generateFluidNoPrefix("CarbonDisulfide", "Carbon Disulfide", 350, new short[] { 175, 175, 175, 100 });
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for GenericChem.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+
+ recipeAdvancedChip();
+ recipeCatalystRed();
+ recipeCatalystYellow();
+ recipeCatalystBlue();
+ recipeCatalystOrange();
+ recipeCatalystPurple();
+ recipeCatalystBrown();
+ recipeCatalystPink();
+ recipeCatalystFormaldehyde();
+ recipeCatalystSolidAcid();
+ recipeCatalystInfiniteMutation();
+
+ recipeGrindingBallAlumina();
+ recipeGrindingBallSoapstone();
+
+ recipeNitroBenzene();
+ recipeAniline();
+ recipeCadaverineAndPutrescine();
+ recipeCyclohexane();
+ recipeCyclohexanone();
+
+ recipe2Ethylanthraquinone();
+ recipe2Ethylanthrahydroquinone();
+ recipeHydrogenPeroxide();
+ recipeLithiumHydroperoxide();
+ recipeLithiumPeroxide();
+
+ recipeSodiumEthoxide();
+ recipeCarbonDisulfide();
+ recipeEthylXanthates();
+ recipePotassiumHydroxide();
+
+ recipeMutatedLivingSolder();
+
+ registerFuels();
+
+ return true;
+ }
+
+ private void recipeSodiumEthoxide() {
+ // C2H5OH + Na → C2H5ONa + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(16), ELEMENT.getInstance().SODIUM.getDust(1) },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000) },
+ new ItemStack[] { ItemUtils.getSimpleStack(mSodiumEthoxide, 9) },
+ new FluidStack[] { ELEMENT.getInstance().HYDROGEN.getFluidStack(1000) },
+ 20 * 20,
+ 120,
+ 2);
+ }
+
+ private void recipePotassiumHydroxide() {
+ // Ca(OH)2 + K2O + CO2 → CaCO3 + 2 KOH
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18), Materials.Potash.getDust(3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5), },
+ new FluidStack[] { Materials.CarbonDioxide.getGas(1000) },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumCarbonate", 5),
+ ItemUtils.getSimpleStack(mPotassiumHydroxide, 6) },
+ new FluidStack[] {},
+ 20 * 30,
+ 120,
+ 2);
+ }
+
+ private void recipeEthylXanthates() {
+
+ // Potassium ethyl xanthate - CH3CH2OH + CS2 + KOH → C3H5KOS2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(mPotassiumHydroxide, 3), },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000), FluidUtils.getFluidStack(Carbon_Disulfide, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(mPotassiumEthylXanthate, 12) },
+ new FluidStack[] { FluidUtils.getWater(1000) },
+ 20 * 60,
+ 120,
+ 4);
+
+ // Sodium ethyl xanthate - CH3CH2ONa + CS2 → CH3CH2OCS2Na
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(mSodiumEthoxide, 9) },
+ new FluidStack[] { FluidUtils.getFluidStack(Carbon_Disulfide, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(mSodiumEthylXanthate, 12) },
+ new FluidStack[] {},
+ 20 * 60,
+ 120,
+ 4);
+ }
+
+ private void recipeCarbonDisulfide() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 16L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack(Carbon_Disulfide, 4000))
+ .duration(10 * MINUTES)
+ .eut(TierEU.RECIPE_LV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), ItemUtils.getSimpleStack(mBrownCatalyst, 0),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSulfur", 4) },
+ new FluidStack[] { FluidUtils.getFluidStack(CoalTar.Coal_Gas, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Carbon_Disulfide, 2000) },
+ 20 * 60 * 5,
+ 30,
+ 2);
+ }
+
+ private void recipeMutatedLivingSolder() {
+
+ // Endgame soldering alloy meant for the bioware circuit line and beyond.
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mInfiniteMutationCatalyst, 0),
+ ItemList.Circuit_Chip_Biocell.get(64), ItemList.Gravistar.get(8),
+ Materials.InfinityCatalyst.getDust(2) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.tin", 18000),
+ FluidUtils.getFluidStack("plasma.bismuth", 18000), FluidUtils.getFluidStack("cryotheum", 4000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 280) },
+ 20 * 800,
+ 3842160,
+ 7);
+ }
+
+ private static void registerFuels() {
+
+ // Burnables
+
+ // Gas Fuels
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellNitrobenzene", 1))
+ .metadata(FUEL_VALUE, 1600)
+ .metadata(FUEL_TYPE, 1)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private void recipeGrindingBallAlumina() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 64), GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemUtils.getSimpleStack(mMillingBallAlumina, 8))
+ .fluidInputs(FluidUtils.getFluidStack(GenericChem.Aniline, 4000))
+ .duration(3 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeGrindingBallSoapstone() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soapstone, 32L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemUtils.getSimpleStack(mMillingBallSoapstone, 8))
+ .fluidInputs(FluidUtils.getFluidStack(AgrichemFluids.mLiquidResin, 2500))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCyclohexane() {
+
+ // C6H6 + 6H = C6H12
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(mBrownCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(Benzene, 1000), FluidUtils.getFluidStack("hydrogen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+ }
+
+ private void recipeCyclohexanone() {
+
+ // C6H12 + 2O(Air) = C6H10O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), FluidUtils.getFluidStack("air", 4000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexanone, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), },
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), FluidUtils.getFluidStack("oxygen", 2000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexanone, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+ }
+
+ private void recipeCatalystRed() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierOneChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(mRedCatalyst, 10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystYellow() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4L))
+ .itemOutputs(ItemUtils.getSimpleStack(mYellowCatalyst, 10))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystBlue() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierTwoChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 3L))
+ .itemOutputs(ItemUtils.getSimpleStack(mBlueCatalyst, 10))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystOrange() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierTwoChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 5L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 5L))
+ .itemOutputs(ItemUtils.getSimpleStack(mOrangeCatalyst, 10))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystPurple() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierFourChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 6L),
+ ELEMENT.getInstance().RUTHENIUM.getDust(6))
+ .itemOutputs(ItemUtils.getSimpleStack(mPurpleCatalyst, 10))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystBrown() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierOneChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L))
+ .itemOutputs(ItemUtils.getSimpleStack(mBrownCatalyst, 10))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystPink() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L),
+ ELEMENT.getInstance().RHODIUM.getDust(4))
+ .itemOutputs(ItemUtils.getSimpleStack(mPinkCatalyst, 10))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystFormaldehyde() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(4),
+ ItemUtils.getSimpleStack(RocketFuels.Formaldehyde_Catalyst_Dust, 8))
+ .itemOutputs(ItemUtils.getSimpleStack(mFormaldehydeCatalyst, 4))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystSolidAcid() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 5))
+ .fluidInputs(MISC_MATERIALS.SOLID_ACID_MIXTURE.getFluidStack(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystInfiniteMutation() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 10L))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mInfiniteMutationCatalyst, 5))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCadaverineAndPutrescine() {
+
+ // Basic Recipe
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierOneChip(), ItemUtils.getSimpleStack(Items.rotten_flesh, 64) },
+ new FluidStack[] { FluidUtils.getHotWater(2000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cadaverine, 250), FluidUtils.getFluidStack(Putrescine, 250), },
+ 20 * 120,
+ 120,
+ 1);
+
+ // Advanced Recipe
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(Items.rotten_flesh, 128),
+ ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 8, 32) },
+ new FluidStack[] { FluidUtils.getHotWater(3000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cadaverine, 750), FluidUtils.getFluidStack(Putrescine, 750), },
+ 20 * 120,
+ 240,
+ 2);
+ }
+
+ private void recipeAniline() {
+
+ // C6H5NO2 + 6H = C6H7N + 2H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierThreeChip(), ItemUtils.getSimpleStack(mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(NitroBenzene, 1000),
+ FluidUtils.getFluidStack("hydrogen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Aniline, 1000), },
+ 20 * 30,
+ 500,
+ 3);
+ }
+
+ private void recipeNitroBenzene() {
+
+ // C6H6 + HNO3 =H2SO4= C6H5NO2 +H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierThreeChip(), },
+ new FluidStack[] { FluidUtils.getFluidStack(Benzene, 5000), FluidUtils.getFluidStack("sulfuricacid", 1000),
+ FluidUtils.getFluidStack("nitricacid", 5000), FluidUtils.getDistilledWater(10000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(NitroBenzene, 5000), },
+ 20 * 30,
+ 500,
+ 4);
+ }
+
+ private void recipe2Ethylanthraquinone() {
+
+ // C6H4(CO)2O + C6H5CH2CH3 = C6H4(CO)2C6H3CH2CH3 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPhthalicAnhydride", 15), },
+ new FluidStack[] { FluidUtils.getFluidStack(CoalTar.Ethylbenzene, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 1000), },
+ 20 * 15,
+ 120,
+ 2);
+ }
+
+ private void recipe2Ethylanthrahydroquinone() {
+
+ // C6H4(CO)2C6H3CH2CH3 + 2H = C6H4(COH)2C6H3CH2CH3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), ItemUtils.getSimpleStack(mOrangeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 1000),
+ FluidUtils.getFluidStack("hydrogen", 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 1000), },
+ 20 * 40,
+ 120,
+ 2);
+ }
+
+ private void recipeLithiumPeroxide() {
+ // 2HLiO2 = Li2O2 + H2O2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroperoxide", 8))
+ .fluidOutputs(FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumPeroxide", 4))
+ .duration(100 * SECONDS)
+ .eut(120)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ private void recipeLithiumHydroperoxide() {
+
+ // LiOH + H2O2 = HLiO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 3), },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroperoxide", 4), },
+ new FluidStack[] {},
+ 20 * 30,
+ 240,
+ 1);
+
+ }
+
+ private void recipeHydrogenPeroxide() {
+
+ // C6H4(COH)2C6H3CH2CH3 + 2O =(C6H4CH)2= H2O2 + C6H4(CO)2C6H3CH2CH3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { FluidUtils.getFluidStack("air", 20000),
+ FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.hydrogenperoxide", 5000), },
+ 20 * 30,
+ 240,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { Materials.Oxygen.getGas(10000), FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.hydrogenperoxide", 5000), },
+ 20 * 5,
+ 240,
+ 1);
+
+ }
+
+ private static ItemStack getTierOneChip() {
+ return CI.getNumberedAdvancedCircuit(4);
+ }
+
+ private static ItemStack getTierTwoChip() {
+ return CI.getNumberedAdvancedCircuit(8);
+ }
+
+ private static ItemStack getTierThreeChip() {
+ return CI.getNumberedAdvancedCircuit(12);
+ }
+
+ private static ItemStack getTierFourChip() {
+ return CI.getNumberedAdvancedCircuit(16);
+ }
+
+ private static void recipeAdvancedChip() {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 0L),
+ 0,
+ new Object[] { OrePrefixes.circuit.get(Materials.Advanced) });
+
+ long bits = 0;
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 1L, new Object[0]),
+ bits,
+ new Object[] { "d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 2L, new Object[0]),
+ bits,
+ new Object[] { " d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 3L, new Object[0]),
+ bits,
+ new Object[] { " d", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 4L, new Object[0]),
+ bits,
+ new Object[] { " ", " Pd", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 5L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 6L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 7L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", "d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 8L, new Object[0]),
+ bits,
+ new Object[] { " ", "dP ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 9L, new Object[0]),
+ bits,
+ new Object[] { "P d", " ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 10L, new Object[0]),
+ bits,
+ new Object[] { "P ", " d", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 11L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 12L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 13L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 14L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 15L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", "d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 16L, new Object[0]),
+ bits,
+ new Object[] { " P", "d ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 17L, new Object[0]),
+ bits,
+ new Object[] { " ", " ", "d P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 18L, new Object[0]),
+ bits,
+ new Object[] { " ", "d ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 19L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 20L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 21L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 22L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 23L, new Object[0]),
+ bits,
+ new Object[] { " d", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 24L, new Object[0]),
+ bits,
+ new Object[] { " ", " d", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java b/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java
new file mode 100644
index 0000000000..d4f5e832f6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java
@@ -0,0 +1,171 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.item.base.misc.BaseItemParticle;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.Utils;
+
+public class IonParticles extends BaseItemParticle {
+
+ public static HashMap<String, Integer> NameToMetaMap = new HashMap<>();
+ public static HashMap<Integer, String> MetaToNameMap = new HashMap<>();
+
+ public IonParticles() {
+ super("Ion", ELEMENT.NAMES.length, EnumRarity.rare);
+ }
+
+ public static IIcon[] overlays = new IIcon[ELEMENT.NAMES.length];
+ public static IIcon baseTexture;
+
+ static {
+ // Generate Ions
+ int key = 0;
+ for (String s : ELEMENT.NAMES) {
+ // Map names to Meta
+ NameToMetaMap.put(Utils.sanitizeString(s.toLowerCase()), key);
+ MetaToNameMap.put(key, Utils.sanitizeString(s.toLowerCase()));
+ Materials m = Materials.get(s);
+ int aColour = 0;
+ if (m == null) {
+ aColour = Utils.rgbtoHexValue(128, 128, 128);
+ } else {
+ aColour = Utils.rgbtoHexValue(m.mRGBa[0], m.mRGBa[1], m.mRGBa[2]);
+ }
+ aColourMap.put(key++, aColour);
+ }
+ }
+
+ @Override
+ public String[] getAffixes() {
+ return new String[] { "", "" };
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "";
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack itemStack) {
+ return "item.particle.ion" + "." + ELEMENT.NAMES[itemStack.getItemDamage()];
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Charge", 0);
+ tagMain.setTag("Ion", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getChargeState(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Ion");
+ if (aNBT != null) {
+ return aNBT.getLong("Charge");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setChargeState(final ItemStack aStack, final long aCharge) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Ion");
+ if (aNBT != null) {
+ aNBT.setLong("Charge", aCharge);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double chargeState = getChargeState(stack);
+ return chargeState;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ long aCharge = getChargeState(stack);
+ String aState = EnumChatFormatting.YELLOW + "Unknown" + EnumChatFormatting.GRAY;
+ // State not set
+ if (aCharge == 0) {
+ list.add(
+ EnumChatFormatting.GRAY + "A "
+ + MetaToNameMap.get(stack.getItemDamage())
+ + " Ion with an "
+ + aState
+ + " charge state");
+ } else {
+ if (aCharge > 0) {
+ aState = EnumChatFormatting.GREEN + "Positive" + EnumChatFormatting.GRAY;
+ } else {
+ aState = EnumChatFormatting.RED + "Negative" + EnumChatFormatting.GRAY;
+ }
+
+ list.add(
+ EnumChatFormatting.GRAY + "A "
+ + MetaToNameMap.get(stack.getItemDamage())
+ + " Ion with a "
+ + aState
+ + " charge state of "
+ + aCharge
+ + "");
+ }
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < IonParticles.overlays.length; i++) {
+ IonParticles.overlays[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "ion/" + i);
+ }
+ IonParticles.baseTexture = reg.registerIcon(GTPlusPlus.ID + ":" + "ion/IonBase");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return IonParticles.overlays[meta];
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(int aMeta, int aPass) {
+ if (aPass == 0) {
+ return IonParticles.baseTexture;
+ } else {
+ return IonParticles.overlays[aMeta];
+ }
+ }
+
+ @Override
+ public int getRenderPasses(int metadata) {
+ return 2;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java b/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java
new file mode 100644
index 0000000000..5a848d2616
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java
@@ -0,0 +1,752 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.HashMap;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.api.objects.data.Quad;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.base.ore.BaseItemMilledOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.xmod.bop.HANDLER_BiomesOPlenty;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class MilledOreProcessing extends ItemPackage {
+
+ /**
+ * Fluids
+ */
+ public static Fluid SphaleriteFlotationFroth;
+
+ public static Fluid ChalcopyriteFlotationFroth;
+ public static Fluid NickelFlotationFroth;
+ public static Fluid PlatinumFlotationFroth;
+ public static Fluid PentlanditeFlotationFroth;
+
+ public static Fluid RedstoneFlotationFroth;
+ public static Fluid SpessartineFlotationFroth;
+ public static Fluid GrossularFlotationFroth;
+ public static Fluid AlmandineFlotationFroth;
+ public static Fluid PyropeFlotationFroth;
+ public static Fluid MonaziteFlotationFroth;
+
+ public static Fluid PineOil;
+
+ /**
+ * Items
+ */
+
+ // Zinc, Iron, Indium, Germanium
+ public static Item milledSphalerite;
+
+ // Copper, Iron, Cadmium, Indium
+ public static Item milledChalcopyrite;
+
+ // Nickel, Cobalt, Rhodium, Ruthenium
+ public static Item milledNickel;
+
+ // Platinum, Rhodium, Selenium, Tellurium
+ public static Item milledPlatinum;
+
+ // Iron, Nickel, Promethium, Hafnium
+ public static Item milledPentlandite;
+
+ // Redstone, Chrome, Firestone, Dysprosium
+ public static Item milledRedstone;
+
+ // Manganese, Aluminium, Osmium, Strontium
+ public static Item milledSpessartine;
+
+ // Calcium, Aluminium, Tungsten, Thallium
+ public static Item milledGrossular;
+
+ // Aluminium, Magnesium, Yttrium, Ytterbium
+ public static Item milledAlmandine;
+
+ // Magnesium, Manganese, Borax, Rhenium
+ public static Item milledPyrope;
+
+ // Erbium, Lanthanum, Praseodymium, Europium
+ public static Item milledMonazite;
+
+ @Override
+ public void items() {
+
+ milledSphalerite = BaseItemMilledOre.generate(Materials.Sphalerite, MaterialUtils.getVoltageForTier(6));
+ milledChalcopyrite = BaseItemMilledOre.generate(Materials.Chalcopyrite, MaterialUtils.getVoltageForTier(5));
+ milledNickel = BaseItemMilledOre.generate(Materials.Nickel, MaterialUtils.getVoltageForTier(5));
+ milledPlatinum = BaseItemMilledOre.generate(Materials.Platinum, MaterialUtils.getVoltageForTier(6));
+ milledPentlandite = BaseItemMilledOre.generate(Materials.Pentlandite, MaterialUtils.getVoltageForTier(6));
+
+ milledRedstone = BaseItemMilledOre.generate(Materials.Redstone, MaterialUtils.getVoltageForTier(5));
+ milledSpessartine = BaseItemMilledOre.generate(Materials.Spessartine, MaterialUtils.getVoltageForTier(6));
+ milledGrossular = BaseItemMilledOre.generate(Materials.Grossular, MaterialUtils.getVoltageForTier(6));
+ milledAlmandine = BaseItemMilledOre.generate(Materials.Almandine, MaterialUtils.getVoltageForTier(6));
+ milledPyrope = BaseItemMilledOre.generate(Materials.Pyrope, MaterialUtils.getVoltageForTier(4));
+ milledMonazite = BaseItemMilledOre.generate(Materials.Monazite, MaterialUtils.getVoltageForTier(7));
+ }
+
+ @Override
+ public void blocks() {
+ // None yet
+ }
+
+ @Override
+ public void fluids() {
+
+ short[] aZincFrothRGB = Materials.Sphalerite.mRGBa;
+ SphaleriteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.zincflotation",
+ "Sphalerite Froth",
+ 32 + 175,
+ new short[] { aZincFrothRGB[0], aZincFrothRGB[1], aZincFrothRGB[2], 100 },
+ true);
+ short[] aCopperFrothRGB = Materials.Chalcopyrite.mRGBa;
+ ChalcopyriteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.copperflotation",
+ "Chalcopyrite Froth",
+ 32 + 175,
+ new short[] { aCopperFrothRGB[0], aCopperFrothRGB[1], aCopperFrothRGB[2], 100 },
+ true);
+ short[] aNickelFrothRGB = Materials.Nickel.mRGBa;
+ NickelFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.nickelflotation",
+ "Nickel Froth",
+ 32 + 175,
+ new short[] { aNickelFrothRGB[0], aNickelFrothRGB[1], aNickelFrothRGB[2], 100 },
+ true);
+ short[] aPlatinumFrothRGB = Materials.Platinum.mRGBa;
+ PlatinumFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.platinumflotation",
+ "Platinum Froth",
+ 32 + 175,
+ new short[] { aPlatinumFrothRGB[0], aPlatinumFrothRGB[1], aPlatinumFrothRGB[2], 100 },
+ true);
+ short[] aPentlanditeFrothRGB = Materials.Pentlandite.mRGBa;
+ PentlanditeFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.pentlanditeflotation",
+ "Pentlandite Froth",
+ 32 + 175,
+ new short[] { aPentlanditeFrothRGB[0], aPentlanditeFrothRGB[1], aPentlanditeFrothRGB[2], 100 },
+ true);
+
+ short[] aRedstoneFrothRGB = Materials.Redstone.mRGBa;
+ RedstoneFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.redstoneflotation",
+ "Redstone Froth",
+ 32 + 175,
+ new short[] { aRedstoneFrothRGB[0], aRedstoneFrothRGB[1], aRedstoneFrothRGB[2], 100 },
+ true);
+ short[] aSpessartineFrothRGB = Materials.Spessartine.mRGBa;
+ SpessartineFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.spessartineflotation",
+ "Spessartine Froth",
+ 32 + 175,
+ new short[] { aSpessartineFrothRGB[0], aSpessartineFrothRGB[1], aSpessartineFrothRGB[2], 100 },
+ true);
+ short[] aGrossularFrothRGB = Materials.Grossular.mRGBa;
+ GrossularFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.grossularflotation",
+ "Grossular Froth",
+ 32 + 175,
+ new short[] { aGrossularFrothRGB[0], aGrossularFrothRGB[1], aGrossularFrothRGB[2], 100 },
+ true);
+ short[] aAlmandineFrothRGB = Materials.Almandine.mRGBa;
+ AlmandineFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.almandineflotation",
+ "Almandine Froth",
+ 32 + 175,
+ new short[] { aAlmandineFrothRGB[0], aAlmandineFrothRGB[1], aAlmandineFrothRGB[2], 100 },
+ true);
+ short[] aPyropeFrothRGB = Materials.Pyrope.mRGBa;
+ PyropeFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.pyropeflotation",
+ "Pyrope Froth",
+ 32 + 175,
+ new short[] { aPyropeFrothRGB[0], aPyropeFrothRGB[1], aPyropeFrothRGB[2], 100 },
+ true);
+ short[] aMonaziteFrothRGB = Materials.Monazite.mRGBa;
+ MonaziteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.Monaziteflotation",
+ "Monazite Froth",
+ 32 + 175,
+ new short[] { aMonaziteFrothRGB[0], aMonaziteFrothRGB[1], aMonaziteFrothRGB[2], 100 },
+ true);
+
+ PineOil = FluidUtils
+ .generateFluidNoPrefix("pineoil", "Pine Oil", 32 + 175, new short[] { 250, 200, 60, 100 }, true);
+ }
+
+ public MilledOreProcessing() {
+ super();
+ Logger.INFO("Adding Ore Milling content");
+ }
+
+ private static void addMiscRecipes() {
+
+ /*
+ * First 5
+ */
+
+ // milledSphalerite
+ registerOreDataForMilledType(
+ SphaleriteFlotationFroth,
+ ELEMENT.getInstance().ZINC,
+ 180,
+ ELEMENT.getInstance().IRON,
+ 120,
+ ELEMENT.getInstance().INDIUM,
+ 64,
+ ELEMENT.getInstance().GERMANIUM,
+ 15);
+ // milledChalcopyrite
+ registerOreDataForMilledType(
+ ChalcopyriteFlotationFroth,
+ ELEMENT.getInstance().COPPER,
+ 180,
+ ELEMENT.getInstance().IRON,
+ 120,
+ ELEMENT.getInstance().CADMIUM,
+ 50,
+ ELEMENT.getInstance().INDIUM,
+ 10);
+ // milledNickel
+ registerOreDataForMilledType(
+ NickelFlotationFroth,
+ ELEMENT.getInstance().NICKEL,
+ 150,
+ ELEMENT.getInstance().COBALT,
+ 120,
+ ELEMENT.getInstance().RHODIUM,
+ 32,
+ ELEMENT.getInstance().RUTHENIUM,
+ 16);
+ // milledPlatinum
+ registerOreDataForMilledType(
+ PlatinumFlotationFroth,
+ ELEMENT.getInstance().PLATINUM,
+ 120,
+ ELEMENT.getInstance().RHODIUM,
+ 60,
+ ELEMENT.getInstance().SELENIUM,
+ 40,
+ ELEMENT.getInstance().TELLURIUM,
+ 10);
+ // milledPentlandite
+ registerOreDataForMilledType(
+ PentlanditeFlotationFroth,
+ ELEMENT.getInstance().IRON,
+ 150,
+ ELEMENT.getInstance().NICKEL,
+ 100,
+ ELEMENT.getInstance().PROMETHIUM,
+ 20,
+ ELEMENT.getInstance().HAFNIUM,
+ 10);
+
+ /*
+ * Second 5
+ */
+ // milledRedstone
+ registerOreDataForMilledType(
+ RedstoneFlotationFroth,
+ NONMATERIAL.REDSTONE,
+ 300,
+ ELEMENT.getInstance().CHROMIUM,
+ 60,
+ MaterialUtils.generateMaterialFromGtENUM(Materials.Firestone),
+ 45,
+ ELEMENT.getInstance().DYSPROSIUM,
+ 16);
+ // milledSpessartine
+ registerOreDataForMilledType(
+ SpessartineFlotationFroth,
+ ELEMENT.getInstance().MANGANESE,
+ 150,
+ ELEMENT.getInstance().ALUMINIUM,
+ 90,
+ ELEMENT.getInstance().OSMIUM,
+ 30,
+ ELEMENT.getInstance().STRONTIUM,
+ 20);
+ // milledGrossular
+ registerOreDataForMilledType(
+ GrossularFlotationFroth,
+ ELEMENT.getInstance().CALCIUM,
+ 180,
+ ELEMENT.getInstance().ALUMINIUM,
+ 110,
+ ELEMENT.getInstance().TUNGSTEN,
+ 60,
+ ELEMENT.getInstance().THALLIUM,
+ 15);
+ // milledAlmandine
+ registerOreDataForMilledType(
+ AlmandineFlotationFroth,
+ ELEMENT.getInstance().ALUMINIUM,
+ 150,
+ ELEMENT.getInstance().MAGNESIUM,
+ 75,
+ ELEMENT.getInstance().YTTRIUM,
+ 25,
+ ELEMENT.getInstance().YTTERBIUM,
+ 15);
+ // milledPyrope
+ registerOreDataForMilledType(
+ PyropeFlotationFroth,
+ ELEMENT.getInstance().MAGNESIUM,
+ 110,
+ ELEMENT.getInstance().MANGANESE,
+ 70,
+ MaterialUtils.generateMaterialFromGtENUM(Materials.Borax),
+ 60,
+ ELEMENT.getInstance().RHENIUM,
+ 20);
+ // milledMonazite TODO
+ registerOreDataForMilledType(
+ MonaziteFlotationFroth,
+ ELEMENT.getInstance().ERBIUM,
+ 64,
+ ELEMENT.getInstance().LANTHANUM,
+ 32,
+ ELEMENT.getInstance().LUTETIUM,
+ 16,
+ ELEMENT.getInstance().EUROPIUM,
+ 8);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for OreMillingProc.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ addMiscRecipes();
+ addPineOilExtraction();
+ addFlotationRecipes1();
+ addFlotationRecipes2();
+ addVacuumFurnaceRecipes();
+ return true;
+ }
+
+ private void addVacuumFurnaceRecipes() {
+ int aCircuitID = 1;
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(SphaleriteFlotationFroth, 4000) },
+ getOutputsFromMap(SphaleriteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(ChalcopyriteFlotationFroth, 4000) },
+ getOutputsFromMap(ChalcopyriteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(NickelFlotationFroth, 4000) },
+ getOutputsFromMap(NickelFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PlatinumFlotationFroth, 4000) },
+ getOutputsFromMap(PlatinumFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PentlanditeFlotationFroth, 4000) },
+ getOutputsFromMap(PentlanditeFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(RedstoneFlotationFroth, 4000) },
+ getOutputsFromMap(RedstoneFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(SpessartineFlotationFroth, 4000) },
+ getOutputsFromMap(SpessartineFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(GrossularFlotationFroth, 4000) },
+ getOutputsFromMap(GrossularFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(AlmandineFlotationFroth, 4000) },
+ getOutputsFromMap(AlmandineFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PyropeFlotationFroth, 4000) },
+ getOutputsFromMap(PyropeFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(4),
+ 3500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(MonaziteFlotationFroth, 4000) },
+ getOutputsFromMap(MonaziteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(7),
+ 7500);
+ }
+
+ private void addFlotationRecipes1() {
+
+ // Sphalerite
+ CORE.RA.addFlotationRecipe(
+ Materials.Sphalerite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 14000), },
+ new FluidStack[] { FluidUtils.getFluidStack(SphaleriteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Chalcopyrite
+ CORE.RA.addFlotationRecipe(
+ Materials.Chalcopyrite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 12000), },
+ new FluidStack[] { FluidUtils.getFluidStack(ChalcopyriteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Nickel
+ CORE.RA.addFlotationRecipe(
+ Materials.Nickel,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 25000), },
+ new FluidStack[] { FluidUtils.getFluidStack(NickelFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Platinum
+ CORE.RA.addFlotationRecipe(
+ Materials.Platinum,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 35000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PlatinumFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Pentlandite
+ CORE.RA.addFlotationRecipe(
+ Materials.Pentlandite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 14000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PentlanditeFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private void addFlotationRecipes2() {
+
+ // Redstone
+ CORE.RA.addFlotationRecipe(
+ Materials.Redstone,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 13000), },
+ new FluidStack[] { FluidUtils.getFluidStack(RedstoneFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Spessartine
+ CORE.RA.addFlotationRecipe(
+ Materials.Spessartine,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 35000), },
+ new FluidStack[] { FluidUtils.getFluidStack(SpessartineFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Grossular
+ CORE.RA.addFlotationRecipe(
+ Materials.Grossular,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 28000), },
+ new FluidStack[] { FluidUtils.getFluidStack(GrossularFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Almandine
+ CORE.RA.addFlotationRecipe(
+ Materials.Almandine,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 18000), },
+ new FluidStack[] { FluidUtils.getFluidStack(AlmandineFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Pyrope
+ CORE.RA.addFlotationRecipe(
+ Materials.Pyrope,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 8000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PyropeFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Monazite
+ CORE.RA.addFlotationRecipe(
+ Materials.Monazite,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 30000), },
+ new FluidStack[] { FluidUtils.getFluidStack(MonaziteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private void addPineOilExtraction() {
+ AutoMap<ItemStack> aLogs = new AutoMap<>();
+ AutoMap<ItemStack> aLeaves = new AutoMap<>();
+ AutoMap<ItemStack> aSaplings = new AutoMap<>();
+ AutoMap<ItemStack> aPinecones = new AutoMap<>();
+
+ ItemStack aCrushedPine = ItemUtils.getSimpleStack(AgriculturalChem.mCrushedPine, 1);
+
+ aLogs.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.log_Pine));
+ aLeaves.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.leaves_Pine));
+ aSaplings.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Pine));
+ aPinecones.add(ItemUtils.getSimpleStack(AgriculturalChem.mPinecone, 1));
+
+ if (BiomesOPlenty.isModLoaded()) {
+ aLogs.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.logs4, 0, 1));
+ aLeaves.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.colorizedLeaves2, 1, 1));
+ aSaplings.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.colorizedSaplings, 5, 1));
+ aPinecones.add(ItemUtils.simpleMetaStack(HANDLER_BiomesOPlenty.mPineCone, 13, 1));
+ }
+ if (Forestry.isModLoaded()) {
+ ItemStack aForestryLog = ItemUtils.getItemStackFromFQRN("Forestry:logs", 1);
+ if (aForestryLog != null) {
+ aForestryLog.setItemDamage(20); // Set to Pine
+ aLogs.add(aForestryLog);
+ }
+ ItemStack aForestryLeaves = ItemUtils.getItemStackFromFQRN("Forestry:leaves", 1);
+ if (aForestryLeaves != null) {
+ NBTUtils.setString(aForestryLeaves, "species", "forestry.treePine"); // Set to Pine
+ aLeaves.add(aForestryLeaves);
+ }
+ }
+
+ for (ItemStack aLog : aLogs) {
+ addRecipe(aLog, ItemUtils.getSimpleStack(aCrushedPine, 16), new int[] { 10000, 7500, 5000, 2500 }, 10, 120);
+ }
+ for (ItemStack aLeaf : aLeaves) {
+ addRecipe(aLeaf, ItemUtils.getSimpleStack(aCrushedPine, 2), new int[] { 5000, 5000, 2500, 2500 }, 10, 30);
+ }
+ for (ItemStack aSapling : aSaplings) {
+ addRecipe(
+ aSapling,
+ ItemUtils.getSimpleStack(aCrushedPine, 4),
+ new int[] { 7500, 7500, 2500, 2500 },
+ 10,
+ 60);
+ }
+ for (ItemStack aCone : aPinecones) {
+ addRecipe(aCone, ItemUtils.getSimpleStack(aCrushedPine, 1), new int[] { 7500, 7500, 5000, 2500 }, 10, 60);
+ }
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), ItemUtils.getSimpleStack(aCrushedPine, 64) },
+ new FluidStack[] { FluidUtils.getSteam(5000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 500) },
+ new int[] { 2000, 2000, 2000, 2000 },
+ 20 * 60,
+ 120,
+ 3);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemUtils.getSimpleStack(aCrushedPine, 64) },
+ new FluidStack[] { FluidUtils.getSuperHeatedSteam(5000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 1500) },
+ new int[] { 3000, 3000, 3000, 3000 },
+ 20 * 45,
+ 120,
+ 4);
+ }
+
+ public boolean addRecipe(ItemStack aInput, ItemStack aOutput1, int[] aChances, int aTime, int aEU) {
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ ItemStack aOutputs[] = new ItemStack[4];
+ for (int i = 0; i < aChances.length; i++) {
+ aOutputs[i] = aOutput1;
+ }
+ aOutputs = cleanArray(aOutputs);
+ if ((GT_Utility.isStackInvalid(aInput))
+ || (GT_Utility.isStackInvalid(aOutput1) || (GT_Utility.getContainerItem(aInput, false) != null))) {
+ return false;
+ }
+
+ return CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(14), aInput },
+ new FluidStack[] {},
+ aOutputs,
+ new FluidStack[] {},
+ aChances,
+ aTime * 20,
+ aEU,
+ 3);
+ }
+
+ public static ItemStack[] cleanArray(ItemStack[] input) {
+ int aArraySize = input.length;
+ AutoMap<ItemStack> aCleanedItems = new AutoMap<>();
+ for (ItemStack checkStack : input) {
+ if (ItemUtils.checkForInvalidItems(checkStack)) {
+ aCleanedItems.put(checkStack);
+ }
+ }
+ ItemStack[] aOutput = new ItemStack[aCleanedItems.size()];
+ for (int i = 0; i < aArraySize; i++) {
+ ItemStack aMappedStack = aCleanedItems.get(i);
+ if (aMappedStack != null) {
+ aOutput[i] = aMappedStack;
+ }
+ }
+ return aOutput;
+ }
+
+ private static final HashMap<String, Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>>> aMilledFluidMap = new HashMap<>();
+
+ public static void registerOreDataForMilledType(Fluid aMilledFluid, Materials aOutput1, int aPerc1,
+ Materials aOutput2, int aPerc2, Materials aOutput3, int aPerc3, Materials aOutput4, int aPerc4) {
+ registerOreDataForMilledType(
+ aMilledFluid,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput1),
+ aPerc1,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput2),
+ aPerc2,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput3),
+ aPerc3,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput4),
+ aPerc4);
+ }
+
+ public static void registerOreDataForMilledType(Fluid aMilledFluid, Material aOutput1, int aPerc1,
+ Material aOutput2, int aPerc2, Material aOutput3, int aPerc3, Material aOutput4, int aPerc4) {
+
+ Pair<Material, Integer> aFluidOutput1 = new Pair<>(aOutput1, aPerc1);
+ Pair<Material, Integer> aFluidOutput2 = new Pair<>(aOutput2, aPerc2);
+ Pair<Material, Integer> aFluidOutput3 = new Pair<>(aOutput3, aPerc3);
+ Pair<Material, Integer> aFluidOutput4 = new Pair<>(aOutput4, aPerc4);
+ Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>> aDataQuad = new Quad<>(
+ aFluidOutput1,
+ aFluidOutput2,
+ aFluidOutput3,
+ aFluidOutput4);
+ aMilledFluidMap.put(aMilledFluid.getUnlocalizedName(), aDataQuad);
+ }
+
+ private static ItemStack[] getOutputsFromMap(Fluid aFluid) {
+ String aKey = aFluid.getUnlocalizedName();
+ return getArrayFromQuad(aMilledFluidMap.get(aKey));
+ }
+
+ private static ItemStack[] getArrayFromQuad(
+ Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>> aData) {
+ AutoMap<ItemStack> aOutputs = new AutoMap<>();
+ for (Object aPair : aData.values()) {
+ if (aPair != null && Pair.class.isInstance(aPair)) {
+ Pair aObj = (Pair) aPair;
+ Material aMat = (Material) aObj.getKey();
+ int aCount = (int) aObj.getValue();
+ aOutputs.addAll(getItemStackFromPair(aMat, aCount));
+ }
+ }
+ ItemStack[] aRealOutputArray = new ItemStack[aOutputs.size()];
+ int aIndex = 0;
+ for (ItemStack aStack : aOutputs) {
+ aRealOutputArray[aIndex++] = aStack;
+ }
+ return aRealOutputArray;
+ }
+
+ private static AutoMap<ItemStack> getItemStackFromPair(Material aMat, Integer aCount) {
+ AutoMap<ItemStack> aOutputs = new AutoMap<>();
+ if (aCount > 64) {
+ AutoMap<Integer> sizes = getStackSizes(aCount);
+ for (int aSplitSize : sizes) {
+ ItemStack aDustStack = aMat.getDust(aSplitSize);
+ aOutputs.put(aDustStack);
+ }
+ } else {
+ ItemStack aDustStack = aMat.getDust(aCount);
+ aOutputs.put(aDustStack);
+ }
+ return aOutputs;
+ }
+
+ private static AutoMap<Integer> getStackSizes(int aBigSize) {
+ AutoMap<Integer> aSizes = new AutoMap<>();
+ if (aBigSize <= 64) {
+ aSizes.add(aBigSize);
+ } else {
+ for (int i = aBigSize; i > 0; i -= 64) {
+ aSizes.add(i);
+ }
+ }
+ return aSizes;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java b/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java
new file mode 100644
index 0000000000..d83b5a7cea
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class NuclearChem extends ItemPackage {
+
+ public static Fluid Burnt_LiFBeF2ThF4UF4;
+ public static Fluid Burnt_LiFBeF2ZrF4UF4;
+ public static Fluid Burnt_LiFBeF2ZrF4U235;
+
+ public static Fluid Impure_LiFBeF2;
+
+ public static Fluid GeneticMutagen;
+ private static boolean generateMutagenRecipe = false;
+
+ @Override
+ public void items() {}
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+ // Create Used Nuclear Fuels
+ Burnt_LiFBeF2ThF4UF4 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ThF4UF4",
+ "Burnt LiFBeF2ThF4UF4 Salt",
+ 545,
+ new short[] { 48, 175, 48, 100 },
+ null,
+ null);
+ Burnt_LiFBeF2ZrF4UF4 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ZrF4UF4",
+ "Burnt LiFBeF2ZrF4UF4 Salt",
+ 520,
+ new short[] { 48, 168, 68, 100 },
+ null,
+ null);
+ Burnt_LiFBeF2ZrF4U235 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ZrF4U235",
+ "Burnt LiFBeF2ZrF4U235 Salt",
+ 533,
+ new short[] { 68, 185, 48, 100 },
+ null,
+ null);
+ Impure_LiFBeF2 = FluidUtils.generateFluidNonMolten(
+ "ImpureLiFBeF2",
+ "Impure Molten Salt Base",
+ 533,
+ new short[] { 110, 75, 186, 100 },
+ null,
+ null);
+ if (FluidUtils.getFluidStack("fluid.Mutagen", 1) == null) {
+ GeneticMutagen = FluidUtils.generateFluidNonMolten(
+ "GeneticMutagen",
+ "Genetic Mutagen",
+ 12,
+ new short[] { 22, 148, 185, 100 },
+ null,
+ null);
+ generateMutagenRecipe = true;
+ } else {
+ GeneticMutagen = FluidUtils.getFluidStack("fluid.Mutagen", 1)
+ .getFluid();
+ }
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Nuclear Chemistry Recipes.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ if (generateMutagenRecipe) {
+ chemReactor_CreateMutagen();
+ }
+ return true;
+ }
+
+ private static void chemReactor_CreateMutagen() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .fluidInputs(FluidRegistry.getFluidStack("mobessence", 5000))
+ .fluidOutputs(FluidUtils.getFluidStack(GeneticMutagen, 8000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java b/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java
new file mode 100644
index 0000000000..3fc682e7cc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java
@@ -0,0 +1,562 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RocketFuels extends ItemPackage {
+
+ public static HashSet<String> mValidRocketFuelNames = new HashSet<>();
+ public static HashMap<Integer, Fluid> mValidRocketFuels = new HashMap<>();
+
+ public static Fluid Oil_Heavy;
+ public static Fluid Diesel;
+ public static Fluid Kerosene;
+ public static Fluid RP1;
+ public static Fluid Nitrogen_Tetroxide;
+ public static Fluid Hydrazine;
+ public static Fluid Monomethylhydrazine;
+ public static Fluid Unsymmetrical_Dimethylhydrazine;
+ public static Fluid Nitrous_Oxide;
+ public static Fluid Hydrated_Ammonium_Nitrate_Slurry;
+ public static Fluid Liquid_Oxygen;
+ public static Fluid Liquid_Hydrogen;
+ public static Fluid Formaldehyde;
+
+ // Rocket Fuel Mixes
+ public static Fluid Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide;
+ public static Fluid RP1_Plus_Liquid_Oxygen;
+ public static Fluid Dense_Hydrazine_Mix;
+ public static Fluid Monomethylhydrazine_Plus_Nitric_Acid;
+
+ public static Item Ammonium_Nitrate_Dust;
+ public static Item Formaldehyde_Catalyst_Dust;
+ public static ItemStack Formaldehyde_Catalyst_Stack;
+
+ public RocketFuels() {
+ super(true);
+ }
+
+ public static void createKerosene() {
+
+ FluidStack fuelA = FluidUtils.getFluidStack("diesel", 3000);
+ FluidStack fuelB = FluidUtils.getFluidStack("fuel", 3000);
+
+ if (fuelA != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelA)
+ .fluidOutputs(FluidUtils.getFluidStack(Kerosene, 1800))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+ if (fuelA == null && fuelB != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelB)
+ .fluidOutputs(FluidUtils.getFluidStack(Kerosene, 1800))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+ }
+
+ public static void createRP1() {
+ FluidStack fuelA = FluidUtils.getFluidStack(Kerosene, 1000);
+ if (fuelA != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelA)
+ .fluidOutputs(FluidUtils.getFluidStack(RP1, 750))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distilleryRecipes);
+ }
+ }
+
+ public static void createNitrogenTetroxide() {
+ // 2HNO3 + Cu = N2O4 + H2O + CuO
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ ItemUtils.getSimpleStack(GenericChem.mOrangeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 2000) },
+ new ItemStack[] { Materials.CupricOxide.getDust(2), },
+ new FluidStack[] { FluidUtils.getFluidStack(Nitrogen_Tetroxide, 1000), },
+ new int[] { 100, 100, 50, 50 },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3),
+ 3);
+ }
+
+ public static void createHydrazine() {
+
+ // H2O2 + 2NH3 = N2H4 + 2H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21) },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000),
+ FluidUtils.getFluidStack("ammonia", 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrazine, 1000), },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(2),
+ 1);
+ }
+
+ public static void createMonomethylhydrazine() {
+
+ // C + 2H + N2H4 = CH6N2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 1) },
+ new FluidStack[] { FluidUtils.getFluidStack("hydrogen", 2000), FluidUtils.getFluidStack(Hydrazine, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine, 1000), },
+ 20 * 48,
+ 240,
+ 2);
+ }
+
+ private static void createLOH() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellHydrogen", 1))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("cellLiquidHydrogen", 1))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ private static void createHydratedAmmoniumNitrateSlurry() {
+
+ // NH3 + HNO3 = NH4NO3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21), },
+ new FluidStack[] { FluidUtils.getFluidStack("ammonia", 4000),
+ FluidUtils.getFluidStack("nitricacid", 4000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrated_Ammonium_Nitrate_Slurry, 5184), },
+ 20 * 60,
+ 120,
+ 1);
+ }
+
+ private static void createAmmoniumNitrateDust() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(8) },
+ FluidUtils.getFluidStack(Hydrated_Ammonium_Nitrate_Slurry, 8 * 144),
+ FluidUtils.getWater(2000),
+ new ItemStack[] { ItemUtils.getSimpleStack(Ammonium_Nitrate_Dust, 8) },
+ new int[] { 10000 },
+ 90 * 20,
+ 480);
+ }
+
+ private static void createFormaldehyde() {
+
+ // O + CH4O = CH2O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getSimpleStack(GenericChem.mFormaldehydeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("oxygen", 32000),
+ FluidUtils.getFluidStack("methanol", 32000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Formaldehyde, 32000), },
+ 20 * 90,
+ 120,
+ 1);
+ }
+
+ private static void createFormaldehydeCatalyst() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1L),
+ GT_Utility.getIntegratedCircuit(18))
+ .itemOutputs(ItemUtils.getSimpleStack(Formaldehyde_Catalyst_Dust, 4))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(mixerRecipes);
+ }
+
+ private static void createUnsymmetricalDimethylhydrazine() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getSimpleStack(GenericChem.mFormaldehydeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrazine", 2000),
+ FluidUtils.getFluidStack(Formaldehyde, 2000), FluidUtils.getFluidStack("hydrogen", 4000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine, 2000),
+ FluidUtils.getWater(2000) },
+ 20 * 60,
+ 120,
+ 3);
+ }
+
+ private static void addRocketFuelsToMap() {
+ HashMap<Integer, GT_Recipe> mRocketFuels = new LinkedHashMap<>();
+ mRocketFuels.put(
+ 0,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(RP1_Plus_Liquid_Oxygen, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 512)); // Fuel Value
+
+ mRocketFuels.put(
+ 1,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Dense_Hydrazine_Mix, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 1024)); // Fuel Value
+
+ mRocketFuels.put(
+ 2,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine_Plus_Nitric_Acid, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 2048)); // Fuel Value
+
+ mRocketFuels.put(
+ 3,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] {
+ FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 4196)); // Fuel Value
+
+ // Add in default Diesel for the Buggy
+ mValidRocketFuels.put(-1, Diesel);
+
+ mValidRocketFuelNames.add(FluidRegistry.getFluidName(Diesel));
+ for (int mID : mRocketFuels.keySet()) {
+ GT_Recipe aFuelRecipe = mRocketFuels.get(mID);
+ if (aFuelRecipe != null) {
+ mValidRocketFuelNames.add(FluidRegistry.getFluidName(aFuelRecipe.mFluidInputs[0].getFluid()));
+ mValidRocketFuels.put(mID, aFuelRecipe.mFluidInputs[0].getFluid());
+ GTPPRecipeMaps.rocketFuels.add(aFuelRecipe);
+ }
+ }
+ }
+
+ private static void createRocketFuels() {
+
+ // RP1_Plus_Liquid_Oxygen
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(1), },
+ new FluidStack[] { FluidUtils.getFluidStack(Liquid_Oxygen, 2000), FluidUtils.getFluidStack(RP1, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(RP1_Plus_Liquid_Oxygen, 1500), },
+ 20 * 15,
+ 240,
+ 3);
+
+ // Dense_Hydrazine_Mix
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(2), },
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrazine, 4000), FluidUtils.getFluidStack("methanol", 6000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Dense_Hydrazine_Mix, 10000), },
+ 20 * 30,
+ 240,
+ 4);
+
+ // Monomethylhydrazine_Plus_Nitric_Acid
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(3), },
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine, 2000),
+ FluidUtils.getFluidStack("nitricacid", 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine_Plus_Nitric_Acid, 2000), },
+ 20 * 45,
+ 480,
+ 5);
+
+ // Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine, 2000),
+ FluidUtils.getFluidStack(Nitrogen_Tetroxide, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] {
+ FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide, 5000), },
+ 20 * 60,
+ 480,
+ 6);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Rocket Fuel Science!";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ createKerosene();
+ createRP1();
+ createNitrogenTetroxide();
+ createHydrazine();
+ createMonomethylhydrazine();
+
+ createLOH();
+
+ createHydratedAmmoniumNitrateSlurry();
+ createAmmoniumNitrateDust();
+ createFormaldehyde();
+ createFormaldehydeCatalyst();
+ createUnsymmetricalDimethylhydrazine();
+
+ createRocketFuels();
+ addRocketFuelsToMap();
+
+ return true;
+ }
+
+ @Override
+ public void items() {
+ Formaldehyde_Catalyst_Dust = ItemUtils.generateSpecialUseDusts(
+ "FormaldehydeCatalyst",
+ "Formaldehyde Catalyst",
+ "Fe16V1",
+ Utils.rgbtoHexValue(25, 5, 25))[0];
+ Formaldehyde_Catalyst_Stack = ItemUtils.getSimpleStack(Formaldehyde_Catalyst_Dust);
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ // Register default fluids
+ Diesel = MaterialUtils.getMaterial("Fuel", "Diesel")
+ .getFluid(1)
+ .getFluid();
+
+ // 5.08 Compat
+ if (!FluidUtils.doesFluidExist("liquid_heavy_oil")) {
+ Oil_Heavy = FluidUtils
+ .generateFluidNoPrefix("liquid_heavy_oil", "Heavy Oil", 200, new short[] { 10, 10, 10, 100 });
+ } else {
+ Oil_Heavy = MaterialUtils.getMaterial("OilHeavy", "Oil")
+ .getFluid(1)
+ .getFluid();
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellOilHeavy", 1) == null) {
+ new BaseItemComponent("OilHeavy", "Heavy Oil", new short[] { 10, 10, 10 });
+ }
+ }
+
+ // Create Kerosene
+ Kerosene = FluidUtils
+ .generateFluidNonMolten("Kerosene", "Kerosene", 233, new short[] { 150, 40, 150, 100 }, null, null);
+ CoalTar.Coal_Oil = Kerosene;
+
+ // RP! Focket Fuel
+ RP1 = FluidUtils.generateFluidNonMolten("RP1Fuel", "RP-1", 500, new short[] { 210, 50, 50, 100 }, null, null);
+
+ // Create Nitrogen Tetroxide
+ Nitrogen_Tetroxide = FluidUtils.generateFluidNonMolten(
+ "NitrogenTetroxide",
+ "Nitrogen Tetroxide",
+ 261,
+ new short[] { 170, 170, 0, 100 },
+ null,
+ null);
+
+ // Create Hydrazine
+ Hydrazine = FluidUtils
+ .generateFluidNonMolten("Hydrazine", "Hydrazine", 275, new short[] { 250, 250, 250, 100 }, null, null);
+
+ // Create Monomethylhydrazine
+ Monomethylhydrazine = FluidUtils.generateFluidNonMolten(
+ "Monomethylhydrazine",
+ "Monomethylhydrazine",
+ 221,
+ new short[] { 125, 125, 125, 100 },
+ null,
+ null);
+
+ // Create Anthracene
+ Nitrous_Oxide = FluidUtils.generateFluidNonMolten(
+ "NitrousOxide",
+ "Nitrous Oxide",
+ 182,
+ new short[] { 255, 255, 255, 100 },
+ null,
+ null);
+
+ // Nos
+ if (!FluidUtils.doesFluidExist("NitrousOxide")) {
+ Nitrous_Oxide = FluidUtils
+ .generateFluidNoPrefix("NitrousOxide", "Nitrous Oxide", 182, new short[] { 255, 255, 255, 100 });
+ } else {
+ Nitrous_Oxide = FluidUtils.getWildcardFluidStack("NitrousOxide", 1)
+ .getFluid();
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellNitrousOxide", 1) == null) {
+ new BaseItemComponent("NitrousOxide", "Nitrous Oxide", new short[] { 10, 10, 175 });
+ }
+ }
+
+ // Unsymmetrical_Dimethylhydrazine
+ if (FluidUtils.getFluidStack("1,1dimethylhydrazine", 1) == null) {
+ Unsymmetrical_Dimethylhydrazine = FluidUtils.generateFluidNonMolten(
+ "UnsymmetricalDimethylhydrazine",
+ "Unsymmetrical Dimethylhydrazine",
+ 216,
+ new short[] { 70, 210, 20, 100 },
+ null,
+ null);
+ } else {
+ Unsymmetrical_Dimethylhydrazine = FluidUtils.getFluidStack("1,1dimethylhydrazine", 1000)
+ .getFluid();
+ }
+
+ // Create Hydrated_Ammonium_Nitrate_Slurry
+ Hydrated_Ammonium_Nitrate_Slurry = FluidUtils.generateFluidNonMolten(
+ "AmmoniumNitrateSlurry",
+ "Hydrated Ammonium Nitrate Slurry",
+ 450,
+ new short[] { 150, 75, 150, 100 },
+ null,
+ null);
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ Ammonium_Nitrate_Dust = ItemUtils.generateSpecialUseDusts(
+ "AmmoniumNitrate",
+ "Ammonium Nitrate",
+ "N2H4O3",
+ Utils.rgbtoHexValue(150, 75, 150))[0];
+
+ // Create Liquid_Oxygen
+ if (FluidUtils.getFluidStack("LiquidOxygen", 1) == null
+ && FluidUtils.getFluidStack("liquidoxygen", 1) == null) {
+ Liquid_Oxygen = FluidUtils.generateFluidNonMolten(
+ "LiquidOxygen",
+ "Liquid Oxygen",
+ 54,
+ new short[] { 75, 75, 220, 100 },
+ null,
+ null);
+ } else {
+ if (FluidUtils.getFluidStack("LiquidOxygen", 1) != null) {
+ Liquid_Oxygen = FluidUtils.getFluidStack("LiquidOxygen", 1)
+ .getFluid();
+ } else {
+ Liquid_Oxygen = FluidUtils.getFluidStack("liquidoxygen", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellLiquidOxygen", 1) == null) {
+ new BaseItemComponent("LiquidOxygen", "Liquid Oxygen", new short[] { 10, 10, 175 });
+ }
+ }
+
+ // Create Liquid_Hydrogen
+ if (FluidUtils.getFluidStack("LiquidHydrogen", 1) == null
+ && FluidUtils.getFluidStack("liquidhydrogen", 1) == null) {
+ Liquid_Hydrogen = FluidUtils.generateFluidNonMolten(
+ "LiquidHydrogen",
+ "Liquid Hydrogen",
+ 14,
+ new short[] { 75, 75, 220, 100 },
+ null,
+ null);
+ } else {
+ if (FluidUtils.getFluidStack("LiquidHydrogen", 1) != null) {
+ Liquid_Hydrogen = FluidUtils.getFluidStack("LiquidHydrogen", 1)
+ .getFluid();
+ } else {
+ Liquid_Hydrogen = FluidUtils.getFluidStack("liquidhydrogen", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellLiquidHydrogen", 1) == null) {
+ new BaseItemComponent("LiquidHydrogen", "Liquid Hydrogen", new short[] { 10, 10, 175 });
+ }
+ }
+
+ Formaldehyde = FluidUtils
+ .generateFluidNonMolten("Formaldehyde", "Formaldehyde", 185, new short[] { 150, 75, 150, 100 }, null, null);
+
+ Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixA",
+ "H8N4C2O4 Rocket Fuel",
+ 216,
+ new short[] { 50, 220, 50, 100 },
+ null,
+ null);
+ RP1_Plus_Liquid_Oxygen = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixB",
+ "Rp-1 Rocket Fuel",
+ 250,
+ new short[] { 250, 50, 50, 100 },
+ null,
+ null);
+ Monomethylhydrazine_Plus_Nitric_Acid = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixC",
+ "CN3H7O3 Rocket Fuel",
+ 221,
+ new short[] { 125, 75, 180, 100 },
+ null,
+ null);
+ Dense_Hydrazine_Mix = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixD",
+ "Dense Hydrazine Fuel Mixture",
+ 275,
+ new short[] { 175, 80, 120, 100 },
+ null,
+ null);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java b/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java
new file mode 100644
index 0000000000..1604bcb571
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.misc.BaseItemParticle;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.material.Particle.ElementaryGroup;
+import gtPlusPlus.core.util.Utils;
+
+public class StandardBaseParticles extends BaseItemParticle {
+
+ public static HashMap<String, Integer> NameToMetaMap = new HashMap<>();
+ public static HashMap<Integer, String> MetaToNameMap = new HashMap<>();
+
+ public StandardBaseParticles() {
+ super("Base", aTypes.length, EnumRarity.rare);
+ }
+
+ private static final String[] aTypes = new String[] { "Graviton", "Up", "Down", "Charm", "Strange", "Top", "Bottom",
+ "Electron", "Electron Neutrino", "Muon", "Muon Neutrino", "Tau", "Tau Neutrino", "Gluon", "Photon", "Z Boson",
+ "W Boson", "Higgs Boson", "Proton", "Neutron", "Lambda", "Omega", "Pion", "ETA Meson", "Unknown" };
+
+ public IIcon[] icons = new IIcon[aTypes.length];
+
+ static {
+ // Generate Ions
+ int key = 0;
+
+ for (String s : aTypes) {
+ // Map names to Meta
+ NameToMetaMap.put(Utils.sanitizeString(s.toLowerCase()), key);
+ MetaToNameMap.put(key, Utils.sanitizeString(s.toLowerCase()));
+ for (Particle o : Particle.aMap) {
+ int aColour = 0;
+ if (o.mParticleName.toLowerCase()
+ .equals(s.toLowerCase())) {
+ if (o.mParticleType == ElementaryGroup.BARYON) {
+ aColour = Utils.rgbtoHexValue(174, 226, 156);
+ aColourMap.put(key++, aColour);
+ } else if (o.mParticleType == ElementaryGroup.BOSON) {
+ if (o == Particle.HIGGS_BOSON) {
+ aColour = Utils.rgbtoHexValue(226, 196, 104);
+ aColourMap.put(key++, aColour);
+ } else {
+ aColour = Utils.rgbtoHexValue(226, 52, 66);
+ aColourMap.put(key++, aColour);
+ }
+ } else if (o.mParticleType == ElementaryGroup.LEPTON) {
+ aColour = Utils.rgbtoHexValue(126, 226, 95);
+ aColourMap.put(key++, aColour);
+ } else if (o.mParticleType == ElementaryGroup.MESON) {
+ aColour = Utils.rgbtoHexValue(90, 154, 226);
+ aColourMap.put(key++, aColour);
+ } else {
+ aColour = Utils.rgbtoHexValue(188, 61, 226);
+ aColourMap.put(key++, aColour);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getAffixes() {
+ return new String[] { "", "" };
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "";
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack itemStack) {
+ return "item.particle.base" + "." + aTypes[itemStack.getItemDamage()];
+ }
+
+ public static Particle getParticle(ItemStack aStack) {
+ AutoMap<Particle> g = Particle.aMap;
+ for (Particle p : g) {
+ String aPartName = Utils.sanitizeString(p.mParticleName.toLowerCase());
+ String expectedPart = Utils.sanitizeString(aTypes[aStack.getItemDamage()].toLowerCase());
+ if (aPartName.equals(expectedPart)) {
+ return p;
+ }
+ }
+ return Particle.UNKNOWN;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ // return Utils.rgbtoHexValue(200, 200, 200);
+ return super.getColorFromParentClass(stack, HEX_OxFFFFFF);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ Particle aCharge = getParticle(stack);
+ EnumChatFormatting aColour = EnumChatFormatting.GRAY;
+ String aState = aColour + "Unknown" + EnumChatFormatting.RESET;
+ if (aCharge != null) {
+ String aGroup = aCharge.mParticleType.name()
+ .toLowerCase();
+ if (aGroup.toLowerCase()
+ .contains("quark")) {
+ aColour = EnumChatFormatting.LIGHT_PURPLE;
+ } else if (aGroup.toLowerCase()
+ .contains("lepton")) {
+ aColour = EnumChatFormatting.GREEN;
+ } else if (aCharge == Particle.HIGGS_BOSON) {
+ aColour = EnumChatFormatting.YELLOW;
+ } else if (aGroup.toLowerCase()
+ .contains("boson")) {
+ aColour = EnumChatFormatting.RED;
+ } else if (aGroup.toLowerCase()
+ .contains("baryon")) {
+ aColour = EnumChatFormatting.BLUE;
+ } else if (aGroup.toLowerCase()
+ .contains("meson")) {
+ aColour = EnumChatFormatting.WHITE;
+ } else {
+ aColour = EnumChatFormatting.GRAY;
+ }
+ String aFirstLet = aGroup.substring(0, 1)
+ .toUpperCase();
+ aGroup = aGroup.replaceFirst(aGroup.substring(0, 1), aFirstLet);
+ aState = aColour + aGroup + EnumChatFormatting.RESET;
+ list.add(EnumChatFormatting.GRAY + "Type: " + aState);
+ }
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < this.icons.length; i++) {
+ this.icons[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "particle/new/" + i);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java b/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java
new file mode 100644
index 0000000000..8ef674ac19
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java
@@ -0,0 +1,321 @@
+package gtPlusPlus.core.item.chemistry.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemGenericChemBase extends Item {
+
+ protected final IIcon base[];
+
+ private final int aMetaSize = 34;
+
+ /*
+ * 0 - Red Metal Catalyst //FeCu 1 - Yellow Metal Catalyst //WNi 2 - Blue Metal Catalyst //CoTi 3 - Orange Metal
+ * Catalyst //Vanadium Pd 4 - Purple Metal Catalyst //IrIdium Ruthenium 5 - Brown Metal Catalyst //NiAl 6 - Pink
+ * Metal Catalyst //PtRh 7 - Alumina Grinding Ball 8 - Soapstone Grinding Ball 9 - Sodium Ethoxide // 2 Sodium + 1
+ * Ethanol | 2 C2H5OH + 2 Na → 2 C2H5ONa + H2 10 - Sodium Ethyl Xanthate //CH3CH2ONa + CS2 → CH3CH2OCS2Na 11 -
+ * Potassium Ethyl Xanthate //CH3CH2OH + CS2 + KOH → CH3CH2OCS2K + H2O 12 - Potassium Hydroxide // KOH 13 -
+ * Formaldehyde Catalyst //Fe16V1 14 - Solid Acid Catalyst //H2SO4 15 - Infinite Mutation Catalyst (for Mutated
+ * Living Solder) 16 - Platinum Group Catalyst (for platline skip) 17 - Plastic Polymer Catalyst (for early plastics
+ * skip) 18 - Rubber Polymer Catalyst (for early rubbers skip) 19 - Adhesion Promoter Catalyst (for glue/solder
+ * skip) 20 - Tita-Tungsten Indium Catalyst (for titanium/tungsten/indium skip) 21 - Radioactivity Catalyst (for
+ * thorium/uranium/plutonium skip) 22 - Rare-Earth Group Catalyst (for monaline skip) 23 - Simple Naquadah Catalyst
+ * (for early naqline skip) 24 - Advanced Naquadah Catalyst (for late naqline skip) 25 - Raw Intelligence Catalyst
+ * (for stem cells skip) 26 - Ultimate Plasticizer Catalyst (for late plastics skip) 27 - Biological Intelligence
+ * Catalyst (for bio cells skip) 28 - Temporal Harmonizer Catalyst (for Eternity processing) 29 - Limpid Water
+ * Catalyst (for early waterline skip) 30 - Flawless Water Catalyst (for advanced waterline skip) 33 - Algagenic
+ * Growth Promoter Catalyst (for seaweed skip)
+ */
+
+ public ItemGenericChemBase() {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ base = new IIcon[aMetaSize];
+ this.setUnlocalizedName("BasicGenericChemItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack stack) {
+ if (ItemUtils.isMillingBall(stack)) {
+ return 16;
+ }
+ return super.getItemStackLimit(stack);
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < aMetaSize; i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < this.aMetaSize; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "science/general/MetaItem1/" + i;
+ this.base[i] = u.registerIcon(aPath);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack aStack) {
+ if (ItemUtils.isMillingBall(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ double currentDamage = getMillingBallDamage(aStack);
+ return currentDamage / getMaxBallDurability(aStack);
+ } else if (ItemUtils.isCatalyst(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ double currentDamage = getCatalystDamage(aStack);
+ return currentDamage / getCatalystMaxDamage(aStack);
+ } else {
+ return 1D;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer player, List list, boolean bool) {
+ boolean aHasSpecialTooltips = false;
+ int aMaxDamage = 0;
+ int aDamageSegment = 0;
+ int aDam = 0;
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (ItemUtils.isMillingBall(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Tumble Tumble Tumble");
+ aMaxDamage = getMillingBallMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getMillingBallDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (ItemUtils.isCatalyst(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Active Reaction Agent");
+ aMaxDamage = getCatalystMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getCatalystDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (aHasSpecialTooltips) {
+ if (aDam > aDamageSegment * 3) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (aDam > aDamageSegment * 2) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (aDam > aDamageSegment) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (aDam >= 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + (aDam) + EnumChatFormatting.GRAY + " / " + aMaxDamage);
+ }
+ super.addInformation(aStack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack aStack) {
+ if (ItemUtils.isMillingBall(aStack)) {
+ int aDam = getMillingBallDamage(aStack);
+ if (aDam > 0) {
+ return true;
+ }
+ } else if (ItemUtils.isCatalyst(aStack)) {
+ int aDam = getCatalystDamage(aStack);
+ if (aDam > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean createMillingBallNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setLong("MaxDamage", getMaxBallDurability(rStack));
+ tagMain.setTag("MillingBall", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static int getMillingBallDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("MillingBall")
+ .getInteger("Damage");
+ }
+
+ public static int getMillingBallMaxDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("MillingBall")
+ .getInteger("MaxDamage");
+ }
+
+ public static void setMillingBallDamage(ItemStack aStack, int aAmount) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ aNBT = aNBT.getCompoundTag("MillingBall");
+ aNBT.setInteger("Damage", aAmount);
+ }
+
+ public static int getMaxBallDurability(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallAlumina, true)) {
+ return 100;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallSoapstone, true)) {
+ return 50;
+ }
+ return 0;
+ }
+
+ public static boolean createCatalystNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setLong("MaxDamage", getMaxCatalystDurability(rStack));
+ tagMain.setTag("catalyst", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static int getCatalystDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("catalyst")
+ .getInteger("Damage");
+ }
+
+ public static int getCatalystMaxDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("catalyst")
+ .getInteger("MaxDamage");
+ }
+
+ public static void setCatalystDamage(ItemStack aStack, int aAmount) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ aNBT = aNBT.getCompoundTag("catalyst");
+ aNBT.setInteger("Damage", aAmount);
+ }
+
+ public static int getMaxCatalystDurability(ItemStack aStack) {
+ return 50;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java b/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java
new file mode 100644
index 0000000000..11bbac53a3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java
@@ -0,0 +1,213 @@
+package gtPlusPlus.core.item.circuit;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.FakePlayer;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.UIInfos;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.INetworkUpdatableItem;
+import gregtech.api.net.GT_Packet_UpdateItem;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class GTPP_IntegratedCircuit_Item extends Item implements INetworkUpdatableItem {
+
+ private final List<ItemStack> ALL_VARIANTS = new ArrayList<>();
+
+ private final String iconLocation;
+ protected final IIcon[] iconDamage = new IIcon[25];
+
+ public GTPP_IntegratedCircuit_Item(String unlocalizedName, String iconLocation) {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName(unlocalizedName);
+ this.iconLocation = iconLocation;
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ ALL_VARIANTS.add(new ItemStack(this, 0, 0));
+ for (int i = 1; i <= 24; i++) {
+ ItemStack aStack = new ItemStack(this, 0, i);
+ ALL_VARIANTS.add(aStack);
+ }
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ try {
+ aList.add("Configuration == " + aStack.getItemDamage());
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ new StringBuilder().append(getUnlocalizedName())
+ .append(".tooltip.0")
+ .toString(),
+ "Right click to reconfigure"));
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ new StringBuilder().append(getUnlocalizedName())
+ .append(".tooltip.1")
+ .toString(),
+ "Needs a screwdriver or circuit programming tool"));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, 0, 1));
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < iconDamage.length; i++) {
+ this.iconDamage[i] = u.registerIcon(GTPlusPlus.ID + ":" + iconLocation + "/" + i);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.iconDamage[MathUtils.balance(meta, 0, 24)];
+ }
+
+ @Override
+ public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) {
+ int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1;
+ if (meta < 0 || meta > 24) return true;
+
+ if (!player.capabilities.isCreativeMode) {
+ Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> toolIndex = findConfiguratorInInv(player);
+ if (toolIndex == null) return true;
+
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ mainInventory[toolIndex.getKey()] = toolIndex.getValue()
+ .apply(mainInventory[toolIndex.getKey()], player);
+ }
+ stack.setItemDamage(meta);
+
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ // nothing on server side or fake player
+ if (player instanceof FakePlayer || !world.isRemote) return stack;
+ // check if any screwdriver
+ ItemStack configuratorStack;
+ if (player.capabilities.isCreativeMode) {
+ configuratorStack = null;
+ } else {
+ Pair<Integer, ?> configurator = findConfiguratorInInv(player);
+ if (configurator == null) {
+ int count;
+ try {
+ count = Integer
+ .parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count"));
+ } catch (NumberFormatException e) {
+ player.addChatComponentMessage(
+ new ChatComponentText(
+ "Error in translation GT5U.item.programmed_circuit.no_screwdriver.count: "
+ + e.getMessage()));
+ count = 1;
+ }
+ player.addChatComponentMessage(
+ new ChatComponentTranslation(
+ "GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count)));
+ return stack;
+ }
+ configuratorStack = player.inventory.mainInventory[configurator.getKey()];
+ }
+ openSelectorGui(configuratorStack, stack.getItemDamage(), player);
+ return stack;
+ }
+
+ private void openSelectorGui(ItemStack configurator, int meta, EntityPlayer player) {
+ UIInfos.openClientUI(
+ player,
+ buildContext -> new SelectItemUIFactory(
+ StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"),
+ configurator,
+ GTPP_IntegratedCircuit_Item::onConfigured,
+ ALL_VARIANTS,
+ meta,
+ true).createWindow(buildContext));
+ }
+
+ private static void onConfigured(ItemStack stack) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("meta", (byte) stack.getItemDamage());
+ GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
+ }
+
+ private static Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> findConfiguratorInInv(
+ EntityPlayer player) {
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) {
+ ItemStack toolStack = mainInventory[j];
+
+ if (!GT_Utility.isStackValid(toolStack)) continue;
+
+ for (Map.Entry<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> p : GregTech_API.sCircuitProgrammerList
+ .entrySet())
+ if (p.getKey()
+ .test(toolStack)) return Pair.of(j, p.getValue());
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java b/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java
new file mode 100644
index 0000000000..51bff6f12b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.item.crafting;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.general.ItemGenericToken;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemDummyResearch extends ItemGenericToken {
+
+ public static enum ASSEMBLY_LINE_RESEARCH {
+
+ RESEARCH_1_CONTAINMENT("Containment Fields", "Advanced scientific study"),
+ RESEARCH_2_BASIC_CHEM("Basic Chemistry", "Time to start at the beginning"),
+ RESEARCH_3_ADV_CHEM("Advanced Chemistry", "Best learn more than chemical equations"),
+ RESEARCH_4_BASIC_PHYSICS("Basic Physics", "Fundamental laws of motion"),
+ RESEARCH_5_ADV_PHYSICS("Advanced Physics", "Advanced knowledge!"),
+ RESEARCH_6_BASIC_METALLURGY("Basic Metallurgy", "Information about material smelting"),
+ RESEARCH_7_ADV_METALLURGY("Advanced Metallurgy", "Advanced Material Sciences!"),
+ RESEARCH_8_TURBINE_AUTOMATION("Turbine Automation", "You really don't want to share this with anyone!"),
+ RESEARCH_9_CLOAKING("Cloaking Technologies", "Sneaking around like a mouse"),
+ RESEARCH_10_SPARGING("Gas Sparging", "Blowing gas for results"),
+ RESEARCH_11_MOLECULAR_TRANSFORMER("Molecular Transformation", "Turning things into something better");
+
+ private final String mName;
+ private final String mDesc;
+
+ private ASSEMBLY_LINE_RESEARCH(String aName, String aDesc) {
+ mName = aName;
+ mDesc = aDesc;
+ ModItems.itemDummyResearch.register(mName, mDesc);
+ }
+ }
+
+ private static Map<String, Integer> mInternalNameToIdMap = new LinkedHashMap<>();
+
+ public static ItemStack getResearchStack(ASSEMBLY_LINE_RESEARCH aResearchName, int aStacksize) {
+ Integer aMeta = mInternalNameToIdMap.get(Utils.sanitizeString(aResearchName.mName));
+ if (aMeta == null) {
+ aMeta = 0;
+ }
+ return ItemUtils.simpleMetaStack(ModItems.itemDummyResearch, aMeta, aStacksize);
+ }
+
+ private int aID = 0;
+
+ public ItemDummyResearch() {
+ super("dummyResearch", "Research", new String[] { "This object requires some further study" }, "research");
+ }
+
+ /**
+ *
+ * @param aResearchType - What is the research for?
+ * @param aDescriptThe - tooltip for this research
+ * @return - Did we register a custom research item?
+ */
+ public boolean register(String aResearchType, String aDescript) {
+ int aNewID = aID++;
+ mInternalNameToIdMap.put(Utils.sanitizeString(aResearchType), aNewID);
+ return register(aNewID, "Research on " + aResearchType, 1, aDescript);
+ }
+
+ @Override
+ public boolean register(int id, String aLocalName, int aMaxStack, String aDescript) {
+ return register(
+ id,
+ aLocalName,
+ 1,
+ new String[] { aDescript, EnumChatFormatting.DARK_GRAY + "Used to further your knowledge" },
+ EnumRarity.common,
+ EnumChatFormatting.LIGHT_PURPLE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (int i = 0, j = mLocalNames.size(); i < j; i++) {
+ mIcons.put(i, aIconRegister.registerIcon(GTPlusPlus.ID + ":" + "research" + "/" + "note"));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java b/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java
new file mode 100644
index 0000000000..a307eb48ac
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java
@@ -0,0 +1,509 @@
+package gtPlusPlus.core.item.food;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemFood;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemMetaFood extends ItemFood {
+
+ private static final HashMap<Integer, IIcon> mIconMap = new HashMap<>();
+ private static int mTotalMetaItems = 0;
+
+ /*
+ * 0 - Raw Human Meat 1 - Cooked Human Meat 2 - Raw Horse Meat 3 - Cooked Horse Meat 4 - Raw Wolf Meat 5 - Cooked
+ * Wolf Meat 6 - Raw Ocelot Meat 7 - Cooked Ocelot Meat 8 - Blaze Flesh
+ */
+
+ // listAllmeatraw
+ // listAllmeatcooked
+
+ public static void registerMetaFoods() {
+ registerNewMetaFood(
+ 0,
+ "I wouldn't eat this unless I was starving",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessModerate(80), new EffectSlownessModerate(80)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(
+ 1,
+ "Doesn't look any better cooked",
+ 4,
+ 1,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(50), new EffectSlownessBasic(50)),
+ getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 2,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(30), new EffectSlownessBasic(30)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(3, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 4,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(25), new EffectSlownessBasic(30)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(5, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 6,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(30), new EffectSlownessBasic(25)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(7, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 8,
+ "Warm to the touch",
+ EnumRarity.uncommon,
+ 4,
+ 1,
+ 64,
+ new AutoMap<>(),
+ new setOnFire(),
+ getOreDictNamesAsArrayList("listAllmeatcooked"));
+ }
+
+ private static final HashMap<Integer, Integer> mMaxStackSizeMap = new HashMap<>();
+ private static final HashMap<Integer, String> mTooltipMap = new HashMap<>();
+ private static final HashMap<Integer, EnumRarity> mRarityMap = new HashMap<>();
+ private static final HashMap<Integer, Integer> mHealAmountMap = new HashMap<>();
+ private static final HashMap<Integer, Float> mSaturationAmountMap = new HashMap<>();
+ private static final HashMap<Integer, AutoMap<PotionEffectPackage>> mPotionEffectsMap = new HashMap<>();
+ private static final HashMap<Integer, Boolean> mHasSpecialBehaviourMap = new HashMap<>();
+ private static final HashMap<Integer, SpecialFoodBehaviour> mSpecialBehaviourMap = new HashMap<>();
+ private static final HashMap<Integer, ArrayList<String>> mOreDictNames = new HashMap<>();
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final ArrayList<String> aOreDictNames) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ aOreDictNames);
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final AutoMap<PotionEffectPackage> aPotionEffects) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final AutoMap<PotionEffectPackage> aPotionEffects,
+ final ArrayList<String> aOreDictNames) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ aPotionEffects,
+ null,
+ aOreDictNames);
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, EnumRarity aRarity,
+ final int aHealAmount, final float aSaturationModifier, final int aMaxStacksize,
+ final AutoMap<PotionEffectPackage> aPotionEffects, final SpecialFoodBehaviour aSpecialBehaviour) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ aPotionEffects,
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, EnumRarity aRarity,
+ final int aHealAmount, final float aSaturationModifier, final int aMaxStacksize,
+ final AutoMap<PotionEffectPackage> aPotionEffects, final SpecialFoodBehaviour aSpecialBehaviour,
+ final ArrayList<String> aOreDictNames) {
+ mTotalMetaItems++;
+ mMaxStackSizeMap.put(aMetaID, aMaxStacksize);
+ mTooltipMap.put(aMetaID, aTooltip);
+ mRarityMap.put(aMetaID, aRarity);
+ mHealAmountMap.put(aMetaID, aHealAmount);
+ mSaturationAmountMap.put(aMetaID, aSaturationModifier);
+ mPotionEffectsMap.put(aMetaID, aPotionEffects);
+ mHasSpecialBehaviourMap.put(aMetaID, (aSpecialBehaviour != null));
+ if (aSpecialBehaviour != null) {
+ mSpecialBehaviourMap.put(aMetaID, aSpecialBehaviour);
+ }
+ mOreDictNames.put(aMetaID, aOreDictNames);
+ }
+
+ public static void registerFoodsToOreDict() {
+ for (int aMetaID = 0; aMetaID < mTotalMetaItems; aMetaID++) {
+ ArrayList<String> aOreDictNames = mOreDictNames.get(aMetaID);
+ if (aOreDictNames != null && !aOreDictNames.isEmpty()) {
+ ItemStack aFoodStack = ItemUtils.simpleMetaStack(ModItems.itemMetaFood, aMetaID, 1);
+ for (String aOreName : aOreDictNames) {
+ ItemUtils.addItemToOreDictionary(aFoodStack, aOreName);
+ }
+ }
+ }
+ }
+
+ public BaseItemMetaFood() {
+ super(0, 0, false);
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName("BasicMetaFood");
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ BaseItemMetaFood.registerMetaFoods();
+ }
+
+ private static int getMetaKey(ItemStack aStack) {
+ return aStack.getItemDamage();
+ }
+
+ // Heal Amount
+ @Override
+ public int func_150905_g(ItemStack aStack) {
+ return mHealAmountMap.get(getMetaKey(aStack));
+ }
+
+ // Saturation Amount
+ @Override
+ public float func_150906_h(ItemStack aStack) {
+ return mSaturationAmountMap.get(getMetaKey(aStack));
+ }
+
+ // Whether wolves like this food, sadly doesn't support meta items
+ @Override
+ public boolean isWolfsFavoriteMeat() {
+ return false;
+ }
+
+ @Override
+ protected void onFoodEaten(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ // super.onFoodEaten(stack, world, player);
+ AutoMap<PotionEffectPackage> aPotionEffects = mPotionEffectsMap.get(getMetaKey(aStack));
+ if (!aWorld.isRemote && aPotionEffects != null && aPotionEffects.size() > 0) {
+ for (PotionEffectPackage aFoodEffect : aPotionEffects) {
+ if (MathUtils.randInt(0, 100) <= aFoodEffect.getChance() || aFoodEffect.getChance() == 100) {
+ PotionEffect aEffect = aFoodEffect.getEffect();
+ if (aEffect != null && aEffect.getPotionID() > 0) {
+ aPlayer.addPotionEffect(
+ new PotionEffect(
+ aEffect.getPotionID(),
+ aEffect.getDuration() * 20,
+ aEffect.getAmplifier(),
+ aEffect.getIsAmbient()));
+ }
+ }
+ }
+ }
+
+ boolean aHasEpcialBehaviour = mHasSpecialBehaviourMap.get(getMetaKey(aStack));
+ if (!aWorld.isRemote && aHasEpcialBehaviour) {
+ SpecialFoodBehaviour aBehaviour = mSpecialBehaviourMap.get(getMetaKey(aStack));
+ if (aBehaviour != null) {
+ aBehaviour.doBehaviour(aPlayer);
+ }
+ }
+ }
+
+ @Override
+ public ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ return super.onEaten(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ return mMaxStackSizeMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ try {
+ String aTooltip = mTooltipMap.get(getMetaKey(aStack));
+ if (aTooltip != null && aTooltip.length() > 0) {
+ aList.add(aTooltip);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack aStack) {
+ return mRarityMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < mIconMap.size(); i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < mTotalMetaItems; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "food/MetaItem1/" + i;
+ mIconMap.put(i, u.registerIcon(aPath));
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return mIconMap.get(damage);
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return mIconMap.get(damage);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return mIconMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int pass) {
+ return mIconMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ private static class PotionEffectPackage {
+
+ private final PotionEffect mEffect;
+ private final int mChance;
+
+ private PotionEffectPackage(PotionEffect aEffect, int aChance) {
+ mEffect = aEffect;
+ mChance = aChance;
+ }
+
+ public PotionEffect getEffect() {
+ return this.mEffect;
+ }
+
+ public int getChance() {
+ return this.mChance;
+ }
+ }
+
+ private static AutoMap<PotionEffectPackage> getPotionEffectPackage(PotionEffectPackage... aEffects) {
+ AutoMap<PotionEffectPackage> aPackage = new AutoMap<>();
+ if (aEffects != null && aEffects.length > 0) {
+ for (PotionEffectPackage aEffect : aEffects) {
+ aPackage.put(aEffect);
+ }
+ }
+ return aPackage;
+ }
+
+ private static ArrayList<String> getOreDictNamesAsArrayList(String... aOreDictNames) {
+ ArrayList<String> aPackage = new ArrayList<>();
+ if (aOreDictNames != null && aOreDictNames.length > 0) {
+ for (String aEffect : aOreDictNames) {
+ aPackage.add(aEffect);
+ }
+ }
+ return aPackage;
+ }
+
+ private static class EffectWeaknessBasic extends PotionEffectPackage {
+
+ protected EffectWeaknessBasic(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 1, 20), aChance);
+ }
+ }
+
+ private static class EffectWeaknessModerate extends PotionEffectPackage {
+
+ protected EffectWeaknessModerate(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 2, 40), aChance);
+ }
+ }
+
+ private static class EffectWeaknessSevere extends PotionEffectPackage {
+
+ protected EffectWeaknessSevere(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 3, 60), aChance);
+ }
+ }
+
+ private static class EffectSlownessBasic extends PotionEffectPackage {
+
+ protected EffectSlownessBasic(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 1, 20), aChance);
+ }
+ }
+
+ private static class EffectSlownessModerate extends PotionEffectPackage {
+
+ protected EffectSlownessModerate(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 2, 40), aChance);
+ }
+ }
+
+ private static class EffectSlownessSevere extends PotionEffectPackage {
+
+ protected EffectSlownessSevere(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 3, 60), aChance);
+ }
+ }
+
+ private abstract static class SpecialFoodBehaviour {
+
+ protected final int mChance;
+
+ public SpecialFoodBehaviour(int aChance) {
+ mChance = aChance;
+ }
+
+ public final void doBehaviour(EntityPlayer aPlayer) {
+ if (aPlayer != null && !aPlayer.worldObj.isRemote) {
+ if (MathUtils.randInt(0, 100) < mChance || mChance == 100) {
+ behaviour(aPlayer);
+ }
+ }
+ }
+
+ protected abstract void behaviour(EntityPlayer aPlayer);
+ }
+
+ private static class setOnFire extends SpecialFoodBehaviour {
+
+ public setOnFire() {
+ super(100);
+ }
+
+ @Override
+ public void behaviour(EntityPlayer aPlayer) {
+ EntityUtils.setEntityOnFire(aPlayer, 5);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/BufferCore.java b/src/main/java/gtPlusPlus/core/item/general/BufferCore.java
new file mode 100644
index 0000000000..69257afb0e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/BufferCore.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.item.base.BaseItemWithDamageValue;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class BufferCore extends BaseItemWithDamageValue {
+
+ public int coreTier = 0;
+
+ public BufferCore(final String unlocalizedName, final int i) {
+ super(unlocalizedName + i);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(32);
+ this.coreTier = i;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack stack) {
+ return super.getItemStackDisplayName(stack) /* +" ["+GT_Values.VN[this.coreTier-1]+"]." */;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(
+ EnumChatFormatting.GRAY + "A key crafting component for "
+ + GT_Values.VN[this.coreTier - 1]
+ + " Applicances");
+ }
+
+ public final int getCoreTier() {
+ return this.coreTier;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+
+ int[] mTierTypes = new int[] { Utils.rgbtoHexValue(200, 180, 180), Utils.rgbtoHexValue(142, 153, 161),
+ Utils.rgbtoHexValue(230, 121, 75), Utils.rgbtoHexValue(215, 156, 70), Utils.rgbtoHexValue(97, 97, 96), // EV
+ Utils.rgbtoHexValue(202, 202, 201), Utils.rgbtoHexValue(247, 159, 157), Utils.rgbtoHexValue(181, 223, 223),
+ Utils.rgbtoHexValue(187, 219, 185), };
+
+ if (this.coreTier == 10) {
+ return Utils
+ .rgbtoHexValue(MathUtils.randInt(220, 250), MathUtils.randInt(221, 251), MathUtils.randInt(220, 250));
+ }
+
+ return mTierTypes[this.coreTier - 1];
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java b/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java
new file mode 100644
index 0000000000..e82e6f1b44
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java
@@ -0,0 +1,143 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemAirFilter extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemAirFilter() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemAirFilter";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemAirFilter");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 2; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+
+ if (tItem == null) {
+ return "Air Filter";
+ }
+
+ String itemName = tItem == null ? "Air Filter" : super.getItemStackDisplayName(tItem);
+ String suffixName = "";
+ if (tItem.getItemDamage() == 0) {
+ suffixName = " [Tier 1]";
+ } else if (tItem.getItemDamage() == 1) {
+ suffixName = " [Tier 2]";
+ }
+ return (itemName + suffixName);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 180, 35);
+ }
+ return HEX_OxFFFFFF;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagMain.setTag("AirFilter", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getFilterMaxDamage(final ItemStack aStack) {
+ return aStack.getItemDamage() == 0 ? 50 : 2500;
+ }
+
+ public static final long getFilterDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("AirFilter");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setFilterDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("AirFilter");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getFilterDamage(stack);
+ double meta = getFilterMaxDamage(stack);
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + "An Air filter for Atmospheric Reconditioning.");
+ long maxDamage = getFilterMaxDamage(stack);
+ list.add(EnumChatFormatting.GRAY + "" + (maxDamage - getFilterDamage(stack)) + "/" + maxDamage + " uses left.");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java b/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java
new file mode 100644
index 0000000000..ee1afdb6bf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java
@@ -0,0 +1,152 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemBasicScrubberTurbine extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemBasicScrubberTurbine() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemBasicTurbine";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemBasicTurbine");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 3; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (tItem == null) {
+ return "Basic Turbine";
+ }
+ return super.getItemStackDisplayName(tItem);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 0) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 200, 200);
+ }
+ if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 128, 0);
+ }
+ if (meta == 2) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(128, 128, 128);
+ }
+ return HEX_OxFFFFFF;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagMain.setTag("BasicTurbine", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getFilterDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("BasicTurbine");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setFilterDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("BasicTurbine");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getMaxDurability(ItemStack aStack) {
+ if (aStack != null) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta == 0) {
+ return 2000;
+ }
+ if (aMeta == 1) {
+ return 4000;
+ }
+ if (aMeta == 2) {
+ return 6000;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getFilterDamage(stack);
+ double meta = getMaxDurability(stack);
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + "An early tier Turbine for Atmospheric Reconditioning.");
+ int maxDamage = getMaxDurability(stack);
+ list.add(EnumChatFormatting.GRAY + "" + (maxDamage - getFilterDamage(stack)) + "/" + maxDamage + " uses left.");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java b/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java
new file mode 100644
index 0000000000..c6e0743268
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java
@@ -0,0 +1,297 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.interfaces.IItemBlueprint;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class ItemBlueprint extends Item implements IItemBlueprint {
+
+ public ItemBlueprint(final String unlocalizedName) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ // this.bpID = MathUtils.randInt(0, 1000);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack itemStack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ // Create some NBT if it's not there, otherwise this does nothing.
+ if (!itemStack.hasTagCompound()) {
+ this.createNBT(itemStack);
+ }
+ // Set up some default variables.
+ int id = -1;
+ String name = "";
+ boolean blueprint = false;
+ // Get proper display vars from NBT if it's there
+ if (itemStack.hasTagCompound()) {
+ // Utils.LOG_WARNING("Found TagCompound");
+ id = (int) this.getNBT(itemStack, "mID");
+ name = (String) this.getNBT(itemStack, "mName");
+ blueprint = (boolean) this.getNBT(itemStack, "mBlueprint");
+ }
+ // Write to tooltip list for each viable setting.
+ if (itemStack.hasTagCompound()) {
+ if (id != -1) {
+ list.add(
+ EnumChatFormatting.GRAY + StatCollector
+ .translateToLocalFormatted(StatCollector.translateToLocal("item.itemBlueprint.tooltip.0"), id));
+ }
+ if (blueprint) {
+ list.add(
+ EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted(
+ StatCollector.translateToLocal("item.itemBlueprint.tooltip.1"),
+ name));
+ } else {
+ list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("item.itemBlueprint.tooltip.2"));
+ }
+ } else {
+ list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("item.itemBlueprint.tooltip.2"));
+ }
+ super.addInformation(itemStack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onCreated(final ItemStack itemStack, final World world, final EntityPlayer player) {
+ this.createNBT(itemStack);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World par2World, final Entity par3Entity, final int par4,
+ final boolean par5) {}
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack itemStack, final World world, final EntityPlayer par3Entity) {
+ // Let the player know what blueprint is held
+ if (itemStack.hasTagCompound()) {
+ PlayerUtils.messagePlayer(
+ par3Entity,
+ "This Blueprint holds NBT data. " + "|"
+ + this.getNBT(itemStack, "mID")
+ + "|"
+ + this.getNBT(itemStack, "mBlueprint")
+ + "|"
+ + this.getNBT(itemStack, "mName")
+ + "|"
+ + ItemUtils.getArrayStackNames(this.readItemsFromNBT(itemStack)));
+ } else {
+ this.createNBT(itemStack);
+ PlayerUtils.messagePlayer(par3Entity, "This is a placeholder. " + this.getNBT(itemStack, "mID"));
+ }
+
+ return super.onItemRightClick(itemStack, world, par3Entity);
+ }
+
+ public ItemStack[] readItemsFromNBT(final ItemStack itemStack) {
+ ItemStack[] blueprint = new ItemStack[9];
+ if (itemStack.hasTagCompound()) {
+ final NBTTagCompound nbt = itemStack.getTagCompound();
+ final NBTTagList list = nbt.getTagList("Inventory", 10);
+ blueprint = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ blueprint[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ return blueprint;
+ }
+ return null;
+ }
+
+ public ItemStack writeItemsToNBT(final ItemStack itemStack, final ItemStack[] craftingGrid) {
+ final ItemStack[] blueprint = craftingGrid;
+ if (itemStack.hasTagCompound()) {
+ final NBTTagCompound nbt = itemStack.getTagCompound();
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = blueprint[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Inventory", list);
+ itemStack.setTagCompound(nbt);
+ return itemStack;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isBlueprint(final ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public boolean setBlueprint(final ItemStack stack, final IInventory craftingTable, final ItemStack output) {
+ boolean hasBP = false;
+ ItemStack[] blueprint = new ItemStack[9];
+
+ if (stack.hasTagCompound()) {
+ hasBP = (boolean) this.getNBT(stack, "mBlueprint");
+ blueprint = this.readItemsFromNBT(stack);
+ }
+
+ if (!hasBP) {
+ try {
+ for (int o = 0; o < craftingTable.getSizeInventory(); o++) {
+ blueprint[o] = craftingTable.getStackInSlot(o);
+ if (blueprint[0] != null) {
+ blueprint[0].stackSize = 0;
+ }
+ }
+ this.writeItemsToNBT(stack, blueprint);
+ if (stack.hasTagCompound()) {
+ if (stack.getTagCompound()
+ .getCompoundTag("Items") != null) {
+ stack.stackTagCompound.setBoolean("mBlueprint", true);
+ } else {
+ // Invalid BP saved?
+ }
+ hasBP = (boolean) this.getNBT(stack, "mBlueprint");
+ }
+
+ if (output != null) {
+ this.setBlueprintName(stack, output.getDisplayName());
+ hasBP = true;
+ return true;
+ }
+ return false;
+ } catch (final Throwable t) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void setBlueprintName(final ItemStack stack, final String name) {
+ stack.stackTagCompound.setString("mName", name);
+ }
+
+ @Override
+ public boolean hasBlueprint(final ItemStack stack) {
+ if (stack.hasTagCompound()) {
+ return (boolean) this.getNBT(stack, "mBlueprint");
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getBlueprint(final ItemStack stack) {
+ ItemStack[] blueprint = new ItemStack[9];
+ if (stack.hasTagCompound()) {
+ blueprint = this.readItemsFromNBT(stack);
+ }
+ try {
+ final ItemStack[] returnStack = new ItemStack[9];
+ for (int o = 0; o < blueprint.length; o++) {
+ returnStack[o] = blueprint[o];
+ if (returnStack[0] != null) {
+ returnStack[0].stackSize = 1;
+ }
+ }
+ return returnStack;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public boolean createNBT(final ItemStack itemStack) {
+ if (itemStack.hasTagCompound()) {
+ if (!itemStack.stackTagCompound.getBoolean("mBlueprint") && !itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // No Blueprint and no name Set
+ Logger.WARNING("No Blueprint and no name Set");
+ return false;
+ } else if (itemStack.stackTagCompound.getBoolean("mBlueprint")
+ && !itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // Has Blueprint but invalid name set
+ Logger.WARNING("Has Blueprint but invalid name set");
+ return false;
+ } else
+ if (!itemStack.stackTagCompound.getBoolean("mBlueprint")
+ && itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // Has no Blueprint, but strangely has a name
+ Logger.WARNING("Has no Blueprint, but strangely has a name");
+ return false;
+ }
+ return false;
+ } else if (!itemStack.hasTagCompound()) {
+ final int bpID = MathUtils.randInt(0, 1000);
+ final boolean hasRecipe = false;
+ final String recipeName = "";
+ Logger.WARNING("Creating Blueprint, setting up it's NBT data. " + bpID);
+ itemStack.stackTagCompound = new NBTTagCompound();
+ itemStack.stackTagCompound.setInteger("mID", bpID);
+ itemStack.stackTagCompound.setBoolean("mBlueprint", hasRecipe);
+ itemStack.stackTagCompound.setString("mName", recipeName);
+ return true;
+ } else {
+ final int bpID = MathUtils.randInt(0, 1000);
+ final boolean hasRecipe = false;
+ final String recipeName = "";
+ Logger.WARNING("Creating a Blueprint, setting up it's NBT data. " + bpID);
+ itemStack.stackTagCompound = new NBTTagCompound();
+ itemStack.stackTagCompound.setInteger("mID", bpID);
+ itemStack.stackTagCompound.setBoolean("mBlueprint", hasRecipe);
+ itemStack.stackTagCompound.setString("mName", recipeName);
+ return true;
+ }
+ }
+
+ public Object getNBT(final ItemStack itemStack, final String tagNBT) {
+ if (!itemStack.hasTagCompound()) {
+ return null;
+ }
+ Object o = null;
+ switch (tagNBT) {
+ case "mID":
+ o = itemStack.stackTagCompound.getInteger(tagNBT);
+ break;
+ case "mBlueprint":
+ o = itemStack.stackTagCompound.getBoolean(tagNBT);
+ break;
+ case "mName":
+ o = itemStack.stackTagCompound.getString(tagNBT);
+ break;
+ case "":
+ // For More Tag Support
+ // o = itemStack.stackTagCompound.getInteger(tagNBT);
+ break;
+ }
+ if (o != null) {
+ return o;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java b/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java
new file mode 100644
index 0000000000..9e5cf0a69d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Names;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Names.BAUBLES) })
+public class ItemCloakingDevice extends Item implements IElectricItem, IElectricItemManager, IBauble {
+
+ private final String unlocalizedName = "personalCloakingDevice";
+ private final ItemStack thisStack;
+ private static final int maxValueEU = 10000 * 20 * 500;
+ protected double chargeEU = 0;
+
+ public ItemCloakingDevice(final double charge) {
+ this.chargeEU = charge;
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setUnlocalizedName(this.unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "personalCloakingDevice");
+ this.thisStack = ItemUtils.getSimpleStack(this);
+ this.charge(this.thisStack, charge, 3, true, false);
+ if (charge == (10000 * 20 * 500)) {
+ this.setDamage(this.thisStack, 13);
+ }
+ GameRegistry.registerItem(this, this.unlocalizedName + "-" + charge);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (worldObj.isRemote) {
+ return;
+ }
+
+ if (player instanceof EntityPlayer) {
+ for (final ItemStack is : ((EntityPlayer) player).inventory.mainInventory) {
+ if (is == itemStack) {
+ continue;
+ }
+ if (is != null) {
+ if (is.getItem() instanceof final IElectricItem electricItem) {
+ this.chargeEU = ElectricItem.manager.getCharge(is);
+ }
+ }
+ }
+ }
+
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ return true;
+ }
+
+ @Override
+ public Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(maxValueEU);
+ return x.getItem();
+ }
+
+ @Override
+ public Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public int getTier(final ItemStack itemStack) {
+ return 5;
+ }
+
+ @Override
+ public double getTransferLimit(final ItemStack itemStack) {
+ return 8196;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(final ItemStack stack) {
+ // return 1.0D - getEnergyStored(stack) / this.capacity;
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public int secondsLeft(final ItemStack stack) {
+ double r;
+ r = this.getCharge(stack) / (10000 * 20);
+ return (int) MathUtils.decimalRounding(r);
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.0"));
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.1"));
+ list.add("");
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.2"));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.3",
+ GT_Utility.formatNumbers(this.getTier(this.thisStack)),
+ GT_Utility.formatNumbers(this.getTransferLimit(this.thisStack))));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.4",
+ GT_Utility.formatNumbers(this.getCharge(stack)),
+ MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack))));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.5",
+ GT_Utility.formatNumbers(this.secondsLeft(stack))));
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public double charge(final ItemStack stack, final double amount, final int tier, final boolean ignoreTransferLimit,
+ final boolean simulate) {
+
+ if (!simulate) {
+ ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ if (!simulate) {
+ ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public BaubleType getBaubleType(final ItemStack arg0) {
+ return BaubleType.BELT;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack arg0, final EntityLivingBase arg1) {
+ // Utils.LOG_INFO("Trying to Tick Belt. 1");
+ if (!arg1.worldObj.isRemote) {
+ if (this.getCharge(arg0) >= 10000) {
+ arg1.addPotionEffect(new PotionEffect(Potion.invisibility.id, 10, 2));
+ this.discharge(arg0, 10000, 5, true, true, false);
+ } else {
+ if (arg1.isPotionActive((Potion.invisibility))) {
+ arg1.removePotionEffect(Potion.invisibility.id);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java b/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java
new file mode 100644
index 0000000000..773a45aa0a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.item.general;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemEmpty extends CoreItem {
+
+ public ItemEmpty() {
+ super("item.empty", AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack tItem) {
+ return "Empty";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java b/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java
new file mode 100644
index 0000000000..c1bea0b81d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java
@@ -0,0 +1,197 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemGenericToken extends CoreItem {
+
+ public final HashMap<Integer, String> mLocalNames;
+ public final HashMap<Integer, Integer> mMaxStackSizes;
+ public final HashMap<Integer, String[]> mDescriptionArrays;
+ public final HashMap<Integer, EnumRarity> mRarities;
+ public final HashMap<Integer, EnumChatFormatting> mCustomNameColours;
+ public final HashMap<Integer, IIcon> mIcons;
+ private final String mTextureDir;
+
+ public ItemGenericToken() {
+ this("itemGenericToken", "Token", new String[] { "Can be reclaimed in some way, shape or form" }, "token");
+ }
+
+ public ItemGenericToken(String aUnlocalName, String aInternalName, String[] aBaseTooltip, String aTextureDir) {
+ super(
+ aUnlocalName,
+ aInternalName,
+ AddToCreativeTab.tabMisc,
+ 64,
+ 1000,
+ aBaseTooltip,
+ EnumRarity.common,
+ EnumChatFormatting.RESET,
+ false,
+ null);
+ mLocalNames = new HashMap<>();
+ mMaxStackSizes = new HashMap<>();
+ mDescriptionArrays = new HashMap<>();
+ mRarities = new HashMap<>();
+ mCustomNameColours = new HashMap<>();
+ mIcons = new HashMap<>();
+ mTextureDir = aTextureDir;
+ setMaxStackSize(64);
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String aDescript) {
+ return register(id, aLocalName, aMaxStack, new String[] { aDescript });
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String[] aDescript) {
+ return register(id, aLocalName, aMaxStack, aDescript, EnumRarity.common, EnumChatFormatting.RESET);
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String[] aDescript, EnumRarity aRarity,
+ EnumChatFormatting aCustomNameColour) {
+ int[][] sizes = new int[2][6];
+ sizes[0][0] = mLocalNames.size();
+ sizes[0][1] = mMaxStackSizes.size();
+ sizes[0][2] = mDescriptionArrays.size();
+ sizes[0][3] = mRarities.size();
+ sizes[0][4] = mCustomNameColours.size();
+ // sizes[0][5] = mIcons.size();
+ mLocalNames.put(id, aLocalName);
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName() + "." + id + ".name", aLocalName);
+ mMaxStackSizes.put(id, aMaxStack);
+ mDescriptionArrays.put(id, aDescript);
+ for (int i = 0; i < aDescript.length; i++) {
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName() + "." + id + ".tooltip." + i,
+ aDescript[i]);
+ }
+ mRarities.put(id, aRarity);
+ mCustomNameColours.put(id, aCustomNameColour);
+ sizes[1][0] = mLocalNames.size();
+ sizes[1][1] = mMaxStackSizes.size();
+ sizes[1][2] = mDescriptionArrays.size();
+ sizes[1][3] = mRarities.size();
+ sizes[1][4] = mCustomNameColours.size();
+ // sizes[1][5] = mIcons.size();
+ boolean b = sizes[0][0] > sizes[1][0] && sizes[0][1] > sizes[1][1]
+ && sizes[0][2] > sizes[1][2]
+ && sizes[0][3] > sizes[1][3]
+ && sizes[0][4] > sizes[1][4];
+ return b;
+ }
+
+ // Handle Sub items
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = mIcons.size(); i < j; i++) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ aList.add(tStack);
+ }
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer aPlayer, List list, boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager.getTranslation(
+ "gtplusplus." + this
+ .getUnlocalizedNameInefficiently(stack) + "." + stack.getItemDamage() + ".tooltip." + i);
+ if (!("gtplusplus." + this
+ .getUnlocalizedNameInefficiently(stack) + "." + stack.getItemDamage() + ".tooltip." + i)
+ .equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String ret = GT_LanguageManager.getTranslation(
+ "gtplusplus." + this.getUnlocalizedNameInefficiently(tItem) + "." + tItem.getItemDamage() + ".name");
+ EnumChatFormatting format = mCustomNameColours.get(tItem.getItemDamage());
+ if (format != null) {
+ ret = format + ret;
+ }
+ return ret;
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack par1ItemStack) {
+ return mRarities.get(par1ItemStack.getItemDamage());
+ }
+
+ @Override
+ public boolean hasEffect(ItemStack par1ItemStack, final int pass) {
+ return false;
+ }
+
+ @Override
+ public int getMetadata(int p_77647_1_) {
+ return 0;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 0D;
+ }
+
+ @Override
+ public boolean isDamaged(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ if (aStack == null) {
+ return maxStackSize;
+ } else {
+ Integer aSize = mMaxStackSizes.get(aStack.getItemDamage());
+ if (aSize != null) {
+ return aSize;
+ } else {
+ return maxStackSize;
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister aIconRegister) {
+ for (int i = 0, j = mLocalNames.size(); i < j; i++) {
+ mIcons.put(i, aIconRegister.registerIcon(GTPlusPlus.ID + ":" + mTextureDir + "/" + i));
+ }
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ return mIcons.get(aMetaData);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java b/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java
new file mode 100644
index 0000000000..47cd73a62b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.core.item.general;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gtPlusPlus.core.item.base.BaseItemColourable;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemHalfCompleteCasings extends BaseItemColourable {
+
+ public ItemHalfCompleteCasings(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg,
+ String description, EnumRarity regRarity, EnumChatFormatting colour, boolean Effect, int rgb) {
+ super(unlocalizedName, creativeTab, stackSize, maxDmg, description, regRarity, colour, Effect, rgb);
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String prefix = super.getItemStackDisplayName(tItem);
+ String casingType = "";
+ if (tItem.getItemDamage() == 0) {
+ casingType = " I";
+ } else if (tItem.getItemDamage() == 1) {
+ casingType = " II";
+ } else if (tItem.getItemDamage() == 2) {
+ casingType = " III";
+ } else if (tItem.getItemDamage() == 3) {
+ casingType = " IV";
+ }
+ return (prefix + casingType);
+ }
+
+ @Override
+ public int getColorFromItemStack(ItemStack stack, int HEX_OxFFFFFF) {
+ if (this.getDamage(stack) == 0) {
+ return Utils.rgbtoHexValue(52, 52, 52);
+ } else if (this.getDamage(stack) == 1) {
+ return Utils.rgbtoHexValue(80, 90, 222);
+ } else if (this.getDamage(stack) == 2) {
+ return Utils.rgbtoHexValue(182, 77, 177);
+ } else {
+ return Utils.rgbtoHexValue(77, 175, 182);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java b/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java
new file mode 100644
index 0000000000..d80238b99a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java
@@ -0,0 +1,419 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.FoodStats;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public class ItemHealingDevice extends Item implements IElectricItem, IElectricItemManager, IBauble {
+
+ private final String unlocalizedName = "personalHealingDevice";
+ private static final int maxValueEU = 1000000000;
+ protected double chargeEU = 0;
+
+ public ItemHealingDevice() {
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setUnlocalizedName(this.unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "personalCloakingDevice");
+ GameRegistry.registerItem(this, this.unlocalizedName);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (worldObj.isRemote) {
+ return;
+ }
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ return true;
+ }
+
+ @Override
+ public Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(maxValueEU);
+ return x.getItem();
+ }
+
+ @Override
+ public Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public int getTier(final ItemStack itemStack) {
+ return 5;
+ }
+
+ @Override
+ public double getTransferLimit(final ItemStack itemStack) {
+ return GT_Values.V[7];
+ }
+
+ @Override
+ public double getDurabilityForDisplay(final ItemStack stack) {
+ // return 1.0D - getEnergyStored(stack) / this.capacity;
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public double secondsLeft(final ItemStack stack) {
+
+ double r = 0;
+ r = this.getCharge(stack) / (1638400 / 4);
+ return (int) r;
+ }
+
+ int EUPerOperation = 1_638_400;
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ String aString1 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.1");
+ String aString2 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.2");
+ String aString3 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.3");
+ String aString4 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.4");
+ String aString5 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.5");
+
+ String aString6 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.6");
+
+ String aStringTooltip = StatCollector.translateToLocal("GTPP.nanohealer.hidden");
+ String aEuInfo = StatCollector.translateToLocal("GTPP.info.euInfo");
+ String aTier = StatCollector.translateToLocal("GTPP.machines.tier");
+ String aInputLimit = StatCollector.translateToLocal("GTPP.info.inputLimit");
+ String aCurrentPower = StatCollector.translateToLocal("GTPP.info.currentPower");
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+ boolean isShowing = getShowMessages(stack);
+
+ list.add("");
+
+ list.add(EnumChatFormatting.GREEN + aString1 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GREEN + aString2
+ + GT_Utility.formatNumbers(EUPerOperation)
+ + aString3
+ + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.GREEN + aString4 + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.RED + aString5 + EnumChatFormatting.GRAY);
+
+ list.add("");
+
+ list.add(EnumChatFormatting.GOLD + aEuInfo + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GRAY + aTier
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTier(stack))
+ + EnumChatFormatting.GRAY
+ + "] "
+ + aInputLimit
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTransferLimit(stack))
+ + EnumChatFormatting.GRAY
+ + aEUT
+ + "]");
+ list.add(
+ EnumChatFormatting.GRAY + aCurrentPower
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getCharge(stack))
+ + EnumChatFormatting.GRAY
+ + aEU
+ + "] ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack)))
+ + EnumChatFormatting.GRAY
+ + "%]");
+ list.add(EnumChatFormatting.GOLD + aString6 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GOLD + aStringTooltip
+ + " "
+ + (!isShowing ? EnumChatFormatting.DARK_GREEN : EnumChatFormatting.DARK_RED)
+ + !isShowing
+ + EnumChatFormatting.GRAY);
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public double charge(final ItemStack stack, final double amount, final int tier, final boolean ignoreTransferLimit,
+ final boolean simulate) {
+
+ if (!simulate) {
+ ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public BaubleType getBaubleType(final ItemStack arg0) {
+ return BaubleType.AMULET;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack baubleStack, final EntityLivingBase arg1) {
+ if (arg1 != null && arg1.worldObj != null && !arg1.worldObj.isRemote) {
+
+ // Try Charge First
+
+ // Inv Slots
+ for (final ItemStack aInvStack : ((EntityPlayer) arg1).inventory.mainInventory) {
+ if (aInvStack == baubleStack) {
+ continue;
+ }
+
+ if (this.getCharge(baubleStack) == this.getMaxCharge(baubleStack)) {
+ break;
+ }
+
+ if (aInvStack != null) {
+ if (ChargingHelper.isItemValid(aInvStack)) {
+
+ double aTransferRate;
+ double aCurrentChargeForThisBauble;
+ int mTier;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+
+ if (electricItem != null) {
+
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ mTier = electricItem.getTier(aInvStack);
+ aCurrentChargeForThisBauble = ElectricItem.manager.getCharge(baubleStack);
+
+ if (aCurrentChargeForThisBauble < maxValueEU) {
+ if ((ElectricItem.manager.getCharge(aInvStack) >= aTransferRate)) {
+ if (electricItem.canProvideEnergy(aInvStack)) {
+ double d = ElectricItem.manager
+ .discharge(aInvStack, aTransferRate, mTier, false, true, false);
+ // Logger.INFO("Charging from "+aInvStack.getDisplayName() +" | "+d);
+ ElectricItem.manager.charge(baubleStack, d, mTier, true, false);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (this.getCharge(baubleStack) <= (this.getMaxCharge(baubleStack) - getTransferLimit(baubleStack))) {
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ // Try Heal
+ if (this.getCharge(baubleStack) > 0) {
+
+ if (!(arg1 instanceof EntityPlayer g)) {
+ return;
+ }
+ // health Check
+ float hp = 0;
+ if (arg1.getHealth() < arg1.getMaxHealth()) {
+ final float rx = arg1.getMaxHealth() - arg1.getHealth();
+ Logger.INFO("rx:" + rx);
+ arg1.heal(rx * 2);
+ hp = rx;
+ this.discharge(baubleStack, (1638400) * rx, 6, true, true, false);
+ }
+
+ int hunger = 0;
+ float saturation = 0;
+ FoodStats aFood = g.getFoodStats();
+ if (aFood != null) {
+ // Hunger Check
+ hunger = 20 - aFood.getFoodLevel();
+ // Saturation Check
+ if (hunger > 0) {
+ saturation = 20f - aFood.getSaturationLevel();
+ saturation /= hunger * 2f;
+ this.discharge(baubleStack, (1638400) * (hunger + saturation), 6, true, true, false);
+ aFood.addStats(hunger, saturation);
+ }
+ }
+
+ // Only show Messages if they're enabled.
+ if (getShowMessages(baubleStack)) {
+ if (hp > 0 || hunger > 0 || saturation > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Your NanoBooster Whirs! Leaving you feeling stronger.");
+
+ if (hp > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Healed " + GT_Utility.formatNumbers(hp) + " hp.");
+
+ if (hunger > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Healed " + GT_Utility.formatNumbers(hunger) + " hunger.");
+
+ if (saturation > 0) PlayerUtils.messagePlayer(
+ (EntityPlayer) arg1,
+ "Satured Hunger by " + GT_Utility.formatNumbers(saturation) + ".");
+
+ if (hp > 0 || hunger > 0 || saturation > 0) PlayerUtils.messagePlayer(
+ (EntityPlayer) arg1,
+ "You check it's remaining uses, it has " + GT_Utility.formatNumbers(secondsLeft(baubleStack))
+ + " seconds left.");
+ }
+ }
+ }
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ tagMain.setBoolean("ShowMSG", false);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final boolean getShowMessages(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT == null) {
+ if (!createNBT(aStack)) {
+ return false;
+ } else {
+ aNBT = aStack.getTagCompound();
+ }
+ }
+ return aNBT.getBoolean("ShowMSG");
+ }
+
+ public static final boolean setShowMessages(final ItemStack aStack, final boolean aShow) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT == null) {
+ if (!createNBT(aStack)) {
+ return false;
+ } else {
+ aNBT = aStack.getTagCompound();
+ }
+ }
+ aNBT.setBoolean("ShowMSG", aShow);
+ return true;
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_,
+ int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
+ // TODO Auto-generated method stub
+ return super.onItemUse(
+ p_77648_1_,
+ p_77648_2_,
+ p_77648_3_,
+ p_77648_4_,
+ p_77648_5_,
+ p_77648_6_,
+ p_77648_7_,
+ p_77648_8_,
+ p_77648_9_,
+ p_77648_10_);
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ ItemStack superStack = super.onItemRightClick(aStack, aWorld, aPlayer);
+ boolean isShiftHeld = KeyboardUtils.isShiftKeyDown();
+ if (isShiftHeld) {
+ boolean oldState = getShowMessages(superStack);
+ boolean newState = !oldState;
+ ItemHealingDevice.setShowMessages(superStack, newState);
+ PlayerUtils.messagePlayer(aPlayer, (!oldState ? "Showing info messages" : "Hiding info messages"));
+ }
+ return superStack;
+ }
+
+ @Override
+ public boolean doesSneakBypassUse(World world, int x, int y, int z, EntityPlayer player) {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java b/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java
new file mode 100644
index 0000000000..2b5dd8883f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemLavaFilter extends CoreItem {
+
+ public IIcon[] mIcon = new IIcon[1];
+
+ public ItemLavaFilter() {
+ super(
+ "itemLavaFilter",
+ AddToCreativeTab.tabMachines,
+ 1,
+ 99,
+ new String[] { "Lava Filter" },
+ EnumRarity.common,
+ EnumChatFormatting.BLACK,
+ false,
+ null);
+ setGregtechItemList();
+ }
+
+ private boolean setGregtechItemList() {
+ ItemList.Component_LavaFilter.set(this);
+ return ItemList.Component_LavaFilter.get(1) != null ? true : false;
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.mIcon[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemLavaFilter");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.mIcon[0];
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("item.itemLavaFilter.tooltip"));
+
+ int maxDurability = stack.getMaxDamage() + 1;
+ int durability = maxDurability - stack.getItemDamage();
+
+ EnumChatFormatting formatting = EnumChatFormatting.GRAY;
+ if (durability > maxDurability * 0.8) {
+ formatting = EnumChatFormatting.GRAY;
+ } else if (durability > maxDurability * 0.6) {
+ formatting = EnumChatFormatting.GREEN;
+ } else if (durability > maxDurability * 0.4) {
+ formatting = EnumChatFormatting.YELLOW;
+ } else if (durability > maxDurability * 0.2) {
+ formatting = EnumChatFormatting.GOLD;
+ } else if (durability > 0) {
+ formatting = EnumChatFormatting.RED;
+ }
+ list.add("Uses remaining: " + formatting + durability + EnumChatFormatting.GRAY + " / " + maxDurability);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java b/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java
new file mode 100644
index 0000000000..9b4dd86525
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java
@@ -0,0 +1,260 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.ref.WeakReference;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.WeakHashMap;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityBeacon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.Phase;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemMagicFeather extends CoreItem {
+
+ public static final String NAME = "magicfeather";
+ private static final WeakHashMap<EntityPlayer, MagicFeatherData> sPlayerData = new WeakHashMap<>();
+ private static final WeakHashMap<EntityPlayer, HashSet<TileEntityBeacon>> sBeaconData = new WeakHashMap<>();
+
+ public ItemMagicFeather() {
+ super(
+ "magicfeather",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 100,
+ new String[] { "Lets you fly around Beacons" },
+ EnumRarity.uncommon,
+ null,
+ false,
+ null);
+ setMaxStackSize(1);
+ setUnlocalizedName(GTPlusPlus.ID + ":" + NAME);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public int getEntityLifespan(ItemStack itemStack, World world) {
+ return Integer.MAX_VALUE;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("Does not need to be the item held in your hand to work");
+ super.addInformation(stack, aPlayer, list, bool);
+ list.add("Needs to be within beacon range");
+ list.add("Range is beacon level * 10 + 10");
+ }
+
+ @Override
+ public boolean hasCustomEntity(ItemStack stack) {
+ return true;
+ }
+
+ private static boolean isInBeaconRange(EntityPlayer player) {
+ World world = player.getEntityWorld();
+ if (world.isRemote) {
+ return false;
+ }
+ HashSet<TileEntityBeacon> aBeaconData = sBeaconData.computeIfAbsent(player, k -> new HashSet<>());
+ int chunkXlo = (int) (player.posX - 50) >> 4, chunkXhi = (int) (player.posX + 50) >> 4,
+ chunkZlo = (int) (player.posZ - 50) >> 4, chunkZhi = (int) (player.posZ + 50) >> 4;
+ for (int chunkX = chunkXlo; chunkX < chunkXhi; chunkX++) {
+ for (int chunkZ = chunkZlo; chunkZ < chunkZhi; chunkZ++) {
+ if (!world.getChunkProvider()
+ .chunkExists(chunkX, chunkZ)) continue;
+ findSuitableBeacon(
+ player,
+ world.getChunkFromChunkCoords(chunkX, chunkZ).chunkTileEntityMap.values(),
+ aBeaconData);
+ }
+ }
+ return aBeaconData.size() > 0;
+ }
+
+ private static void findSuitableBeacon(EntityPlayer player, Collection<TileEntity> tileEntities,
+ HashSet<TileEntityBeacon> aBeaconData) {
+ for (TileEntity t : tileEntities) {
+ if (!(t instanceof TileEntityBeacon beacon)) {
+ continue;
+ }
+ int level = beacon.getLevels();
+ if (level == 0) {
+ continue;
+ }
+ int radius = (level * 10 + 10);
+ int x = beacon.xCoord;
+ int z = beacon.zCoord;
+ if (player.posX < (x - radius) || player.posX > (x + radius)) {
+ continue;
+ }
+ if (player.posZ < (z - radius) || player.posZ > (z + radius)) {
+ continue;
+ }
+ aBeaconData.add(beacon);
+ }
+ }
+
+ private static void setMayFly(EntityPlayer player, boolean mayFly) {
+ if (player.capabilities.allowFlying == mayFly) {
+ return;
+ }
+ if (!mayFly) {
+ // force the player on the ground then remove ability to fly
+ // this prevent crashing the the ground and dying
+ // when you accidentally get out of the beacon range
+ player.capabilities.isFlying = false;
+ if (player.onGround && player.fallDistance < 1F) {
+ player.capabilities.allowFlying = false;
+ }
+ } else {
+ player.capabilities.allowFlying = true;
+ }
+ player.sendPlayerAbilities();
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onPlayerTick(TickEvent.PlayerTickEvent event) {
+ if (event.side != Side.SERVER || event.phase != Phase.END) {
+ return;
+ }
+ EntityPlayer player = event.player;
+ HashSet<TileEntityBeacon> aBeaconData = sBeaconData.get(player);
+ if (aBeaconData != null && !aBeaconData.isEmpty()) {
+ for (Iterator<TileEntityBeacon> iterator = aBeaconData.iterator(); iterator.hasNext();) {
+ TileEntityBeacon aBeacon = iterator.next();
+ int level = aBeacon.getLevels();
+ if (level == 0) {
+ iterator.remove();
+ continue;
+ }
+ int radius = (level * 10 + 10);
+ int x = aBeacon.xCoord;
+ int z = aBeacon.zCoord;
+ if (player.posX < (x - radius) || player.posX > (x + radius)
+ || player.posZ < (z - radius)
+ || player.posZ > (z + radius)) {
+ iterator.remove();
+ }
+ }
+ }
+ boolean hasItem = hasItem(player, ModItems.itemMagicFeather);
+ if (!hasItem) {
+ ItemMagicFeather.sPlayerData.remove(player);
+ }
+ MagicFeatherData data = ItemMagicFeather.sPlayerData.get(player);
+ if (data == null) {
+ data = new MagicFeatherData(player);
+ ItemMagicFeather.sPlayerData.put(player, data);
+ }
+ data.onTick();
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOWEST)
+ public void onPlayerDeath(LivingDeathEvent event) {
+ if (event.entityLiving == null) return;
+ EntityLivingBase aEntity = event.entityLiving;
+ if (!(aEntity instanceof EntityPlayer aPlayer) || aEntity.worldObj == null || aEntity.worldObj.isRemote) return;
+ ItemMagicFeather.sPlayerData.remove(aPlayer);
+ ItemMagicFeather.sBeaconData.remove(aPlayer);
+ }
+
+ private static boolean hasItem(EntityPlayer player, Item item) {
+ for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
+ ItemStack stack = player.inventory.getStackInSlot(i);
+ if (stack != null && stack.getItem() != null && stack.getItem() instanceof ItemMagicFeather) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static class MagicFeatherData {
+
+ private final WeakReference<EntityPlayer> player;
+ private boolean hasItem = false;
+ private int checkTick = 0;
+ private boolean beaconInRangeCache;
+
+ public MagicFeatherData(EntityPlayer player) {
+ this.player = new WeakReference<>(player);
+ this.beaconInRangeCache = player.capabilities.allowFlying;
+ }
+
+ public void onTick() {
+ EntityPlayer player = this.player.get();
+ if (player == null) return;
+ try {
+ boolean hasItem = hasItem(player, ModItems.itemMagicFeather);
+ if (hasItem != this.hasItem) {
+ if (hasItem) {
+ this.onAdd();
+ }
+ if (!hasItem) {
+ this.onRemove();
+ }
+ this.hasItem = hasItem;
+ Logger.INFO("Ticking feather " + hasItem);
+ return;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ if (hasItem) {
+ // only modify if hasItem. Override other flight methods since you are literally holding this item in
+ // your own inventory. You have sent your consent.
+ boolean mayFly = player.capabilities.isCreativeMode || checkBeaconInRange(player);
+ setMayFly(player, mayFly);
+ }
+ }
+
+ private void onAdd() {
+ if (!ItemMagicFeather.isInBeaconRange(getPlayer())) {
+ return;
+ }
+ setMayFly(getPlayer(), true);
+ }
+
+ private void onRemove() {
+ if (getPlayer().capabilities.isCreativeMode) {
+ return;
+ }
+ setMayFly(getPlayer(), false);
+ }
+
+ private boolean checkBeaconInRange(EntityPlayer player) {
+ if (checkTick++ % 40 != 0) {
+ return beaconInRangeCache;
+ }
+ beaconInRangeCache = ItemMagicFeather.isInBeaconRange(player);
+ return beaconInRangeCache;
+ }
+
+ private EntityPlayer getPlayer() {
+ return player.get();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java b/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java
new file mode 100644
index 0000000000..87c5ab3e74
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java
@@ -0,0 +1,122 @@
+package gtPlusPlus.core.item.general.books;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gtPlusPlus.core.handler.BookHandler.mBookMap;
+import static gtPlusPlus.core.util.Utils.addBookTitleLocalization;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemWritableBook;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ItemBaseBook extends ItemWritableBook {
+
+ public ItemBaseBook() {
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemBook");
+ this.setUnlocalizedName("itembookgt");
+ GameRegistry.registerItem(this, "bookGT");
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < BookHandler.mBookMap.size(); i++) {
+ ItemStack bookstack = new ItemStack(item, 1, i);
+
+ /*
+ * bookstack = Utils.getWrittenBook( bookstack, i, mBookMap.get(i).mMapping, mBookMap.get(i).mTitle,
+ * mBookMap.get(i).mAuthor, mBookMap.get(i).mPages);
+ */
+
+ NBTUtils.createIntegerTagCompound(bookstack, "stats", "mMeta", i);
+ list.add(bookstack);
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (NBTUtils.hasKey(tItem, "title")) {
+ return NBTUtils.getString(tItem, "title");
+ } else if (tItem.getItemDamage() > -1 && tItem.getItemDamage() <= mBookMap.size()) {
+ return EnumChatFormatting.ITALIC + ""
+ + addBookTitleLocalization(mBookMap.get(tItem.getItemDamage()).mTitle);
+ }
+ // NBTUtils.tryIterateNBTData(tItem);
+ return "GT++ Storybook";
+ }
+
+ @Override
+ public void addInformation(ItemStack tItem, EntityPlayer player, List list, boolean bool) {
+ // TODO Auto-generated method stub
+ if (NBTUtils.hasKey(tItem, "author")) {
+ list.add(EnumChatFormatting.GRAY + "Author: " + NBTUtils.getString(tItem, "author"));
+ } else if (mBookMap.get(tItem.getItemDamage()).mAuthor != null) {
+ list.add(EnumChatFormatting.WHITE + "Author: " + mBookMap.get(tItem.getItemDamage()).mAuthor);
+ }
+ if (NBTUtils.hasKey(tItem, "title")) {
+ list.add(EnumChatFormatting.GRAY + "Pages: " + NBTUtils.getString(tItem, "pages"));
+ } else if (mBookMap.get(tItem.getItemDamage()).mPages != null) {
+ list.add(EnumChatFormatting.WHITE + "Pages: " + mBookMap.get(tItem.getItemDamage()).mPages.length);
+ }
+ // super.addInformation(p_77624_1_, p_77624_2_, p_77624_3_, p_77624_4_);
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) {
+ // player.displayGUIBook(item);
+ int i = item.getItemDamage();
+ ItemStack bookstack = Utils.getWrittenBook(
+ null,
+ mBookMap.get(i).mMeta,
+ mBookMap.get(i).mMapping,
+ mBookMap.get(i).mTitle,
+ mBookMap.get(i).mAuthor,
+ mBookMap.get(i).mPages);
+
+ if (player.worldObj.isRemote) {
+ try {
+ Class<?> clazz = ReflectionUtils.getClass("net.minecraft.client.gui.GuiScreenBook");
+ Constructor<?> ctor = clazz.getConstructor(EntityPlayer.class, ItemStack.class, boolean.class);
+ Object object = ctor.newInstance(new Object[] { player, bookstack, false });
+ Minecraft.getMinecraft()
+ .displayGuiScreen((GuiScreen) object);
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // Minecraft.getMinecraft().displayGuiScreen(new GuiScreenBook(player, bookstack, false));
+ }
+ return item;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java
new file mode 100644
index 0000000000..8efcfe6912
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java
@@ -0,0 +1,72 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemBoilerChassis extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemBoilerChassis() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemBoilerChassis";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemBoilerChassis");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 3; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector.translateToLocalFormatted("item.itemBoilerChassis.name", tItem.getItemDamage());
+ }
+
+ @Override // TODO
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 0) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(10, 110, 30);
+ } else if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 180, 35);
+ } else if (meta == 2) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 85, 40);
+ } else if (meta == 3) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 100, 50);
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java
new file mode 100644
index 0000000000..24759808ab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class ItemDehydratorCoil extends Item {
+
+ public IIcon[] icons = new IIcon[4];
+
+ public ItemDehydratorCoil() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemDehydratorCoil";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_0");
+ this.icons[1] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_1");
+ this.icons[2] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_2");
+ this.icons[3] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_3");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector
+ .translateToLocalFormatted("item.itemDehydratorCoil.name", GT_Values.VN[tItem.getItemDamage() + 4]);
+ }
+
+ /*
+ * @Override public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) { int meta =
+ * stack.getItemDamage(); if (meta == 0){ HEX_OxFFFFFF = Utils.rgbtoHexValue(10,110,30); } else if (meta == 1){
+ * HEX_OxFFFFFF = Utils.rgbtoHexValue(150,180,35); } else if (meta == 2){ HEX_OxFFFFFF =
+ * Utils.rgbtoHexValue(200,85,40); } else if (meta == 3){ HEX_OxFFFFFF = Utils.rgbtoHexValue(255,150,50); } return
+ * HEX_OxFFFFFF; }
+ */
+
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java
new file mode 100644
index 0000000000..b050e4c65c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class ItemDehydratorCoilWire extends Item {
+
+ public IIcon[] icons = new IIcon[4];
+
+ public ItemDehydratorCoilWire() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemDehydratorCoilWire";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_0");
+ this.icons[1] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_1");
+ this.icons[2] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_2");
+ this.icons[3] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_3");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector
+ .translateToLocalFormatted("item.itemDehydratorCoilWire.name", GT_Values.VN[tItem.getItemDamage() + 4]);
+ }
+
+ /*
+ * @Override public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) { int meta =
+ * stack.getItemDamage(); if (meta == 0){ HEX_OxFFFFFF = Utils.rgbtoHexValue(10,110,30); } else if (meta == 1){
+ * HEX_OxFFFFFF = Utils.rgbtoHexValue(150,180,35); } else if (meta == 2){ HEX_OxFFFFFF =
+ * Utils.rgbtoHexValue(200,85,40); } else if (meta == 3){ HEX_OxFFFFFF = Utils.rgbtoHexValue(255,150,50); } return
+ * HEX_OxFFFFFF; }
+ */
+
+}
diff --git a/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java b/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java
new file mode 100644
index 0000000000..c186fccd4b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java
@@ -0,0 +1,278 @@
+package gtPlusPlus.core.item.general.spawn;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IEntityLivingData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemMonsterPlacer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Facing;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemCustomSpawnEgg extends ItemMonsterPlacer {
+
+ private static final HashMap<Integer, IIcon> mIconMap = new HashMap<>();
+ private static int mTotalMetaItems = 0;
+
+ private static final HashMap<Integer, Integer> mMaxStackSizeMap = new HashMap<>();
+ private static final HashMap<Integer, EnumRarity> mRarityMap = new HashMap<>();
+ private static final HashMap<Integer, ArrayList<String>> mOreDictNames = new HashMap<>();
+
+ private static final HashMap<Integer, Integer> mColourBaseMap = new HashMap<>();
+ private static final HashMap<Integer, Integer> mColourSpotsMap = new HashMap<>();
+ private static final HashMap<Integer, String> mEntityNameMap = new HashMap<>();
+ private static final HashMap<Integer, String> mEntityFullNameMap = new HashMap<>();
+
+ private static final HashMap<String, Integer> mReverseEntityMap = new HashMap<>();
+
+ protected EntityLiving entityToSpawn = null;
+
+ public static void registerEntityForSpawnEgg(final int aMetaID, String parEntityToSpawnName, int aPrimaryColor,
+ int aSecondaryColor) {
+ registerEntityForSpawnEgg(
+ aMetaID,
+ parEntityToSpawnName,
+ aPrimaryColor,
+ aSecondaryColor,
+ EnumRarity.common,
+ new ArrayList<String>());
+ }
+
+ public static void registerEntityForSpawnEgg(final int aMetaID, String parEntityToSpawnName, int aPrimaryColor,
+ int aSecondaryColor, EnumRarity aRarity, final ArrayList<String> aOreDictNames) {
+ mTotalMetaItems++;
+ mMaxStackSizeMap.put(aMetaID, 64);
+ mRarityMap.put(aMetaID, aRarity);
+ mOreDictNames.put(aMetaID, aOreDictNames);
+ mColourBaseMap.put(aMetaID, aPrimaryColor);
+ mColourSpotsMap.put(aMetaID, aSecondaryColor);
+ mReverseEntityMap.put(parEntityToSpawnName, aMetaID);
+ setEntityToSpawnName(aMetaID, parEntityToSpawnName);
+ }
+
+ public ItemCustomSpawnEgg() {
+ super();
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName("BasicMetaSpawnEgg");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ /**
+ * Callback for item usage. If the item does something special on right clicking,
+ *
+ * he will have one of those. Return True if something happen and false if it don't. This is for ITEMS, not BLOCKS
+ */
+ @Override
+ public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4,
+ int par5, int par6, int par7, float par8, float par9, float par10) {
+ if (par3World.isRemote) {
+ return true;
+ } else {
+ Block block = par3World.getBlock(par4, par5, par6);
+ par4 += Facing.offsetsXForSide[par7];
+ par5 += Facing.offsetsYForSide[par7];
+ par6 += Facing.offsetsZForSide[par7];
+ double d0 = 0.0D;
+
+ if (par7 == 1 && block.getRenderType() == 11) {
+ d0 = 0.5D;
+ }
+
+ Entity entity = spawnEntity(par1ItemStack, par3World, par4 + 0.5D, par5 + d0, par6 + 0.5D);
+
+ if (entity != null) {
+ if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par2EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * Called whenever this item is equipped and the right mouse button is pressed.
+ *
+ * Args: itemStack, world, entityPlayer
+ */
+ @Override
+ public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
+ if (par2World.isRemote) {
+ return par1ItemStack;
+ } else {
+ MovingObjectPosition movingobjectposition = getMovingObjectPositionFromPlayer(
+ par2World,
+ par3EntityPlayer,
+ true);
+
+ if (movingobjectposition == null) {
+ return par1ItemStack;
+ } else {
+ if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
+ int i = movingobjectposition.blockX;
+ int j = movingobjectposition.blockY;
+ int k = movingobjectposition.blockZ;
+
+ if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) {
+ return par1ItemStack;
+ }
+
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) {
+
+ return par1ItemStack;
+ }
+
+ if (par2World.getBlock(i, j, k) instanceof BlockLiquid) {
+ Entity entity = spawnEntity(par1ItemStack, par2World, i, j, k);
+
+ if (entity != null) {
+ if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) {
+
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par3EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+ }
+ }
+
+ return par1ItemStack;
+ }
+ }
+ }
+
+ /**
+ * Spawns the creature specified by the egg's type in the location specified by
+ *
+ * the last three parameters. Parameters: world, entityID, x, y, z.
+ *
+ * @param par1ItemStack
+ */
+ public Entity spawnEntity(ItemStack par1ItemStack, World parWorld, double parX, double parY, double parZ) {
+
+ if (!parWorld.isRemote) // never spawn entity on client side
+ {
+ int aDamage = par1ItemStack.getItemDamage();
+ String entityToSpawnNameFull = mEntityFullNameMap.get(aDamage);
+ String entityToSpawnName = mEntityNameMap.get(aDamage);
+ // entityToSpawnNameFull = WildAnimals.MODID + "." + entityToSpawnName;
+ if (EntityList.stringToClassMapping.containsKey(entityToSpawnNameFull)) {
+ entityToSpawn = (EntityLiving) EntityList.createEntityByName(entityToSpawnNameFull, parWorld);
+ entityToSpawn.setLocationAndAngles(
+ parX,
+ parY,
+ parZ,
+ MathHelper.wrapAngleTo180_float(parWorld.rand.nextFloat() * 360.0F),
+ 0.0F);
+ parWorld.spawnEntityInWorld(entityToSpawn);
+ entityToSpawn.onSpawnWithEgg((IEntityLivingData) null);
+ entityToSpawn.playLivingSound();
+ } else {
+ // DEBUG
+ System.out.println("Entity not found " + entityToSpawnName);
+ }
+ }
+
+ return entityToSpawn;
+ }
+
+ /**
+ * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int aMeta : mReverseEntityMap.values()) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, aMeta, 1));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack par1ItemStack, int parColorType) {
+ int aID = par1ItemStack.getItemDamage();
+ return (parColorType == 0) ? mColourBaseMap.get(aID) : mColourSpotsMap.get(aID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ // Doing this override means that there is no localization for language
+ // unless you specifically check for localization here and convert
+ public String getItemStackDisplayName(ItemStack par1ItemStack) {
+ return StatCollector.translateToLocalFormatted(
+ "item.ItemCustomSpawnEgg.name",
+ StatCollector.translateToLocal("entity." + mEntityNameMap.get(par1ItemStack.getItemDamage()) + ".name"));
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ mIconMap.put(0, u.registerIcon(GTPlusPlus.ID + ":" + "spawn_egg"));
+ mIconMap.put(1, u.registerIcon(GTPlusPlus.ID + ":" + "spawn_egg_overlay"));
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int renderPass) {
+ return mIconMap.get(renderPass);
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return getIconFromDamageForRenderPass(0, 0);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return getIconFromDamageForRenderPass(0, renderPass);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass) {
+ return getIconFromDamageForRenderPass(0, renderPass);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ public static void setEntityToSpawnName(int aMetaID, String parEntityToSpawnName) {
+ mEntityNameMap.put(aMetaID, parEntityToSpawnName);
+ mEntityFullNameMap.put(aMetaID, GTPlusPlus.ID + "." + parEntityToSpawnName);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java b/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java
new file mode 100644
index 0000000000..acddd58a7b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.item.init;
+
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityOcelot;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.passive.EntityWolf;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.food.BaseItemMetaFood;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class ItemsFoods {
+
+ public static void load() {
+ run();
+ }
+
+ private static void run() {
+
+ ModItems.itemMetaFood = new BaseItemMetaFood();
+ BaseItemMetaFood.registerFoodsToOreDict();
+ addCookingRecipes();
+ addFoodDropsToMobs();
+ }
+
+ private static ItemStack getMetaFoodStack(int aID) {
+ return ItemUtils.simpleMetaStack(ModItems.itemMetaFood, aID, 1);
+ }
+
+ private static void addCookingRecipes() {
+
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(0), getMetaFoodStack(1), 0.4F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(2), getMetaFoodStack(3), 0.35F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(4), getMetaFoodStack(5), 0.35F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(6), getMetaFoodStack(7), 0.35F);
+ }
+
+ private static void addFoodDropsToMobs() {
+
+ EntityUtils.registerDropsForMob(EntityVillager.class, getMetaFoodStack(0), 2, 1500);
+ EntityUtils.registerDropsForMob(EntityHorse.class, getMetaFoodStack(2), 4, 4000);
+ EntityUtils.registerDropsForMob(EntityWolf.class, getMetaFoodStack(4), 2, 4000);
+ EntityUtils.registerDropsForMob(EntityOcelot.class, getMetaFoodStack(6), 2, 4000);
+ EntityUtils.registerDropsForMob(EntityBlaze.class, getMetaFoodStack(8), 1, 500);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java b/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java
new file mode 100644
index 0000000000..eaf8c2c9da
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java
@@ -0,0 +1,97 @@
+package gtPlusPlus.core.item.materials;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.util.minecraft.ItemUtils.getSimpleStack;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.handler.Recipes.DecayableRecipe;
+import gtPlusPlus.core.item.base.BaseItemTickable;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class DustDecayable extends BaseItemTickable {
+
+ private final Item turnsIntoItem;
+ private final int radLevel;
+
+ public DustDecayable(String unlocal, int colour, int maxTicks, String[] desc1, Item turnsInto, int radLevel) {
+ super(true, true, unlocal, colour, (maxTicks / 1), desc1);
+ this.turnsIntoItem = turnsInto;
+ this.radLevel = radLevel;
+ GT_OreDictUnificator.registerOre(unlocal, ItemUtils.getSimpleStack(this));
+ new DecayableRecipe(maxTicks, getSimpleStack(this), getSimpleStack(turnsInto));
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ String gt = GregTech.ID + ":" + "materialicons/" + "NUCLEAR" + "/" + "dust";
+ this.mIcon[0] = reg.registerIcon(gt);
+ String gt2 = GregTech.ID + ":" + "materialicons/" + "NUCLEAR" + "/" + "dust" + "_OVERLAY";
+ this.mIcon[1] = reg.registerIcon(gt2);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ super.addInformation(stack, player, list, bool);
+ if (this.radLevel > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.radLevel, world, entityHolding);
+ }
+ }
+ boolean a1, a2;
+
+ a1 = this.isTicking(world, iStack);
+ a2 = tickItemTag(world, iStack);
+
+ if (!a1 && !a2) {
+ if (entityHolding instanceof EntityPlayer) {
+ ItemStack replacement = ItemUtils.getSimpleStack(getDecayResult());
+ // Logger.INFO("Replacing "+iStack.getDisplayName()+" with "+replacement.getDisplayName()+".");
+ final ItemStack tempTransform = replacement;
+ if (iStack.stackSize > 1) {
+ int u = iStack.stackSize;
+ tempTransform.stackSize = u;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ for (int l = 0; l < u; l++) {
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+
+ } else {
+ tempTransform.stackSize = 1;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+ }
+ }
+ }
+
+ public Item getDecayResult() {
+ return turnsIntoItem;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java b/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java
new file mode 100644
index 0000000000..5ba3aa1531
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java
@@ -0,0 +1,1320 @@
+package gtPlusPlus.core.item.tool.misc;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.fluids.IFluidTank;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+import ic2.api.item.ISpecialElectricItem;
+
+public class GregtechPump extends Item implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
+
+ /**
+ * Right Click Functions
+ */
+ @Override
+ public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, int a4,
+ float p_77648_8_, float p_77648_9_, float p_77648_10_) {
+ if (aStack == null || aPlayer == null || aWorld == null || aWorld.isRemote) {
+ return false;
+ }
+ if (!aWorld.isRemote && tryDrainTile(aStack, aWorld, aPlayer, aX, aY, aZ)) {
+ return true;
+ } else {
+ // return super.onItemUse(aStack, aPlayer, aWorld, aX, aY, aZ, a4, p_77648_8_, p_77648_9_, p_77648_10_);
+ return false;
+ }
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) {
+ return p_77659_1_;
+ }
+
+ /**
+ * GT Code
+ */
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+ private final HashMap<Short, ArrayList<IItemBehaviour<GregtechPump>>> mItemBehaviors = new HashMap<>();
+
+ public final short mOffset, mItemAmount;
+ public final BitSet mEnabledItems;
+ public final BitSet mVisibleItems;
+ /** The unlocalized name of this item. */
+ private String unlocalizedName;
+
+ private final HashMap<Integer, IIcon> mIconMap = new LinkedHashMap<>();
+ private final HashMap<Integer, EnumRarity> rarity = new LinkedHashMap<>();
+ private final HashMap<Integer, String> itemName = new LinkedHashMap<>();
+ private final HashMap<Integer, Boolean> hasEffect = new LinkedHashMap<>();
+
+ public final HashMap<Short, Long[]> mElectricStats = new LinkedHashMap<>();
+ public final HashMap<Short, Short> mBurnValues = new LinkedHashMap<>();
+
+ public void registerPumpType(final int aID, final String aPumpName, final int aEuMax, final int aTier) {
+ ModItems.toolGregtechPump.registerItem(
+ aID, // ID
+ aPumpName, // Name
+ aEuMax, // Eu Storage
+ (short) aTier, // Tier/ Tooltip
+ aTier <= 0 ? EnumRarity.common
+ : aTier == 1 ? EnumRarity.uncommon
+ : aTier == 2 ? EnumRarity.rare : aTier == 3 ? EnumRarity.epic : EnumRarity.common, // Rarity
+ false // Effect?
+ );
+ }
+
+ public GregtechPump() {
+ this("MU-metatool.01", AddToCreativeTab.tabTools, (short) 1000, (short) 31766);
+ }
+
+ public GregtechPump(final String unlocalizedName, final CreativeTabs creativeTab, final short aOffset,
+ final short aItemAmount) {
+ this.mEnabledItems = new BitSet(aItemAmount);
+ this.mVisibleItems = new BitSet(aItemAmount);
+ this.mOffset = (short) Math.min(32766, aOffset);
+ this.mItemAmount = (short) Math.min(aItemAmount, 32766 - this.mOffset);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(1);
+ if (GameRegistry.findItem(GTPlusPlus.ID, unlocalizedName) == null) {
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final int tier) {
+ this.registerItem(id, localizedName, euStorage, (short) tier, EnumRarity.common, false);
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final int tier,
+ final int burnTime) {
+ this.registerItem(id, localizedName, euStorage, (short) tier, EnumRarity.common, false);
+ this.setBurnValue(id, burnTime);
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final short tier,
+ final EnumRarity regRarity, final boolean Effect) {
+ this.addItem(
+ id,
+ localizedName,
+ EnumChatFormatting.GRAY + "Can be used to remove fluids from GT machine input & output slots");
+ if (euStorage > 0 && tier > 0)
+ this.setElectricStats(this.mOffset + id, euStorage, GT_Values.V[tier], tier, -3L, true);
+ this.rarity.put(id, regRarity);
+ this.itemName.put(id, localizedName);
+ this.hasEffect.put(id, Effect);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ int h = getCorrectMetaForItemstack(par1ItemStack);
+ if (this.rarity.get(h) != null) {
+ return this.rarity.get(h);
+ }
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ int h = getCorrectMetaForItemstack(par1ItemStack);
+ if (this.hasEffect.get(h) != null) {
+ return this.hasEffect.get(h);
+ }
+ return false;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, List aList, final boolean aF3_H) {
+ // aList.add("Meta: "+(aStack.getItemDamage()-mOffset));
+ int aOffsetMeta = getCorrectMetaForItemstack(aStack);
+ aList.add(
+ GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName(aStack) + "." + aOffsetMeta + ".tooltip"));
+
+ if (aOffsetMeta <= 3) {
+ FluidStack f = getFluid(aStack);
+ aList.add(StatCollector.translateToLocal("item.itemGregtechPump.tooltip.0"));
+ aList.add(StatCollector.translateToLocal("item.itemGregtechPump.tooltip.1"));
+ aList.add(EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal("item.itemGregtechPump.tooltip.2"));
+ aList.add(
+ EnumChatFormatting.BLUE + (f != null ? f.getLocalizedName()
+ : StatCollector.translateToLocal("item.itemGregtechPump.tooltip.3")));
+ aList.add(
+ EnumChatFormatting.BLUE + (f != null ? "" + f.amount : "" + 0)
+ + "L"
+ + " / "
+ + formatNumbers(getCapacity(aStack))
+ + "L");
+ }
+
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats != null) {
+ if (tStats[3] > 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocalFormatted(
+ "item.itemBaseEuItem.tooltip.1",
+ formatNumbers(tStats[3]),
+ (tStats[2] >= 0 ? tStats[2] : 0)) + EnumChatFormatting.GRAY);
+ } else {
+ final long tCharge = this.getRealCharge(aStack);
+ if ((tStats[3] == -2) && (tCharge <= 0)) {
+ aList.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocal("item.itemBaseEuItem.tooltip.2")
+ + EnumChatFormatting.GRAY);
+ } else {
+ aList.add(
+ EnumChatFormatting.AQUA
+ + StatCollector.translateToLocalFormatted(
+ "item.itemBaseEuItem.tooltip.3",
+ formatNumbers(tCharge),
+ formatNumbers(Math.abs(tStats[0])) + " EU - Voltage: ",
+ V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)])
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ final ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final IItemBehaviour<GregtechPump> tBehavior : tList) {
+ aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
+ }
+ }
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.abs(tStats[0]);
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.max(tStats[1], tStats[3]);
+ }
+
+ @Override
+ public final int getTier(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]);
+ }
+
+ @Override
+ public final double charge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)
+ || !((tStats[3] == -1) || (tStats[3] == -3) || ((tStats[3] < 0) && (aCharge == Integer.MAX_VALUE)))
+ || (aStack.stackSize != 1)) {
+ return 0;
+ }
+ final long tChargeBefore = this.getRealCharge(aStack),
+ tNewCharge = aCharge == Integer.MAX_VALUE ? Long.MAX_VALUE
+ : Math.min(
+ Math.abs(tStats[0]),
+ tChargeBefore + (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tNewCharge - tChargeBefore;
+ }
+
+ @Override
+ public final double discharge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aBatteryAlike, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)) {
+ return 0;
+ }
+ if (aBatteryAlike && !this.canProvideEnergy(aStack)) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ if ((aCharge < tStats[3]) || (aStack.stackSize < 1)) {
+ return 0;
+ }
+ if (!aSimulate) {
+ aStack.stackSize--;
+ }
+ return tStats[3];
+ }
+ final long tChargeBefore = this.getRealCharge(aStack), tNewCharge = Math
+ .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tChargeBefore - tNewCharge;
+ }
+
+ @Override
+ public final double getCharge(final ItemStack aStack) {
+ return this.getRealCharge(aStack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack aStack, final double aAmount) {
+ return this.getRealCharge(aStack) >= aAmount;
+ }
+
+ @Override
+ public final boolean use(final ItemStack aStack, final double aAmount, final EntityLivingBase aPlayer) {
+ this.chargeFromArmor(aStack, aPlayer);
+ if ((aPlayer instanceof EntityPlayer) && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) {
+ return true;
+ }
+ final double tTransfer = this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
+ if (tTransfer == aAmount) {
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return true;
+ }
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return false;
+ }
+
+ @Override
+ public final boolean canProvideEnergy(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ return (tStats[3] > 0) || ((aStack.stackSize == 1) && ((tStats[3] == -2) || (tStats[3] == -3)));
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack aStack, final EntityLivingBase aPlayer) {
+ if ((aPlayer == null) || aPlayer.worldObj.isRemote) {
+ return;
+ }
+ for (int i = 1; i < 5; i++) {
+ final ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
+ if (GT_ModHandler.isElectricItem(tArmor)) {
+ final IElectricItem tArmorItem = (IElectricItem) tArmor.getItem();
+ if (tArmorItem.canProvideEnergy(tArmor) && (tArmorItem.getTier(tArmor) >= this.getTier(aStack))) {
+ final double tCharge = ElectricItem.manager.discharge(
+ tArmor,
+ this.charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true),
+ Integer.MAX_VALUE,
+ true,
+ true,
+ false);
+ if (tCharge > 0) {
+ this.charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
+ if (aPlayer instanceof EntityPlayer) {
+ final Container tContainer = ((EntityPlayer) aPlayer).openContainer;
+ if (tContainer != null) {
+ tContainer.detectAndSendChanges();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public final long getRealCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ return (int) (long) tStats[3];
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge");
+ }
+
+ public final boolean setCharge(final ItemStack aStack, long aCharge) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[3] > 0)) {
+ return false;
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.removeTag("GT.ItemCharge");
+ aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0]));
+ if (aCharge > 0) {
+ aStack.setItemDamage(this.getChargedMetaData(aStack));
+ tNBT.setLong("GT.ItemCharge", aCharge);
+ } else {
+ aStack.setItemDamage(this.getEmptyMetaData(aStack));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ return true;
+ }
+
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public short getEmptyMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final IItemBehaviour<GregtechPump> tBehavior : tList) {
+ if (!tBehavior.isItemStackUsable(this, aStack)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public final String getToolTip(final ItemStack aStack) {
+ return null;
+ } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up
+ // at this Point
+
+ @Override
+ public final IElectricItemManager getManager(final ItemStack aStack) {
+ return this;
+ } // We are our own Manager
+
+ /**
+ * Sets the Furnace Burn Value for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU)
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump setBurnValue(final int aMetaValue, final int aValue) {
+ if ((aMetaValue < 0) || (aValue < 0)) {
+ return this;
+ }
+ if (aValue == 0) {
+ this.mBurnValues.remove((short) aMetaValue);
+ } else {
+ this.mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue);
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump setElectricStats(final int aMetaValue, final long aMaxCharge, final long aTransferLimit,
+ final long aTier, final long aSpecialData, final boolean aUseAnimations) {
+ if (aMetaValue < 0) {
+ return this;
+ }
+ if (aMaxCharge == 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mElectricStats.put(
+ (short) aMetaValue,
+ new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData });
+ }
+ return this;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = this.mEnabledItems.length(); i < j; i++) {
+ if (this.mVisibleItems.get(i) || (GT_Values.D1 && this.mEnabledItems.get(i))) {
+ final Long[] tStats = this.mElectricStats.get((short) (this.mOffset + i));
+ if ((tStats != null) && (tStats[3] < 0)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.setCharge(tStack, Math.abs(tStats[0]));
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ if ((tStats == null) || (tStats[3] != -2)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (short i = 0, j = (short) this.mEnabledItems.length(); i < j; i++) {
+ if (this.mEnabledItems.get(i)) {
+ mIconMap.put(
+ (int) i,
+ aIconRegister.registerIcon(GTPlusPlus.ID + ":" + (this.getUnlocalizedName() + "/" + i)));
+ }
+ }
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ if (aMetaData < this.mOffset) {
+ return mIconMap.get(0);
+ } else {
+ int newMeta = aMetaData - this.mOffset;
+ newMeta = (Math.max(0, Math.min(3, newMeta)));
+ return mIconMap.get(newMeta);
+ }
+ }
+
+ /**
+ * Sets the unlocalized name of this item to the string passed as the parameter"
+ */
+ @Override
+ public Item setUnlocalizedName(final String p_77655_1_) {
+ this.unlocalizedName = p_77655_1_;
+ super.setUnlocalizedName(p_77655_1_);
+ return this;
+ }
+
+ /**
+ * Returns the unlocalized name of this item.
+ */
+ @Override
+ public String getUnlocalizedName() {
+ return this.unlocalizedName;
+ }
+
+ public final Long[] getElectricStats(final ItemStack aStack) {
+ return this.mElectricStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ /**
+ * Adds a special Item Behaviour to the Item.
+ * <p/>
+ * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
+ * @param aBehavior the Click Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump addItemBehavior(final int aMetaValue, final IItemBehaviour<GregtechPump> aBehavior) {
+ if ((aMetaValue < 0) || (aMetaValue >= 32766) || (aBehavior == null)) {
+ return this;
+ }
+ ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) aMetaValue);
+ if (tList == null) {
+ tList = new ArrayList<>(1);
+ this.mItemBehaviors.put((short) aMetaValue, tList);
+ }
+ tList.add(aBehavior);
+ return this;
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aFoodBehavior The Food Value of this Item. Can be null aswell. Just a convenience thing.
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ @SuppressWarnings("unchecked")
+ public final ItemStack addItem(final int aID, final String aEnglish, String aToolTip, final Object... aRandomData) {
+ if (aToolTip == null) {
+ aToolTip = "";
+ }
+ if ((aID >= 0) && (aID < this.mItemAmount)) {
+ final ItemStack rStack = new ItemStack(this, 1, this.mOffset + aID);
+ GT_ModHandler.registerBoxableItemToToolBox(rStack);
+ this.mEnabledItems.set(aID);
+ this.mVisibleItems.set(aID);
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName(rStack) + "." + aID + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName(rStack) + "." + aID + ".tooltip",
+ aToolTip);
+ final List<TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ this.mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ continue;
+ }
+ }
+ }
+ // now check for the rest
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData != null) {
+ boolean tUseOreDict = true;
+ if (tRandomData instanceof IItemBehaviour) {
+ this.addItemBehavior(this.mOffset + aID, (IItemBehaviour<GregtechPump>) tRandomData);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof TC_AspectStack) {
+ ((TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ continue;
+ }
+ if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ } else {
+ GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ }
+ continue;
+ }
+ if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ continue;
+ }
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null) {
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ }
+ return rStack;
+ }
+ return null;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack aStack) {
+ int keyValue = (getCorrectMetaForItemstack(aStack));
+ if (keyValue < 0 || keyValue > 3) {
+ keyValue = 0;
+ }
+ return GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName(aStack) + "." + keyValue + ".name");
+ }
+
+ /**
+ * Fluid Handling
+ */
+
+ /*
+ * IFluidContainer Functions
+ */
+
+ public void emptyStoredFluid(ItemStack aStack) {
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound t = aStack.getTagCompound();
+ if (t.hasKey("mInit")) {
+ t.removeTag("mInit");
+ }
+ if (t.hasKey("mFluid")) {
+ t.removeTag("mFluid");
+ }
+ if (t.hasKey("mFluidAmount")) {
+ t.removeTag("mFluidAmount");
+ }
+ }
+ }
+
+ public void storeFluid(ItemStack aStack, FluidStack aFluid) {
+ if (aFluid == null) {
+ return;
+ } else {
+ String fluidname = aFluid.getFluid()
+ .getName();
+ int amount = aFluid.amount;
+ if (fluidname != null && fluidname.length() > 0 && amount > 0) {
+ NBTUtils.setString(aStack, "mFluid", fluidname);
+ NBTUtils.setInteger(aStack, "mFluidAmount", amount);
+ }
+ }
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack container) {
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ String fluidname;
+ Integer amount = 0;
+ fluidname = NBTUtils.getString(container, "mFluid");
+ amount = NBTUtils.getInteger(container, "mFluidAmount");
+ if (fluidname != null && amount != null && amount > 0) {
+ return FluidUtils.getFluidStack(fluidname, amount);
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int getCapacity(ItemStack container) {
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ return container.getTagCompound()
+ .getInteger("mCapacity");
+ }
+ int aMeta = this.getCorrectMetaForItemstack(container);
+ int aCapacity = (aMeta == 0 ? 2000 : (aMeta == 1 ? 8000 : (aMeta == 2 ? 32000 : 128000)));
+ return aCapacity;
+ }
+
+ public int fill(ItemStack container, FluidStack resource) {
+ return fill(container, resource, true);
+ }
+
+ @Override
+ public int fill(ItemStack container, FluidStack resource, boolean doFill) {
+ if (!doFill || resource == null) {
+ return 0;
+ }
+
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ String aStored;
+ int aStoredAmount = 0;
+ int aCapacity = getCapacity(container);
+ FluidStack aStoredFluid = getFluid(container);
+ if (aStoredFluid != null) {
+ aStored = aStoredFluid.getFluid()
+ .getName();
+ aStoredAmount = aStoredFluid.amount;
+ if (aStoredAmount == aCapacity) {
+ return 0;
+ }
+ }
+ // Handle no stored fluid first
+ if (aStoredFluid == null) {
+ Logger.INFO("Pump is empty, filling with tank fluids.");
+ FluidStack toConsume;
+ int amountToConsume = 0;
+ if (resource.amount >= aCapacity) {
+ amountToConsume = aCapacity;
+ } else {
+ amountToConsume = resource.amount;
+ }
+ toConsume = FluidUtils.getFluidStack(resource, amountToConsume);
+ if (toConsume != null && amountToConsume > 0) {
+ storeFluid(container, toConsume);
+ return amountToConsume;
+ }
+ } else {
+ Logger.INFO("Pump is Partially full, filling with tank fluids.");
+ if (aStoredFluid.isFluidEqual(resource)) {
+ Logger.INFO("Found matching fluids.");
+ int aSpaceLeft = (aCapacity - aStoredAmount);
+ Logger.INFO(
+ "Capacity: " + aCapacity + " | Stored: " + aStoredAmount + " | Space left: " + aSpaceLeft);
+ FluidStack toConsume;
+ int amountToConsume = 0;
+ if (resource.amount >= aSpaceLeft) {
+ amountToConsume = aSpaceLeft;
+ Logger.INFO("More or equal fluid amount to pump container space.");
+ } else {
+ amountToConsume = resource.amount;
+ Logger.INFO("Less fluid than container space");
+ }
+ Logger.INFO("Amount to consume: " + amountToConsume);
+ toConsume = FluidUtils.getFluidStack(resource, (aStoredAmount + amountToConsume));
+ if (toConsume != null && amountToConsume > 0) {
+ Logger.INFO("Storing Fluid");
+ storeFluid(container, toConsume);
+ return amountToConsume;
+ } else {
+ Logger.INFO("Not storing fluid");
+ }
+ } else {
+ Logger.INFO("Fluids did not match.");
+ }
+ }
+ }
+ return 0;
+ }
+
+ public FluidStack drain(ItemStack container, int drainAmt) {
+ return drain(container, drainAmt, true);
+ }
+
+ @Override
+ public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) {
+ if (!doDrain || maxDrain == 0) {
+ return null;
+ }
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+
+ String aStored;
+ int aStoredAmount = 0;
+ FluidStack aStoredFluid = getFluid(container);
+
+ if (aStoredFluid != null) {
+ aStored = aStoredFluid.getFluid()
+ .getName();
+ aStoredAmount = aStoredFluid.amount;
+ }
+ // We cannot drain this if it's empty.
+ else if (aStoredFluid == null) {
+ return null;
+ }
+
+ if (maxDrain >= aStoredAmount) {
+ emptyStoredFluid(container);
+ return aStoredFluid;
+ } else {
+ // Handle Partial removal
+ int amountRemaining = (aStoredAmount - maxDrain);
+ if (amountRemaining == 0) {
+ emptyStoredFluid(container);
+ } else {
+ FluidStack newAmount = FluidUtils.getFluidStack(aStoredFluid, amountRemaining);
+ FluidStack drained = FluidUtils.getFluidStack(aStoredFluid, maxDrain);
+ if (newAmount != null && drained != null) {
+ storeFluid(container, newAmount);
+ return drained;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /*
+ * Handle ItemStack NBT
+ */
+
+ public void initNBT(ItemStack aStack) {
+ NBTTagCompound aNewNBT;
+ if (!aStack.hasTagCompound()) {
+ aNewNBT = new NBTTagCompound();
+ } else {
+ aNewNBT = aStack.getTagCompound();
+ }
+
+ if (!aNewNBT.hasKey("mInit")) {
+ int aMeta = this.getCorrectMetaForItemstack(aStack);
+ aNewNBT.setInteger("mMeta", aMeta);
+ aNewNBT.setBoolean("mInit", true);
+ aNewNBT.setString("mFluid", "@@@@@");
+ aNewNBT.setInteger("mFluidAmount", 0);
+ int aCapacity = (aMeta == 0 ? 2000 : (aMeta == 1 ? 8000 : (aMeta == 2 ? 32000 : 128000)));
+ aNewNBT.setInteger("mCapacity", aCapacity);
+ aStack.setTagCompound(aNewNBT);
+ }
+ }
+
+ /**
+ * Tile Handling
+ */
+
+ /*
+ * Custom Fluid Handling for Tiles and GT Tiles.
+ */
+
+ public boolean tryDrainTile(ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ) {
+ try {
+ if (aWorld.isRemote || aStack == null) {
+ return false;
+ } else {
+ int aTier = (aStack.getItemDamage() - 1000);
+ int removal;
+ if (aTier == 0) {
+ removal = 0;
+ } else if (aTier == 1) {
+ removal = 32;
+ } else if (aTier == 2) {
+ removal = 128;
+ } else if (aTier == 3) {
+ removal = 512;
+ } else {
+ removal = 8;
+ }
+ if (!canUse(aStack, removal) && aTier > 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Not enough power.");
+ Logger.INFO("No Power");
+ return false;
+ }
+
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity == null) {
+ return false;
+ } else {
+ double aCharge = this.getCharge(aStack);
+ boolean didDrain = false;
+ if (aTier > 0 && aCharge > 0) {
+ if (discharge(aStack, removal, aTier, true, true, false) > 0) {
+ didDrain = true;
+ }
+ } else if (aTier == 0) {
+ didDrain = true;
+ } else {
+ didDrain = false;
+ }
+
+ if (didDrain) {
+ if ((tTileEntity instanceof IGregTechTileEntity)) {
+ return this.drainTankGT(tTileEntity, aStack, aWorld, aPlayer, aX, aY, aZ);
+ }
+ // Try support Standard Fluid Tanks too (May disable if dupes appear again)
+ else if ((tTileEntity instanceof IFluidTank || tTileEntity instanceof IFluidHandler)) {
+ // return this.drainIFluidTank(tTileEntity, aStack, aWorld, aPlayer, aX, aY, aZ);
+ return false;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ return false;
+ }
+
+ /*
+ * Vanilla IFluidTank
+ */
+
+ public boolean drainIFluidTank(TileEntity tTileEntity, ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX,
+ int aY, int aZ) {
+ if (tTileEntity == null) {
+ Logger.INFO("Invalid Tile, somehow.");
+ return false;
+ }
+ if ((tTileEntity instanceof IFluidTank || tTileEntity instanceof IFluidHandler)) {
+ if (this.getFluid(aStack) == null
+ || (this.getFluid(aStack) != null && this.getFluid(aStack).amount < this.getCapacity(aStack))) {
+ Logger.INFO("Trying to find Stored Fluid - Behaviour Class.");
+ FluidStack aStored = getStoredFluidOfVanillaTank(tTileEntity);
+ if (aStored != null) {
+ int mAmountInserted = fill(aStack, aStored);
+ FluidStack newStackRemainingInTank;
+ if (mAmountInserted > 0) {
+ if (mAmountInserted == aStored.amount) {
+ newStackRemainingInTank = null;
+ } else {
+ newStackRemainingInTank = FluidUtils
+ .getFluidStack(aStored, (aStored.amount - mAmountInserted));
+ }
+ boolean b = setStoredFluidOfVanillaTank(tTileEntity, newStackRemainingInTank);
+ Logger.INFO("Cleared Tank? " + b + " | mAmountInserted: " + mAmountInserted);
+ Logger.INFO("Returning " + b + " - drainTankVanilla.");
+ if (b) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Drained " + mAmountInserted + "L of " + aStored.getLocalizedName() + ".");
+ }
+ return b;
+ }
+ } else {
+ Logger.INFO("Found no valid Fluidstack - drainTankVanilla.");
+ }
+ } else {
+ Logger.INFO("Pump is full.");
+ }
+ }
+ Logger.INFO("Could not drain vanilla tank.");
+ return false;
+ }
+
+ /*
+ * GT Tanks
+ */
+
+ public boolean drainTankGT(TileEntity tTileEntity, ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX,
+ int aY, int aZ) {
+ if (tTileEntity == null) {
+ return false;
+ }
+ if ((tTileEntity instanceof IGregTechTileEntity)) {
+ Logger.INFO("Right Clicking on GT Tile - drainTankGT.");
+ if (((IGregTechTileEntity) tTileEntity).getTimer() < 50L) {
+ Logger.INFO("Returning False - Behaviour Class. Timer < 50");
+ return false;
+ } else if ((!aWorld.isRemote) && (!((IGregTechTileEntity) tTileEntity).isUseableByPlayer(aPlayer))) {
+ Logger.INFO("Returning True - drainTankGT. NotUsable()");
+ return true;
+ } else {
+ if (this.getFluid(aStack) == null
+ || (this.getFluid(aStack) != null && this.getFluid(aStack).amount < this.getCapacity(aStack))) {
+ Logger.INFO("Trying to find Stored Fluid - drainTankGT.");
+ FluidStack aStored = getStoredFluidOfGTMachine((IGregTechTileEntity) tTileEntity);
+ if (aStored != null) {
+ int mAmountInserted = fill(aStack, aStored);
+ FluidStack newStackRemainingInTank;
+ if (mAmountInserted > 0) {
+ if (mAmountInserted == aStored.amount) {
+ newStackRemainingInTank = null;
+ } else {
+ newStackRemainingInTank = FluidUtils
+ .getFluidStack(aStored, (aStored.amount - mAmountInserted));
+ }
+ boolean b = setStoredFluidOfGTMachine(
+ (IGregTechTileEntity) tTileEntity,
+ newStackRemainingInTank);
+ Logger.INFO("Cleared Tank? " + b + " | mAmountInserted: " + mAmountInserted);
+ Logger.INFO("Returning " + b + " - drainTankGT.");
+ if (b) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Drained " + mAmountInserted + "L of " + aStored.getLocalizedName() + ".");
+ } else {
+ drain(aStack, mAmountInserted);
+ }
+ return b;
+ }
+ } else {
+ Logger.INFO("Found no valid Fluidstack - drainTankGT.");
+ }
+ } else {
+ Logger.INFO("Pump is full.");
+ }
+ }
+ }
+ Logger.INFO("Could not drain GT tank.");
+ return false;
+ }
+
+ /*
+ * Vanilla Tanks
+ */
+
+ public FluidStack getStoredFluidOfVanillaTank(TileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ } else if ((aTileEntity instanceof IFluidTank || aTileEntity instanceof IFluidHandler)) {
+ if (aTileEntity instanceof IFluidTank) {
+ return getStoredFluidOfVanillaTank((IFluidTank) aTileEntity);
+ } else {
+ return getStoredFluidOfVanillaTank((IFluidHandler) aTileEntity);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public FluidStack getStoredFluidOfVanillaTank(IFluidTank aTileEntity) {
+ FluidStack f = aTileEntity.getFluid();
+ Logger.INFO(
+ "Returning Fluid stack from tile. Found: "
+ + (f != null ? f.getLocalizedName() + " - " + f.amount + "L" : "Nothing"));
+ return f;
+ }
+
+ public FluidStack getStoredFluidOfVanillaTank(IFluidHandler aTileEntity) {
+ if (aTileEntity instanceof IFluidTank) {
+ return getStoredFluidOfVanillaTank((IFluidTank) aTileEntity);
+ }
+ FluidStack f;
+ AutoMap<FluidTankInfo[]> m = new AutoMap<>();
+ for (int i = 0; i < 6; i++) {
+ m.put(aTileEntity.getTankInfo(ForgeDirection.getOrientation(i)));
+ }
+ if (m.get(0) != null && m.get(0)[0] != null && m.get(0)[0].fluid != null) {
+ return m.get(0)[0].fluid;
+ } else {
+ return null;
+ }
+ }
+
+ public boolean setStoredFluidOfVanillaTank(TileEntity aTileEntity, FluidStack aSetFluid) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [1]");
+
+ if (aTileEntity == null) {
+ return false;
+ } else if ((aTileEntity instanceof IFluidTank || aTileEntity instanceof IFluidHandler)) {
+ if (aTileEntity instanceof IFluidTank) {
+ Logger.INFO("Tile Was instanceof IFluidTank.");
+ FluidStack f = ((IFluidTank) aTileEntity).getFluid();
+ if (aSetFluid == null) {
+ aSetFluid = f;
+ aSetFluid.amount = f.amount;
+ }
+ int toDrain = (f.amount - aSetFluid.amount);
+ FluidStack newStack;
+ if (toDrain <= 0) {
+ newStack = f;
+ } else {
+ newStack = ((IFluidTank) aTileEntity).drain(toDrain, true);
+ }
+
+ if (newStack.isFluidEqual(aSetFluid) && newStack.amount == aSetFluid.amount) {
+ Logger.INFO("Removed fluid from vanilla IFluidTank successfully.");
+ return true;
+ } else {
+ Logger.INFO("Failed trying to remove fluid from vanilla IFluidTank.");
+ return false;
+ }
+ } else {
+
+ // Rewrite Fluid handling for Vanilla type tanks
+ if (!IFluidHandler.class.isInstance(aTileEntity)) {
+ Logger.INFO("Tile Was not an instance of IFluidHandler.");
+ return false;
+ }
+
+ IFluidHandler aTank = (IFluidHandler) aTileEntity;
+ FluidStack aTankContents = null;
+ FluidTankInfo[] a1 = aTank.getTankInfo(ForgeDirection.UNKNOWN);
+ if (a1 != null) {
+ if (a1[0] != null) {
+ aTankContents = a1[0].fluid;
+ Logger.INFO(
+ "Found Fluid in Tank. " + aTankContents.getLocalizedName() + " - " + aTankContents.amount);
+ }
+ }
+ if (aSetFluid == null) {
+ Logger.INFO("Setting fluid to tank contents, as we're going to empty it totally.");
+ aSetFluid = aTankContents.copy();
+ } else {
+ Logger.INFO("Setting fluid to tank contents, as we're going to empty it totally.");
+ }
+ Logger.INFO(
+ "Tile Was instance of IFluidHandler. Trying to Drain " + aSetFluid.getLocalizedName()
+ + " - "
+ + aSetFluid.amount);
+
+ if (a1 == null || aTankContents == null) {
+ Logger.INFO("Tank is empty.");
+ return false;
+ }
+ // Found some Fluid in the tank
+ else {
+ FluidStack aDrainedStack = aTank.drain(ForgeDirection.UNKNOWN, aSetFluid, true);
+ if (aDrainedStack.isFluidStackIdentical(aSetFluid)) {
+ Logger.INFO("Drained!");
+ return true;
+ } else {
+ Logger.INFO("Partially Drained! This is probably an error.");
+ return true;
+ }
+ }
+ }
+ } else {
+ Logger.INFO("Bad Tank Tile to drain.");
+ return false;
+ }
+ }
+
+ /*
+ * GT Tanks
+ */
+
+ public FluidStack getStoredFluidOfGTMachine(IGregTechTileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();;
+ if (aMetaTileEntity == null || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ // blacklist multiinput hatch as it's too complex
+ return null;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicTank) {
+ Logger.INFO("Tile Was Instanceof BasicTank.");
+ return getStoredFluidOfGTMachine((GT_MetaTileEntity_BasicTank) aMetaTileEntity);
+ } else {
+ return null;
+ }
+ }
+
+ public FluidStack getStoredFluidOfGTMachine(GT_MetaTileEntity_BasicTank aTileEntity) {
+ FluidStack f = aTileEntity.mFluid;
+
+ // Let's see if this machine has output fluid too
+ /*
+ * if (f == null) { Logger.INFO("Could not find any input fluid, checking output if possible."); if (aTileEntity
+ * instanceof GT_MetaTileEntity_BasicMachine) { GT_MetaTileEntity_BasicMachine g =
+ * (GT_MetaTileEntity_BasicMachine) aTileEntity;
+ * Logger.INFO("Tile is a Basic Machine of some sort - "+g.mNEIName); if (g != null) { f = g.mOutputFluid; if (f
+ * != null) { Logger.INFO("Found output fluid! "+f.getLocalizedName()); } else {
+ * Logger.INFO("Did not find anything!"); f = g.getFluid(); if (f != null) {
+ * Logger.INFO("Found fluid! "+f.getLocalizedName()); } else { Logger.INFO("Did not find anything!"); f =
+ * g.getFluid(); } } } } }
+ */
+
+ Logger.INFO(
+ "Returning Fluid stack from tile. Found: "
+ + (f != null ? f.getLocalizedName() + " - " + f.amount + "L" : "Nothing"));
+ return f;
+ }
+
+ public boolean setStoredFluidOfGTMachine(IGregTechTileEntity aTileEntity, FluidStack aSetFluid) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [1]");
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicTank) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [2]");
+ return setStoredFluidOfGTMachine((GT_MetaTileEntity_BasicTank) aMetaTileEntity, aSetFluid);
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setStoredFluidOfGTMachine(GT_MetaTileEntity_BasicTank aTileEntity, FluidStack aSetFluid) {
+ try {
+
+ // Try Handle Outputs First
+ /*
+ * if (aTileEntity.setDrainableStack(aSetFluid) != null) { return true; }
+ */
+
+ aTileEntity.mFluid = aSetFluid;
+ boolean b = aTileEntity.mFluid == aSetFluid;
+ Logger.INFO("Trying to set Tile's tank. - Behaviour Class. [3] " + b);
+ return b;
+ } catch (Throwable t) {
+ Logger.INFO("Trying to clear Tile's tank. FAILED - Behaviour Class. [x]");
+ return false;
+ }
+ }
+
+ public int getCorrectMetaForItemstack(ItemStack aStack) {
+ if (aStack == null) {
+ return 0;
+ } else {
+ if (aStack.getItemDamage() < this.mOffset) {
+ return 0;
+ } else {
+ int newMeta = aStack.getItemDamage() - this.mOffset;
+ newMeta = (Math.max(0, Math.min(3, newMeta)));
+ return newMeta;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java b/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java
new file mode 100644
index 0000000000..8044b4364f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.item.wearable;
+
+import gtPlusPlus.core.item.wearable.armour.ArmourLoader;
+
+public class WearableLoader {
+
+ public static void run() {
+ execute();
+ }
+
+ private static void execute() {
+ ArmourLoader.run();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java b/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java
new file mode 100644
index 0000000000..e929d6cb7f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.item.wearable.armour;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor.ArmorMaterial;
+import net.minecraftforge.common.util.EnumHelper;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.item.wearable.armour.tinfoil.ArmourTinFoilHat;
+
+public class ArmourLoader {
+
+ // Glass
+ public static Item ClearGlassChestplate;
+ public static Item ClearGlassBoots;
+ public static Item ClearGlassLeggings;
+ public static Item ClearGlassHelmet;
+
+ // Tin Foil
+ public static Item TinFoilHat;
+
+ public static ArmorMaterial ClearGlassArmour = EnumHelper
+ .addArmorMaterial("ClearGlassArmor", 1, new int[] { 1, 1, 1, 1 }, 100);
+ public static ArmorMaterial TinFoilArmour = EnumHelper.addArmorMaterial("TINFOIL", 5, new int[] { 1, 1, 1, 1 }, 50);
+
+ public static void run() {
+ glassArmour();
+ tinfoilArmour();
+ }
+
+ private static void glassArmour() {}
+
+ private static void tinfoilArmour() {
+ TinFoilHat = new ArmourTinFoilHat().setUnlocalizedName("itemHatTinFoil");
+ GameRegistry.registerItem(TinFoilHat, "itemHatTinFoil", GTPlusPlus.ID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java b/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java
new file mode 100644
index 0000000000..e7ce975eca
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.wearable.armour.base;
+
+import gtPlusPlus.core.item.wearable.base.BaseItemWearable;
+
+public abstract class BaseArmour extends BaseItemWearable {
+
+ public BaseArmour(ArmorMaterial material, int renderIndex, int armourType) {
+ super(material, renderIndex, armourType);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java b/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java
new file mode 100644
index 0000000000..d121a90ade
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java
@@ -0,0 +1,9 @@
+package gtPlusPlus.core.item.wearable.armour.base;
+
+public abstract class BaseArmourHelm extends BaseArmour {
+
+ public BaseArmourHelm(ArmorMaterial material, int renderIndex) {
+ super(material, renderIndex, 0);
+ // TODO Auto-generated constructor stub
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java b/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java
new file mode 100644
index 0000000000..0703ac3b93
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java
@@ -0,0 +1,179 @@
+package gtPlusPlus.core.item.wearable.armour.tinfoil;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityBoat;
+import net.minecraft.entity.item.EntityEnderEye;
+import net.minecraft.entity.item.EntityEnderPearl;
+import net.minecraft.entity.item.EntityExpBottle;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.item.EntityXPOrb;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityEgg;
+import net.minecraft.entity.projectile.EntityFireball;
+import net.minecraft.entity.projectile.EntitySnowball;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.wearable.armour.ArmourLoader;
+import gtPlusPlus.core.item.wearable.armour.base.BaseArmourHelm;
+
+public class ArmourTinFoilHat extends BaseArmourHelm {
+
+ public IIcon iconHelm;
+
+ public ArmourTinFoilHat() {
+ super(ArmourLoader.TinFoilArmour, 0);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister ir) {
+ this.iconHelm = ir.registerIcon(GTPlusPlus.ID + ":itemHatTinFoil");
+ }
+
+ @Override
+ public int getRenderIndex() {
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(int par1) {
+ return this.iconHelm;
+ }
+
+ @Override
+ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
+ return GTPlusPlus.ID + ":textures/models/TinFoil.png";
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack itemstack) {
+ return EnumRarity.uncommon;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) {
+ return false;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ return super.getArmorDisplay(player, armor, slot);
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {}
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ aList.add("DoomSquirter's protection against cosmic radiation!");
+ aList.add("General paranoia makes the wearer unable to collect xp");
+ aList.add("Movement speed is also reduced, to keep you safe");
+ aList.add("This hat may also have other strange powers");
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ return new ArmorProperties(0, 0, 0);
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean itemInteractionForEntity(ItemStack p_111207_1_, EntityPlayer p_111207_2_,
+ EntityLivingBase p_111207_3_) {
+ return super.itemInteractionForEntity(p_111207_1_, p_111207_2_, p_111207_3_);
+ }
+
+ @Override
+ public void onUpdate(ItemStack aStack, World aWorld, Entity aEntity, int p_77663_4_, boolean p_77663_5_) {
+ super.onUpdate(aStack, aWorld, aEntity, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean onEntityItemUpdate(EntityItem entityItem) {
+ return super.onEntityItemUpdate(entityItem);
+ }
+
+ @Override
+ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
+ if (itemStack != null && player != null && world != null && !world.isRemote) {
+ if (player instanceof EntityPlayer) {
+
+ // Apply Slow
+ if (!GT_Utility.getPotion(player, Potion.moveSlowdown.id)) {
+ player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2, 1, true));
+ }
+
+ // Move Xp orbs away
+ try {
+ AxisAlignedBB box = player.boundingBox;
+ box.maxX = player.posX + 5;
+ box.maxY = player.posY + 5;
+ box.maxZ = player.posZ + 5;
+ box.minX = player.posX - 5;
+ box.minY = player.posY - 5;
+ box.minZ = player.posZ - 5;
+ @SuppressWarnings("unchecked")
+ List<Entity> g = world.getEntitiesWithinAABBExcludingEntity(player, box);
+ if (g.size() > 0) {
+ for (Entity e : g) {
+ if (e != null) {
+ if (!EntityXPOrb.class.isInstance(e) && !EntityBoat.class.isInstance(e)
+ && !EntitySnowball.class.isInstance(e)
+ && !EntityFireball.class.isInstance(e)
+ && !EntityEgg.class.isInstance(e)
+ && !EntityExpBottle.class.isInstance(e)
+ && !EntityEnderEye.class.isInstance(e)
+ && !EntityEnderPearl.class.isInstance(e)) {
+ continue;
+ } else {
+ // Logger.INFO("Found "+e.getClass().getName());
+ double distX = player.posX - e.posX;
+ double distZ = player.posZ - e.posZ;
+ double distY = e.posY + 1.5D - player.posY;
+ double dir = Math.atan2(distZ, distX);
+ double speed = 1F / e.getDistanceToEntity(player) * 0.5;
+ speed = -speed;
+ if (distY < 0) {
+ e.motionY += speed;
+ }
+ e.motionX = Math.cos(dir) * speed;
+ e.motionZ = Math.sin(dir) * speed;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ }
+ }
+
+ super.onArmorTick(world, player, itemStack);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java b/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java
new file mode 100644
index 0000000000..84b1d2ff51
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.core.item.wearable.base;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.common.ISpecialArmor;
+
+public abstract class BaseItemWearable extends ItemArmor implements ISpecialArmor {
+
+ public BaseItemWearable(ArmorMaterial material, int renderIndex, int armourType) {
+ super(material, renderIndex, armourType);
+ }
+
+ public abstract int getRenderIndex();
+
+ @Override
+ public abstract ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source,
+ double damage, int slot);
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public abstract void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage,
+ int slot);
+
+ public void dyeArmour(ItemStack aArmour, int aColour) {
+ func_82813_b(aArmour, aColour);
+ }
+
+ @Override
+ public void func_82813_b(ItemStack p_82813_1_, int p_82813_2_) {
+ NBTTagCompound nbttagcompound = p_82813_1_.getTagCompound();
+ if (nbttagcompound == null) {
+ nbttagcompound = new NBTTagCompound();
+ p_82813_1_.setTagCompound(nbttagcompound);
+ }
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
+ if (!nbttagcompound.hasKey("display", 10)) {
+ nbttagcompound.setTag("display", nbttagcompound1);
+ }
+ nbttagcompound1.setInteger("color", p_82813_2_);
+ }
+
+ @Override
+ public void removeColor(ItemStack p_82815_1_) {
+ NBTTagCompound nbttagcompound = p_82815_1_.getTagCompound();
+ if (nbttagcompound != null) {
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
+ if (nbttagcompound1.hasKey("color")) {
+ nbttagcompound1.removeTag("color");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java b/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java
new file mode 100644
index 0000000000..e01c89d827
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.item.wearable.hazmat;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.ic2.CustomInternalName;
+import ic2.core.IC2;
+import ic2.core.init.InternalName;
+import ic2.core.item.armor.ItemArmorHazmat;
+
+public class ItemArmorHazmatEx extends ItemArmorHazmat {
+
+ public static void init() {
+ GregtechItemList.Armour_Hazmat_Advanced_Helmet
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatHelmetEx, 0)));
+ GregtechItemList.Armour_Hazmat_Advanced_Chest
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatChestEx, 1)));
+ GregtechItemList.Armour_Hazmat_Advanced_Legs
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatLegsEx, 2)));
+ GregtechItemList.Armour_Hazmat_Advanced_Boots
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatBootsEx, 3)));
+ }
+
+ private ItemArmorHazmatEx(InternalName internalName, int type) {
+ super(internalName, type);
+ this.setMaxDamage(256);
+ }
+
+ @Override
+ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
+ int suffix = this.armorType == 2 ? 2 : 1;
+ return IC2.textureDomain + ":textures/armor/" + "hazmatEx_" + suffix + ".png";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/lib/CORE.java b/src/main/java/gtPlusPlus/core/lib/CORE.java
new file mode 100644
index 0000000000..9f39f1f369
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/lib/CORE.java
@@ -0,0 +1,242 @@
+package gtPlusPlus.core.lib;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import com.mojang.authlib.GameProfile;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.IGregtech_RecipeAdder;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+
+public class CORE {
+
+ public static Map PlayerCache;
+
+ // Math Related
+ public static final float PI = (float) Math.PI;
+ public static volatile Random RANDOM = new XSTR();
+
+ public static boolean DEVENV = false;;
+
+ // Mod Variables
+ public static final String name = "GT++";
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+
+ // Tweakables
+ public static int EVERGLADES_ID = 227;
+ public static int EVERGLADESBIOME_ID = 238;
+
+ public static int turbineCutoffBase = 75000;
+
+ // GT++ Fake Player Profile
+ public static final GameProfile gameProfile = new GameProfile(
+ UUID.nameUUIDFromBytes("gtplusplus.core".getBytes()),
+ "[GT++]");
+ public static final WeakHashMap<World, EntityPlayerMP> fakePlayerCache = new WeakHashMap<>();
+ // Tooltips;
+ public static final Supplier<String> GT_Tooltip = () -> StatCollector.translateToLocal("GTPP.core.GT_Tooltip");
+ public static final Supplier<String> GT_Tooltip_Builder = () -> StatCollector
+ .translateToLocal("GTPP.core.GT_Tooltip_Builder");
+ public static final Supplier<String> GT_Tooltip_Radioactive = () -> StatCollector
+ .translateToLocal("GTPP.core.GT_Tooltip_Radioactive");
+
+ public static final String SEPERATOR = "/";
+
+ /**
+ * Lists/Maps
+ */
+
+ // Burnables List
+ public static List<Pair<Integer, ItemStack>> burnables = new ArrayList<>();
+
+ // TesseractMaps
+ public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>> sTesseractGeneratorOwnershipMap = new HashMap<>();
+ public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>> sTesseractTerminalOwnershipMap = new HashMap<>();
+
+ // BookMap
+ public static final Map<String, ItemStack> sBookList = new ConcurrentHashMap<>();
+
+ /**
+ * Some Gregtech Material and Recipe Variables
+ */
+ public static IGregtech_RecipeAdder RA;
+
+ public static final GT_Materials[] sMU_GeneratedMaterials = new GT_Materials[1000];
+
+ public static class ConfigSwitches {
+
+ // Debug
+ public static boolean MACHINE_INFO = true;
+ public static boolean showHiddenNEIItems = false;
+ public static boolean dumpItemAndBlockData = false;
+
+ // Machine Related
+ public static boolean enableThaumcraftShardUnification = false;
+ public static boolean disableIC2Recipes = false;
+ public static int boilerSteamPerSecond = 750;
+
+ // Feature Related
+ public static boolean enableCustomCapes = false;
+ public static int enableWatchdogBGM = CORE_Preloader.enableWatchdogBGM;
+ public static boolean hideUniversalCells = true;
+
+ // Single Block Machines
+ public static boolean enableMachine_Dehydrators = true;
+ public static boolean enableMachine_SteamConverter = true;
+ public static boolean enableMachine_FluidTanks = true;
+ public static boolean enableMachine_RocketEngines = true;
+ public static boolean enableMachine_GeothermalEngines = true;
+ public static boolean enableMachine_Tesseracts = true;
+ public static boolean enableMachine_SimpleWasher = true;
+ public static boolean enableMachine_Pollution = true;
+ public static boolean enableCustom_Pipes = true;
+ public static boolean enableCustom_Cables = true;
+
+ // Multiblocks
+ public static boolean enableMultiblock_AlloyBlastSmelter = true;
+ public static boolean enableMultiblock_QuantumForceTransformer = true;
+ public static boolean enableMultiblock_IndustrialCentrifuge = true;
+ public static boolean enableMultiblock_IndustrialCokeOven = true;
+ public static boolean enableMultiblock_IndustrialElectrolyzer = true;
+ public static boolean enableMultiblock_IndustrialMacerationStack = true;
+ public static boolean enableMultiblock_IndustrialPlatePress = true;
+ public static boolean enableMultiblock_IndustrialWireMill = true;
+ public static boolean enableMultiblock_MatterFabricator = true;
+ public static boolean enableMultiblock_MultiTank = true;
+ public static boolean enableMultiblock_PowerSubstation = true;
+ public static boolean enableMultiblock_LiquidFluorideThoriumReactor = true;
+ public static boolean enableMultiblock_NuclearSaltProcessingPlant = true;
+ public static boolean enableMultiblock_NuclearFuelRefinery = true;
+ public static boolean enableMultiblock_TreeFarmer = true;
+ public static boolean enableMultiblock_IndustrialSifter = true;
+ public static boolean enableMultiblock_IndustrialThermalCentrifuge = true;
+ public static boolean enableMultiblock_IndustrialWashPlant = true;
+ public static boolean enableMultiblock_LargeAutoCrafter = true;
+ public static boolean enableMultiblock_ThermalBoiler = true;
+ public static boolean enableMultiblock_IndustrialCuttingMachine = true;
+ public static boolean enableMultiblock_IndustrialFishingPort = true;
+ public static boolean enableMultiblock_IndustrialExtrudingMachine = true;
+ public static boolean enableMultiblock_IndustrialMultiMachine = true;
+ public static boolean enableMultiblock_Cyclotron = true;
+
+ // Visuals
+ public static boolean useGregtechTextures = true;
+ public static boolean enableAnimatedTextures = false;
+
+ // Pollution
+ public static int pollutionPerSecondMultiPackager = 40;
+ public static int pollutionPerSecondMultiIndustrialAlloySmelter = 300;
+ public static int pollutionPerSecondMultiIndustrialArcFurnace = 2400;
+ public static int pollutionPerSecondMultiIndustrialCentrifuge = 300;
+ public static int pollutionPerSecondMultiIndustrialCokeOven = 80;
+ public static int pollutionPerSecondMultiIndustrialCuttingMachine = 160;
+ public static int pollutionPerSecondMultiIndustrialDehydrator = 500;
+ public static int pollutionPerSecondMultiIndustrialElectrolyzer = 300;
+ public static int pollutionPerSecondMultiIndustrialExtruder = 1000;
+ public static int pollutionPerSecondMultiIndustrialMacerator = 400;
+ public static int pollutionPerSecondMultiIndustrialMixer = 800;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal = 400;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid = 400;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc = 600;
+ public static int pollutionPerSecondMultiIndustrialPlatePress_ModeForming = 240;
+ public static int pollutionPerSecondMultiIndustrialPlatePress_ModeBending = 480;
+ public static int pollutionPerSecondMultiIndustrialForgeHammer = 250;
+ public static int pollutionPerSecondMultiIndustrialSifter = 40;
+ public static int pollutionPerSecondMultiIndustrialThermalCentrifuge = 1000;
+ public static int pollutionPerSecondMultiIndustrialVacuumFreezer = 500;
+ public static int pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath = 400;
+ public static int pollutionPerSecondMultiIndustrialWashPlant_ModeWasher = 100;
+ public static int pollutionPerSecondMultiIndustrialWireMill = 100;
+ public static int pollutionPerSecondMultiIsaMill = 1280;
+ public static int pollutionPerSecondMultiAdvDistillationTower_ModeDistillery = 240;
+ public static int pollutionPerSecondMultiAdvDistillationTower_ModeDT = 480;
+ public static int pollutionPerSecondMultiAdvEBF = 500;
+ public static int pollutionPerSecondMultiAdvImplosion = 5000;
+ public static int pollutionPerSecondMultiABS = 200;
+ public static int pollutionPerSecondMultiCyclotron = 200;
+ public static int pollutionPerSecondMultiIndustrialFishingPond = 20;
+ public static int pollutionPerSecondMultiLargeSemiFluidGenerator = 1280;
+ public static int pollutionPerSecondMultiMassFabricator = 40;
+ public static int pollutionPerSecondMultiRefinery = 4000;
+ public static int pollutionPerSecondMultiTreeFarm = 100;
+ public static int pollutionPerSecondMultiFrothFlotationCell = 0;
+ public static int pollutionPerSecondMultiAutoCrafter = 500;
+ public static int pollutionPerSecondMultiThermalBoiler = 700;
+ public static int pollutionPerSecondMultiMolecularTransformer = 1000;
+ public static int pollutionPerSecondMultiAlgaePond = 0;
+ public static int pollutionPerSecondMultiIndustrialRockBreaker = 100;
+ public static int pollutionPerSecondMultiIndustrialChisel = 50;
+ // pollution single blocks
+ public static int basePollutionPerSecondSemiFluidGenerator = 40;
+ public static double[] pollutionReleasedByTierSemiFluidGenerator = new double[] { 0, 2.0, 4.0, 8.0, 12.0, 16,
+ 0 };
+ public static int basePollutionPerSecondBoiler = 35;
+ public static double[] pollutionReleasedByTierBoiler = new double[] { 0, 1.0, 1.43, 1.86 };
+ public static int baseMinPollutionPerSecondRocketFuelGenerator = 250;
+ public static int baseMaxPollutionPerSecondRocketFuelGenerator = 2000;
+ public static double[] pollutionReleasedByTierRocketFuelGenerator = new double[] { 0, 0, 0, 0, 1, 2, 3 };
+ public static int basePollutionPerSecondGeothermalGenerator = 100;
+ public static double[] pollutionReleasedByTierGeothermalGenerator = new double[] { 0, 0, 0, 0, 1, 1, 1 };
+ }
+
+ public static class Everglades {
+
+ public static final String NAME = "GT++ Toxic Everglades";
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+ }
+
+ public static final void crash() {
+ crash("Generic Crash");
+ }
+
+ public static final void crash(String aReason) {
+ try {
+ Logger.INFO("==========================================================");
+ Logger.INFO("[GT++ CRASH]");
+ Logger.INFO("==========================================================");
+ Logger.INFO("Oooops...");
+ Logger.INFO("This should only happy in a development environment or when something really bad happens.");
+ Logger.INFO("Reason: " + aReason);
+ Logger.INFO("==========================================================");
+ Logger.INFO("Called from: " + ReflectionUtils.getMethodName(1));
+ Logger.INFO(ReflectionUtils.getMethodName(2));
+ Logger.INFO(ReflectionUtils.getMethodName(3));
+ Logger.INFO(ReflectionUtils.getMethodName(4));
+ Logger.INFO(ReflectionUtils.getMethodName(5));
+ Logger.INFO(ReflectionUtils.getMethodName(6));
+ Logger.INFO(ReflectionUtils.getMethodName(7));
+ Logger.INFO(ReflectionUtils.getMethodName(8));
+ Logger.INFO(ReflectionUtils.getMethodName(9));
+ Logger.INFO(ReflectionUtils.getMethodName(10));
+ Logger.INFO(ReflectionUtils.getMethodName(11));
+ Logger.INFO(ReflectionUtils.getMethodName(12));
+ Logger.INFO(ReflectionUtils.getMethodName(13));
+ Logger.INFO(ReflectionUtils.getMethodName(14));
+ Logger.INFO(ReflectionUtils.getMethodName(15));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ FMLCommonHandler.instance()
+ .exitJava(0, true);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/lib/VanillaColours.java b/src/main/java/gtPlusPlus/core/lib/VanillaColours.java
new file mode 100644
index 0000000000..70e7902fbf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/lib/VanillaColours.java
@@ -0,0 +1,43 @@
+package gtPlusPlus.core.lib;
+
+import gtPlusPlus.core.util.Utils;
+
+public enum VanillaColours {
+
+ BONE_MEAL(249, 255, 254),
+ INK_BLACK(29, 29, 33),
+ COCOA_BEANS(131, 84, 50),
+ LAPIS_LAZULI(60, 68, 170),
+ DYE_WHITE(249, 255, 254),
+ DYE_BLACK(29, 29, 33),
+ DYE_RED(176, 46, 38),
+ DYE_GREEN(94, 124, 22),
+ DYE_CYAN(22, 156, 156),
+ DYE_PINK(243, 139, 170),
+ DYE_LIME(128, 199, 31),
+ DYE_YELLOW(254, 216, 61),
+ DYE_ORANGE(249, 128, 29),
+ DYE_BROWN(131, 84, 50),
+ DYE_LIGHT_BLUE(58, 179, 218),
+ DYE_LIGHT_PURPLE(199, 78, 189),
+ DYE_LIGHT_GRAY(157, 157, 151),
+ DYE_DARK_BLUE(60, 68, 170),
+ DYE_DARK_PURPLE(137, 50, 184),
+ DYE_DARK_GRAY(71, 79, 82);
+
+ private final int r, g, b;
+
+ private VanillaColours(int aR, int aG, int aB) {
+ r = aR;
+ g = aG;
+ b = aB;
+ }
+
+ public short[] getAsShort() {
+ return new short[] { (short) r, (short) g, (short) b };
+ }
+
+ public int getAsInt() {
+ return Utils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/ALLOY.java b/src/main/java/gtPlusPlus/core/material/ALLOY.java
new file mode 100644
index 0000000000..6618c61dd3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/ALLOY.java
@@ -0,0 +1,828 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class ALLOY {
+
+ // Just some GT Alloys that I need within mine.
+ public static final Material BRONZE = MaterialUtils.generateMaterialFromGtENUM(Materials.Bronze);
+ public static final Material STEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.Steel);
+ public static final Material STEEL_BLACK = MaterialUtils.generateMaterialFromGtENUM(Materials.BlackSteel);
+ public static final Material INVAR = MaterialUtils.generateMaterialFromGtENUM(Materials.Invar);
+ public static final Material KANTHAL = MaterialUtils.generateMaterialFromGtENUM(Materials.Kanthal);
+ public static final Material NICHROME = MaterialUtils.generateMaterialFromGtENUM(Materials.Nichrome);
+ public static final Material TUNGSTENSTEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.TungstenSteel);
+ public static final Material STAINLESS_STEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.StainlessSteel);
+ public static final Material OSMIRIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Osmiridium);
+ public static final Material POLYETHYLENE = MaterialUtils.generateMaterialFromGtENUM(Materials.Plastic);
+ public static final Material POLYTETRAFLUOROETHYLENE = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Polytetrafluoroethylene);
+ public static final Material ENERGYCRYSTAL = new Material(
+ "Energy Crystal", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 228, 255, 0, 0 }, // Material Colour
+ 4660, // Melting Point in C
+ 5735, // Boiling Point in C
+ 90, // Protons
+ 40, // Neutrons
+ true, // Uses Blast furnace?
+ "⬟ ⯂ ⬢ ⬣ ⯃ ⯄",
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().AER, 5),
+ new MaterialStack(ELEMENT.getInstance().IGNIS, 5), new MaterialStack(ELEMENT.getInstance().TERRA, 5),
+ new MaterialStack(ELEMENT.getInstance().AQUA, 5) });
+
+ public static final Material BLOODSTEEL = new Material(
+ "Blood Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 142, 28, 0, 0 }, // Material Colour
+ 2500, // Melting Point in C
+ 0, // Boiling Point in C
+ 100, // Protons
+ 100, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 5), new MaterialStack(ELEMENT.getInstance().IGNIS, 5) });
+
+ public static final Material STABALLOY = new Material(
+ "Staballoy", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 68, 75, 66, 0 }, // Material Colour
+ 3450, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().URANIUM238, 9),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 1) });
+
+ public static final Material TANTALLOY_60 = new Material(
+ "Tantalloy-60", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 213, 231, 237, 0 }, // Material Colour
+ 3025, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 46) });
+
+ public static final Material TANTALLOY_61 = new Material(
+ "Tantalloy-61", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 193, 211, 217, 0 }, // Material Colour
+ 3030, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.TANTALLOY_60, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 8) });
+
+ public static final Material TUMBAGA = new Material(
+ "Tumbaga", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 255, 178, 15, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().GOLD, 70),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 30) });
+
+ public static final Material POTIN = new Material(
+ "Potin", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 201, 151, 129, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LEAD, 40), new MaterialStack(ALLOY.BRONZE, 40),
+ new MaterialStack(ELEMENT.getInstance().TIN, 20) });
+
+ /*
+ * public static final Material BEDROCKIUM = new Material( "Bedrockium", //Material Name new short[]{32, 32, 32, 0},
+ * //Material Colour 7735, //Melting Point in C 0, //Boiling Point in C 100, //Protons 100, //Neutrons false, //Uses
+ * Blast furnace? //Material Stacks with Percentage of required elements. null);
+ */
+
+ public static final Material INCONEL_625 = new Material(
+ "Inconel-625", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 128, 200, 128, 0 }, // Material Colour
+ 2425, // Melting Point in C
+ 3758,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 3),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 7),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10), new MaterialStack(INVAR, 10),
+ new MaterialStack(NICHROME, 13) });
+
+ public static final Material INCONEL_690 = new Material(
+ "Inconel-690", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 118, 220, 138, 0 }, // Material Colour
+ 3425, // Melting Point in C
+ 4895,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CHROMIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().NIOBIUM, 10),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10), new MaterialStack(NICHROME, 15) });
+
+ public static final Material INCONEL_792 = new Material(
+ "Inconel-792", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 108, 240, 118, 0 }, // Material Colour
+ 3425, // Melting Point in C
+ 6200,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 20),
+ new MaterialStack(ELEMENT.getInstance().NIOBIUM, 10),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 20), new MaterialStack(NICHROME, 10) });
+
+ public static final Material NITINOL_60 = new Material(
+ "Nitinol 60", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5651, // Melting Point in C
+ 8975,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 40),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 60) });
+
+ public static final Material ZERON_100 = new Material(
+ "Zeron-100", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 180, 180, 20, 0 }, // Material Colour
+ 6100,
+ 9785,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CHROMIUM, 26),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 6), new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 20), new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4),
+ new MaterialStack(ALLOY.STEEL, 40) });
+
+ public static final Material MARAGING250 = new Material(
+ "Maraging Steel 250", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material MARAGING300 = new Material(
+ "Maraging Steel 300", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material MARAGING350 = new Material(
+ "Maraging Steel 350", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material AQUATIC_STEEL = new Material(
+ "Watertight Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 120, 120, 180 }, // Material Colour
+ 2673, // Melting Point in C
+ 4835,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 60), new MaterialStack(ELEMENT.getInstance().CARBON, 10),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 5), new MaterialStack(ELEMENT.getInstance().SILICON, 10),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 5), new MaterialStack(ELEMENT.getInstance().SULFUR, 5),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 5) });
+
+ public static final Material STELLITE = new Material(
+ "Stellite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4310, // Melting Point in C
+ 6250,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 35),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 35),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 20),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 10) });
+
+ public static final Material TALONITE = new Material(
+ "Talonite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3454, // Melting Point in C
+ 5500,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 40),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 30),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 20),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10) });
+
+ public static final Material HASTELLOY_W = new Material(
+ "Hastelloy-W", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3350, // Melting Point in C
+ 5755,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 06),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 2), new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 24),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 6),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 62) });
+
+ public static final Material HASTELLOY_X = new Material(
+ "Hastelloy-X", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3350, // Melting Point in C
+ 5755,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 18),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 8),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 22),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 48) });
+
+ public static final Material HASTELLOY_N = new Material(
+ "Hastelloy-N", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4350, // Melting Point in C
+ 6875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 8),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 16),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 8), new MaterialStack(ELEMENT.getInstance().TITANIUM, 8),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 60) });
+
+ public static final Material HASTELLOY_C276 = new Material(
+ "Hastelloy-C276", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4350, // Melting Point in C
+ 6520,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 2),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 16),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 2), new MaterialStack(ELEMENT.getInstance().COPPER, 2),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 14),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 64) });
+
+ public static final Material INCOLOY_020 = new Material(
+ "Incoloy-020", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3425, // Melting Point in C
+ 5420,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 40),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 4), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 36) });
+
+ public static final Material INCOLOY_DS = new Material(
+ "Incoloy-DS", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3425, // Melting Point in C
+ 5420,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 46),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 18), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 18) });
+
+ public static final Material INCOLOY_MA956 = new Material(
+ "Incoloy-MA956", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4425, // Melting Point in C
+ 6875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 64),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 4) });
+
+ public static final Material TUNGSTEN_CARBIDE = new Material(
+ "Tungsten Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 44, 44, 44, 0 }, // Material Colour
+ 3422, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ false, // Generate cells
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CARBON, 50),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 50) });
+
+ public static final Material TUNGSTEN_TITANIUM_CARBIDE = new Material(
+ "Tungsten Titanium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 4422, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(TUNGSTEN_CARBIDE, 70),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 30) });
+
+ public static final Material SILICON_CARBIDE = new Material(
+ "Silicon Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 40, 48, 36, 0 }, // Material Colour
+ 1414, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SILICON, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material TANTALUM_CARBIDE = new Material(
+ "Tantalum Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 139, 136, 120, 0 }, // Material Colour
+ 2980, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TANTALUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material ZIRCONIUM_CARBIDE = new Material(
+ "Zirconium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 222, 202, 180, 0 }, // Material Colour
+ 1555, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material NIOBIUM_CARBIDE = new Material(
+ "Niobium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 205, 197, 191, 0 }, // Material Colour
+ 2477, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NIOBIUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material ARCANITE = new Material(
+ "Arcanite", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 5666, // Melting Point in C
+ 9875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 40),
+ new MaterialStack(ENERGYCRYSTAL, 40), new MaterialStack(ELEMENT.getInstance().ORDO, 10),
+ new MaterialStack(ELEMENT.getInstance().PERDITIO, 10) });
+
+ public static final Material LEAGRISIUM = new Material(
+ "Grisium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 53, 93, 106, 0 }, // Material Colour
+ 3850, // Melting Point in C
+ 5550, // Boiling Point in C
+ 96, // Protons
+ 128, // Neutrons
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TITANIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 18), new MaterialStack(ELEMENT.getInstance().POTASSIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().LITHIUM, 18), new MaterialStack(ELEMENT.getInstance().SULFUR, 18),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 10) }); // Material Stacks with Percentage of
+ // required elements.
+
+ public static final Material EGLIN_STEEL_BASE = new Material(
+ "Eglin Steel Base Compound", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 12), new MaterialStack(KANTHAL, 3),
+ new MaterialStack(INVAR, 15) });
+
+ public static final Material EGLIN_STEEL = new Material(
+ "Eglin Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 139, 69, 19, 0 }, // Material Colour
+ 1048, // Melting Point in C
+ 1973, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.EGLIN_STEEL_BASE, 10),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1), new MaterialStack(ELEMENT.getInstance().SILICON, 4),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1) });
+
+ public static final Material HG1223 = new Material(
+ "HG-1223", // Material Name
+ MaterialState.LIQUID, // State
+ new short[] { 39, 85, 159, 0 }, // Material Colour
+ 6357, // Melting Point in C
+ 8563, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().MERCURY, 1),
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 2), new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 3), new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ public static final Material HS188A = new Material(
+ "HS188-A", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4870, // Melting Point in C
+ 7550, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 20),
+ new MaterialStack(ELEMENT.getInstance().HAFNIUM, 20), new MaterialStack(TALONITE, 16),
+ new MaterialStack(ELEMENT.getInstance().RHENIUM, 10), new MaterialStack(NIOBIUM_CARBIDE, 10),
+ new MaterialStack(HASTELLOY_X, 8), new MaterialStack(TUNGSTENSTEEL, 8),
+ new MaterialStack(ZIRCONIUM_CARBIDE, 8), }); // Material Stacks with Percentage of required
+ // elements.
+
+ /**
+ * Stargate Materials - #D2FFA9 210, 255, 170
+ */
+ public static final Material TRINIUM_TITANIUM = new Material(
+ "Trinium Titanium Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3750, // Melting Point in C
+ 7210, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 3),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 7) });
+
+ public static final Material TRINIUM_NAQUADAH = new Material(
+ "Trinium Naquadah Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4200, // Melting Point in C
+ 7400, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 5),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH, 9) });
+ public static final Material TRINIUM_NAQUADAH_CARBON = new Material(
+ "Trinium Naquadah Carbonite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 6500, // Melting Point in C
+ 9000, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(TRINIUM_NAQUADAH, 9),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1) });
+
+ public static final Material TRINIUM_REINFORCED_STEEL = new Material(
+ "Arceus Alloy 2B", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 205, 197, 23, 0 }, // Material Colour
+ 7555, // Melting Point in C
+ 12350,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 30),
+ new MaterialStack(ALLOY.MARAGING350, 40), new MaterialStack(ALLOY.TUNGSTENSTEEL, 20),
+ new MaterialStack(ALLOY.OSMIRIDIUM, 10), new MaterialStack(ELEMENT.getInstance().STRONTIUM, 10) });
+
+ /*
+ * Witchery Material
+ */
+
+ public static final Material KOBOLDITE = new Material(
+ "Koboldite", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 80, 210, 255, 0 }, // Material Colour
+ -1, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 35),
+ new MaterialStack(ELEMENT.getInstance().THAUMIUM, 30), new MaterialStack(ELEMENT.getInstance().IRON, 35) });
+
+ /*
+ * Top Tier Alloys
+ */
+
+ public static final Material HELICOPTER = new Material(
+ "HeLiCoPtEr", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5763,
+ 8192,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().HELIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().LITHIUM, 20), new MaterialStack(ELEMENT.getInstance().COBALT, 20),
+ new MaterialStack(ELEMENT.getInstance().PLATINUM, 20),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 20) });
+
+ // 0lafe Compound
+ public static final Material LAFIUM = new Material(
+ "Lafium Compound", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 6350, // Melting Point in C
+ 9865, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.HASTELLOY_N, 8),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH, 4), new MaterialStack(ELEMENT.getInstance().SAMARIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4), new MaterialStack(ELEMENT.getInstance().ARGON, 2),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 6), new MaterialStack(ELEMENT.getInstance().NICKEL, 8),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2) });
+
+ // Cinobi Alloy
+ public static final Material CINOBITE = new Material(
+ "Cinobite A243", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 7350, // Melting Point in C
+ 12565, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.ZERON_100, 16),
+ new MaterialStack(ELEMENT.getInstance().NAQUADRIA, 7),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 3), new MaterialStack(ELEMENT.getInstance().MERCURY, 2),
+ new MaterialStack(ELEMENT.getInstance().TIN, 2), new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ALLOY.OSMIRIDIUM, 6) });
+
+ // Piky Alloy
+ public static final Material PIKYONIUM = new Material(
+ "Pikyonium 64B", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 52, 103, 186, 0 }, // Material Colour
+ 6850, // Melting Point in C
+ 11765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.INCONEL_792, 16), new MaterialStack(ALLOY.EGLIN_STEEL, 10),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH_ENRICHED, 8),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 6), new MaterialStack(ELEMENT.getInstance().ANTIMONY, 4),
+ new MaterialStack(ELEMENT.getInstance().PLATINUM, 4), new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2),
+ new MaterialStack(ALLOY.TUNGSTENSTEEL, 8) });
+
+ // Piky Alloy
+ public static final Material ABYSSAL = new Material(
+ "Abyssal Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 9650, // Melting Point in C
+ 13765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STAINLESS_STEEL, 10),
+ new MaterialStack(ALLOY.TUNGSTEN_CARBIDE, 10), new MaterialStack(ALLOY.NICHROME, 10),
+ new MaterialStack(ALLOY.BRONZE, 10), new MaterialStack(ALLOY.INCOLOY_MA956, 10),
+ new MaterialStack(ELEMENT.getInstance().IODINE, 2), new MaterialStack(ELEMENT.getInstance().RADON, 2),
+ new MaterialStack(ELEMENT.getInstance().GERMANIUM, 2), });
+
+ // Alkalus Alloy
+ public static final Material LAURENIUM = new Material(
+ "Laurenium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 244, 168, 255, 0 }, // Material Colour
+ 6825, // Melting Point in C
+ 11355, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.EGLIN_STEEL, 40),
+ new MaterialStack(ELEMENT.getInstance().INDIUM, 10), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().DYSPROSIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().RHENIUM, 5), });
+
+ // Bot Alloy
+ public static final Material BOTMIUM = new Material(
+ "Botmium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 80, 160, 80, 0 }, // Material Colour
+ 8220, // Melting Point in C
+ 10540, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.NITINOL_60, 2),
+ new MaterialStack(ELEMENT.getInstance().OSMIUM, 12), new MaterialStack(ELEMENT.getInstance().RUTHENIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().THALLIUM, 6), });
+
+ // Titansteel
+ public static final Material TITANSTEEL = new Material(
+ "Titansteel", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 8250, // Melting Point in C
+ 11765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.TUNGSTEN_TITANIUM_CARBIDE, 3),
+ new MaterialStack(ELEMENT.getInstance().IGNIS, 1), new MaterialStack(ELEMENT.getInstance().TERRA, 1),
+ new MaterialStack(ELEMENT.getInstance().PERDITIO, 1), });
+
+ public static final Material OCTIRON = new Material(
+ "Octiron", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 9120, // Melting Point in C
+ 14200,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ARCANITE, 30), new MaterialStack(TITANSTEEL, 30),
+ new MaterialStack(ENERGYCRYSTAL, 5), new MaterialStack(STEEL_BLACK, 10),
+ new MaterialStack(ELEMENT.getInstance().THAUMIUM, 25) });
+
+ public static final Material BLACK_TITANIUM = new Material(
+ "Black Titanium", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ Materials.Titanium.mMeltingPoint * 4, // Melting Point in C
+ Materials.Titanium.mMeltingPoint * 16,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TITANIUM, 55),
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 12),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 8), new MaterialStack(ELEMENT.getInstance().COBALT, 6),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 4),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 4),
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 4), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ARGON, 5) });
+
+ public static final Material BABBIT_ALLOY = new Material(
+ "Babbit Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 268, // Melting Point in C
+ 589,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TIN, 10),
+ new MaterialStack(ELEMENT.getInstance().LEAD, 72), new MaterialStack(ELEMENT.getInstance().ANTIMONY, 16),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 2) });
+
+ public static final Material INDALLOY_140 = new Material(
+ "Indalloy 140", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5200, // Melting Point in C
+ 6500,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BISMUTH, 47),
+ new MaterialStack(ELEMENT.getInstance().LEAD, 25), new MaterialStack(ELEMENT.getInstance().TIN, 13),
+ new MaterialStack(ELEMENT.getInstance().CADMIUM, 10), new MaterialStack(ELEMENT.getInstance().INDIUM, 5) });
+
+ // Quantum
+ public static final Material QUANTUM = new Material(
+ "Quantum", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 10500, // Melting Point in C
+ 25000, // Boiling Point in C
+ 150, // Protons
+ 200, // Neutrons
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STELLITE, 15), new MaterialStack(ALLOY.ENERGYCRYSTAL, 5),
+ new MaterialStack(ALLOY.SILICON_CARBIDE, 5), new MaterialStack(ELEMENT.getInstance().GALLIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().AMERICIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 5), new MaterialStack(ELEMENT.getInstance().BISMUTH, 5),
+ new MaterialStack(ELEMENT.getInstance().GERMANIUM, 5) });
+}
diff --git a/src/main/java/gtPlusPlus/core/material/ELEMENT.java b/src/main/java/gtPlusPlus/core/material/ELEMENT.java
new file mode 100644
index 0000000000..9bcea2a47b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/ELEMENT.java
@@ -0,0 +1,651 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class ELEMENT {
+
+ public static final String[] NAMES = new String[] { "Hydrogen", "Helium" };
+
+ // First 50 Elements
+ public final Material HYDROGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Hydrogen);
+ public final Material HELIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Helium);
+ public final Material LITHIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lithium);
+ public final Material BERYLLIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Beryllium);
+ public final Material BORON = MaterialUtils.generateMaterialFromGtENUM(Materials.Boron);
+ public final Material CARBON = MaterialUtils.generateMaterialFromGtENUM(Materials.Carbon);
+ public final Material NITROGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Nitrogen);
+ public final Material OXYGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Oxygen);
+ public final Material FLUORINE = MaterialUtils.generateMaterialFromGtENUM(Materials.Fluorine);
+ public final Material NEON = new Material(
+ "Neon",
+ MaterialState.PURE_GAS,
+ new short[] { 240, 180, 30 },
+ -248,
+ -246,
+ 10,
+ 10,
+ false,
+ "Ne",
+ 0); // Not a GT Inherited Material
+ public final Material SODIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Sodium);
+ public final Material MAGNESIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Magnesium);
+ public final Material ALUMINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Aluminium);
+ public final Material ALUMINIUMOXIDE = MaterialUtils.generateMaterialFromGtENUM(Materials.Aluminiumoxide);
+ public final Material SILICON = MaterialUtils.generateMaterialFromGtENUM(Materials.Silicon);
+ public final Material SILICONDIOXIDE = MaterialUtils.generateMaterialFromGtENUM(Materials.SiliconDioxide);
+ public final Material PHOSPHORUS = MaterialUtils.generateMaterialFromGtENUM(Materials.Phosphorus);
+ public final Material SULFUR = MaterialUtils.generateMaterialFromGtENUM(Materials.Sulfur);
+ public final Material CHLORINE = MaterialUtils.generateMaterialFromGtENUM(Materials.Chlorine);
+ public final Material ARGON = MaterialUtils.generateMaterialFromGtENUM(Materials.Argon);
+ public final Material POTASSIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Potassium);
+ public final Material CALCIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Calcium);
+ public final Material SCANDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Scandium);
+ public final Material TITANIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Titanium);
+ public final Material VANADIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Vanadium);
+ public final Material CHROMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Chrome);
+ public final Material MANGANESE = MaterialUtils.generateMaterialFromGtENUM(Materials.Manganese);
+ public final Material IRON = MaterialUtils.generateMaterialFromGtENUM(Materials.Iron);
+ public final Material COBALT = MaterialUtils.generateMaterialFromGtENUM(Materials.Cobalt);
+ public final Material NICKEL = MaterialUtils.generateMaterialFromGtENUM(Materials.Nickel);
+ public final Material COPPER = MaterialUtils.generateMaterialFromGtENUM(Materials.Copper);
+ public final Material ZINC = MaterialUtils.generateMaterialFromGtENUM(Materials.Zinc);
+ public final Material GALLIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Gallium);
+ public final Material GERMANIUM = new Material(
+ "Germanium",
+ MaterialState.SOLID,
+ new short[] { 200, 200, 200 },
+ 937,
+ 2830,
+ 32,
+ 41,
+ false,
+ "Ge",
+ 0); // Not a GT Inherited Material
+ public final Material ARSENIC = MaterialUtils.generateMaterialFromGtENUM(Materials.Arsenic);
+ public final Material SELENIUM = new Material(
+ "Selenium",
+ MaterialState.SOLID,
+ new short[] { 190, 190, 190 },
+ 217,
+ 685,
+ 34,
+ 45,
+ false,
+ "Se",
+ 0); // Not a GT Inherited Material
+ public final Material BROMINE = new Material(
+ "Bromine",
+ MaterialState.PURE_LIQUID,
+ new short[] { 200, 25, 25 },
+ -7,
+ 58,
+ 35,
+ 45,
+ false,
+ "Br",
+ 0); // Not a GT Inherited Material
+ public final Material KRYPTON = new Material(
+ "Krypton",
+ MaterialState.PURE_GAS,
+ new short[] { 5, 200, 220 },
+ -157,
+ -153,
+ 36,
+ 48,
+ false,
+ "Kr",
+ 0); // Not a GT Inherited Material
+ public final Material RUBIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Rubidium);
+ public final Material STRONTIUM = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Strontium, new short[] { 230, 210, 110 }, TextureSet.SET_FLINT);
+ public final Material YTTRIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Yttrium);
+ public final Material ZIRCONIUM = new Material(
+ "Zirconium",
+ MaterialState.SOLID,
+ new short[] { 255, 250, 205 },
+ 1855,
+ 4377,
+ 40,
+ 51,
+ false,
+ "Zr",
+ 0); // Not a GT Inherited Material
+ public final Material NIOBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Niobium);
+ public final Material MOLYBDENUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Molybdenum);
+
+ public final Material RUTHENIUM = new Material(
+ "Ruthenium",
+ MaterialState.SOLID,
+ new short[] { 220, 220, 220 },
+ 2250,
+ 3900,
+ 44,
+ 57,
+ false,
+ "Ru",
+ 0); // Not a GT Inherited Material
+ public final Material RHODIUM = new Material(
+ "Rhodium",
+ MaterialState.SOLID,
+ new short[] { 220, 220, 220 },
+ 1966,
+ 3727,
+ 45,
+ 58,
+ false,
+ "Rh",
+ 0); // Not a GT Inherited Material
+ public final Material AMERICIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Americium);
+ public final Material TECHNETIUM = new Material(
+ "Technetium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 220, 220, 220 },
+ 2200,
+ 4877,
+ 43,
+ 55,
+ false,
+ "Tc",
+ 2); // Not a GT Inherited Material
+ public final Material NEPTUNIUM = new Material(
+ "Neptunium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 200, 220, 205 },
+ 640,
+ 3902,
+ 93,
+ 144,
+ false,
+ "Np",
+ 2); // Not a GT Inherited Material
+
+ public final Material PALLADIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Palladium);
+ public final Material SILVER = MaterialUtils.generateMaterialFromGtENUM(Materials.Silver);
+ public final Material CADMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Cadmium);
+ public final Material INDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Indium);
+ public final Material TIN = MaterialUtils.generateMaterialFromGtENUM(Materials.Tin);
+ public final Material ANTIMONY = MaterialUtils.generateMaterialFromGtENUM(Materials.Antimony);
+ public final Material TELLURIUM = new Material(
+ "Tellurium",
+ MaterialState.SOLID,
+ new short[] { 210, 210, 210 },
+ 449,
+ 989,
+ 52,
+ 76,
+ false,
+ "Te",
+ 0); // Not a GT Inherited Material
+ public final Material IODINE = new Material(
+ "Iodine",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 96, 96, 96 },
+ 114,
+ 184,
+ 53,
+ 74,
+ false,
+ "I",
+ 0); // Not a GT Inherited Material
+ public final Material XENON = new Material(
+ "Xenon",
+ MaterialState.PURE_GAS,
+ new short[] { 5, 105, 210 },
+ -111,
+ -108,
+ 54,
+ 77,
+ false,
+ "Xe",
+ 0); // Not a GT Inherited Material
+ public final Material CAESIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Caesium);
+ public final Material BARIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Barium);
+ public final Material LANTHANUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lanthanum);
+ public final Material CERIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Cerium);
+ public final Material PRASEODYMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Praseodymium);
+ public final Material NEODYMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Neodymium);
+ public final Material PROMETHIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Promethium);
+ public final Material SAMARIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Samarium);
+ public final Material EUROPIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Europium);
+ public final Material GADOLINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Gadolinium);
+ public final Material TERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Terbium);
+ public final Material DYSPROSIUM = new Material(
+ "Dysprosium",
+ MaterialState.SOLID,
+ new short[] { 180, 180, 180 },
+ 1412,
+ 2562,
+ 66,
+ 97,
+ false,
+ "Dy",
+ 0); // Not a GT Inherited Material
+ public final Material HOLMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Holmium);
+ public final Material ERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Erbium);
+ public final Material THULIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Thulium);
+ public final Material YTTERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Ytterbium);
+ public final Material LUTETIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lutetium);
+ public final Material HAFNIUM = new Material(
+ "Hafnium",
+ MaterialState.SOLID,
+ new short[] { 128, 128, 128 },
+ 2150,
+ 5400,
+ 72,
+ 106,
+ false,
+ "Hf",
+ 0); // Not a GT Inherited Material
+
+ // Second 50 elements
+ public final Material TANTALUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Tantalum);
+ public final Material TUNGSTEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Tungsten);
+ public final Material RHENIUM = new Material(
+ "Rhenium",
+ MaterialState.SOLID,
+ new short[] { 150, 150, 150 },
+ 3180,
+ 3627,
+ 75,
+ 111,
+ false,
+ "Re",
+ 0); // Not a GT Inherited Material
+ public final Material OSMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Osmium);
+ public final Material IRIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Iridium);
+ public final Material PLATINUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Platinum);
+ public final Material GOLD = MaterialUtils.generateMaterialFromGtENUM(Materials.Gold);
+ public final Material MERCURY = MaterialUtils.generateMaterialFromGtENUM(Materials.Mercury); // Mercury
+ public final Material THALLIUM = new Material(
+ "Thallium",
+ MaterialState.SOLID,
+ new short[] { 175, 175, 175 },
+ 304,
+ 1457,
+ 81,
+ 123,
+ false,
+ "Tl",
+ 0); // Not a GT Inherited Material
+ public final Material LEAD = MaterialUtils.generateMaterialFromGtENUM(Materials.Lead);
+ public final Material BISMUTH = MaterialUtils.generateMaterialFromGtENUM(Materials.Bismuth);
+ public final Material POLONIUM = new Material(
+ "Polonium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 180, 170, 180 },
+ 254,
+ 962,
+ 84,
+ 125,
+ false,
+ "Po",
+ 1); // Not a GT Inherited Material
+
+ public final Material RADON = MaterialUtils.generateMaterialFromGtENUM(Materials.Radon);
+
+ public final Material RADIUM = new Material(
+ "Radium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 165, 165, 165 },
+ 700,
+ 1737,
+ 88,
+ 138,
+ false,
+ "Ra",
+ 1); // Not a GT Inherited Material
+
+ public final Material THORIUM = new Material(
+ "Thorium",
+ MaterialState.SOLID,
+ Materials.Thorium.mRGBa,
+ Materials.Thorium.mMeltingPoint,
+ Materials.Thorium.mBlastFurnaceTemp,
+ 90,
+ 142,
+ false,
+ StringUtils.superscript("Th"),
+ 1);
+ public final Material PROTACTINIUM = new Material(
+ "Protactinium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 190, 150, 170 },
+ 1568,
+ 4027,
+ 91,
+ 140,
+ false,
+ "Pa",
+ 1); // Not a GT Inherited Material
+ public final Material URANIUM238 = MaterialUtils.generateMaterialFromGtENUM(Materials.Uranium);
+ public final Material URANIUM235 = MaterialUtils.generateMaterialFromGtENUM(Materials.Uranium235);
+ public final Material PLUTONIUM241 = MaterialUtils.generateMaterialFromGtENUM(Materials.Plutonium241);
+ public final Material CURIUM = new Material(
+ "Curium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 175, 85, 110 },
+ 1340,
+ 3110,
+ 96,
+ 151,
+ false,
+ "Cm",
+ 3); // Not a GT Inherited Material
+
+ public final Material CALIFORNIUM = new Material(
+ "Californium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 85, 110, 205 },
+ 899,
+ 1472,
+ 98,
+ 153,
+ false,
+ "Cf",
+ 4); // Not a GT Inherited Material
+
+ public final Material FERMIUM = new Material(
+ "Fermium",
+ MaterialState.LIQUID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 75, 90, 25 },
+ 1527,
+ 3850,
+ 100,
+ 157,
+ false,
+ "Fm",
+ 5); // Not a GT Inherited Material //Boiling Point is made up
+
+ // Misc
+ public final Material AER = MaterialUtils.generateMaterialFromGtENUM(Materials.InfusedAir, TextureSets.GEM_A.get());
+ public final Material IGNIS = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedFire, TextureSets.GEM_A.get());
+ public final Material TERRA = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedEarth, TextureSets.GEM_A.get());
+ public final Material AQUA = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedWater, TextureSets.GEM_A.get());
+ public final Material PERDITIO = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedEntropy, TextureSets.GEM_A.get());
+ public final Material ORDO = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedOrder, TextureSets.GEM_A.get());
+
+ public final Material NAQUADAH = MaterialUtils.generateMaterialFromGtENUM(Materials.Naquadah);
+ public final Material NAQUADAH_ENRICHED = MaterialUtils.generateMaterialFromGtENUM(Materials.NaquadahEnriched);
+ public final Material NAQUADRIA = MaterialUtils.generateMaterialFromGtENUM(Materials.Naquadria);
+ public final Material TRINIUM;
+ public final Material TRINIUM_REFINED;
+ // https://github.com/Blood-Asp/GT5-Unofficial/issues/609
+
+ // Custom Isotopes
+ public final Material LITHIUM7 = new Material(
+ "Lithium 7",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ Materials.Lithium.mRGBa,
+ Materials.Lithium.mMeltingPoint,
+ Materials.Lithium.mBlastFurnaceTemp,
+ Materials.Lithium.getProtons(),
+ Materials.Lithium.getNeutrons(),
+ Materials.Lithium.mBlastFurnaceRequired,
+ StringUtils.superscript("7Li"),
+ 0,
+ false); // Not a GT Inherited Material
+ public final Material URANIUM232 = new Material(
+ "Uranium 232",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 88, 220, 103, 0 },
+ 1132,
+ 4131,
+ 92,
+ 140,
+ false,
+ StringUtils.superscript("232U"),
+ 4); // Not a GT Inherited Material
+ public final Material URANIUM233 = new Material(
+ "Uranium 233",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 73, 220, 83, 0 },
+ 1132,
+ 4131,
+ 92,
+ 141,
+ false,
+ StringUtils.superscript("233U"),
+ 2); // Not a GT Inherited Material
+ public final Material THORIUM232 = new Material(
+ "Thorium 232",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 15, 60, 15, 0 },
+ Materials.Thorium.mMeltingPoint,
+ Materials.Thorium.mBlastFurnaceTemp,
+ 90,
+ 142,
+ false,
+ StringUtils.superscript("232Th"),
+ 1,
+ true); // Not a GT Inherited Material
+
+ // RTG Fuels
+ public final Material PLUTONIUM238 = new Material(
+ "Plutonium-238",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ Materials.Plutonium241.mDurability,
+ Materials.Plutonium241.mRGBa,
+ Materials.Plutonium241.mMeltingPoint,
+ Materials.Plutonium241.mBlastFurnaceTemp,
+ 94,
+ 144,
+ false,
+ StringUtils.superscript("238Pu"),
+ 2,
+ false); // Not a GT Inherited Material
+
+ public final Material MAGIC = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Magic, new short[] { 10, 185, 140 });
+ public final Material THAUMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Thaumium);
+
+ static {
+ Logger.MATERIALS("Initialising Base Elements.");
+ }
+
+ private static final ELEMENT INSTANCE = new ELEMENT();
+
+ public ELEMENT() {
+ // GTNH Trinium Handling
+ TRINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Trinium);
+ TRINIUM_REFINED = TRINIUM;
+ }
+
+ public static ELEMENT getInstance() {
+ return INSTANCE;
+ }
+
+ public static class STANDALONE {
+
+ public static final Material CELESTIAL_TUNGSTEN = new Material(
+ "Celestial Tungsten",
+ MaterialState.SOLID,
+ TextureSets.REFINED.get(),
+ new short[] { 50, 50, 50, 2 },
+ INSTANCE.TUNGSTEN.getMeltingPointC() + 6500,
+ INSTANCE.TUNGSTEN.getBoilingPointC() + 7500,
+ 160,
+ 101,
+ true,
+ "✦◆✦",
+ 0); // Not a GT Inherited Material
+ public static final Material ASTRAL_TITANIUM = new Material(
+ "Astral Titanium",
+ MaterialState.SOLID,
+ TextureSets.REFINED.get(),
+ new short[] { 220, 160, 240, 2 },
+ INSTANCE.TITANIUM.getMeltingPointC() + 7500,
+ INSTANCE.TITANIUM.getBoilingPointC() + 7500,
+ 145,
+ 133,
+ true,
+ "✧◇✧",
+ 0); // Not a GT Inherited Material
+ public static final Material CHRONOMATIC_GLASS = new Material(
+ "Chromatic Glass",
+ MaterialState.SOLID,
+ new short[] { 255, 255, 255, 3 },
+ 9200,
+ 17550,
+ 40,
+ 51,
+ false,
+ "⌘☯𓍰 𓍱 𓍲 𓍳 𓍴 𓍵 𓍶 𓍷 𓍸 ☯⌘ ",
+ 0); // Not a GT Inherited Material
+ public static final Material ADVANCED_NITINOL = new Material(
+ "Advanced Nitinol",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ ALLOY.NITINOL_60.getRGB(),
+ 8400,
+ 14377,
+ 40,
+ 51,
+ true,
+ StringUtils.subscript("⚷⚙⚷ Ni4Ti6"),
+ 0); // Not a GT Inherited Material
+ public static final Material HYPOGEN = new Material(
+ "Hypogen",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 220, 120, 75, 2 },
+ 11255,
+ 19377,
+ 240,
+ 251,
+ true,
+ "Hy⚶",
+ 0); // Not a GT Inherited Material
+ public static final Material RHUGNOR = new Material(
+ "Rhugnor",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ new short[] { 190, 0, 255, 0 },
+ 8750,
+ 14757,
+ 184,
+ 142,
+ true,
+ "Fs⚶",
+ 0); // Not a GT Inherited Material //funeris
+ public static final Material FORCE = new Material(
+ "Force",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ new short[] { 250, 250, 20, 0 },
+ 4550,
+ 6830,
+ 63,
+ 81,
+ true,
+ "Fc⚙",
+ 0); // Not a GT Inherited Material
+
+ // Runescape materials
+ public static final Material BLACK_METAL = new Material(
+ "Black Metal",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ new short[] { 5, 5, 5 },
+ 2350,
+ 4650,
+ 24,
+ 17,
+ false,
+ "҈",
+ 0,
+ new MaterialStack[] { new MaterialStack(getInstance().LEAD, 15),
+ new MaterialStack(getInstance().MANGANESE, 25), new MaterialStack(getInstance().CARBON, 60) }); // Not
+ // a
+ // GT
+ // Inherited
+ // Material
+ public static final Material WHITE_METAL = new Material(
+ "White Metal",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ new short[] { 255, 255, 255 },
+ 4560,
+ 7580,
+ 35,
+ 41,
+ false,
+ "҉",
+ 0,
+ new MaterialStack[] { new MaterialStack(getInstance().COPPER, 5),
+ new MaterialStack(getInstance().ANTIMONY, 10), new MaterialStack(getInstance().PLATINUM, 10),
+ new MaterialStack(getInstance().TIN, 75) }); // Not a GT Inherited Material
+
+ public static final Material GRANITE = new Material(
+ "Ancient Granite",
+ MaterialState.SOLID,
+ TextureSet.SET_SAND,
+ new short[] { 107, 107, 107 },
+ 500,
+ 2000,
+ 16,
+ 12,
+ false,
+ "«»",
+ 0,
+ false,
+ new MaterialStack[] { new MaterialStack(getInstance().OXYGEN, 16),
+ new MaterialStack(getInstance().IRON, 10), new MaterialStack(getInstance().SILICONDIOXIDE, 10),
+ new MaterialStack(getInstance().ALUMINIUMOXIDE, 6), new MaterialStack(getInstance().POTASSIUM, 6),
+ new MaterialStack(getInstance().CALCIUM, 4), new MaterialStack(getInstance().SODIUM, 4),
+ new MaterialStack(getInstance().YTTERBIUM, 2) }); // Not
+ // a
+ // GT
+ // Inherited
+ // Material
+
+ public static final Material RUNITE = new Material(
+ "Runite",
+ MaterialState.SOLID,
+ TextureSet.SET_FINE,
+ new short[] { 60, 200, 190 },
+ 6750,
+ 11550,
+ 73,
+ 87,
+ true,
+ "Rt*",
+ 0); // Not a GT Inherited Material
+ public static final Material DRAGON_METAL = new Material(
+ "Dragonblood",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 220, 40, 20, 2 },
+ 10160,
+ 17850,
+ 96,
+ 105,
+ true,
+ "۞",
+ 0); // Not a GT Inherited Material
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java b/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java
new file mode 100644
index 0000000000..c46b05fbb8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java
@@ -0,0 +1,592 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class MISC_MATERIALS {
+
+ /*
+ * Some of these materials purely exist as data objects, items will most likely be assigned separately. Most are
+ * just compositions which will have dusts assigned to them.
+ */
+
+ public static void run() {
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(POTASSIUM_NITRATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(SODIUM_NITRATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(STRONTIUM_OXIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(STRONTIUM_HYDROXIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(CYANOACETIC_ACID, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(SODIUM_CYANIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(CALCIUM_CHLORIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(COPPER_SULFATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(COPPER_SULFATE_HYDRATED, false);
+ WATER.registerComponentForMaterial(FluidUtils.getWater(1000));
+ }
+
+ public static final Material POTASSIUM_NITRATE = new Material(
+ "Potassium Nitrate",
+ MaterialState.SOLID, // State
+ null,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "KNO3",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().POTASSIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+ public static final Material SODIUM_NITRATE = new Material(
+ "Sodium Nitrate",
+ MaterialState.SOLID, // State
+ null,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "NaNO3",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+
+ public static final Material SOLAR_SALT_COLD = new Material(
+ "Solar Salt (Cold)",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(POTASSIUM_NITRATE, 4),
+ new MaterialStack(SODIUM_NITRATE, 6));
+
+ public static final Material SOLAR_SALT_HOT = new Material(
+ "Solar Salt (Hot)",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 200, 25, 25 }, // Material Colour
+ 1200, // Melting Point in C
+ 3300, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(POTASSIUM_NITRATE, 4),
+ new MaterialStack(SODIUM_NITRATE, 6));
+
+ public static final Material STRONTIUM_OXIDE = new Material(
+ "Strontium Oxide",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "SrO",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().STRONTIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ public static final Material SELENIUM_DIOXIDE = new Material(
+ "Selenium Dioxide",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().SELENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material SELENIOUS_ACID = new Material(
+ "Selenious Acid",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(SELENIUM_DIOXIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 8),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material HYDROGEN_CYANIDE = new Material(
+ "Hydrogen Cyanide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ 4, // Melting Point in C
+ 26, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1));
+
+ public static final Material CARBON_MONOXIDE = new Material(
+ "Carbon Monoxide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ public static final Material CARBON_DIOXIDE = new Material(
+ "Carbon Dioxide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material WOODS_GLASS = new Material(
+ "Wood's Glass", // Material Name
+ MaterialState.SOLID, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 220, 60, 255 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "Si4Ba3Na2Ni",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SILICON, 40),
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 30),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 10));
+
+ /*
+ * Rare Earth Materials
+ */
+
+ public static final Material RARE_EARTH_LOW = new Material(
+ "Rare Earth (I)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ null, // Material Colour
+ 1200,
+ 2500,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.GREENOCKITE, 1), new MaterialStack(ORES.LANTHANITE_CE, 1),
+ new MaterialStack(ORES.AGARDITE_CD, 1), new MaterialStack(ORES.YTTRIALITE, 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.NetherQuartz), 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.Galena), 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.Chalcopyrite), 1),
+ new MaterialStack(ORES.CRYOLITE, 1), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1) });
+
+ public static final Material RARE_EARTH_MID = new Material(
+ "Rare Earth (II)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ null, // Material Colour
+ 3500,
+ 5000,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.LANTHANITE_ND, 1), new MaterialStack(ORES.AGARDITE_ND, 1),
+ new MaterialStack(ORES.YTTRIAITE, 1), new MaterialStack(ORES.CROCROITE, 1),
+ new MaterialStack(ORES.NICHROMITE, 1), new MaterialStack(ORES.ZIRCON, 1),
+ new MaterialStack(ELEMENT.STANDALONE.GRANITE, 1), new MaterialStack(ELEMENT.STANDALONE.BLACK_METAL, 1),
+ new MaterialStack(ELEMENT.STANDALONE.RUNITE, 1) });
+
+ public static final Material RARE_EARTH_HIGH = new Material(
+ "Rare Earth (III)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ null, // Material Colour
+ 5200,
+ 7500,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.GADOLINITE_Y, 1), new MaterialStack(ORES.LEPERSONNITE, 1),
+ new MaterialStack(ORES.FLORENCITE, 1), new MaterialStack(ORES.FLUORCAPHITE, 1),
+ new MaterialStack(ORES.LAUTARITE, 1), new MaterialStack(ORES.DEMICHELEITE_BR, 1),
+ new MaterialStack(ORES.ALBURNITE, 1), new MaterialStack(ORES.SAMARSKITE_Y, 1),
+ new MaterialStack(ORES.AGARDITE_LA, 1), });
+
+ public static final Material WATER = new Material(
+ "Water",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ // OH
+ public static final Material HYDROXIDE = new Material(
+ "Hydroxide", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1));
+
+ // NH3
+ public static final Material AMMONIA = new Material(
+ "Ammonia", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -77, // Melting Point in C
+ -33, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3));
+
+ // NH4
+ public static final Material AMMONIUM = new Material(
+ "Ammonium", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 4));
+
+ public static final Material HYDROGEN_CHLORIDE = new Material(
+ "Hydrogen Chloride",
+ MaterialState.PURE_GAS,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material HYDROGEN_CHLORIDE_MIX = new Material(
+ "Hydrogen Chloride Mix",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material SODIUM_CHLORIDE = new Material(
+ "Sodium Chloride",
+ MaterialState.PURE_GAS,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material SALT_WATER = new Material(
+ "Salt Water",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(WATER, 3),
+ new MaterialStack(SODIUM_CHLORIDE, 1));
+
+ public static final Material BRINE = new Material(
+ "Brine",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(SALT_WATER, 1),
+ new MaterialStack(SODIUM_CHLORIDE, 2));
+
+ public static final Material STRONTIUM_HYDROXIDE = new Material(
+ "Strontium Hydroxide",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "Sr(OH)2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().STRONTIUM, 1),
+ new MaterialStack(MISC_MATERIALS.HYDROXIDE, 2));
+
+ // Glue Chemicals
+
+ public static final Material ACETIC_ANHYDRIDE = new Material(
+ "Acetic Anhydride",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 250, 240, 110 }, // Material Colour
+ -73, // Melting Point in C
+ 139, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "(CH3CO)2O",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 4),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+
+ public static final Material CHLOROACETIC_ACID = new Material(
+ "Chloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 230, 200, 90 }, // Material Colour
+ 63, // Melting Point in C
+ 189, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "ClCH2-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material DICHLOROACETIC_ACID = new Material(
+ "Dichloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 190, 160, 60 }, // Material Colour
+ 13, // Melting Point in C
+ 194, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "Cl2CH-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2));
+
+ public static final Material TRICHLOROACETIC_ACID = new Material(
+ "Trichloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 120, 100, 30 }, // Material Colour
+ 57, // Melting Point in C
+ 196, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "Cl3C-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material CHLOROACETIC_MIXTURE = new Material(
+ "Chloroacetic Mixture",
+ MaterialState.LIQUID, // State
+ null,
+ new short[] { 210, 160, 10 },
+ 40,
+ 192,
+ -1,
+ -1,
+ false,
+ "Cl?H?C-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 6),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 6));
+
+ public static final Material SODIUM_CYANIDE = new Material(
+ "Sodium Cyanide",
+ MaterialState.SOLID, // State
+ new short[] { 180, 190, 255 }, // Material Colour
+ 563, // Melting Point in C
+ 1496, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "NaCN",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1));
+
+ public static final Material CALCIUM_CHLORIDE = new Material(
+ "Calcium Chloride",
+ MaterialState.SOLID, // State
+ new short[] { 180, 190, 255 }, // Material Colour
+ 563, // Melting Point in C
+ 1496, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CaCl2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2));
+
+ public static final Material CYANOACETIC_ACID = new Material(
+ "Cyanoacetic Acid",
+ MaterialState.SOLID, // State
+ new short[] { 130, 130, 40 }, // Material Colour
+ 66, // Melting Point in C
+ 108, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C3H3NO2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 3),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material SOLID_ACID_MIXTURE = new Material(
+ "Solid Acid Catalyst Mixture",
+ MaterialState.LIQUID, // State
+ new short[] { 80, 40, 0 }, // Material Colour
+ -10, // Melting Point in C
+ 337, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "?H2SO4?",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material COPPER_SULFATE = new Material(
+ "Copper(II) Sulfate",
+ MaterialState.SOLID, // State
+ new short[] { 200, 200, 200 }, // Material Colour
+ 590, // Melting Point in C
+ 650, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CuSO4",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().COPPER, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material COPPER_SULFATE_HYDRATED = new Material(
+ "Copper(II) Sulfate Pentahydrate",
+ MaterialState.SOLID, // State
+ new short[] { 90, 170, 255 }, // Material Colour
+ 590, // Melting Point in C
+ 650, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CuSO4∙(H2O)5",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().COPPER, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material ETHYL_CYANOACETATE = new Material(
+ "Ethyl Cyanoacetate",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 0, 75, 160 }, // Material Colour
+ -22, // Melting Point in C
+ 210, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C5H7NO2",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material CYANOACRYLATE_POLYMER = new Material(
+ "Cyanoacrylate Polymer",
+ MaterialState.LIQUID, // State
+ new short[] { 140, 150, 160 }, // Material Colour
+ -25, // Melting Point in C
+ 55, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "(-C6H7NO2-)n",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material ETHYL_CYANOACRYLATE = new Material(
+ "Ethyl Cyanoacrylate (Super Glue)",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 170, 190, 200 }, // Material Colour
+ -25, // Melting Point in C
+ 55, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C6H7NO2",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material MUTATED_LIVING_SOLDER = new Material(
+ "Mutated Living Solder",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 147, 109, 155 }, // Material Colour
+ -200, // Melting Point in C
+ 500, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "?Sn?Bi?",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().TIN, 1),
+ new MaterialStack(ELEMENT.getInstance().BISMUTH, 1));
+}
diff --git a/src/main/java/gtPlusPlus/core/material/Material.java b/src/main/java/gtPlusPlus/core/material/Material.java
new file mode 100644
index 0000000000..fec80060ac
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/Material.java
@@ -0,0 +1,1725 @@
+package gtPlusPlus.core.material;
+
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gtPlusPlus.core.util.math.MathUtils.safeCast_LongToInt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.cell.BaseItemCell;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.tinkers.material.BaseTinkersMaterial;
+
+public class Material {
+
+ public static final Set<Material> mMaterialMap = new HashSet<>();
+ public static HashMap<String, Material> mMaterialCache = new HashMap<>();
+
+ public static final Map<String, Map<String, ItemStack>> mComponentMap = new HashMap<>();
+
+ public static HashMap<String, String> sChemicalFormula = new HashMap<>();
+
+ private String unlocalizedName;
+ private String localizedName;
+ private String translatedName;
+
+ private MaterialState materialState;
+ private TextureSet textureSet;
+
+ private Fluid mFluid;
+ private Fluid mPlasma;
+
+ private boolean vGenerateCells;
+
+ protected Object dataVar = MathUtils.generateSingularRandomHexValue();
+
+ private ArrayList<MaterialStack> vMaterialInput = new ArrayList<>();
+ public long[] vSmallestRatio;
+ public short vComponentCount;
+
+ private short[] RGBA;
+
+ private boolean usesBlastFurnace;
+ public boolean isRadioactive;
+ public byte vRadiationLevel;
+
+ private int meltingPointK;
+ private int boilingPointK;
+ private int meltingPointC;
+ private int boilingPointC;
+ private long vProtons;
+ private long vNeutrons;
+ private long vMass;
+ public int smallestStackSizeWhenProcessing; // Add a check for <=0 || > 64
+ public int vTier;
+ public int vVoltageMultiplier;
+ public String vChemicalFormula;
+ public String vChemicalSymbol;
+
+ public long vDurability;
+ public int vToolQuality;
+ public int vHarvestLevel;
+
+ public BaseTinkersMaterial vTiConHandler;
+
+ public short werkstoffID;
+
+ public static AutoMap<Materials> invalidMaterials = new AutoMap<>();
+
+ public Material(final String materialName, final MaterialState defaultState, final MaterialStack... inputs) {
+ this(materialName, defaultState, null, inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final MaterialStack... inputs) {
+ this(materialName, defaultState, null, 0, rgba, -1, -1, -1, -1, false, "", 0, false, false, inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba, int radiationLevel,
+ MaterialStack... materialStacks) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "",
+ radiationLevel,
+ false,
+ materialStacks);
+ }
+
+ public Material(String materialName, MaterialState defaultState, short[] rgba, int j, int k, int l, int m,
+ int radiationLevel, MaterialStack[] materialStacks) {
+ this(materialName, defaultState, null, 0, rgba, j, k, l, m, false, "", radiationLevel, false, materialStacks);
+ }
+
+ public Material(String materialName, MaterialState defaultState, final TextureSet set, short[] rgba,
+ int meltingPoint, int boilingPoint, int protons, int neutrons, int radiationLevel,
+ MaterialStack[] materialStacks) {
+ this(
+ materialName,
+ defaultState,
+ set,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ false,
+ "",
+ radiationLevel,
+ false,
+ materialStacks);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ 0,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemSymbol, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemSymbol,
+ 0,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, boolean generateCells, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ 0,
+ generateCells,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final int radiationLevel, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final long durability,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final int radiationLevel, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel, boolean addCells,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ addCells,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, TextureSet textureSet,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ textureSet,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, TextureSet textureSet,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel, boolean addCells,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ textureSet,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ addCells,
+ true,
+ inputs);
+ }
+
+ private Material(final String materialName, final MaterialState defaultState, final long durability,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final TextureSet set,
+ final long durability, final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons,
+ final long neutrons, final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ boolean generateCells, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ set,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final TextureSet set,
+ final long durability, short[] rgba, final int meltingPoint, final int boilingPoint, final long protons,
+ final long neutrons, final boolean blastFurnace, String chemicalSymbol, final int radiationLevel,
+ boolean generateCells, boolean generateFluid, final MaterialStack... inputs) {
+
+ if (mMaterialMap.add(this)) {}
+
+ if (defaultState == MaterialState.ORE) {
+ rgba = null;
+ }
+
+ mComponentMap.put(unlocalizedName, new HashMap<>());
+
+ try {
+ this.unlocalizedName = Utils.sanitizeString(materialName);
+ this.localizedName = materialName;
+ this.translatedName = GT_LanguageManager
+ .addStringLocalization("gtplusplus.material." + unlocalizedName, localizedName);
+ mMaterialCache.put(getLocalizedName().toLowerCase(), this);
+ Logger.INFO("Stored " + getLocalizedName() + " to cache with key: " + getLocalizedName().toLowerCase());
+
+ this.materialState = defaultState;
+
+ Logger.MATERIALS(this.getLocalizedName() + " is " + defaultState.name() + ".");
+
+ this.vGenerateCells = generateCells;
+
+ // Add Components to an array.
+ if (inputs == null) {
+ this.vMaterialInput = null;
+ } else {
+ if (inputs.length != 0) {
+ for (int i = 0; i < inputs.length; i++) {
+ if (inputs[i] != null) {
+ this.vMaterialInput.add(i, inputs[i]);
+ }
+ }
+ }
+ }
+
+ // set RGB
+
+ if (rgba == null) {
+ if (vMaterialInput.size() > 0) {
+
+ try {
+ Short[] mMixedRGB = new Short[3];
+ AutoMap<Material> mMaterialSet = MaterialUtils.getCompoundMaterialsRecursively(this);
+ for (int mnh = 0; mnh < 3; mnh++) {
+ AutoMap<Short> aDataSet = new AutoMap<>();
+ Set<Material> set4 = new HashSet<>();
+ for (Material u : mMaterialSet) {
+ // if (u.getState() == MaterialState.ORE || u.getState() == MaterialState.SOLID)
+ set4.add(u);
+ }
+ for (Material e : set4) {
+ aDataSet.put(e.getRGB()[mnh]);
+ }
+
+ Short aAverage = MathUtils.getShortAverage(aDataSet);
+ if (aAverage > Short.MAX_VALUE || aAverage < Short.MIN_VALUE
+ || aAverage < 0
+ || aAverage > 255) {
+ if (aAverage > 255) {
+ while (aAverage > 255) {
+ aAverage = (short) (aAverage / 2);
+ }
+ }
+ aAverage = (short) Math.max(Math.min(aAverage, 255), 0);
+ }
+ mMixedRGB[mnh] = aAverage;
+ }
+
+ if (mMixedRGB != null && mMixedRGB[0] != null && mMixedRGB[1] != null && mMixedRGB[2] != null) {
+ this.RGBA = new short[] { mMixedRGB[0], mMixedRGB[1], mMixedRGB[2], 0 };
+ } else {
+ this.RGBA = Materials.Steel.mRGBa;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ this.RGBA = Materials.Steel.mRGBa;
+ }
+ } else {
+ // Boring Grey Material
+
+ int aValueForGen = this.getUnlocalizedName()
+ .hashCode();
+ int hashSize = MathUtils.howManyPlaces(aValueForGen);
+
+ String a = String.valueOf(aValueForGen);
+ String b = "";
+
+ if (hashSize < 9) {
+ int aSecondHash = this.materialState.hashCode();
+ int hashSize2 = MathUtils.howManyPlaces(aSecondHash);
+ if (hashSize2 + hashSize >= 9) {
+ b = String.valueOf(aValueForGen);
+ } else {
+ String c = b;
+ while (MathUtils.howManyPlaces(hashSize + c.length()) < 9) {
+ c = c + c.hashCode();
+ }
+ b = c;
+ }
+ }
+
+ String valueR;
+ if (b != null) {
+ valueR = a + b;
+ } else {
+ valueR = a;
+ }
+ short fc[] = new short[3];
+ int aIndex = 0;
+ for (char gg : valueR.toCharArray()) {
+ short ui = Short.parseShort("" + gg);
+ if (ui > 255 || ui < 0) {
+ if (ui > 255) {
+ while (ui > 255) {
+ ui = (short) (ui / 2);
+ }
+ } else {
+ ui = 0;
+ }
+ }
+ fc[aIndex++] = ui;
+ }
+ this.RGBA = fc;
+ }
+ } else {
+ this.RGBA = rgba;
+ }
+
+ // Set Melting/Boiling point, if value is -1 calculate it from compound inputs.
+ if (meltingPoint != -1) {
+ this.meltingPointC = meltingPoint;
+ } else {
+ this.meltingPointC = this.calculateMeltingPoint();
+ }
+ if (boilingPoint != -1) {
+ if (boilingPoint != 0) {
+ this.boilingPointC = boilingPoint;
+ } else {
+ this.boilingPointC = meltingPoint * 4;
+ }
+ } else {
+ this.boilingPointC = this.calculateBoilingPoint();
+ }
+
+ this.meltingPointK = (int) MathUtils.celsiusToKelvin(this.meltingPointC);
+ this.boilingPointK = (int) MathUtils.celsiusToKelvin(this.boilingPointC);
+
+ // Set Proton/Neutron count, if value is -1 calculate it from compound inputs.
+ if (protons != -1) {
+ this.vProtons = protons;
+ } else {
+ this.vProtons = this.calculateProtons();
+ }
+ if (boilingPoint != -1) {
+ this.vNeutrons = neutrons;
+ } else {
+ this.vNeutrons = this.calculateNeutrons();
+ }
+
+ this.vMass = this.getMass();
+
+ // Sets tool Durability
+ if (durability != 0) {
+ this.vDurability = durability;
+ } else {
+ long aTempDura = 0;
+ for (MaterialStack g : this.getComposites()) {
+ if (g != null) {
+ aTempDura += safeCast_LongToInt(
+ g.getStackMaterial()
+ .getMass() * 2000);
+ }
+ }
+ this.vDurability = aTempDura > 0 ? aTempDura
+ : (this.getComposites()
+ .isEmpty() ? 51200
+ : 32000 * this.getComposites()
+ .size());
+ }
+
+ if ((this.vDurability >= 0) && (this.vDurability < 64000)) {
+ this.vToolQuality = 1;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 64000) && (this.vDurability < 128000)) {
+ this.vToolQuality = 2;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 128000) && (this.vDurability < 256000)) {
+ this.vToolQuality = 3;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 256000) && (this.vDurability < 512000)) {
+ this.vToolQuality = 3;
+ this.vHarvestLevel = 3;
+ } else if ((this.vDurability >= 512000) && (this.vDurability <= Integer.MAX_VALUE)) {
+ this.vToolQuality = 4;
+ this.vHarvestLevel = 4;
+ } else {
+ this.vToolQuality = 1;
+ this.vHarvestLevel = 1;
+ }
+
+ // Sets the Rad level
+ if (radiationLevel > 0) {
+ Logger.MATERIALS(this.getLocalizedName() + " is radioactive. Level: " + radiationLevel + ".");
+ this.isRadioactive = true;
+ this.vRadiationLevel = (byte) radiationLevel;
+ } else {
+ if (vMaterialInput.size() > 0) {
+ AutoMap<Byte> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(m.getStackMaterial().vRadiationLevel);
+ }
+ byte aAverage = MathUtils.getByteAverage(aDataSet);
+ if (aAverage > 0) {
+ Logger.MATERIALS(
+ this.getLocalizedName() + " is radioactive due to trace elements. Level: "
+ + aAverage
+ + ".");
+ this.isRadioactive = true;
+ this.vRadiationLevel = aAverage;
+ } else {
+ Logger.MATERIALS(this.getLocalizedName() + " is not radioactive.");
+ this.isRadioactive = false;
+ this.vRadiationLevel = 0;
+ }
+ } else {
+ Logger.MATERIALS(this.getLocalizedName() + " is not radioactive.");
+ this.isRadioactive = false;
+ this.vRadiationLevel = 0;
+ }
+ }
+
+ /*
+ * if (vMaterialInput.size() > 0) { AutoMap<Integer> aDataSet = new AutoMap<Integer>(); int bonus = 0; bonus
+ * += this.vMaterialInput.size(); bonus += MathUtils.roundToClosestInt(meltingPointC/1000);
+ * aDataSet.put(bonus); for (MaterialStack m : this.vMaterialInput) {
+ * aDataSet.put(m.getStackMaterial().vTier); } int aAverage = MathUtils.getIntAverage(aDataSet); if
+ * (aAverage > Integer.MAX_VALUE || aAverage < Integer.MIN_VALUE) { aAverage = 0; } if (aAverage > 0) {
+ * this.vTier = Math.min(aAverage, 10); } else { this.vTier = MaterialUtils.getTierOfMaterial((int)
+ * MathUtils.celsiusToKelvin(meltingPoint)); } } else { this.vTier = MaterialUtils.getTierOfMaterial((int)
+ * MathUtils.celsiusToKelvin(meltingPoint)); }
+ */
+ this.vTier = MaterialUtils.getTierOfMaterial(meltingPoint);
+
+ // Sets the materials 'tier'. Will probably replace this logic.
+
+ this.usesBlastFurnace = blastFurnace;
+ this.vVoltageMultiplier = MaterialUtils.getVoltageForTier(vTier);
+
+ this.vComponentCount = this.getComponentCount(inputs);
+ this.vSmallestRatio = this.getSmallestRatio(this.vMaterialInput);
+ int tempSmallestSize = 0;
+
+ if (this.vSmallestRatio != null) {
+ for (long l : this.vSmallestRatio) {
+ tempSmallestSize = (int) (tempSmallestSize + l);
+ }
+ this.smallestStackSizeWhenProcessing = tempSmallestSize; // Valid stacksizes
+ } else {
+ this.smallestStackSizeWhenProcessing = 1; // Valid stacksizes
+ }
+
+ // Makes a Fancy Chemical Tooltip
+
+ if (chemicalSymbol == null) {
+ chemicalSymbol = "";
+ }
+
+ this.vChemicalSymbol = chemicalSymbol;
+ if (this.vMaterialInput != null) {
+ this.vChemicalFormula = this.getToolTip(chemicalSymbol, OrePrefixes.dust.mMaterialAmount / M, true);
+ } else if (!this.vChemicalSymbol.equals("")) {
+ Logger.MATERIALS("materialInput is null, using a valid chemical symbol.");
+ this.vChemicalFormula = this.vChemicalSymbol;
+ } else {
+ Logger.MATERIALS("MaterialInput == null && chemicalSymbol probably equals nothing");
+ this.vChemicalSymbol = "??";
+ this.vChemicalFormula = "??";
+ }
+
+ if (generateFluid) {
+ final Materials aGregtechMaterial = tryFindGregtechMaterialEquivalent();
+ FluidStack aTest = FluidUtils.getWildcardFluidStack(localizedName, 1);
+ if (aTest != null) {
+ this.mFluid = aTest.getFluid();
+ checkForCellAndGenerate(this);
+ } else {
+ if (aGregtechMaterial != null && !MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aTest = FluidUtils.getWildcardFluidStack(aGregtechMaterial, 1);
+ }
+ if (aTest != null) {
+ this.mFluid = aTest.getFluid();
+ checkForCellAndGenerate(this);
+ } else {
+ mFluid = generateFluid();
+ }
+ }
+ // Don't generate plasma for composites
+ if (this.getComposites()
+ .isEmpty()) {
+ this.mPlasma = this.generatePlasma();
+ }
+ } else {
+ this.mFluid = null;
+ this.mPlasma = null;
+ }
+ String ratio = "";
+ if (this.vSmallestRatio != null) {
+ for (long l : this.vSmallestRatio) {
+ if (ratio.equals("")) {
+ ratio = String.valueOf(l);
+ } else {
+ ratio = ratio + ":" + l;
+ }
+ }
+ }
+
+ this.textureSet = setTextureSet(set, vTier);
+
+ if (TinkerConstruct.isModLoaded() && this.materialState == MaterialState.SOLID) {
+ if (this.getProtons() >= 98 || this.getComposites()
+ .size() > 1 || this.getMeltingPointC() >= 3600) {
+ this.vTiConHandler = new BaseTinkersMaterial(this);
+ }
+ }
+
+ sChemicalFormula.put(materialName.toLowerCase(), this.vChemicalFormula);
+ Logger.MATERIALS("Creating a Material instance for " + materialName);
+ Logger.MATERIALS(
+ "Formula: " + this.vChemicalFormula
+ + " Smallest Stack: "
+ + this.smallestStackSizeWhenProcessing
+ + " Smallest Ratio:"
+ + ratio);
+ Logger.MATERIALS("Protons: " + this.vProtons);
+ Logger.MATERIALS("Neutrons: " + this.vNeutrons);
+ Logger.MATERIALS("Mass: " + this.vMass + "/units");
+ Logger.MATERIALS("Melting Point: " + this.meltingPointC + "C.");
+ Logger.MATERIALS("Boiling Point: " + this.boilingPointC + "C.");
+ } catch (Throwable t) {
+ Logger.MATERIALS("Stack Trace for " + materialName);
+ t.printStackTrace();
+ }
+ }
+
+ private static void checkForCellAndGenerate(Material material) {
+ if (!material.vGenerateCells) {
+ return;
+ }
+ String aName = Utils.sanitizeString(material.unlocalizedName);
+ String aName2 = Utils.sanitizeString(material.unlocalizedName.toLowerCase());
+ String aName3 = (material.localizedName == null) ? aName : material.localizedName;
+ ItemStack aTestCell1 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName, 1);
+ ItemStack aTestCell2 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName2, 1);
+ ItemStack aTestCell3 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName3, 1);
+ if (aTestCell1 == null && aTestCell2 == null && aTestCell3 == null) {
+ Logger.INFO("Generating cell for " + material.localizedName);
+ new BaseItemCell(material);
+ } else {
+ if (aTestCell1 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell1);
+ } else if (aTestCell2 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName2);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell2);
+ } else if (aTestCell3 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName3);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell3);
+ }
+ }
+ }
+
+ public final TextureSet getTextureSet() {
+ synchronized (this) {
+ return textureSet;
+ }
+ }
+
+ public TextureSet setTextureSet(TextureSet set) {
+ return setTextureSet(set, vTier);
+ }
+
+ public TextureSet setTextureSet(TextureSet set, int aTier) {
+ if (set != null) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + set.mSetName
+ + ". This textureSet was supplied.");
+ return set;
+ }
+
+ int aGem = 0;
+ int aShiny = 0;
+ TextureSet aSet = null;
+
+ // Check Mixture Contents
+ for (MaterialStack m : this.getComposites()) {
+
+ // Gems
+ if (m.getStackMaterial() == ELEMENT.getInstance().AER) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().AQUA) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().IGNIS) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TERRA) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MAGIC) {
+ aGem++;
+ }
+ // Shiny Materials
+ if (m.getStackMaterial() == ELEMENT.getInstance().GOLD) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().SILVER) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().PLATINUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TITANIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().GERMANIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().GALLIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MERCURY) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MAGIC) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().SAMARIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TANTALUM) {
+ aShiny++;
+ }
+ }
+
+ if (aSet == null) {
+ if (aGem >= this.getComposites()
+ .size() / 2) {
+ if (MathUtils.isNumberEven(aGem)) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + TextureSet.SET_GEM_HORIZONTAL.mSetName
+ + ".");
+ return TextureSet.SET_GEM_HORIZONTAL;
+ } else {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + TextureSet.SET_GEM_VERTICAL.mSetName
+ + ".");
+ return TextureSet.SET_GEM_VERTICAL;
+ }
+ }
+ }
+
+ if (aSet == null) {
+ if (aShiny >= this.getComposites()
+ .size() / 3) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + TextureSet.SET_SHINY.mSetName + ".");
+ return TextureSet.SET_SHINY;
+ }
+ }
+
+ // build hash table with count
+ AutoMap<Material> sets = new AutoMap<>();
+ if (this.vMaterialInput != null) {
+ for (MaterialStack r : this.vMaterialInput) {
+ if (r.getStackMaterial()
+ .getTextureSet().mSetName.toLowerCase()
+ .contains("fluid")) {
+ sets.put(ELEMENT.getInstance().GOLD);
+ } else {
+ sets.put(r.getStackMaterial());
+ }
+ }
+ TextureSet mostUsedTypeTextureSet = MaterialUtils.getMostCommonTextureSet(new ArrayList<>(sets.values()));
+ if (mostUsedTypeTextureSet != null && mostUsedTypeTextureSet instanceof TextureSet) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + mostUsedTypeTextureSet.mSetName + ".");
+ return mostUsedTypeTextureSet;
+ }
+ }
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + Materials.Iron.mIconSet.mSetName + ". [Fallback]");
+ return Materials.Gold.mIconSet;
+ }
+
+ public final String getLocalizedName() {
+ if (this.localizedName != null) {
+ return this.localizedName;
+ }
+ return "ERROR BAD LOCALIZED NAME";
+ }
+
+ public final String getUnlocalizedName() {
+ if (this.unlocalizedName != null) {
+ return this.unlocalizedName;
+ }
+ return "ERROR.BAD.UNLOCALIZED.NAME";
+ }
+
+ public final String getTranslatedName() {
+ if (this.translatedName != null) {
+ return this.translatedName;
+ }
+ return "ERROR.BAD.TRANSLATED.NAME";
+ }
+
+ public final MaterialState getState() {
+ return this.materialState;
+ }
+
+ public final short[] getRGB() {
+ if (this.RGBA != null) {
+ return this.RGBA;
+ }
+ return new short[] { 255, 0, 0 };
+ }
+
+ public final short[] getRGBA() {
+ if (this.RGBA != null) {
+ if (this.RGBA.length == 4) {
+ return this.RGBA;
+ } else {
+ return new short[] { this.RGBA[0], this.RGBA[1], this.RGBA[2], 0 };
+ }
+ }
+ return new short[] { 255, 0, 0, 0 };
+ }
+
+ public final int getRgbAsHex() {
+
+ final int returnValue = Utils.rgbtoHexValue(this.RGBA[0], this.RGBA[1], this.RGBA[2]);
+ if (returnValue == 0) {
+ return (int) this.dataVar;
+ }
+ return Utils.rgbtoHexValue(this.RGBA[0], this.RGBA[1], this.RGBA[2]);
+ }
+
+ public final long getProtons() {
+ return this.vProtons;
+ }
+
+ public final long getNeutrons() {
+ return this.vNeutrons;
+ }
+
+ public final long getMass() {
+ return this.vProtons + this.vNeutrons;
+ }
+
+ public final int getMeltingPointC() {
+ return this.meltingPointC;
+ }
+
+ public final int getBoilingPointC() {
+ return this.boilingPointC;
+ }
+
+ public final int getMeltingPointK() {
+ return this.meltingPointK;
+ }
+
+ public final int getBoilingPointK() {
+ return this.boilingPointK;
+ }
+
+ public final boolean requiresBlastFurnace() {
+ return this.usesBlastFurnace;
+ }
+
+ public final ItemStack getComponentByPrefix(OrePrefixes aPrefix, int stacksize) {
+ String aKey = aPrefix.name();
+ Map<String, ItemStack> g = mComponentMap.get(this.unlocalizedName);
+ if (g == null) {
+ Map<String, ItemStack> aMap = new HashMap<>();
+ mComponentMap.put(unlocalizedName, aMap);
+ g = aMap;
+ }
+ ItemStack i = g.get(aKey);
+ if (i != null) {
+ return ItemUtils.getSimpleStack(i, stacksize);
+ } else {
+ // Try get a GT Material
+ Materials Erf = MaterialUtils.getMaterial(this.unlocalizedName);
+ if (Erf != null && !MaterialUtils.isNullGregtechMaterial(Erf)) {
+ ItemStack Erg = ItemUtils.getOrePrefixStack(aPrefix, Erf, stacksize);
+ if (Erg != null && ItemUtils.checkForInvalidItems(Erg)) {
+ Logger.MATERIALS("Found \"" + aKey + this.unlocalizedName + "\" using backup GT Materials option.");
+ g.put(aKey, Erg);
+ mComponentMap.put(unlocalizedName, g);
+ return Erg;
+ } else {
+ // Try get a molten cell
+ if (aPrefix == OrePrefixes.cell) {
+ Erg = ItemUtils.getOrePrefixStack(OrePrefixes.cellMolten, Erf, stacksize);
+ if (Erg != null && ItemUtils.checkForInvalidItems(Erg)) {
+ Logger.MATERIALS(
+ "Found \"" + OrePrefixes.cellMolten.name()
+ + this.unlocalizedName
+ + "\" using backup GT Materials option.");
+ g.put(aKey, Erg);
+ mComponentMap.put(unlocalizedName, g);
+ return Erg;
+ }
+ }
+ }
+ } else {
+ ItemStack u = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(aKey + this.unlocalizedName, stacksize);
+ if (u != null) {
+ g.put(aKey, u);
+ mComponentMap.put(unlocalizedName, g);
+ return u;
+ }
+ }
+ // Logger.MATERIALS("Unabled to find \"" + aKey + this.unlocalizedName + "\"");
+ return ItemUtils.getErrorStack(stacksize, (aKey + this.unlocalizedName + " x" + stacksize));
+ }
+ }
+
+ public final Block getBlock() {
+ Block b = Block.getBlockFromItem(getBlock(1).getItem());
+ if (b == null) {
+ Logger.INFO(
+ "[ERROR] Tried to get invalid block for " + this.getLocalizedName()
+ + ", returning debug block instead.");
+ }
+ return b != null ? b : Blocks.lit_furnace;
+ }
+
+ public final ItemStack getBlock(final int stacksize) {
+ ItemStack i = getComponentByPrefix(OrePrefixes.block, stacksize);
+ return i != null ? i
+ : ItemUtils.getItemStackOfAmountFromOreDictNoBroken("block" + this.unlocalizedName, stacksize);
+ }
+
+ public final ItemStack getDust(final int stacksize) {
+ ItemStack i = getComponentByPrefix(OrePrefixes.dust, stacksize);
+ return i != null ? i : ItemUtils.getGregtechDust("dust" + this.unlocalizedName, stacksize);
+ }
+
+ public final ItemStack getSmallDust(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustSmall, stacksize);
+ }
+
+ public final ItemStack getTinyDust(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustTiny, stacksize);
+ }
+
+ public final ItemStack getIngot(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ingot, stacksize);
+ }
+
+ public final ItemStack getHotIngot(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ingotHot, stacksize);
+ }
+
+ public final ItemStack getPlate(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plate, stacksize);
+ }
+
+ public final ItemStack getPlateDouble(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plateDouble, stacksize);
+ }
+
+ public final ItemStack getPlateDense(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plateDense, stacksize);
+ }
+
+ public final ItemStack getGear(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.gearGt, stacksize);
+ }
+
+ public final ItemStack getRod(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.stick, stacksize);
+ }
+
+ public final ItemStack getLongRod(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.stickLong, stacksize);
+ }
+
+ public final ItemStack getBolt(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.bolt, stacksize);
+ }
+
+ public final ItemStack getScrew(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.screw, stacksize);
+ }
+
+ public final ItemStack getFineWire(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireFine, stacksize);
+ }
+
+ public final ItemStack getFoil(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.foil, stacksize);
+ }
+
+ public final ItemStack getRing(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ring, stacksize);
+ }
+
+ public final ItemStack getRotor(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.rotor, stacksize);
+ }
+
+ public final ItemStack getFrameBox(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.frameGt, stacksize);
+ }
+
+ public final ItemStack getCell(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cell, stacksize);
+ }
+
+ public final ItemStack getPlasmaCell(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cellPlasma, stacksize);
+ }
+
+ public final ItemStack getNugget(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.nugget, stacksize);
+ }
+
+ public final ItemStack getWire01(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt01, stacksize);
+ }
+
+ public final ItemStack getWire02(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt02, stacksize);
+ }
+
+ public final ItemStack getWire04(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt04, stacksize);
+ }
+
+ public final ItemStack getWire08(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt08, stacksize);
+ }
+
+ public final ItemStack getWire12(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt12, stacksize);
+ }
+
+ public final ItemStack getWire16(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt16, stacksize);
+ }
+
+ public final ItemStack getCable01(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt01, stacksize);
+ }
+
+ public final ItemStack getCable02(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt02, stacksize);
+ }
+
+ public final ItemStack getCable04(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt04, stacksize);
+ }
+
+ public final ItemStack getCable08(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt08, stacksize);
+ }
+
+ public final ItemStack getCable12(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt12, stacksize);
+ }
+
+ public final ItemStack getCable16(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt16, stacksize);
+ }
+
+ /**
+ * Ore Components
+ *
+ * @return
+ */
+ public final ItemStack getOre(final int stacksize) {
+ return ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "ore" + Utils.sanitizeString(this.getUnlocalizedName()),
+ stacksize);
+ }
+
+ public final Block getOreBlock(final int stacksize) {
+ // Logger.DEBUG_MATERIALS("Trying to get ore block for "+this.getLocalizedName()+". Looking for
+ // '"+"ore"+Utils.sanitizeString(this.getUnlocalizedName())+"'.");
+ try {
+ ItemStack a1 = getOre(1);
+ Item a2 = a1.getItem();
+ Block a3 = Block.getBlockFromItem(a2);
+ if (a3 != null) {
+ return a3;
+ }
+
+ Block x = Block.getBlockFromItem(
+ ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken(
+ "ore" + Utils.sanitizeString(this.unlocalizedName),
+ stacksize)
+ .getItem());
+ if (x != null) {
+ return x;
+ }
+ } catch (Throwable t) {
+ // t.printStackTrace();
+ }
+ // Logger.MATERIALS("Failed getting the Ore Block for "+this.getLocalizedName()+".");
+ return Blocks.stone;
+ }
+
+ public final ItemStack getCrushed(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushed, stacksize);
+ }
+
+ public final ItemStack getCrushedPurified(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushedPurified, stacksize);
+ }
+
+ public final ItemStack getCrushedCentrifuged(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushedCentrifuged, stacksize);
+ }
+
+ public final ItemStack getDustPurified(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustPure, stacksize);
+ }
+
+ public final ItemStack getDustImpure(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustImpure, stacksize);
+ }
+
+ public final ItemStack getMilled(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.milled, stacksize);
+ }
+
+ public final ItemStack getRawOre(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.rawOre, stacksize);
+ }
+
+ public final boolean hasSolidForm() {
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { getDust(1), getBlock(1), getTinyDust(1), getSmallDust(1) })) {
+ return true;
+ }
+ return false;
+ }
+
+ public final ItemStack[] getMaterialComposites() {
+ if (this.vMaterialInput != null && !this.vMaterialInput.isEmpty()) {
+ final ItemStack[] temp = new ItemStack[this.vMaterialInput.size()];
+ for (int i = 0; i < this.vMaterialInput.size(); i++) {
+ // Utils.LOG_MATERIALS("i:"+i);
+ ItemStack testNull = null;
+ try {
+ testNull = this.vMaterialInput.get(i)
+ .getValidStack();
+ } catch (final Throwable r) {
+ Logger.MATERIALS("Failed gathering material stack for " + this.localizedName + ".");
+ Logger.MATERIALS("What Failed: Length:" + this.vMaterialInput.size() + " current:" + i);
+ }
+ try {
+ if (testNull != null) {
+ // Utils.LOG_MATERIALS("not null");
+ temp[i] = this.vMaterialInput.get(i)
+ .getValidStack();
+ }
+ } catch (final Throwable r) {
+ Logger.MATERIALS("Failed setting slot " + i + ", using " + this.localizedName);
+ }
+ }
+ return temp;
+ }
+ return new ItemStack[] {};
+ }
+
+ public final ArrayList<MaterialStack> getComposites() {
+ return this.vMaterialInput;
+ }
+
+ public final int[] getMaterialCompositeStackSizes() {
+ if (!this.vMaterialInput.isEmpty()) {
+ final int[] temp = new int[this.vMaterialInput.size()];
+ for (int i = 0; i < this.vMaterialInput.size(); i++) {
+ if (this.vMaterialInput.get(i) != null) {
+ temp[i] = this.vMaterialInput.get(i)
+ .getDustStack().stackSize;
+ } else {
+ temp[i] = 0;
+ }
+ }
+ return temp;
+ }
+ return new int[] {};
+ }
+
+ private short getComponentCount(final MaterialStack[] inputs) {
+
+ if (inputs == null || inputs.length < 1) {
+ return 1;
+ }
+ int counterTemp = 0;
+ for (final MaterialStack m : inputs) {
+ if (m.getStackMaterial() != null) {
+ counterTemp++;
+ }
+ }
+ if (counterTemp != 0) {
+ return (short) counterTemp;
+ } else {
+ return 1;
+ }
+ }
+
+ public final long[] getSmallestRatio(final ArrayList<MaterialStack> tempInput) {
+ if (tempInput != null) {
+ if (!tempInput.isEmpty()) {
+ Logger.MATERIALS("length: " + tempInput.size());
+ Logger.MATERIALS("(inputs != null): " + (tempInput != null));
+ // Utils.LOG_MATERIALS("length: "+inputs.length);
+ final long[] tempRatio = new long[tempInput.size()];
+ for (int x = 0; x < tempInput.size(); x++) {
+ if (tempInput.get(x) != null) {
+ tempRatio[x] = tempInput.get(x)
+ .getPartsPerOneHundred();
+ }
+ }
+
+ final long[] smallestRatio = MathUtils.simplifyNumbersToSmallestForm(tempRatio);
+
+ if (smallestRatio.length > 0) {
+ String tempRatioStringThing1 = "";
+ for (long value : tempRatio) {
+ tempRatioStringThing1 = tempRatioStringThing1 + value + " : ";
+ }
+ Logger.MATERIALS("Default Ratio: " + tempRatioStringThing1);
+
+ String tempRatioStringThing = "";
+ int tempSmallestCraftingUseSize = 0;
+ for (long l : smallestRatio) {
+ tempRatioStringThing = tempRatioStringThing + l + " : ";
+ tempSmallestCraftingUseSize = (int) (tempSmallestCraftingUseSize + l);
+ }
+ // this.smallestStackSizeWhenProcessing = tempSmallestCraftingUseSize;
+ Logger.MATERIALS("Smallest Ratio: " + tempRatioStringThing);
+ return smallestRatio;
+ }
+ }
+ }
+ return new long[] {};
+ }
+
+ public final String getToolTip(final String chemSymbol, final long aMultiplier, final boolean aShowQuestionMarks) {
+ if (!aShowQuestionMarks && (this.vChemicalFormula.equals("?") || this.vChemicalFormula.equals("??"))) {
+ return "";
+ }
+ Logger.MATERIALS("===============| Calculating Atomic Formula for " + this.localizedName + " |===============");
+ if (!chemSymbol.equals("")) {
+ return chemSymbol;
+ }
+ final ArrayList<MaterialStack> tempInput = this.vMaterialInput;
+ if (tempInput != null) {
+ if (!tempInput.isEmpty()) {
+ String dummyFormula = "";
+ final long[] dummyFormulaArray = this.getSmallestRatio(tempInput);
+ if (dummyFormulaArray != null) {
+ if (dummyFormulaArray.length >= 1) {
+ for (int e = 0; e < tempInput.size(); e++) {
+ MaterialStack g = tempInput.get(e);
+ if (g != null) {
+ if (g.getStackMaterial() != null) {
+
+ String aChemSymbol = g.getStackMaterial().vChemicalSymbol;
+ String aChemFormula = g.getStackMaterial().vChemicalFormula;
+
+ if (aChemSymbol == null) {
+ aChemSymbol = "??";
+ }
+ if (aChemFormula == null) {
+ aChemFormula = "??";
+ }
+
+ if (!aChemSymbol.equals("??")) {
+ if (dummyFormulaArray[e] > 1) {
+
+ if (aChemFormula.length() > 3
+ || StringUtils.uppercaseCount(aChemFormula) > 1) {
+ dummyFormula = dummyFormula + "("
+ + aChemFormula
+ + ")"
+ + dummyFormulaArray[e];
+ } else {
+ dummyFormula = dummyFormula + aChemFormula + dummyFormulaArray[e];
+ }
+ } else if (dummyFormulaArray[e] == 1) {
+ if (aChemFormula.length() > 3
+ || StringUtils.uppercaseCount(aChemFormula) > 1) {
+ dummyFormula = dummyFormula + "(" + aChemFormula + ")";
+ } else {
+ dummyFormula = dummyFormula + aChemFormula;
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ }
+ }
+ return StringUtils.subscript(dummyFormula);
+ // return dummyFormula;
+ }
+ Logger.MATERIALS("dummyFormulaArray <= 0");
+ }
+ Logger.MATERIALS("dummyFormulaArray == null");
+ }
+ Logger.MATERIALS("tempInput.length <= 0");
+ }
+ Logger.MATERIALS("tempInput == null");
+ return "??";
+ }
+
+ public final boolean queueFluidGeneration() {
+ return isFluidQueued = true;
+ }
+
+ public static final void generateQueuedFluids() {
+ for (Material m : mMaterialMap) {
+ if (m.isFluidQueued) {}
+ }
+ }
+
+ // If we need a fluid, let's just queue it for later.
+ public boolean isFluidQueued = false;
+
+ public final Fluid generateFluid() {
+ if (this.materialState == MaterialState.ORE) {
+ return null;
+ }
+
+ Fluid aGTBaseFluid = null;
+
+ // Clean up Internal Fluid Generation
+ final Materials n1 = MaterialUtils
+ .getMaterial(this.getLocalizedName(), Utils.sanitizeString(this.getLocalizedName()));
+ final Materials n2 = MaterialUtils
+ .getMaterial(this.getUnlocalizedName(), Utils.sanitizeString(this.getUnlocalizedName()));
+
+ FluidStack f1 = FluidUtils.getWildcardFluidStack(n1, 1);
+ FluidStack f2 = FluidUtils.getWildcardFluidStack(n2, 1);
+ FluidStack f3 = FluidUtils
+ .getWildcardFluidStack(Utils.sanitizeString(this.getUnlocalizedName(), new char[] { '-', '_' }), 1);
+ FluidStack f4 = FluidUtils
+ .getWildcardFluidStack(Utils.sanitizeString(this.getLocalizedName(), new char[] { '-', '_' }), 1);
+
+ if (f1 != null) {
+ aGTBaseFluid = f1.getFluid();
+ } else if (f2 != null) {
+ aGTBaseFluid = f2.getFluid();
+ } else if (f3 != null) {
+ aGTBaseFluid = f3.getFluid();
+ } else if (f4 != null) {
+ aGTBaseFluid = f4.getFluid();
+ }
+
+ ItemStack aFullCell = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + this.getUnlocalizedName(), 1);
+ ItemStack aFullCell2 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + this.getLocalizedName(), 1);
+ ItemStack aFullCell3 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "cell" + Utils.sanitizeString(this.getUnlocalizedName(), new char[] { '-', '_' }),
+ 1);
+ ItemStack aFullCell4 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "cell" + Utils.sanitizeString(this.getLocalizedName(), new char[] { '-', '_' }),
+ 1);
+
+ Logger.MATERIALS("Generating our own fluid.");
+ // Generate a Cell if we need to, but first validate all four searches are invalid
+
+ if (!ItemUtils.checkForInvalidItems(new ItemStack[] { aFullCell, aFullCell2, aFullCell3, aFullCell4 })) {
+ if (this.vGenerateCells) {
+ Item g = new BaseItemCell(this);
+ aFullCell = ItemUtils.getSimpleStack(g);
+ Logger.MATERIALS("Generated a cell for " + this.getUnlocalizedName());
+ } else {
+ Logger.MATERIALS("Did not generate a cell for " + this.getUnlocalizedName());
+ }
+ } else {
+ // One cell we searched for was valid, let's register it.
+ if (aFullCell != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell);
+ } else if (aFullCell2 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell2);
+ } else if (aFullCell3 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell3);
+ } else if (aFullCell4 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell4);
+ }
+ }
+
+ // We found a GT fluid, let's use it.
+ // Good chance we registered the cell from this material too.
+ if (aGTBaseFluid != null) {
+ return aGTBaseFluid;
+ }
+
+ // This fluid does not exist at all, time to generate it.
+ if (this.materialState == MaterialState.SOLID) {
+ return FluidUtils.addGTFluid(
+ this.getUnlocalizedName(),
+ "Molten " + this.getLocalizedName(),
+ this.RGBA,
+ 4,
+ this.getMeltingPointK(),
+ aFullCell,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ this.vGenerateCells);
+ } else if (this.materialState == MaterialState.LIQUID || this.materialState == MaterialState.PURE_LIQUID) {
+ return FluidUtils.addGTFluid(
+ this.getUnlocalizedName(),
+ this.getLocalizedName(),
+ this.RGBA,
+ 0,
+ this.getMeltingPointK(),
+ aFullCell,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ this.vGenerateCells);
+ } else if (this.materialState == MaterialState.GAS || this.materialState == MaterialState.PURE_GAS) {
+ return FluidUtils
+ .generateGas(unlocalizedName, this.getLocalizedName(), getMeltingPointK(), getRGBA(), vGenerateCells);
+ /*
+ * return FluidUtils.addGTFluid( this.getUnlocalizedName(), this.getLocalizedName()+" Gas", this.RGBA, 2,
+ * this.getMeltingPointK(), aFullCell, ItemUtils.getEmptyCell(), 1000, this.vGenerateCells);
+ */
+ } else { // Plasma
+ return this.generatePlasma();
+ }
+ }
+
+ public final Fluid generatePlasma() {
+ if (this.materialState == MaterialState.ORE) {
+ return null;
+ }
+ final Materials isValid = tryFindGregtechMaterialEquivalent();
+
+ if (!this.vGenerateCells) {
+ return null;
+ }
+ if (isValid != null) {
+ for (Materials m : invalidMaterials.values()) {
+ if (isValid == m) {
+ return null;
+ }
+ }
+ if (isValid.mPlasma != null) {
+ Logger.MATERIALS("Using a pre-defined Plasma from GT.");
+ return isValid.mPlasma;
+ }
+ }
+ Logger.MATERIALS("Generating our own Plasma.");
+ return FluidUtils.addGTPlasma(this);
+ }
+
+ public Fluid getFluid() {
+ return mFluid;
+ }
+
+ public Fluid getPlasma() {
+ return mPlasma;
+ }
+
+ public final FluidStack getFluidStack(final int fluidAmount) {
+ if (this.mFluid == null) {
+ return null;
+ }
+ final FluidStack moltenFluid = new FluidStack(this.mFluid, fluidAmount);
+ return moltenFluid;
+ }
+
+ public final boolean setFluid(Fluid aFluid) {
+ if (this.mFluid == null) {
+ this.mFluid = aFluid;
+ return true;
+ }
+ return false;
+ }
+
+ public final int calculateMeltingPoint() {
+ try {
+ AutoMap<Integer> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getMeltingPointC());
+ }
+ long aAverage = MathUtils.getIntAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 500;
+ }
+ }
+
+ public final int calculateBoilingPoint() {
+ try {
+
+ AutoMap<Integer> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getBoilingPointC());
+ }
+ long aAverage = MathUtils.getIntAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 2500;
+ }
+ }
+
+ public final long calculateProtons() {
+ try {
+
+ AutoMap<Long> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getProtons());
+ }
+ long aAverage = MathUtils.getLongAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 50;
+ }
+ }
+
+ public final long calculateNeutrons() {
+ try {
+
+ AutoMap<Long> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getNeutrons());
+ }
+ long aAverage = MathUtils.getLongAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 75;
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!Material.class.isInstance(obj)) {
+ return false;
+ }
+ Material aObj = (Material) obj;
+ if (aObj.unlocalizedName.equals(this.unlocalizedName)) {
+ if (aObj.localizedName.equals(this.localizedName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean registerComponentForMaterial(FluidStack aStack) {
+ return registerComponentForMaterial(this, aStack);
+ }
+
+ private static boolean registerComponentForMaterial(Material componentMaterial, FluidStack aStack) {
+ if (componentMaterial != null && aStack != null && componentMaterial.mFluid == null) {
+ componentMaterial.mFluid = aStack.getFluid();
+ return true;
+ }
+ return false;
+ }
+
+ public boolean registerComponentForMaterial(ComponentTypes aPrefix, ItemStack aStack) {
+ return registerComponentForMaterial(this, aPrefix.getGtOrePrefix(), aStack);
+ }
+
+ public boolean registerComponentForMaterial(OrePrefixes aPrefix, ItemStack aStack) {
+ return registerComponentForMaterial(this, aPrefix, aStack);
+ }
+
+ public static boolean registerComponentForMaterial(Material componentMaterial, ComponentTypes aPrefix,
+ ItemStack aStack) {
+ return registerComponentForMaterial(componentMaterial, aPrefix.getGtOrePrefix(), aStack);
+ }
+
+ public static boolean registerComponentForMaterial(Material componentMaterial, OrePrefixes aPrefix,
+ ItemStack aStack) {
+ if (componentMaterial == null) {
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = aPrefix.name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, aStack);
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ public Materials tryFindGregtechMaterialEquivalent() {
+ return tryFindGregtechMaterialEquivalent(this);
+ }
+
+ public static Materials tryFindGregtechMaterialEquivalent(Material aMaterial) {
+ String aMaterialName = aMaterial.getLocalizedName();
+ Materials aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aMaterialName = aMaterialName.replace(" ", "_");
+ aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aMaterialName = aMaterialName.replace(" ", "");
+ aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ return null;
+ } else {
+ return aGregtechMaterial;
+ }
+ } else {
+ return aGregtechMaterial;
+ }
+ } else {
+ return aGregtechMaterial;
+ }
+ }
+
+ public void setWerkstoffID(short werkstoffID) {
+ this.werkstoffID = werkstoffID;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java b/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java
new file mode 100644
index 0000000000..df2abd0acb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java
@@ -0,0 +1,428 @@
+package gtPlusPlus.core.material;
+
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.bolts.BaseItemBolt;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust.DustState;
+import gtPlusPlus.core.item.base.gears.BaseItemGear;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngotHot;
+import gtPlusPlus.core.item.base.nugget.BaseItemNugget;
+import gtPlusPlus.core.item.base.ore.BaseItemCentrifugedCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemImpureDust;
+import gtPlusPlus.core.item.base.ore.BaseItemPurifiedCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemPurifiedDust;
+import gtPlusPlus.core.item.base.ore.BaseItemRawOre;
+import gtPlusPlus.core.item.base.plates.BaseItemPlate;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDense;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDouble;
+import gtPlusPlus.core.item.base.rings.BaseItemRing;
+import gtPlusPlus.core.item.base.rods.BaseItemRod;
+import gtPlusPlus.core.item.base.rods.BaseItemRodLong;
+import gtPlusPlus.core.item.base.rotors.BaseItemRotor;
+import gtPlusPlus.core.item.base.screws.BaseItemScrew;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_AlloySmelter;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Assembler;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_BlastSmelter;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_DustGeneration;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Extruder;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_FluidCanning;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Fluids;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Fluorite;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MaterialProcessing;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MetalRecipe;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Ore;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Plasma;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Plates;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Recycling;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_ShapedCrafting;
+
+public class MaterialGenerator {
+
+ public static final AutoMap<Set<RunnableWithInfo<Material>>> mRecipeMapsToGenerate = new AutoMap<>();
+
+ @SuppressWarnings("unused")
+ private static volatile Item temp;
+
+ @SuppressWarnings("unused")
+ private static volatile Block tempBlock;
+
+ @Deprecated
+ public static boolean addFluidCannerRecipe(ItemStack aEmpty, ItemStack aFullContainer, FluidStack aFluidIn,
+ FluidStack rFluidOut) {
+ return addFluidCannerRecipe(aEmpty, aFullContainer, aFluidIn, rFluidOut, null, null);
+ }
+
+ @Deprecated
+ public static boolean addFluidCannerRecipe(ItemStack aEmpty, ItemStack aFullContainer, FluidStack aFluidIn,
+ FluidStack rFluidOut, Integer aTime, Integer aEu) {
+
+ RecipeGen_FluidCanning g = new RecipeGen_FluidCanning(false, aEmpty, aFullContainer, aFluidIn, null, null, 0);
+ if (g != null && g.valid()) {
+ return true;
+ }
+ return false;
+ }
+
+ public static void generate(final Material matInfo) {
+ generate(matInfo, true);
+ }
+
+ public static void generate(final Material matInfo, final boolean generateEverything) {
+ generate(matInfo, generateEverything, true);
+ }
+
+ public static boolean generate(final Material matInfo, final boolean generateEverything,
+ final boolean generateBlastSmelterRecipes) {
+ try {
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = matInfo.getRGBA();
+ final int Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+ final boolean hotIngot = matInfo.requiresBlastFurnace();
+ int materialTier = matInfo.vTier; // TODO
+
+ if ((materialTier > 10) || (materialTier <= 0)) {
+ materialTier = 2;
+ }
+
+ int sRadiation = 0;
+ if (ItemUtils.isRadioactive(materialName) || (matInfo.vRadiationLevel != 0)) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (matInfo.getState() == MaterialState.SOLID) {
+ if (generateEverything == true) {
+ if (sRadiation >= 1) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ temp = new BaseItemIngot(matInfo);
+
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemRod(matInfo);
+ temp = new BaseItemRodLong(matInfo);
+ } else {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.FRAME);
+ temp = new BaseItemIngot(matInfo);
+ if (hotIngot) {
+ temp = new BaseItemIngotHot(matInfo);
+ }
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ temp = new BaseItemBolt(matInfo);
+ temp = new BaseItemRod(matInfo);
+ temp = new BaseItemRodLong(matInfo);
+ temp = new BaseItemRing(matInfo);
+ temp = new BaseItemScrew(matInfo);
+ temp = new BaseItemRotor(matInfo);
+ temp = new BaseItemGear(matInfo);
+ temp = new BaseItemPlateDense(matInfo);
+ }
+ } else {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ }
+ } else if (matInfo.getState() == MaterialState.LIQUID) {
+ if (generateEverything == true) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ }
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ } else if (matInfo.getState() == MaterialState.GAS) {
+ temp = new BaseItemDust(matInfo);
+ FluidUtils.generateGas(unlocalizedName, materialName, matInfo.getMeltingPointK(), C, true);
+ } else if (matInfo.getState() == MaterialState.PURE_GAS) {
+ FluidUtils.generateGas(unlocalizedName, materialName, matInfo.getMeltingPointK(), C, true);
+ return true;
+ } else if (matInfo.getState() == MaterialState.PURE_LIQUID) {
+ FluidUtils.generateFluidNoPrefix(unlocalizedName, materialName, matInfo.getMeltingPointK(), C);
+ return true;
+ } else if (matInfo.getState() == MaterialState.ORE) {
+
+ }
+
+ // Add A jillion Recipes - old code
+ new RecipeGen_AlloySmelter(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ if (generateBlastSmelterRecipes) {
+ new RecipeGen_BlastSmelter(matInfo);
+ }
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+
+ new RecipeGen_DustGeneration(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ new RecipeGen_Plasma(matInfo);
+
+ return true;
+
+ } catch (final Throwable t) {
+
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ return false;
+ }
+ }
+
+ public static void generateDusts(final Material matInfo) {
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = matInfo.getRGBA();
+ final int Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+ int materialTier = matInfo.vTier; // TODO
+
+ if ((materialTier > 10) || (materialTier <= 0)) {
+ materialTier = 2;
+ }
+
+ int sRadiation = 0;
+ if (ItemUtils.isRadioactive(materialName) || (matInfo.vRadiationLevel != 0)) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (matInfo.getState() == MaterialState.SOLID) {
+ temp = new BaseItemDust(matInfo);
+ }
+
+ // Add A jillion Recipes - old code
+ try {
+ RecipeGen_DustGeneration.addMixerRecipe_Standalone(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ } catch (Throwable t) {
+ Logger.MATERIALS("Failed to generate some recipes for " + materialName);
+ Logger.ERROR("Failed to generate some recipes for " + materialName);
+ t.printStackTrace();
+ }
+ // RecipeGen_Recycling.generateRecipes(matInfo);
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo) {
+ generateNuclearMaterial(matInfo, true);
+ }
+
+ public static void generateNuclearDusts(final Material matInfo) {
+ generateNuclearDusts(matInfo, true);
+ }
+
+ public static void generateNuclearDusts(final Material matInfo, boolean generateDehydratorRecipe) {
+ generateNuclearMaterial(matInfo, false, true, false, false, true);
+ if (generateDehydratorRecipe && matInfo.getFluid() != null && matInfo.getDust(0) != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20) },
+ matInfo.getFluidStack(144),
+ null,
+ new ItemStack[] { matInfo.getDust(1), },
+ new int[] { 10000 },
+ 10 * (matInfo.vVoltageMultiplier / 5), // Time in ticks
+ matInfo.vVoltageMultiplier); // EU
+ } else {
+ Logger.INFO(
+ "Nuclear Dehydrator: Did not generate recipe for " + matInfo.getLocalizedName()
+ + " | Null Fluid? "
+ + (matInfo.getFluid() == null)
+ + " | Null Dust? "
+ + (matInfo.getDust(0) == null));
+ }
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo, final boolean generatePlates) {
+ generateNuclearMaterial(matInfo, true, true, true, generatePlates, true);
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo, final boolean generateBlock,
+ final boolean generateDusts, final boolean generateIngot, final boolean generatePlates,
+ final boolean disableOptionalRecipes) {
+ try {
+
+ if (generateBlock) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ }
+ if (generateDusts) {
+ temp = new BaseItemDust(matInfo);
+ }
+ if (generateIngot) {
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ }
+
+ if (generatePlates) {
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ }
+
+ if (!disableOptionalRecipes) {
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ }
+
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_DustGeneration(matInfo, disableOptionalRecipes);
+ new RecipeGen_Plasma(matInfo);
+
+ } catch (final Throwable t) {
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ }
+ }
+
+ public static void generateOreMaterial(final Material matInfo) {
+ generateOreMaterial(matInfo, true, true, true, matInfo.getRGBA());
+ }
+
+ @SuppressWarnings("unused")
+ public static void generateOreMaterial(final Material matInfo, boolean generateOre, boolean generateDust,
+ boolean generateSmallTinyDusts, short[] customRGB) {
+ try {
+
+ if (matInfo == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing null material.");
+ return;
+ }
+
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = customRGB;
+ final Integer Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+
+ if (Colour == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing " + materialName + ".");
+ return;
+ }
+
+ int sRadiation = 0;
+ if (matInfo.vRadiationLevel > 0) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (generateOre) {
+ tempBlock = new BlockBaseOre(matInfo, BlockTypes.ORE);
+ }
+
+ DustState aState = new DustState(generateDust, generateSmallTinyDusts, generateSmallTinyDusts);
+
+ if (!aState.generatesDust()) {
+ if (aState.generatesSmallDust()) {
+ temp = new BaseItemComponent(matInfo, ComponentTypes.DUSTSMALL);
+ }
+ if (aState.generatesTinyDust()) {
+ temp = new BaseItemComponent(matInfo, ComponentTypes.DUSTTINY);
+ }
+ } else {
+ temp = new BaseItemDust(aState, matInfo);
+ }
+
+ temp = new BaseItemCrushedOre(matInfo);
+ temp = new BaseItemCentrifugedCrushedOre(matInfo);
+ temp = new BaseItemPurifiedCrushedOre(matInfo);
+ temp = new BaseItemImpureDust(matInfo);
+ temp = new BaseItemPurifiedDust(matInfo);
+ temp = new BaseItemRawOre(matInfo);
+
+ Logger.MATERIALS(
+ "Generated all ore components for " + matInfo.getLocalizedName()
+ + ", now generating processing recipes.");
+
+ if (matInfo == FLUORIDES.FLUORITE) {
+ new RecipeGen_Fluorite(matInfo);
+ } else {
+ new RecipeGen_Ore(matInfo);
+ }
+
+ } catch (final Throwable t) {
+ Logger.MATERIALS(
+ "[Error] " + (matInfo != null ? matInfo.getLocalizedName() : "Null Material") + " failed to generate.");
+ t.printStackTrace();
+ }
+ }
+
+ public static boolean generateOreMaterialWithAllExcessComponents(final Material matInfo) {
+ try {
+ if (matInfo == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing null material.");
+ return false;
+ }
+ final short[] C = matInfo.getRGBA();
+ final Integer Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+
+ tempBlock = new BlockBaseOre(matInfo, BlockTypes.ORE);
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+
+ temp = new BaseItemCrushedOre(matInfo);
+ temp = new BaseItemCentrifugedCrushedOre(matInfo);
+ temp = new BaseItemPurifiedCrushedOre(matInfo);
+ temp = new BaseItemImpureDust(matInfo);
+ temp = new BaseItemPurifiedDust(matInfo);
+ temp = new BaseItemRawOre(matInfo);
+
+ Logger.MATERIALS(
+ "Generated all ore & base components for " + matInfo.getLocalizedName()
+ + ", now generating processing recipes.");
+
+ new RecipeGen_Ore(matInfo, true);
+ new RecipeGen_AlloySmelter(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ new RecipeGen_BlastSmelter(matInfo);
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ new RecipeGen_DustGeneration(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ new RecipeGen_Plasma(matInfo);
+ return true;
+ } catch (final Throwable t) {
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ t.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/MaterialStack.java b/src/main/java/gtPlusPlus/core/material/MaterialStack.java
new file mode 100644
index 0000000000..37070a35ec
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/MaterialStack.java
@@ -0,0 +1,116 @@
+package gtPlusPlus.core.material;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.OrePrefixes;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.bartworks.BW_Utils;
+
+public class MaterialStack {
+
+ private final transient int[] vAmount;
+ private final Material stackMaterial;
+ private final double vPercentageToUse;
+
+ public MaterialStack(final Material inputs, final double partOutOf100) {
+ this.stackMaterial = inputs;
+ // Logger.INFO("Tried getting MaterialStack for "+inputs.getLocalizedName());
+ this.vPercentageToUse = partOutOf100;
+ this.vAmount = this.math(partOutOf100);
+ }
+
+ private int[] math(final double val) {
+ double i;
+ // Cast to a BigDecimal to round it.
+ final BigDecimal bd = new BigDecimal(val).setScale(2, RoundingMode.HALF_EVEN);
+ i = bd.doubleValue();
+ // Split the string into xx.xx
+ final String[] arr = String.valueOf(i)
+ .split("\\.");
+ final int[] intArr = new int[2];
+ intArr[0] = Integer.parseInt(arr[0]);
+ intArr[1] = Integer.parseInt(arr[1]);
+ return intArr;
+ }
+
+ public ItemStack getValidStack() {
+ if (this.stackMaterial.getDust(1) == null) {
+ // if (this.stackMaterial.getCell(1) == null){
+ return null;
+ // }
+ // return this.stackMaterial.getCell(this.vAmount[0]);
+ }
+ return this.stackMaterial.getDust(this.vAmount[0]);
+ }
+
+ public ItemStack getDustStack() {
+ return this.stackMaterial.getDust(this.vAmount[0]);
+ }
+
+ public ItemStack getDustStack(final int amount) {
+ return this.stackMaterial.getDust(amount);
+ }
+
+ public ItemStack getUnificatedDustStack(final int amount) {
+ if (this.stackMaterial.werkstoffID != 0) {
+ ItemStack stack = BW_Utils
+ .getCorrespondingItemStack(OrePrefixes.dust, this.stackMaterial.werkstoffID, amount);
+ if (stack != null) {
+ return stack;
+ }
+ }
+ return getDustStack(amount);
+ }
+
+ public Material getStackMaterial() {
+ if (this.stackMaterial == null) {
+ Logger.MATERIALS("Tried getStackMaterial, got an invalid material.");
+ Logger.MATERIALS(ReflectionUtils.getMethodName(0));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(1));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(2));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(3));
+ return null;
+ }
+ return this.stackMaterial;
+ }
+
+ public double getvPercentageToUse() {
+ return this.vPercentageToUse;
+ }
+
+ public long[] getSmallestStackSizes() {
+ return this.stackMaterial.getSmallestRatio(this.stackMaterial.getComposites());
+ }
+
+ public int getPartsPerOneHundred() {
+ if (this.vAmount != null) {
+ if ((this.vAmount[0] >= 1) && (this.vAmount[0] <= 100)) {
+ return this.vAmount[0];
+ }
+ }
+ return 100;
+ }
+
+ public ItemStack getLeftOverStacksFromDecimalValue() {
+ final int temp = this.vAmount[1];
+ int getCount;
+ if ((temp >= 25) && (temp <= 99)) {
+ getCount = temp / 25;
+ return this.stackMaterial.getSmallDust(getCount);
+ } else if ((temp >= 11) && (temp <= 24)) {
+ getCount = temp / 11;
+ return this.stackMaterial.getTinyDust(getCount);
+ } else {
+ return null;
+ }
+ }
+
+ public ItemStack[] getValidItemStacks() {
+ return ItemUtils.validItemsForOreDict(this.stackMaterial.getUnlocalizedName());
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java b/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java
new file mode 100644
index 0000000000..5e084b84bf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class NONMATERIAL {
+
+ // Soul Sand
+ public static final Material SOULSAND = MaterialUtils.generateMaterialFromGtENUM(Materials.SoulSand);
+
+ // Redstone
+ public static final Material REDSTONE = MaterialUtils.generateMaterialFromGtENUM(Materials.Redstone);
+
+ // Glowstone Dust
+ public static final Material GLOWSTONE = MaterialUtils.generateMaterialFromGtENUM(Materials.Glowstone);
+
+ // Enderpearl
+ public static final Material ENDERPEARL = MaterialUtils.generateMaterialFromGtENUM(Materials.EnderPearl);
+
+ // Raw Flesh
+ public static final Material MEAT = MaterialUtils.generateMaterialFromGtENUM(Materials.MeatRaw);
+
+ // Clay
+ public static final Material CLAY = MaterialUtils.generateMaterialFromGtENUM(Materials.Clay);
+
+ // Wrought Iron
+ public static final Material WROUGHT_IRON = MaterialUtils.generateMaterialFromGtENUM(Materials.WroughtIron);
+
+ // PTFE
+ public static final Material PTFE = MaterialUtils
+ .generateMaterialFromGtENUM(MaterialUtils.getMaterial("Polytetrafluoroethylene", "Plastic"));
+
+ // Plastic
+ public static final Material PLASTIC = MaterialUtils
+ .generateMaterialFromGtENUM(MaterialUtils.getMaterial("Plastic", "Rubber"));
+
+ static {
+ MEAT.setTextureSet(TextureSet.SET_ROUGH);
+ CLAY.setTextureSet(TextureSet.SET_ROUGH);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/ORES.java b/src/main/java/gtPlusPlus/core/material/ORES.java
new file mode 100644
index 0000000000..5079639e38
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/ORES.java
@@ -0,0 +1,701 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+
+public final class ORES {
+
+ public static final Material AGARDITE_CD = new Material(
+ "Agardite (Cd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 170, 188, 33, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (CdCa)Cu7(AsO2)4(O2H)5·3H2O
+ new MaterialStack(ELEMENT.getInstance().CADMIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 7), new MaterialStack(ELEMENT.getInstance().ARSENIC, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 11) });
+
+ public static final Material AGARDITE_LA = new Material(
+ "Agardite (La)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 206, 232, 9, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (LaCa)Cu5(AsO6)2(OH)4·3H2O
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 5), new MaterialStack(ELEMENT.getInstance().ARSENIC, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 19),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 10) });
+
+ public static final Material AGARDITE_ND = new Material(
+ "Agardite (Nd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 225, 244, 78, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (NdCa)Cu6(As3O3)2(O2H)6·3H2O
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 6), new MaterialStack(ELEMENT.getInstance().ARSENIC, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12) });
+
+ public static final Material AGARDITE_Y = new Material(
+ "Agardite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 210, 232, 44, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (YCa)Cu5(As2O4)3(OH)6·3H2O
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 5), new MaterialStack(ELEMENT.getInstance().ARSENIC, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12) });
+
+ // Alburnite
+ // Ag8GeTe2S4
+ public static final Material ALBURNITE = new Material(
+ "Alburnite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 16, 5, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().GOLD, 8), new MaterialStack(ELEMENT.getInstance().GERMANIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 4) });
+
+ public static final Material CERITE = new Material(
+ "Cerite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 68, 13, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ce,La,Ca)9(Mg,Fe+3)(SiO4)6(SiO3OH)(OH)3
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 9), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 9),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 9), new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().IRON, 3), new MaterialStack(ELEMENT.getInstance().SILICON, 7),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 20),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 4) });
+
+ // Comancheite
+ // Hg55N24(NH2,OH)4(Cl,Br)34
+ public static final Material COMANCHEITE = new Material(
+ "Comancheite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 65, 205, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().MERCURY, 54 / 4),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 28 / 4),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12 / 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8 / 4),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 34 / 4),
+ new MaterialStack(ELEMENT.getInstance().BROMINE, 34 / 4) });
+
+ public static final Material CROCROITE = new Material(
+ "Crocoite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_GEM_VERTICAL, // Texture Set
+ new short[] { 255, 143, 84, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LEAD, 2),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CAESIUM, 1), });
+
+ public static final Material CRYOLITE = new Material(
+ "Cryolite (F)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 205, 205, 255, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 3), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ // Demicheleite-(Br)
+ // BiSBr
+ public static final Material DEMICHELEITE_BR = new Material(
+ "Demicheleite (Br)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 165, 75, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().BISMUTH, 13), new MaterialStack(ELEMENT.getInstance().SULFUR, 11),
+ new MaterialStack(ELEMENT.getInstance().BROMINE, 1) });
+
+ public static final Material FLORENCITE = new Material(
+ "Florencite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 249, 249, 124, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // SmAl3(PO4)2(OH)6
+ new MaterialStack(ELEMENT.getInstance().SAMARIUM, 1), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 10),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6) });
+
+ public static final Material FLUORCAPHITE = new Material(
+ "Fluorcaphite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 255, 255, 30, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ca,Sr,Ce,Na)5(PO4)3F
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 5), new MaterialStack(MISC_MATERIALS.STRONTIUM_OXIDE, 5),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 5), new MaterialStack(ELEMENT.getInstance().SODIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 3), new MaterialStack(ELEMENT.getInstance().OXYGEN, 12),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6), });
+
+ // Gadolinite_Ce
+ public static final Material GADOLINITE_CE = new Material(
+ "Gadolinite (Ce)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 15, 159, 59, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 2), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2),
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 7),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 14), });
+
+ // Gadolinite_Y
+ public static final Material GADOLINITE_Y = new Material(
+ "Gadolinite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 35, 189, 99, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 2), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2),
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 3), new MaterialStack(ELEMENT.getInstance().SILICON, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 9), });
+
+ public static final Material GEIKIELITE = new Material(
+ "Geikielite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 187, 193, 204, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3) });
+
+ public static final Material GREENOCKITE = new Material(
+ "Greenockite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 110, 193, 25, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CADMIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1), });
+
+ public static final Material HIBONITE = new Material(
+ "Hibonite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 58, 31, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // ((Ca,Ce)(Al,Ti,Mg)12O19)
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 19), });
+
+ // Honeaite
+ // Au3TlTe2
+ public static final Material HONEAITE = new Material(
+ "Honeaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 165, 165, 5, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().GOLD, 3), new MaterialStack(ELEMENT.getInstance().THALLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2) });
+
+ // Irarsite
+ // (Ir,Ru,Rh,Pt)AsS
+ public static final Material IRARSITE = new Material(
+ "Irarsite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 125, 105, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().IRIDIUM, 1), new MaterialStack(ELEMENT.getInstance().RUTHENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().RHODIUM, 1), new MaterialStack(ELEMENT.getInstance().PLATINUM, 1),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 1), new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1) });
+
+ // Kashinite
+ // (Ir,Rh)2S3
+ public static final Material KASHINITE = new Material(
+ "Kashinite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 75, 105, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().IRIDIUM, 2), new MaterialStack(ELEMENT.getInstance().RHODIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 3) });
+
+ // Tl(Cl,Br)
+ public static final Material LAFOSSAITE = new Material(
+ "Lafossaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 165, 105, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1), new MaterialStack(ELEMENT.getInstance().BROMINE, 1),
+ new MaterialStack(ELEMENT.getInstance().THALLIUM, 1) });
+
+ public static final Material LANTHANITE_CE = new Material(
+ "Lanthanite (Ce)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 186, 113, 179, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ce)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ public static final Material LANTHANITE_LA = new Material(
+ "Lanthanite (La)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 219, 160, 214, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (La)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ public static final Material LANTHANITE_ND = new Material(
+ "Lanthanite (Nd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 153, 76, 145, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Nd)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ // Iodine Source
+ public static final Material LAUTARITE = new Material(
+ "Lautarite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 165, 105, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().IODINE, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 6) });
+
+ public static final Material LEPERSONNITE = new Material(
+ "Lepersonnite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_EMERALD, // Texture Set
+ new short[] { 175, 175, 20, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().DYSPROSIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 29),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 24) });
+
+ // Miessiite
+ // Pd11Te2Se2
+ public static final Material MIESSIITE = new Material(
+ "Miessiite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 75, 75, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 11),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SELENIUM, 2) });
+
+ public static final Material NICHROMITE = new Material(
+ "Nichromite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 22, 19, 19, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 1),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 1), new MaterialStack(ELEMENT.getInstance().IRON, 3),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 2), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ // Perroudite
+ // Hg5Ag4S5(I,Br)2Cl2
+ public static final Material PERROUDITE = new Material(
+ "Perroudite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 77, 165, 174, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SULFUR, 5),
+ new MaterialStack(ELEMENT.getInstance().SILVER, 4), new MaterialStack(ELEMENT.getInstance().IODINE, 2),
+ new MaterialStack(ELEMENT.getInstance().MERCURY, 5), new MaterialStack(ELEMENT.getInstance().BROMINE, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2) });
+
+ public static final Material POLYCRASE = new Material(
+ "Polycrase", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_ROUGH, // Texture Set
+ new short[] { 51, 0, 11, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 1), new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 6) });
+
+ // Radiobarite
+ // Radium, Barium, Barite?
+ public static final Material RADIOBARITE = new Material(
+ "Barite (Rd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FLINT, // Texture Set
+ new short[] { 205, 205, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 32), new MaterialStack(ELEMENT.getInstance().RADIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 16), new MaterialStack(ELEMENT.getInstance().OXYGEN, 15) });
+
+ // Samarskite_Y
+ public static final Material SAMARSKITE_Y = new Material(
+ "Samarskite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 65, 163, 164, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().IRON, 10), new MaterialStack(ELEMENT.getInstance().URANIUM235, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 3), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 3) });
+
+ // Samarskite_YB
+ public static final Material SAMARSKITE_YB = new Material(
+ "Samarskite (Yb)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 95, 193, 194, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().IRON, 9), new MaterialStack(ELEMENT.getInstance().URANIUM235, 3),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 2) });
+
+ public static final Material TITANITE = new Material(
+ "Titanite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 184, 198, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 10) });
+
+ public static final Material XENOTIME = new Material(
+ "Xenotime", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_OPAL, // Texture Set
+ new short[] { 235, 89, 199, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2), new MaterialStack(ELEMENT.getInstance().ERBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().EUROPIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ public static final Material YTTRIAITE = new Material( // TODO
+ "Yttriaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 255, 143, 84, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3), new MaterialStack(ELEMENT.getInstance().IRON, 4),
+ new MaterialStack(ELEMENT.getInstance().TIN, 1), new MaterialStack(ELEMENT.getInstance().NITROGEN, 2) });
+
+ public static final Material YTTRIALITE = new Material(
+ "Yttrialite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_RUBY, // Texture Set
+ new short[] { 35, 189, 99, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 7), });
+
+ public static final Material YTTROCERITE = new Material(
+ "Yttrocerite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_DIAMOND, // Texture Set
+ new short[] { 35, 19, 199, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().FLUORINE, 5),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), });
+
+ public static final Material ZIMBABWEITE = new Material(
+ "Zimbabweite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 193, 187, 131, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().POTASSIUM, 2), new MaterialStack(ELEMENT.getInstance().LEAD, 1),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 4), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 4), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 18) });
+
+ public static final Material ZIRCON = new Material(
+ "Zircon", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 195, 19, 19, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SILICON, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 4), });
+
+ public static final Material ZIRCONILITE = new Material(
+ "Zirconolite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 45, 26, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 2), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 14) });
+
+ public static final Material ZIRCOPHYLLITE = new Material(
+ "Zircophyllite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 30, 0, 6, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().POTASSIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 3), new MaterialStack(ELEMENT.getInstance().MANGANESE, 7),
+ new MaterialStack(ELEMENT.getInstance().IRON, 7), new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SILICON, 8), new MaterialStack(ELEMENT.getInstance().OXYGEN, 13),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 7), });
+
+ public static final Material ZIRKELITE = new Material(
+ "Zirkelite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 229, 208, 48, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ca,Th,Ce)Zr(Ti,Nb)2O7
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 1), new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 7) });
+
+ public static final Material DEEP_EARTH_REACTOR_FUEL_DEPOSIT = new Material(
+ "Radioactive Mineral Mix", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.NUCLEAR.get(), // Texture Set
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 4, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().RADON, 2), new MaterialStack(ELEMENT.getInstance().RADIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM238, 10),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 25),
+ new MaterialStack(ELEMENT.getInstance().THORIUM232, 4), new MaterialStack(FLUORCAPHITE, 6),
+ new MaterialStack(SAMARSKITE_Y, 8), new MaterialStack(TITANITE, 4) });
+}
diff --git a/src/main/java/gtPlusPlus/core/material/Particle.java b/src/main/java/gtPlusPlus/core/material/Particle.java
new file mode 100644
index 0000000000..b5cd30184e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/Particle.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.material;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class Particle {
+
+ public static final Particle GRAVITON;
+
+ public static final Particle UP;
+ public static final Particle DOWN;
+ public static final Particle CHARM;
+ public static final Particle STRANGE;
+ public static final Particle TOP;
+ public static final Particle BOTTOM;
+
+ public static final Particle ELECTRON;
+ public static final Particle ELECTRON_NEUTRINO;
+ public static final Particle MUON;
+ public static final Particle MUON_NEUTRINO;
+ public static final Particle TAU;
+ public static final Particle TAU_NEUTRINO;
+
+ public static final Particle GLUON;
+ public static final Particle PHOTON;
+ public static final Particle Z_BOSON;
+ public static final Particle W_BOSON;
+ public static final Particle HIGGS_BOSON;
+
+ public static final Particle PROTON;
+ public static final Particle NEUTRON;
+ public static final Particle LAMBDA;
+ public static final Particle OMEGA;
+
+ public static final Particle PION;
+ public static final Particle ETA_MESON;
+
+ public static final Particle UNKNOWN;
+
+ public static final AutoMap<Particle> aMap = new AutoMap<>();
+
+ static {
+
+ /*
+ * Standard Model of Physics
+ */
+
+ // I exist, because I must.
+ GRAVITON = new Particle(ElementaryGroup.BOSON, "Graviton");
+
+ // Quarks
+ UP = new Particle(ElementaryGroup.QUARK, "Up");
+ DOWN = new Particle(ElementaryGroup.QUARK, "Down");
+ CHARM = new Particle(ElementaryGroup.QUARK, "Charm");
+ STRANGE = new Particle(ElementaryGroup.QUARK, "Strange");
+ TOP = new Particle(ElementaryGroup.QUARK, "Top");
+ BOTTOM = new Particle(ElementaryGroup.QUARK, "Bottom");
+
+ // Leptons
+ ELECTRON = new Particle(ElementaryGroup.LEPTON, "Electron");
+ MUON = new Particle(ElementaryGroup.LEPTON, "Muon");
+ TAU = new Particle(ElementaryGroup.LEPTON, "Tau");
+ ELECTRON_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Electron Neutrino");
+ MUON_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Muon Neutrino");
+ TAU_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Tau Neutrino");
+
+ // Bosons
+ GLUON = new Particle(ElementaryGroup.BOSON, "Gluon");
+ PHOTON = new Particle(ElementaryGroup.BOSON, "Photon");
+ Z_BOSON = new Particle(ElementaryGroup.BOSON, "Z Boson");
+ W_BOSON = new Particle(ElementaryGroup.BOSON, "W Boson");
+ HIGGS_BOSON = new Particle(ElementaryGroup.BOSON, "Higgs Boson");
+
+ /*
+ * Composite Particles
+ */
+
+ // Baryons
+ PROTON = new Particle(ElementaryGroup.BARYON, "Proton", new Particle[] { UP, UP, DOWN });
+ NEUTRON = new Particle(ElementaryGroup.BARYON, "Neutron", new Particle[] { UP, DOWN, DOWN });
+ LAMBDA = new Particle(ElementaryGroup.BARYON, "Lambda", new Particle[] { UP, DOWN, STRANGE });
+ OMEGA = new Particle(ElementaryGroup.BARYON, "Omega", new Particle[] { STRANGE, STRANGE, STRANGE });
+
+ // Mesons
+ PION = new Particle(ElementaryGroup.MESON, "Pion", new Particle[] { MUON, MUON_NEUTRINO });
+ ETA_MESON = new Particle(ElementaryGroup.MESON, "ETA Meson", new Particle[] { PION, PION, PION });
+
+ // Wildcard
+ UNKNOWN = new Particle(ElementaryGroup.UNKNOWN, "Unknown");
+ }
+
+ public static enum ElementaryGroup {
+ QUARK,
+ LEPTON,
+ BOSON,
+ BARYON,
+ MESON,
+ UNKNOWN;
+ }
+
+ public final ElementaryGroup mParticleType;
+ public final String mParticleName;
+ public final Particle[] mComposition;
+
+ public Particle(ElementaryGroup aParticleType, String aParticleName) {
+ this(aParticleType, aParticleName, null);
+ }
+
+ public Particle(ElementaryGroup aParticleType, String aParticleName, Particle[] aComposition) {
+ mParticleType = aParticleType;
+ mParticleName = aParticleName;
+ mComposition = aComposition == null ? new Particle[] { this } : aComposition;
+ aMap.put(this);
+ }
+
+ public static ItemStack getIon(String aElementName, int aCharge) {
+ for (String g : gtPlusPlus.core.item.chemistry.IonParticles.NameToMetaMap.keySet()) {
+ if (g.toLowerCase()
+ .equals(Utils.sanitizeString(aElementName.toLowerCase()))) {
+ Integer meta = gtPlusPlus.core.item.chemistry.IonParticles.NameToMetaMap
+ .get(Utils.sanitizeString(aElementName.toLowerCase()));
+ if (meta == null) {
+ meta = 0;
+ }
+ ItemStack aIon = ItemUtils.simpleMetaStack(ModItems.itemIonParticleBase, meta, 1);
+ if (aCharge != 0) {
+ IonParticles.setChargeState(aIon, aCharge);
+ }
+ return aIon;
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack getBaseParticle(Particle aParticle) {
+ String aPartName = Utils.sanitizeString(aParticle.mParticleName.toLowerCase());
+ for (String g : gtPlusPlus.core.item.chemistry.StandardBaseParticles.NameToMetaMap.keySet()) {
+ if (g.toLowerCase()
+ .equals(aPartName)) {
+ Integer meta = gtPlusPlus.core.item.chemistry.StandardBaseParticles.NameToMetaMap.get(aPartName);
+ if (meta == null) {
+ meta = 0;
+ }
+ return ItemUtils.simpleMetaStack(ModItems.itemStandarParticleBase, meta, 1);
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java b/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java
new file mode 100644
index 0000000000..5a50a604da
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.core.material.nuclear;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+
+public class FLUORIDES {
+
+ public static final Material FLUORITE = new Material(
+ "Fluorite (F)", // Material Name
+ MaterialState.ORE, // State
+ null, // Material Colour
+ Materials.Fluorine.mMeltingPoint, // Melting Point in C
+ Materials.Fluorine.mBlastFurnaceTemp, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ false, // Generate cells
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 16),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 32), new MaterialStack(ELEMENT.getInstance().IRON, 4),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2) });
+
+ // ThF4
+ public static final Material THORIUM_TETRAFLUORIDE = new Material(
+ "Thorium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // ThF6
+ public static final Material THORIUM_HEXAFLUORIDE = new Material(
+ "Thorium Hexafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 1),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 12) });
+
+ // UF4
+ public static final Material URANIUM_TETRAFLUORIDE = new Material(
+ "Uranium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().URANIUM233, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // UF6
+ public static final Material URANIUM_HEXAFLUORIDE = new Material(
+ "Uranium Hexafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // ZrF4
+
+ public static final Material ZIRCONIUM_TETRAFLUORIDE = new Material(
+ "Zirconium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Texture Set (Autogenerated)
+ 0,
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "ZrF\u2084",
+ -1,
+ true,
+ false,
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ /*
+ * public static final Material ZIRCONIUM_TETRAFLUORIDE = new Material( "Zirconium Tetrafluoride", //Material Name
+ * MaterialState.LIQUID, //State null, //Material Colour -1, //Melting Point in C -1, //Boiling Point in C -1,
+ * //Protons -1, //Neutrons false, //Uses Blast furnace? //Material Stacks with Percentage of required elements. new
+ * MaterialStack[]{ new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1), new
+ * MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+ */
+
+ // BeF2
+ public static final Material BERYLLIUM_FLUORIDE = new Material(
+ "Beryllium Fluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // LiF
+ public static final Material LITHIUM_FLUORIDE = new Material(
+ "Lithium Fluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM7, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 1) });
+
+ // LFTR sub components
+
+ // (NH4)HF2
+ public static final Material AMMONIUM_BIFLUORIDE = new Material(
+ "Ammonium Bifluoride", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ 126, // Melting Point in C
+ 240, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(MISC_MATERIALS.AMMONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // Be(OH)2
+ public static final Material BERYLLIUM_HYDROXIDE = new Material(
+ "Beryllium Hydroxide", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(MISC_MATERIALS.HYDROXIDE, 2) });
+
+ // (NH4)2BeF4
+ public static final Material AMMONIUM_TETRAFLUOROBERYLLATE = new Material(
+ "Ammonium Tetrafluoroberyllate", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ 280, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(MISC_MATERIALS.AMMONIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // LFTR Output
+ public static final Material NEPTUNIUM_HEXAFLUORIDE = new Material(
+ "Neptunium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NEPTUNIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material TECHNETIUM_HEXAFLUORIDE = new Material(
+ "Technetium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TECHNETIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material SELENIUM_HEXAFLUORIDE = new Material(
+ "Selenium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SELENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material SODIUM_FLUORIDE = new Material(
+ "Sodium Fluoride", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 1) });
+
+ private static final FLUORIDES INSTANCE = new FLUORIDES();
+
+ public static FLUORIDES getInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java b/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java
new file mode 100644
index 0000000000..ebd24bad07
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java
@@ -0,0 +1,311 @@
+package gtPlusPlus.core.material.nuclear;
+
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.data.StringUtils;
+
+public final class NUCLIDE {
+
+ public static final Material Li2BeF4 = new Material(
+ "Lithium Tetrafluoroberyllate (LFTB)", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 566, // Melting Point in C
+ 870, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "Li2BeF4"), // Chemical Formula
+ 4, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 2),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1) });
+
+ public static final Material LiFBeF2ThF4UF4 = new Material(
+ "LFTR Fuel 3", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 566, // Melting Point in C
+ 870, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4UF4"), // Chemical Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 65),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 28), new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1) });
+
+ public static final Material LiFBeF2ZrF4UF4 = new Material(
+ "LFTR Fuel 2", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 650, // Melting Point in C
+ 940, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ZrF4UF4"), // Chemical Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 65),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 28),
+ new MaterialStack(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE, 5),
+ new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 2) });
+
+ public static final Material LiFBeF2ZrF4U235 = new Material(
+ "LFTR Fuel 1", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 590, // Melting Point in C
+ 890, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ZrF4") + StringUtils.superscript("235U"), // Chemical
+ // Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 55),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 25),
+ new MaterialStack(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE, 6),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 14) });
+
+ // Misc
+ public static final Material BurntLftrFuel_MK1 = new Material(
+ "Burnt Reactor Fuel I", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material BurntLftrFuel_MK2 = new Material(
+ "Burnt Reactor Fuel II", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ // LFTR Core Fluids
+ public static final Material LiFBeF2UF4FP = new Material(
+ "Uranium Depleted Molten Salt (U Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material Sparged_LiFBeF2UF4FP = new Material(
+ "Helium Sparged U Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material UF6F2FP = new Material(
+ "Phosphorous Uranium Hexafluoride (P-UF6)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript("UF6F2FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_HEXAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 3),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 1) });
+
+ public static final Material LiFBeF2 = new Material(
+ "Stable Molten Salt Base", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1) });
+
+ public static final Material LiFBeF2UF4 = new Material(
+ "LFTR Fuel Base", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(LiFBeF2, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1) });
+
+ // LFTR Blanket Fluids
+
+ // Tier 1 Fuel blanket output
+ public static final Material LiFThF4 = new Material(
+ "Thorium Depleted Molten Salt (T Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 2 Fuel blanket output
+ public static final Material LiFBeF2ThF4 = new Material(
+ "Thorium-Beryllium Depleted Molten Salt (TB Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 1 Fuel blanket output
+ public static final Material Sparged_LiFThF4 = new Material(
+ "Fluorine Sparged T Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 2 Fuel blanket output
+ public static final Material Sparged_LiFBeF2ThF4 = new Material(
+ "Fluorine Sparged TB Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ public static final Material UF6F2 = new Material(
+ "Fluorinated Uranium Hexafluoride (F-UF6)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript("UF6F2"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_HEXAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // Secondary material is molten metal
+ public static final Material NAQ_FUEL_T1 = new Material(
+ "Naquadah Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADAH, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 3) });
+
+ // Secondary material is a plasma
+ public static final Material NAQ_FUEL_T2 = new Material(
+ "Enriched Naquadah Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADAH_ENRICHED, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 3) });
+
+ // Secondary material is a plasma
+ public static final Material NAQ_FUEL_T3 = new Material(
+ "Naquadria Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADRIA, 2),
+ new MaterialStack(ELEMENT.getInstance().AMERICIUM, 3) });
+
+ private static final NUCLIDE INSTANCE = new NUCLIDE();
+
+ public static NUCLIDE getInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/material/state/MaterialState.java b/src/main/java/gtPlusPlus/core/material/state/MaterialState.java
new file mode 100644
index 0000000000..9fb5cde101
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/material/state/MaterialState.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.material.state;
+
+public enum MaterialState {
+
+ SOLID(0),
+ LIQUID(1),
+ GAS(2),
+ PLASMA(3),
+ PURE_LIQUID(4),
+ ORE(5),
+ PURE_GAS(6);
+
+ private final int STATE;
+
+ private MaterialState(final int State) {
+ this.STATE = State;
+ }
+
+ public int ID() {
+ return this.STATE;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java b/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java
new file mode 100644
index 0000000000..383f22dc23
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+
+public abstract class AbstractClientMessageHandler<T extends IMessage> extends AbstractMessageHandler<T> {
+
+ @Override
+ public final IMessage handleServerMessage(EntityPlayer player, T message, MessageContext ctx) {
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java b/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java
new file mode 100644
index 0000000000..a50bee6092
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+
+public abstract class AbstractMessageHandler<T extends IMessage> implements IMessageHandler<T, IMessage> {
+
+ /**
+ * Handle a message received on the client side
+ *
+ * @return a message to send back to the Server, or null if no reply is necessary
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract IMessage handleClientMessage(EntityPlayer player, T message, MessageContext ctx);
+
+ /**
+ * Handle a message received on the server side
+ *
+ * @return a message to send back to the Client, or null if no reply is necessary
+ */
+ public abstract IMessage handleServerMessage(EntityPlayer player, T message, MessageContext ctx);
+
+ @Override
+ public IMessage onMessage(T message, MessageContext ctx) {
+ if (ctx.side.isClient()) {
+ return handleClientMessage(GTplusplus.proxy.getPlayerEntity(ctx), message, ctx);
+ } else {
+ // server side proxy will return the server side EntityPlayer
+ return handleServerMessage(GTplusplus.proxy.getPlayerEntity(ctx), message, ctx);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java b/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java
new file mode 100644
index 0000000000..a45bf8dd17
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+
+public abstract class AbstractServerMessageHandler<T extends IMessage> extends AbstractMessageHandler<T> {
+
+ @Override
+ public final IMessage handleClientMessage(EntityPlayer player, T message, MessageContext ctx) {
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java b/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java
new file mode 100644
index 0000000000..ef43795206
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java
@@ -0,0 +1,8 @@
+package gtPlusPlus.core.network.packet;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+
+public interface AbstractPacket extends IMessage {
+
+ public abstract String getPacketName();
+}
diff --git a/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java b/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java
new file mode 100644
index 0000000000..9dfa1dbad5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java
@@ -0,0 +1,127 @@
+package gtPlusPlus.core.network.packet;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractServerMessageHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import io.netty.buffer.ByteBuf;
+
+public class Packet_VolumetricFlaskGui extends AbstractServerMessageHandler<Packet_VolumetricFlaskGui>
+ implements AbstractPacket {
+
+ private int x;
+ private int y;
+ private int z;
+ private int flaskValue;
+
+ public Packet_VolumetricFlaskGui() {}
+
+ public Packet_VolumetricFlaskGui(TileEntityVolumetricFlaskSetter tile, int aCustomValue) {
+ x = tile.xCoord;
+ y = tile.yCoord;
+ z = tile.zCoord;
+ flaskValue = aCustomValue;
+ Logger.INFO("Created Packet with values (" + x + ", " + y + ", " + z + " | " + flaskValue + ")");
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(x);
+ buf.writeInt(y);
+ buf.writeInt(z);
+ buf.writeInt(flaskValue);
+ Logger.INFO("Writing to byte buffer.");
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ x = buf.readInt();
+ y = buf.readInt();
+ z = buf.readInt();
+ flaskValue = buf.readInt();
+ Logger.INFO("Reading from byte buffer.");
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public void setZ(int z) {
+ this.z = z;
+ }
+
+ public int getCustomValue() {
+ return flaskValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ this.flaskValue = aVal;
+ }
+
+ protected TileEntityVolumetricFlaskSetter getTileEntity(Packet_VolumetricFlaskGui message, MessageContext ctx) {
+ Logger.INFO("Trying to get tile.");
+ World worldObj = getWorld(ctx);
+ if (worldObj == null) {
+ Logger.INFO("Bad world object.");
+ return null;
+ }
+ TileEntity te = worldObj.getTileEntity(message.getX(), message.getY(), message.getZ());
+ if (te == null) {
+ Logger.INFO("Bad Tile.");
+ return null;
+ }
+ if (te instanceof TileEntityVolumetricFlaskSetter) {
+ Logger.INFO("Found Tile.");
+ return (TileEntityVolumetricFlaskSetter) te;
+ }
+ Logger.INFO("Error.");
+ return null;
+ }
+
+ protected World getWorld(MessageContext ctx) {
+ if (ctx.side == Side.SERVER) {
+ return ctx.getServerHandler().playerEntity.worldObj;
+ } else {
+ return GTplusplus.proxy.getClientWorld();
+ }
+ }
+
+ @Override
+ public IMessage handleServerMessage(EntityPlayer player, Packet_VolumetricFlaskGui message, MessageContext ctx) {
+ TileEntityVolumetricFlaskSetter te = getTileEntity(message, ctx);
+ if (te != null) {
+ Logger.INFO("Setting value on tile. " + message.getCustomValue());
+ te.setCustomValue(message.getCustomValue());
+ // return new Packet_VolumetricFlaskGui2(te, message.getCustomValue());
+ }
+ return null;
+ }
+
+ @Override
+ public String getPacketName() {
+ return "Packet_VoluemtricFlaskSetter_ToServer";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java b/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java
new file mode 100644
index 0000000000..599469191b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.core.network.packet;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractClientMessageHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import io.netty.buffer.ByteBuf;
+
+public class Packet_VolumetricFlaskGui2 extends AbstractClientMessageHandler<Packet_VolumetricFlaskGui2>
+ implements AbstractPacket {
+
+ private int x;
+ private int y;
+ private int z;
+ private int flaskValue;
+
+ public Packet_VolumetricFlaskGui2() {}
+
+ public Packet_VolumetricFlaskGui2(TileEntityVolumetricFlaskSetter tile, int aCustomValue) {
+ x = tile.xCoord;
+ y = tile.yCoord;
+ z = tile.zCoord;
+ flaskValue = aCustomValue;
+ Logger.INFO("Created Packet with values (" + x + ", " + y + ", " + z + " | " + flaskValue + ")");
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(x);
+ buf.writeInt(y);
+ buf.writeInt(z);
+ buf.writeInt(flaskValue);
+ Logger.INFO("Writing to byte buffer.");
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ x = buf.readInt();
+ y = buf.readInt();
+ z = buf.readInt();
+ flaskValue = buf.readInt();
+ Logger.INFO("Reading from byte buffer.");
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public void setZ(int z) {
+ this.z = z;
+ }
+
+ public int getCustomValue() {
+ return flaskValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ this.flaskValue = aVal;
+ }
+
+ protected TileEntityVolumetricFlaskSetter getTileEntity(Packet_VolumetricFlaskGui2 message, MessageContext ctx) {
+ Logger.INFO("Trying to get tile.");
+ World worldObj = getWorld(ctx);
+ if (worldObj == null) {
+ Logger.INFO("Bad world object.");
+ return null;
+ }
+ TileEntity te = worldObj.getTileEntity(message.getX(), message.getY(), message.getZ());
+ if (te == null) {
+ Logger.INFO("Bad Tile.");
+ return null;
+ }
+ if (te instanceof TileEntityVolumetricFlaskSetter) {
+ Logger.INFO("Found Tile.");
+ return (TileEntityVolumetricFlaskSetter) te;
+ }
+ Logger.INFO("Error.");
+ return null;
+ }
+
+ protected World getWorld(MessageContext ctx) {
+ if (ctx.side == Side.SERVER) {
+ return ctx.getServerHandler().playerEntity.worldObj;
+ } else {
+ return GTplusplus.proxy.getClientWorld();
+ }
+ }
+
+ @Override
+ public String getPacketName() {
+ return "Packet_VoluemtricFlaskSetter_ToClient";
+ }
+
+ @Override
+ public IMessage handleClientMessage(EntityPlayer player, Packet_VolumetricFlaskGui2 message, MessageContext ctx) {
+ TileEntityVolumetricFlaskSetter te = getTileEntity(message, ctx);
+ if (te != null) {
+ Logger.INFO("Setting value on tile. " + message.getCustomValue());
+ te.setCustomValue(message.getCustomValue());
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java b/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java
new file mode 100644
index 0000000000..65e7d20af0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.potion;
+
+import net.minecraft.potion.PotionEffect;
+
+public class GtPotionEffect extends PotionEffect {
+
+ public GtPotionEffect(int aPotionID, int aDurationInSecs, int aLevel) {
+ super(aPotionID, aDurationInSecs * 20, aLevel, false);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java b/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java
new file mode 100644
index 0000000000..5f6f93542e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java
@@ -0,0 +1,190 @@
+package gtPlusPlus.core.proxy;
+
+import java.util.ArrayList;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.entity.RenderFireball;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.client.registry.ClientRegistry;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.client.renderer.CustomItemBlockRenderer;
+import gtPlusPlus.core.client.renderer.CustomOreBlockRenderer;
+import gtPlusPlus.core.client.renderer.RenderDecayChest;
+import gtPlusPlus.core.client.renderer.RenderMiningExplosivesPrimed;
+import gtPlusPlus.core.client.renderer.RenderSickBlaze;
+import gtPlusPlus.core.client.renderer.RenderStaballoyConstruct;
+import gtPlusPlus.core.client.renderer.RenderToxinball;
+import gtPlusPlus.core.common.CommonProxy;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.nei.NEI_GTPP_Config;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_CapeRenderer;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_FlaskRenderer;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_Render_MachineBlock;
+import ic2.core.item.ItemFluidCell;
+
+public class ClientProxy extends CommonProxy implements Runnable {
+
+ private final GTPP_CapeRenderer mCapeRenderer;
+
+ @SideOnly(Side.CLIENT)
+ public static boolean mFancyGraphics = false;
+
+ public ClientProxy() {
+ mCapeRenderer = new GTPP_CapeRenderer();
+ // Get Graphics Mode.
+ mFancyGraphics = Minecraft.isFancyGraphicsEnabled();
+ }
+
+ @SubscribeEvent
+ public void receiveRenderSpecialsEvent(net.minecraftforge.client.event.RenderPlayerEvent.Specials.Pre aEvent) {
+ if (ConfigSwitches.enableCustomCapes) {
+ mCapeRenderer.receiveRenderSpecialsEvent(aEvent);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static String playerName = "";
+
+ @Override
+ public void preInit(final FMLPreInitializationEvent e) {
+ super.preInit(e);
+ if (ConfigSwitches.enableCustomCapes) {
+ onPreLoad();
+ }
+ // Do this weird things for textures.
+ GTplusplus.loadTextures();
+ }
+
+ @Override
+ public void init(final FMLInitializationEvent e) {
+
+ /**
+ * Custom Block Renderers
+ */
+ new CustomOreBlockRenderer();
+ new CustomItemBlockRenderer();
+ new GTPP_Render_MachineBlock();
+
+ new GTPP_FlaskRenderer();
+
+ MinecraftForge.EVENT_BUS.register(new NEI_GTPP_Config());
+
+ super.init(e);
+ }
+
+ @Override
+ public void postInit(final FMLPostInitializationEvent e) {
+ super.postInit(e);
+ }
+
+ @Override
+ public void registerRenderThings() {
+
+ // Standard GT++
+
+ /**
+ * Entities
+ */
+ RenderingRegistry
+ .registerEntityRenderingHandler(EntityPrimedMiningExplosive.class, new RenderMiningExplosivesPrimed());
+ RenderingRegistry.registerEntityRenderingHandler(EntitySickBlaze.class, new RenderSickBlaze());
+ RenderingRegistry
+ .registerEntityRenderingHandler(EntityStaballoyConstruct.class, new RenderStaballoyConstruct());
+ RenderingRegistry.registerEntityRenderingHandler(EntityToxinballSmall.class, new RenderToxinball(1F));
+ RenderingRegistry.registerEntityRenderingHandler(EntityLightningAttack.class, new RenderFireball(1F));
+
+ /**
+ * Tiles
+ */
+ Logger.INFO("Registering Custom Renderer for the Lead Lined Chest.");
+ ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecayablesChest.class, new RenderDecayChest());
+ Logger.INFO("Registering Custom Renderer for the Egg Box.");
+
+ /**
+ * Items
+ */
+ for (Pair<Item, IItemRenderer> sItemRenderMappings : mItemRenderMappings) {
+ MinecraftForgeClient.registerItemRenderer(sItemRenderMappings.getKey(), sItemRenderMappings.getValue());
+ }
+ }
+
+ @Override
+ public int addArmor(final String armor) {
+ return RenderingRegistry.addNewArmourRendererPrefix(armor);
+ }
+
+ @Override
+ public void serverStarting(final FMLServerStartingEvent e) {}
+
+ public void onPreLoad() {
+
+ }
+
+ @Override
+ public void run() {
+
+ }
+
+ @Override
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ if (CORE.ConfigSwitches.hideUniversalCells) {
+ hideUniversalCells();
+ }
+ super.onLoadComplete(event);
+ }
+
+ public void hideUniversalCells() {
+ ArrayList<ItemStack> itemList = new ArrayList<>();
+ for (Fluid fluid : FluidRegistry.getRegisteredFluids()
+ .values()) {
+ if (fluid == null) {
+ continue;
+ }
+ itemList.add(ItemFluidCell.getUniversalFluidCell(new FluidStack(fluid, 2147483647)));
+ }
+ for (ItemStack aCell : itemList) {
+ codechicken.nei.api.API.hideItem(aCell);
+ }
+ }
+
+ @Override
+ public World getClientWorld() {
+ return FMLClientHandler.instance()
+ .getClient().theWorld;
+ }
+
+ @Override
+ public EntityPlayer getPlayerEntity(MessageContext ctx) {
+ return (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : super.getPlayerEntity(ctx));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java b/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java
new file mode 100644
index 0000000000..73b027af10
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.proxy;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.core.common.CommonProxy;
+
+@SuppressWarnings("unused")
+public class ServerProxy extends CommonProxy {
+
+ @Override
+ public void preInit(final FMLPreInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.preInit(e);
+ }
+
+ @Override
+ public void init(final FMLInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.init(e);
+ }
+
+ @Override
+ public void postInit(final FMLPostInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.postInit(e);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java b/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java
new file mode 100644
index 0000000000..a10d2cd05b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java
@@ -0,0 +1,114 @@
+package gtPlusPlus.core.recipe;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LOADER_Machine_Components {
+
+ public static void initialise() {
+ registerDefaultComponents();
+
+ registerGTNHComponents();
+ }
+
+ private static void registerDefaultComponents() {
+ // Machine Components
+ CI.electricMotor_LV = ItemList.Electric_Motor_LV.get(1);
+ CI.electricMotor_MV = ItemList.Electric_Motor_MV.get(1);
+ CI.electricMotor_HV = ItemList.Electric_Motor_HV.get(1);
+ CI.electricMotor_EV = ItemList.Electric_Motor_EV.get(1);
+ CI.electricMotor_IV = ItemList.Electric_Motor_IV.get(1);
+ CI.electricPump_LV = ItemList.Electric_Pump_LV.get(1);
+ CI.electricPump_MV = ItemList.Electric_Pump_MV.get(1);
+ CI.electricPump_HV = ItemList.Electric_Pump_HV.get(1);
+ CI.electricPump_EV = ItemList.Electric_Pump_EV.get(1);
+ CI.electricPump_IV = ItemList.Electric_Pump_IV.get(1);
+ CI.electricPiston_LV = ItemList.Electric_Piston_LV.get(1);
+ CI.electricPiston_MV = ItemList.Electric_Piston_MV.get(1);
+ CI.electricPiston_HV = ItemList.Electric_Piston_HV.get(1);
+ CI.electricPiston_EV = ItemList.Electric_Piston_EV.get(1);
+ CI.electricPiston_IV = ItemList.Electric_Piston_IV.get(1);
+ CI.robotArm_LV = ItemList.Robot_Arm_LV.get(1);
+ CI.robotArm_MV = ItemList.Robot_Arm_MV.get(1);
+ CI.robotArm_HV = ItemList.Robot_Arm_HV.get(1);
+ CI.robotArm_EV = ItemList.Robot_Arm_EV.get(1);
+ CI.robotArm_IV = ItemList.Robot_Arm_IV.get(1);
+ CI.conveyorModule_LV = ItemList.Conveyor_Module_LV.get(1);
+ CI.conveyorModule_MV = ItemList.Conveyor_Module_MV.get(1);
+ CI.conveyorModule_HV = ItemList.Conveyor_Module_HV.get(1);
+ CI.conveyorModule_EV = ItemList.Conveyor_Module_EV.get(1);
+ CI.conveyorModule_IV = ItemList.Conveyor_Module_IV.get(1);
+ CI.emitter_LV = ItemList.Emitter_LV.get(1);
+ CI.emitter_MV = ItemList.Emitter_MV.get(1);
+ CI.emitter_HV = ItemList.Emitter_HV.get(1);
+ CI.emitter_EV = ItemList.Emitter_EV.get(1);
+ CI.emitter_IV = ItemList.Emitter_IV.get(1);
+ CI.fieldGenerator_LV = ItemList.Field_Generator_LV.get(1);
+ CI.fieldGenerator_MV = ItemList.Field_Generator_MV.get(1);
+ CI.fieldGenerator_HV = ItemList.Field_Generator_HV.get(1);
+ CI.fieldGenerator_EV = ItemList.Field_Generator_EV.get(1);
+ CI.fieldGenerator_IV = ItemList.Field_Generator_IV.get(1);
+ CI.sensor_LV = ItemList.Sensor_LV.get(1);
+ CI.sensor_MV = ItemList.Sensor_MV.get(1);
+ CI.sensor_HV = ItemList.Sensor_HV.get(1);
+ CI.sensor_EV = ItemList.Sensor_EV.get(1);
+ CI.sensor_IV = ItemList.Sensor_IV.get(1);
+ CI.fluidRegulator_LV = ItemList.FluidRegulator_LV.get(1);
+ CI.fluidRegulator_MV = ItemList.FluidRegulator_MV.get(1);
+ CI.fluidRegulator_HV = ItemList.FluidRegulator_HV.get(1);
+ CI.fluidRegulator_EV = ItemList.FluidRegulator_EV.get(1);
+ CI.fluidRegulator_IV = ItemList.FluidRegulator_IV.get(1);
+ }
+
+ private static void registerGTNHComponents() {
+ // Machine Components
+ CI.electricMotor_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32606, 1);
+ CI.electricMotor_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32607, 1);
+ CI.electricMotor_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32608, 1);
+
+ CI.electricPump_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32615, 1);
+ CI.electricPump_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32616, 1);
+ CI.electricPump_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32617, 1);
+
+ CI.electricPiston_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32645, 1);
+ CI.electricPiston_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32646, 1);
+ CI.electricPiston_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32647, 1);
+
+ CI.robotArm_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32655, 1);
+ CI.robotArm_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32656, 1);
+ CI.robotArm_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32657, 1);
+
+ CI.conveyorModule_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32635, 1);
+ CI.conveyorModule_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32636, 1);
+ CI.conveyorModule_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32637, 1);
+
+ CI.emitter_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32685, 1);
+ CI.emitter_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32686, 1);
+ CI.emitter_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32687, 1);
+
+ CI.fieldGenerator_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32675, 1);
+ CI.fieldGenerator_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32676, 1);
+ CI.fieldGenerator_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32677, 1);
+
+ CI.sensor_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32695, 1);
+ CI.sensor_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32696, 1);
+ CI.sensor_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32697, 1);
+
+ CI.fluidRegulator_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32665, 1);
+ CI.fluidRegulator_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32666, 1);
+ CI.fluidRegulator_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32667, 1);
+
+ // Thanks 0lafe
+ CI.electricMotor_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32596, 1);
+ CI.electricPump_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32618, 1);
+ CI.electricPiston_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32648, 1);
+ CI.robotArm_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32658, 1);
+ CI.conveyorModule_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32638, 1);
+ CI.emitter_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32688, 1);
+ CI.fieldGenerator_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32678, 1);
+ CI.sensor_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32698, 1);
+
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java
new file mode 100644
index 0000000000..0900bbb4fa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java
@@ -0,0 +1,1806 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.Backpack;
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
+import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.thermalBoilerRecipes;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.Loader;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch.ASSEMBLY_LINE_RESEARCH;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPES_GREGTECH {
+
+ public static void run() {
+ Logger.INFO("Loading Recipes through GregAPI for Industrial Multiblocks.");
+ execute();
+ }
+
+ private static void execute() {
+ electrolyzerRecipes();
+ assemblerRecipes();
+ distilleryRecipes();
+ extractorRecipes();
+ fluidExtractorRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ blastFurnaceRecipes();
+ largeChemReactorRecipes();
+ fusionRecipes();
+ compressorRecipes();
+ mixerRecipes();
+ macerationRecipes();
+ centrifugeRecipes();
+ cyclotronRecipes();
+ blastSmelterRecipes();
+ extruderRecipes();
+ cuttingSawRecipes();
+ breweryRecipes();
+ laserEngraverRecipes();
+ assemblyLineRecipes();
+ fluidHeaterRecipes();
+ chemplantRecipes();
+ alloySmelterRecipes();
+ thermalBoilerRecipes();
+
+ /*
+ * Special Recipe handlers
+ */
+ RECIPES_SeleniumProcessing.init();
+ RECIPES_RareEarthProcessing.init();
+
+ addFuels();
+ }
+
+ private static void alloySmelterRecipes() {
+
+ // Wood's Glass Laser Lens
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MISC_MATERIALS.WOODS_GLASS.getDust(5), ItemList.Shape_Mold_Ball.get(0))
+ .itemOutputs(GregtechItemList.Laser_Lens_WoodsGlass.get(1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(alloySmelterRecipes);
+ }
+
+ private static void chemplantRecipes() {
+
+ // This is subsequently absorbed in water to form nitric acid and nitric oxide.
+ // 3 NO2 (g) + H2O (l) → 2 HNO3 (aq) + NO (g) (ΔH = −117 kJ/mol)
+ // The nitric oxide is cycled back for reoxidation. Alternatively, if the last step is carried out in air:
+ // 4 NO2 (g) + O2 (g) + 2 H2O (l) → 4 HNO3 (aq)
+
+ // Advanced method for Nitric Acid Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPinkCatalyst(0), },
+ new FluidStack[] { Materials.NitrogenDioxide.getGas(4000L), FluidUtils.getAir(4000),
+ FluidUtils.getWater(2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 4000), },
+ 10 * 20,
+ 480,
+ 3);
+
+ // Advanced recipe for Fluorine Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPurpleCatalyst(0),
+ ItemUtils.getSimpleStack(Blocks.sandstone, 64), ItemUtils.getSimpleStack(Blocks.sandstone, 64) },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 4000), FluidUtils.getAir(8000) },
+ new ItemStack[] { FLUORIDES.FLUORITE.getOre(8), FLUORIDES.FLUORITE.getOre(4), FLUORIDES.FLUORITE.getOre(4),
+ FLUORIDES.FLUORITE.getOre(4), },
+ new FluidStack[] {},
+ new int[] { 0, 2500, 2000, 1500 },
+ 10 * 20,
+ 1024,
+ 5);
+
+ // Advanced recipe for Fluorine Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPurpleCatalyst(0),
+ ItemUtils.getSimpleStack(Blocks.sand, 64), ItemUtils.getSimpleStack(Blocks.sand, 64) },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 5000), FluidUtils.getAir(12000) },
+ new ItemStack[] { FLUORIDES.FLUORITE.getOre(4), FLUORIDES.FLUORITE.getOre(2), FLUORIDES.FLUORITE.getOre(2),
+ FLUORIDES.FLUORITE.getOre(2), },
+ new FluidStack[] {},
+ new int[] { 7500, 1500, 1000, 500 },
+ 10 * 20,
+ 1024,
+ 5);
+
+ // 3NO2 + H2O = 2HNO3 + NO
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPinkCatalyst(0), },
+ new FluidStack[] { Materials.NitrogenDioxide.getGas(3000L), FluidUtils.getDistilledWater(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 2000), Materials.NitricOxide.getGas(1000L), },
+ 10 * 20,
+ 480,
+ 2);
+
+ // Produce Boric Acid
+ // Na2B4O7·10H2O + 2HCl = 4B(OH)3 + 2NaCl + 5H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustBorax", 23), },
+ new FluidStack[] { FluidUtils.getFluidStack(GenericChem.HydrochloricAcid, 2000) },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustSalt", 4), },
+ new FluidStack[] { FluidUtils.getFluidStack("boricacid", 4000), FluidUtils.getWater(5000) },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3),
+ 3);
+
+ // Produce Th232
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22), ELEMENT.getInstance().THORIUM.getDust(16) },
+ new FluidStack[] { FluidUtils.getDistilledWater(2000), FluidUtils.getFluidStack("boricacid", 1500) },
+ new ItemStack[] { ELEMENT.getInstance().THORIUM.getSmallDust(32),
+ ELEMENT.getInstance().THORIUM232.getDust(2), ELEMENT.getInstance().THORIUM232.getSmallDust(2),
+ ELEMENT.getInstance().URANIUM232.getDust(1), },
+ new FluidStack[] {},
+ new int[] { 0, 0, 1000, 250 },
+ 20 * 300,
+ MaterialUtils.getVoltageForTier(4),
+ 4);
+
+ // Modify Sapling into Pine Sapling
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(6), ItemUtils.getSimpleStack(Blocks.sapling, 32) },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.geneticmutagen", 2000),
+ FluidUtils.getDistilledWater(8000) },
+ new ItemStack[] { ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Pine, 16) },
+ new FluidStack[] {},
+ 120 * 20,
+ 64,
+ 2);
+
+ int aLaureniumTier = ALLOY.LAURENIUM.vTier;
+ // Adding Recipes for Casings
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), CI.getTieredMachineCasing(aLaureniumTier - 1),
+ ALLOY.LAURENIUM.getPlate(8), CI.getGear(aLaureniumTier, 2) },
+ new FluidStack[] { CI.getTieredFluid(aLaureniumTier, 2 * 144),
+ CI.getAlternativeTieredFluid(aLaureniumTier - 1, 4 * 144),
+ CI.getTertiaryTieredFluid(aLaureniumTier - 2, 6 * 144) },
+ new ItemStack[] { GregtechItemList.Casing_Machine_Custom_3.get(1) },
+ new FluidStack[] {},
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(aLaureniumTier - 2),
+ 5);
+
+ int aBotmiumTier = ALLOY.BOTMIUM.vTier;
+ // Adding Recipes for Casings
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), CI.getTieredMachineCasing(aBotmiumTier - 1),
+ ALLOY.BOTMIUM.getPlate(8), CI.getGear(aBotmiumTier, 2) },
+ new FluidStack[] { CI.getTieredFluid(aBotmiumTier, 2 * 144),
+ CI.getAlternativeTieredFluid(aBotmiumTier - 1, 4 * 144),
+ CI.getTertiaryTieredFluid(aBotmiumTier - 2, 6 * 144) },
+ new ItemStack[] { GregtechItemList.Casing_Machine_Custom_4.get(1) },
+ new FluidStack[] {},
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(aBotmiumTier - 2),
+ 6);
+
+ // Refine GT HF into GT++ HF
+ if (FluidUtils.doesHydrofluoricAcidGtExist()) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22), },
+ new FluidStack[] { FluidUtils.getHydrofluoricAcid(2000), FluidUtils.getHydrofluoricAcidGT(5000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getHydrofluoricAcid(4500) },
+ 30 * 20,
+ 480,
+ 3);
+ }
+ }
+
+ private static void fluidHeaterRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(FluidUtils.getHotWater(1000))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidHeaterRecipes);
+ }
+
+ private static void fusionRecipes() {
+ // Hypogen
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(144),
+ ELEMENT.STANDALONE.RHUGNOR.getFluidStack(288))
+ .fluidOutputs(ELEMENT.STANDALONE.HYPOGEN.getFluidStack(36))
+ .duration(6 * MINUTES + 49 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_UHV)
+ .metadata(FUSION_THRESHOLD, 1_200_000_000)
+ .addTo(fusionRecipes);
+
+ // Rhugnor
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ MaterialUtils.getMaterial("Infinity", "Neutronium")
+ .getMolten(144),
+ ALLOY.QUANTUM.getFluidStack(288))
+ .fluidOutputs(ELEMENT.STANDALONE.RHUGNOR.getFluidStack(144))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 2_000_000_000)
+ .addTo(fusionRecipes);
+ }
+
+ private static void assemblyLineRecipes() {
+
+ // Containment Casings
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_1_CONTAINMENT, 1))
+ .metadata(RESEARCH_TIME, 30 * MINUTES)
+ .itemInputs(
+ ItemList.Field_Generator_IV.get(32),
+ ItemList.Electric_Motor_EV.get(64),
+ ItemList.Energy_LapotronicOrb.get(32),
+ CI.getTieredComponent(OrePrefixes.cableGt12, 7, 32),
+ CI.getTieredComponent(OrePrefixes.wireGt16, 6, 64),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Naquadria, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gadolinium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Samarium, 16L),
+ ALLOY.ARCANITE.getGear(8),
+ new Object[] { CI.getTieredCircuitOreDictName(5), 64 },
+ new Object[] { CI.getTieredCircuitOreDictName(6), 32 },
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ GregtechItemList.Laser_Lens_Special.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ ALLOY.NITINOL_60.getFluidStack(144 * 9 * 4),
+ ALLOY.ENERGYCRYSTAL.getFluidStack(144 * 9 * 8),
+ ALLOY.TUMBAGA.getFluidStack(144 * 9 * 32),
+ Materials.Nichrome.getMolten(16 * INGOTS))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockCasings3Misc, 15, 32))
+ .eut(TierEU.RECIPE_LuV)
+ .duration(20 * MINUTES)
+ .addTo(AssemblyLine);
+
+ // Turbine Automation Port
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_8_TURBINE_AUTOMATION, 1))
+ .metadata(RESEARCH_TIME, 24 * HOURS)
+ .itemInputs(
+ CI.getTieredMachineHull(8, 4),
+ CI.getConveyor(8, 24),
+ CI.getElectricMotor(7, 32),
+ CI.getElectricPiston(7, 16),
+ CI.getEnergyCore(6, 8),
+ CI.getPlate(8, 24),
+ CI.getTieredComponent(OrePrefixes.screw, 8, 48),
+ CI.getTieredComponent(OrePrefixes.bolt, 7, 32),
+ CI.getTieredComponent(OrePrefixes.rod, 6, 12),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 20 },
+ CI.getTieredComponent(OrePrefixes.rotor, 6, 16))
+ .fluidInputs(
+ CI.getTieredFluid(8, 144 * 32),
+ CI.getAlternativeTieredFluid(7, 144 * 16),
+ CI.getTertiaryTieredFluid(7, 144 * 16),
+ ALLOY.BABBIT_ALLOY.getFluidStack(128 * 144))
+ .itemOutputs(GregtechItemList.Hatch_Input_TurbineHousing.get(4))
+ .eut(TierEU.RECIPE_UV)
+ .duration(2 * HOURS)
+ .addTo(AssemblyLine);
+
+ /*
+ * Containment casings
+ */
+ ItemStack[] aCoilWire = new ItemStack[] { ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 0, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 1, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 2, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64), };
+ ItemStack[] aGemCasings = new ItemStack[] { GregtechItemList.Battery_Casing_Gem_1.get(1),
+ GregtechItemList.Battery_Casing_Gem_2.get(1), GregtechItemList.Battery_Casing_Gem_3.get(1),
+ GregtechItemList.Battery_Casing_Gem_4.get(1), };
+ ItemStack[] aResearch = new ItemStack[] { Particle.getBaseParticle(Particle.UNKNOWN),
+ GregtechItemList.Battery_Casing_Gem_1.get(1), GregtechItemList.Battery_Casing_Gem_2.get(1),
+ GregtechItemList.Battery_Casing_Gem_3.get(1), };
+
+ int aCasingSlot = 0;
+ for (int j = 6; j < 10; j++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aResearch[aCasingSlot])
+ .metadata(RESEARCH_TIME, 1 * HOURS)
+ .itemInputs(
+ CI.getTieredComponent(OrePrefixes.plate, j - 1, 16),
+ CI.getTieredComponent(OrePrefixes.cableGt08, j + 1, 32),
+ CI.getTieredComponent(OrePrefixes.gearGt, j - 1, 4),
+ aCoilWire[aCasingSlot])
+ .fluidInputs(
+ CI.getTieredFluid(j, 144 * 8),
+ CI.getTertiaryTieredFluid(j - 2, 144 * 16),
+ CI.getAlternativeTieredFluid(j, 144 * 16))
+ .itemOutputs(aGemCasings[aCasingSlot++])
+ .eut(GT_Values.V[j])
+ .duration(2 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ /*
+ * Gem Battery Recipes
+ */
+
+ ItemStack[] aGemBatteries = new ItemStack[] { GregtechItemList.Battery_Gem_1.get(1),
+ GregtechItemList.Battery_Gem_2.get(1), GregtechItemList.Battery_Gem_3.get(1),
+ GregtechItemList.Battery_Gem_4.get(1), };
+
+ ItemStack[] aExoticInputs = new ItemStack[] { Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.CHARM),
+ Particle.getBaseParticle(Particle.GRAVITON) };
+ aCasingSlot = 0;
+ for (int j = 6; j < 10; j++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aExoticInputs[aCasingSlot])
+ .metadata(RESEARCH_TIME, 5 * HOURS)
+ .itemInputs(
+ aGemCasings[aCasingSlot],
+ ItemUtils.getSimpleStack(aExoticInputs[aCasingSlot], 16),
+ CI.getTieredComponent(OrePrefixes.plate, j, 16),
+ new Object[] { CI.getTieredCircuitOreDictName(j), 8 },
+ CI.getTieredComponent(OrePrefixes.wireGt16, j + 1, 32),
+ CI.getTieredComponent(OrePrefixes.bolt, j, 8),
+ CI.getTieredComponent(OrePrefixes.screw, j - 1, 8))
+ .fluidInputs(
+ CI.getTieredFluid(j, 144 * 1 * 16),
+ CI.getTertiaryTieredFluid(j - 2, 144 * 2 * 16),
+ CI.getAlternativeTieredFluid(j, 144 * 16),
+ CI.getTertiaryTieredFluid(j - 1, 144 * 16))
+ .itemOutputs(aGemBatteries[aCasingSlot++])
+ .eut(GT_Values.V[j])
+ .duration(2 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ if (Baubles.isModLoaded()) {
+ // Nano Healer
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemUtils.simpleMetaStack(Items.golden_apple, 1, 1))
+ .metadata(RESEARCH_TIME, 10 * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemCasings[2], 4),
+ CI.getTieredComponent(OrePrefixes.plate, 8, 32),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ CI.getTieredComponent(OrePrefixes.cableGt02, 7, 16),
+ CI.getTieredComponent(OrePrefixes.gearGt, 6, 6),
+ CI.getTieredComponent(OrePrefixes.screw, 7, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, 5, 24),
+ CI.getTieredComponent(OrePrefixes.frameGt, 4, 12),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ CI.getTieredFluid(7, 144 * 18 * 16),
+ CI.getTertiaryTieredFluid(7, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(6, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(7, 144 * 18 * 16))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("miscutils:personalHealingDevice", 1))
+ .eut(TierEU.RECIPE_ZPM)
+ .duration(1 * HOURS)
+ .addTo(AssemblyLine);
+
+ // Charge Pack LuV-UV
+
+ ItemStack[] aChargeResearch = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore10", 1), };
+
+ ItemStack[] aChargeOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemChargePack_High_1, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_2, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_3, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_4, 1), };
+
+ int aCurrSlot = 0;
+ for (int h = 6; h < 10; h++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aChargeResearch[aCurrSlot])
+ .metadata(RESEARCH_TIME, 10 * (aCurrSlot + 1) * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemBatteries[aCurrSlot], 2),
+ aCoilWire[aCurrSlot],
+ CI.getTieredComponent(OrePrefixes.plate, h, 8),
+ new Object[] { CI.getTieredCircuitOreDictName(h), 4 },
+ new Object[] { CI.getTieredCircuitOreDictName(h - 1), 8 },
+ CI.getTieredComponent(OrePrefixes.cableGt12, h - 1, 16),
+ CI.getTieredComponent(OrePrefixes.screw, h, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, h - 2, 32),
+ CI.getFieldGenerator(h - 1, 1))
+ .fluidInputs(
+ CI.getTieredFluid(h, 144 * 4 * 8),
+ CI.getTertiaryTieredFluid(h - 1, 144 * 4 * 8),
+ CI.getAlternativeTieredFluid(h - 1, 144 * 4 * 8),
+ CI.getAlternativeTieredFluid(h - 2, 144 * 4 * 8))
+ .itemOutputs(aChargeOutputs[aCurrSlot])
+ .eut(GT_Values.V[h])
+ .duration((aCurrSlot + 1) * HOURS)
+ .addTo(AssemblyLine);
+ aCurrSlot++;
+ }
+
+ // Cloaking device
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_9_CLOAKING, 1))
+ .metadata(RESEARCH_TIME, 10 * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemCasings[3], 4),
+ CI.getTieredComponent(OrePrefixes.plate, 8, 32),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ CI.getTieredComponent(OrePrefixes.cableGt04, 8, 16),
+ CI.getTieredComponent(OrePrefixes.gearGt, 7, 6),
+ CI.getTieredComponent(OrePrefixes.screw, 8, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, 7, 24),
+ CI.getTieredComponent(OrePrefixes.frameGt, 5, 12),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ CI.getTieredFluid(8, 144 * 18 * 16),
+ CI.getTertiaryTieredFluid(8, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(7, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(8, 144 * 18 * 16))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("miscutils:personalCloakingDevice-0.0", 1))
+ .eut(TierEU.RECIPE_UV)
+ .duration(1 * HOURS)
+ .addTo(AssemblyLine);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, GregtechItemList.Industrial_AlloyBlastSmelter.get(1, new Object() {}))
+ .metadata(RESEARCH_TIME, 30 * MINUTES)
+ .itemInputs(
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ ItemList.UV_Coil.get(16L, new Object() {}),
+ ItemList.Conveyor_Module_UV.get(4L, new Object() {}),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 16 },
+ ItemList.Circuit_Chip_PPIC.get(16, new Object() {}),
+ ALLOY.PIKYONIUM.getPlate(16),
+ ALLOY.CINOBITE.getScrew(32))
+ .fluidInputs(
+ ALLOY.PIKYONIUM.getFluidStack(144 * 8),
+ ALLOY.INDALLOY_140.getFluidStack(144 * 9),
+ Materials.SolderingAlloy.getMolten(144 * 10))
+ .itemOutputs(GregtechItemList.Mega_AlloyBlastSmelter.get(1L))
+ .eut(TierEU.RECIPE_UHV / 2)
+ .duration(1 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ private static void laserEngraverRecipes() {
+
+ // Laser Sensors and Emitters together
+ GregtechItemList[] aTransParts = new GregtechItemList[] { GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ for (int i = 1; i < aTransParts.length; i++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getEmitter(i, 2), CI.getSensor(i, 2))
+ .itemOutputs(aTransParts[i - 1].get(1))
+ .duration(5 * SECONDS)
+ .eut(GT_Values.VP[i])
+ .addTo(laserEngraverRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 6L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getDust(1))
+ .duration(3 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 8L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getDust(1))
+ .duration(2 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.ASTRAL_TITANIUM.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.NITINOL_60.getBlock(2), GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.ADVANCED_NITINOL.getBlock(1))
+ .duration(1 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.ADVANCED_NITINOL.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 64L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getDust(1))
+ .duration(5 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getFieldGenerator(6, 1), CI.getEmitter(7, 2))
+ .itemOutputs(ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_1_CONTAINMENT, 1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ // Distillus Upgrade Chip
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Laser_Lens_WoodsGlass.get(0),
+ ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, 20, 1))
+ .itemOutputs(GregtechItemList.Distillus_Upgrade_Chip.get(1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ }
+
+ private static void breweryRecipes() {
+
+ if (Loader.isModLoaded("OpenBlocks")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(14))
+ .fluidInputs(FluidRegistry.getFluidStack("mobessence", 100))
+ .fluidOutputs(FluidRegistry.getFluidStack("liquidxp", 1332))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(14))
+ .fluidInputs(FluidRegistry.getFluidStack("liquidxp", 1332))
+ .fluidOutputs(FluidRegistry.getFluidStack("mobessence", 100))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(Materials.Water.getFluid(100L))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(Materials.Honey.getFluid(100L))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(FluidUtils.getFluidStack("juice", 100))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ }
+
+ private static void cuttingSawRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("blockMeatRaw", 1))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("plateMeatRaw", 9))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(cutterRecipes);
+ }
+
+ private static void electrolyzerRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(ModItems.dustDecayedRadium226, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("radon", 144))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(electrolyzerRecipes);
+ }
+
+ private static void extruderRecipes() {
+ // Osmium Credits
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("blockOsmium", 1), ItemList.Shape_Mold_Credit.get(0))
+ .itemOutputs(ItemList.Credit_Greg_Osmium.get(1))
+ .duration(6 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_EV / 2)
+ .addTo(extruderRecipes);
+ }
+
+ private static void blastSmelterRecipes() {
+
+ // Eglin Steel
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(6), ELEMENT.getInstance().IRON.getDust(4),
+ ALLOY.KANTHAL.getDust(1), ALLOY.INVAR.getDust(5), ELEMENT.getInstance().SULFUR.getDust(1),
+ ELEMENT.getInstance().CARBON.getDust(1), ELEMENT.getInstance().SILICON.getDust(4) },
+ ALLOY.EGLIN_STEEL.getFluidStack(16 * 144),
+ 0,
+ 20 * 45,
+ 120);
+
+ // HG1223
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(5), ELEMENT.getInstance().BARIUM.getDust(2),
+ ELEMENT.getInstance().CALCIUM.getDust(2), ELEMENT.getInstance().COPPER.getDust(3), },
+ new FluidStack[] { ELEMENT.getInstance().OXYGEN.getFluidStack(8000),
+ ELEMENT.getInstance().MERCURY.getFluidStack(1000), },
+ ALLOY.HG1223.getFluidStack(16 * 144),
+ null,
+ new int[] { 10000 }, // Output Chance
+ 20 * 120,
+ 30720);
+
+ // NITINOL_60
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(2), ELEMENT.getInstance().TITANIUM.getDust(3),
+ ELEMENT.getInstance().NICKEL.getDust(2) },
+ ALLOY.NITINOL_60.getFluidStack(5 * 144),
+ 0,
+ 20 * 75,
+ 7680);
+
+ // INDALLOY_140
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(5), ELEMENT.getInstance().BISMUTH.getDust(47),
+ ELEMENT.getInstance().LEAD.getDust(25), ELEMENT.getInstance().TIN.getDust(13),
+ ELEMENT.getInstance().CADMIUM.getDust(10), ELEMENT.getInstance().INDIUM.getDust(5) },
+ ALLOY.INDALLOY_140.getFluidStack(100 * 144),
+ 0,
+ 20 * 40,
+ 7680);
+
+ // Germanium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedSphalerite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(2000),
+ ELEMENT.getInstance().GERMANIUM.getFluidStack(288),
+ 0,
+ 20 * 300,
+ 4000);
+
+ // Rhenium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedScheelite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(10000),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(144),
+ 0,
+ 20 * 300,
+ 4000);
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMolybdenite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(7500),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(144),
+ 0,
+ 20 * 300,
+ 4000);
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMolybdenum", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(5000),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(288),
+ 0,
+ 20 * 300,
+ 4000);
+
+ // Thallium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(21),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedZinc", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPyrite", 4),
+ ELEMENT.getInstance().CARBON.getDust(16), },
+ Materials.SulfuricAcid.getFluid(1250),
+ ELEMENT.getInstance().THALLIUM.getFluidStack(288),
+ new ItemStack[] {},
+ new int[] { 0 },
+ 20 * 75,
+ 8000,
+ 3700,
+ false);
+
+ // Strontium processing
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(21), MISC_MATERIALS.STRONTIUM_OXIDE.getDust(8),
+ ELEMENT.getInstance().ALUMINIUM.getDust(8), },
+ (FluidStack) null,
+ ELEMENT.getInstance().OXYGEN.getFluidStack(8000),
+ new ItemStack[] { ELEMENT.getInstance().ALUMINIUM.getIngot(8),
+ ELEMENT.getInstance().STRONTIUM.getIngot(8) },
+ new int[] { 10000, 10000 }, // Output Chance
+ 20 * 120,
+ 480 * 4);
+
+ // molten botmium
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustNitinol60", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustOsmium", 6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRuthenium", 6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustThallium", 3) },
+ GT_Values.NF,
+ ALLOY.BOTMIUM.getFluidStack(2304),
+ 0,
+ 20 * 120,
+ 491520);
+
+ // molten precious metals alloy
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRuthenium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRhodium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPalladium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPlatinum", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustOsmium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustIridium", 1) },
+ GT_Values.NF,
+ FluidUtils.getFluidStack("molten.precious metals alloy", 864),
+ 0,
+ 20 * 540,
+ 7864320);
+ }
+
+ private static void dehydratorRecipes() {
+ Logger.INFO("Loading Recipes for Chemical Dehydrator.");
+
+ ItemStack cropGrape = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cropGrape", 1);
+ ItemStack foodRaisins = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foodRaisins", 1);
+
+ if (cropGrape != null && foodRaisins != null) CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20), cropGrape }, // Item
+ null, // Fluid input (slot 1)
+ null, // Fluid output (slot 2)
+ new ItemStack[] { foodRaisins }, // Output
+ new int[] { 10000 },
+ 10, // Time in ticks
+ 2); // EU
+
+ // Process Waste Water
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(21) },
+ FluidUtils.getFluidStack("fluid.sludge", 1000),
+ FluidUtils.getFluidStack("nitricacid", 10),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCopper", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyNickel", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCobalt", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAluminium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinySilver", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyGold", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyIridium", 1) },
+ new int[] { 10, 5, 5, 4, 4, 3, 2, 2, 1 },
+ 2 * 20,
+ 500); // EU
+
+ // C8H10 = C8H8 + 2H
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), CI.emptyCells(3) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellStyrene", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrogen", 2) },
+ new int[] { 10000, 10000 },
+ 3 * 20,
+ 30);
+
+ /*
+ * Add custom recipes for drying leather
+ */
+ if (Backpack.isModLoaded()) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), new ItemStack(Items.leather, 2) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getCorrectStacktype("Backpack:tannedLeather", 1) },
+ new int[] { 10000 },
+ 5 * 20,
+ 180);
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 2L, 0) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getCorrectStacktype("Backpack:tannedLeather", 1) },
+ new int[] { 10000 },
+ 5 * 20,
+ 180);
+ }
+ }
+ // Alternative ACETIC ANHYDRIDE recipe for Kevlar Line
+ // 2C2H4O2 = C4H6O3 + H2O
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), CI.emptyCells(1) },
+ FluidUtils.getFluidStack("aceticacid", 2000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellWater", 1), },
+ new int[] { 10000 },
+ 30 * 20,
+ 480);
+ }
+
+ private static void largeChemReactorRecipes() {
+ // Styrene
+ // C8H10 = C8H8 + 2H
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs()
+ .fluidInputs(FluidUtils.getFluidStack("fluid.ethylbenzene", 1000))
+ .fluidOutputs(Materials.Styrene.getFluid(1000L), Materials.Hydrogen.getGas(2000))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // Short-cut Styrene
+ // C6H6 + C2H4 = C8H8 + 2H
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs()
+ .fluidInputs(Materials.Ethylene.getGas(500L), Materials.Benzene.getFluid(500L))
+ .fluidOutputs(Materials.Styrene.getFluid(500L), Materials.Hydrogen.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+ }
+
+ private static void assemblerRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Vanadium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.VanadiumSteel, 8L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 0, 4))
+ .fluidInputs(Materials.Oxygen.getGas(8000L))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 0, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.VanadiumGallium, 8L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 1, 8))
+ .fluidInputs(Materials.Tantalum.getMolten(4 * INGOTS))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 1, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(3), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(GregtechItemList.Casing_Vanadium_Redox.get(1), 1))
+ .fluidInputs(Materials.Oxygen.getGas(16 * BUCKETS))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Titanium, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(4), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_IV.get(1))
+ .fluidInputs(Materials.Nitrogen.getGas(16 * BUCKETS))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.TungstenSteel, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(5), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_LuV.get(1))
+ .fluidInputs(Materials.Helium.getGas(8 * BUCKETS))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_LuV.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateAlloyIridium", 16),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_ZPM.get(1))
+ .fluidInputs(Materials.Argon.getGas(4 * BUCKETS))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Naquadah, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_UV.get(1))
+ .fluidInputs(Materials.Radon.getGas(4 * BUCKETS))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Americium, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(8), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_MAX.get(1))
+ .fluidInputs(FluidUtils.getFluidStack("krypton", 500))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(CI.explosiveITNT, 2),
+ ItemUtils.getSimpleStack(CI.explosiveTNT, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iron, 1L))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockMiningExplosive, 3))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.BlackSteel, 8L))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard, 64))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_LV,
+ CI.electricMotor_LV,
+ CI.getTieredComponent(OrePrefixes.bolt, 1, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Brass, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Brass, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 1, 1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_MV,
+ CI.electricMotor_MV,
+ CI.getTieredComponent(OrePrefixes.bolt, 2, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Invar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Invar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 2, 1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_HV,
+ CI.electricMotor_HV,
+ CI.getTieredComponent(OrePrefixes.bolt, 3, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Chrome, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Chrome, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 3, 1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_EV,
+ CI.electricMotor_EV,
+ CI.getTieredComponent(OrePrefixes.bolt, 4, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Titanium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 4, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 1, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1000, 1))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 2, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1001, 1))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 3, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1002, 1))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 4, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1003, 1))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ // Low tier Charge Packs
+
+ final ItemStack[] aPackBatteries = new ItemStack[] { ItemList.Battery_RE_LV_Lithium.get(4),
+ ItemList.Battery_RE_MV_Lithium.get(4), ItemList.Battery_RE_HV_Lithium.get(4),
+ GregtechItemList.Battery_RE_EV_Lithium.get(4), ItemList.Energy_LapotronicOrb.get(4), };
+ final ItemStack[] aPackPlates = new ItemStack[] { CI.getPlate(1, 8), CI.getPlate(2, 8), CI.getPlate(3, 8),
+ CI.getPlate(4, 8), CI.getPlate(5, 8), };
+ final ItemStack[] aPackWire = new ItemStack[] { CI.getTieredComponent(OrePrefixes.wireGt02, 1, 6),
+ CI.getTieredComponent(OrePrefixes.wireGt04, 2, 6), CI.getTieredComponent(OrePrefixes.wireGt08, 3, 6),
+ CI.getTieredComponent(OrePrefixes.wireGt12, 4, 6), CI.getTieredComponent(OrePrefixes.wireGt16, 5, 6), };
+ final ItemStack[] aPackCircuit = new ItemStack[] { CI.getTieredComponent(OrePrefixes.circuit, 1, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, 2, 4), CI.getTieredComponent(OrePrefixes.circuit, 3, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, 4, 4), CI.getTieredComponent(OrePrefixes.circuit, 5, 4), };
+ final ItemStack[] aPackRing = new ItemStack[] { CI.getTieredComponent(OrePrefixes.ring, 1, 12),
+ CI.getTieredComponent(OrePrefixes.ring, 2, 12), CI.getTieredComponent(OrePrefixes.ring, 3, 12),
+ CI.getTieredComponent(OrePrefixes.ring, 4, 12), CI.getTieredComponent(OrePrefixes.ring, 5, 12), };
+ final ItemStack[] aPackOutput = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_2),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_3),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_4),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_5) };
+
+ for (int i = 1; i < 6; i++) {
+
+ int aAS = i - 1;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aPackPlates[aAS],
+ aPackRing[aAS],
+ aPackWire[aAS],
+ aPackCircuit[aAS],
+ aPackBatteries[aAS],
+ CI.getSensor(i, 4))
+ .itemOutputs(aPackOutput[aAS])
+ .fluidInputs(CI.getTieredFluid(i, (144 * 4)))
+ .duration(30 * i * SECONDS)
+ .eut(GT_Values.V[i])
+ .addTo(assemblerRecipes);
+ }
+
+ if (Baubles.isModLoaded()) {
+
+ // Turbine Housing Research Page
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(17),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Trinium, 64L),
+ CI.getSensor(6, 6),
+ CI.getBolt(7, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Platinum, 64L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 12))
+ .itemOutputs(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_8_TURBINE_AUTOMATION, 1))
+ .fluidInputs(CI.getAlternativeTieredFluid(7, 144 * 32))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ // Cloaking Device Research Page
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(17),
+ ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR, 4),
+ CI.getFieldGenerator(6, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Palladium, 32L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 12))
+ .itemOutputs(ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_9_CLOAKING, 1))
+ .fluidInputs(CI.getAlternativeTieredFluid(7, 144 * 32))
+ .duration(10 * MINUTES)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ private static void distilleryRecipes() {
+ Logger.INFO("Registering Distillery/Distillation Tower Recipes.");
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.Air.getGas(1000L))
+ .fluidOutputs(Materials.Helium.getGas(1L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Air.getGas(20000L))
+ .fluidOutputs(Materials.Helium.getGas(25L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distillationTowerRecipes);
+
+ // Apatite Distillation
+ /*
+ * so if you dissolve aparite in sulphuric acid you'll get a mixture of SO2, H2O, HF and HCl
+ */
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("sulfuricapatite", 5200))
+ .fluidOutputs(
+ FluidUtils.getFluidStack("sulfurousacid", 3800),
+ FluidUtils.getFluidStack("hydrogenchloride", 1000),
+ FluidUtils.getFluidStack("hydrofluoricacid", 400))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("sulfurousacid", 1000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(500), Materials.Water.getFluid(500))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distillationTowerRecipes);
+ }
+
+ private static void thermalBoilerRecipes() {
+ Logger.INFO("Registering Thermal Boiler Recipes.");
+
+ // Recipes with special value -1 display additional tooltip in NEI about lava filters.
+
+ // Lava
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getLava(1000), FluidUtils.getWater(16_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getPahoehoeLava(1000), FluidUtils.getSteam(16_000))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tantalum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 1),
+ new ItemStack(Blocks.obsidian, 1, 0))
+ .outputChances(444, 222, 56, 56, 56, 125, 1000)
+ .specialValue(-1)
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Pahoehoe Lava
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getPahoehoeLava(1000), FluidUtils.getWater(16_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getSteam(16_000))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Electrum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tantalum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 1),
+ new ItemStack(Blocks.obsidian, 1, 0))
+ .outputChances(167, 56, 56, 125, 3700)
+ .specialValue(-1)
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Hot Coolant
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ FluidUtils.getFluidStack("ic2hotcoolant", 500),
+ FluidUtils.getWater(100_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getFluidStack("ic2coolant", 500), FluidUtils.getSuperHeatedSteam(100_000))
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Solar Salt (Hot)
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ MISC_MATERIALS.SOLAR_SALT_HOT.getFluidStack(100),
+ FluidUtils.getWater(100_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(MISC_MATERIALS.SOLAR_SALT_COLD.getFluidStack(100), FluidUtils.getSuperHeatedSteam(100_000))
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+ }
+
+ private static void addFuels() {
+ Logger.INFO("Registering New Fuels.");
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(Items.lava_bucket))
+ .metadata(FUEL_VALUE, 32)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getIC2Cell(2))
+ .metadata(FUEL_VALUE, 32)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getIC2Cell(11))
+ .metadata(FUEL_VALUE, 24)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private static void extractorRecipes() {
+ Logger.INFO("Registering Extractor Recipes.");
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Sodium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Cadmium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Lithium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ }
+
+ private static void fluidExtractorRecipes() {
+ // Gelid Cryotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack("cryotheum", 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(fluidExtractionRecipes);
+
+ // Ender Fluid
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(Items.ender_pearl))
+ .fluidOutputs(FluidUtils.getFluidStack("ender", 250))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Blazing Pyrotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrotheum, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack("pyrotheum", 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static void centrifugeRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedAdvancedCircuit(2), MISC_MATERIALS.SOLAR_SALT_COLD.getCell(1))
+ .itemOutputs(
+ MISC_MATERIALS.SODIUM_NITRATE.getDust(3),
+ MISC_MATERIALS.POTASSIUM_NITRATE.getDust(2),
+ CI.emptyCells(1))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+ }
+
+ private static void mixerRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ CI.emptyCells(1),
+ MISC_MATERIALS.SODIUM_NITRATE.getDust(3),
+ MISC_MATERIALS.POTASSIUM_NITRATE.getDust(2))
+ .itemOutputs(MISC_MATERIALS.SOLAR_SALT_COLD.getCell(1))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ Materials.Titanium.getDust(9),
+ Materials.Carbon.getDust(9),
+ Materials.Potassium.getDust(9),
+ Materials.Lithium.getDust(9),
+ Materials.Sulfur.getDust(9))
+ .itemOutputs(ALLOY.LEAGRISIUM.getDust(50))
+ .fluidInputs(Materials.Hydrogen.getGas(5000))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ Materials.Steel.getDust(16),
+ Materials.Molybdenum.getDust(1),
+ Materials.Titanium.getDust(1),
+ Materials.Nickel.getDust(4),
+ Materials.Cobalt.getDust(2))
+ .itemOutputs(ALLOY.MARAGING250.getDust(24))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+ }
+
+ private static void chemicalReactorRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(21),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 32L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Sulfur, 8L))
+ .fluidInputs(FluidUtils.getFluidStack("sulfuricacid", 4000))
+ .fluidOutputs(FluidUtils.getFluidStack("sulfuricapatite", 8000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // KOH + HNO3 = KNO3 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(GenericChem.mPotassiumHydroxide, 3), CI.getNumberedAdvancedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumNitrade, 5L))
+ .fluidInputs(Materials.NitricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Na2CO3 + 2HNO3 = 2NaNO3 + CO2 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ CI.getNumberedAdvancedCircuit(1))
+ .itemOutputs(MISC_MATERIALS.SODIUM_NITRATE.getDust(10))
+ .fluidInputs(Materials.NitricAcid.getFluid(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ private static void blastFurnaceRecipes() {
+
+ // Synthetic Graphite
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.SILICON_CARBIDE.getDust(16), GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Silicon, 8L))
+ .fluidInputs(Materials.Nitrogen.getGas(4000))
+ .fluidOutputs()
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .metadata(COIL_HEAT, 4500)
+ .addTo(blastFurnaceRecipes);
+
+ }
+
+ private static void compressorRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Clay, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 9L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.MeatRaw, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FusionComputer_UV.get(9))
+ .itemOutputs(GregtechItemList.Compressed_Fusion_Reactor.get(1))
+ .duration(1 * HOURS + 50 * MINUTES)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(compressorRecipes);
+ }
+
+ private static void macerationRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.MeatRaw, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 9L))
+ .duration(44 * SECONDS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ if (ItemUtils.simpleMetaStack("chisel:limestone", 0, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("limestone", 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 4L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ }
+
+ private static void cyclotronRecipes() {
+
+ // Polonium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.bismuth", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_PO210.get(1) },
+ null,
+ new int[] { 100 },
+ 20 * 300 * 100,
+ 2040 * 4,
+ 500 * 20);
+
+ // Americium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.americium", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_AM241.get(4) },
+ null,
+ new int[] { 2500 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium u235
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.uranium235", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 570 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium u233
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.uranium233", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 660 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium pu239
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.plutonium", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 220 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Plutonium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.plutonium238", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_PU238.get(2) },
+ null,
+ new int[] { 780 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Neptunium
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { ELEMENT.getInstance().URANIUM238.getDust(1) },
+ FluidUtils.getFluidStack("deuterium", 400),
+ new ItemStack[] { ItemUtils.getSimpleStack(ModItems.dustNeptunium238) },
+ null,
+ new int[] { 500 },
+ 20 * 5,
+ 500 * 4,
+ 500 * 20); // PO Special Value
+
+ /*
+ * Particle Science
+ */
+
+ // Quark Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(3),
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.UP), Particle.getBaseParticle(Particle.DOWN),
+ Particle.getBaseParticle(Particle.CHARM), Particle.getBaseParticle(Particle.STRANGE),
+ Particle.getBaseParticle(Particle.TOP), Particle.getBaseParticle(Particle.BOTTOM), },
+ null,
+ new int[] { 50, 50, 50, 50, 50, 50 },
+ 20 * 300 * 9,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Lepton Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(6),
+ FluidUtils.getFluidStack("plasma.helium", 1500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.MUON),
+ Particle.getBaseParticle(Particle.TAU), Particle.getBaseParticle(Particle.ELECTRON_NEUTRINO),
+ Particle.getBaseParticle(Particle.MUON_NEUTRINO), Particle.getBaseParticle(Particle.TAU_NEUTRINO), },
+ null,
+ new int[] { 600, 40, 20, 15, 10, 5 },
+ 20 * 300 * 8,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Boson Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(9),
+ FluidUtils.getFluidStack("plasma.helium", 1500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GLUON), Particle.getBaseParticle(Particle.PHOTON),
+ Particle.getBaseParticle(Particle.Z_BOSON), Particle.getBaseParticle(Particle.W_BOSON),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 160, 260, 150, 150, 1 },
+ 20 * 300 * 6,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Mixed Smash 1
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(12),
+ Materials.Americium.getPlasma(2500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.ETA_MESON),
+ Particle.getBaseParticle(Particle.PION), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.NEUTRON), Particle.getBaseParticle(Particle.LAMBDA),
+ Particle.getBaseParticle(Particle.OMEGA), Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 50, 50, 50, 40, 30, 20, 20, 10 },
+ 1000 * 20,
+ (int) MaterialUtils.getVoltageForTier(8),
+ 750 * 20);
+
+ // Mixed Smash 1
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(12),
+ new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 2500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.ETA_MESON),
+ Particle.getBaseParticle(Particle.PION), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.NEUTRON), Particle.getBaseParticle(Particle.LAMBDA),
+ Particle.getBaseParticle(Particle.OMEGA), Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 5000, 200, 200, 100, 80, 60, 40, 30 },
+ 100 * 20,
+ (int) MaterialUtils.getVoltageForTier(8),
+ 750 * 20);
+
+ // Graviton Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(15),
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.UNKNOWN) },
+ null,
+ new int[] { 1000, 100 },
+ 20 * (90),
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1000 * 20);
+
+ FluidStack aPlasma = Materials.Duranium.getMolten(40);
+ FluidStack aPlasma_NULL = Materials._NULL.getPlasma(1);
+
+ if (aPlasma == null || aPlasma.isFluidEqual(aPlasma_NULL)) {
+ aPlasma = Materials.Americium.getMolten(20);
+ }
+
+ // Quantum Anomaly
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(24), Particle.getBaseParticle(Particle.UNKNOWN), },
+ aPlasma,
+ new ItemStack[] { GregtechItemList.Laser_Lens_Special.get(1) },
+ null,
+ new int[] { 100 },
+ 20 * (25),
+ (int) MaterialUtils.getVoltageForTier(8),
+ 500 * 20);
+
+ /*
+ * Ions
+ */
+
+ int IonCount = 2;
+ int tenCountA = 2;
+ int tenCountB = 0;
+ for (String y : IonParticles.MetaToNameMap.values()) {
+ if (y.toLowerCase()
+ .contains("hydrogen")) {
+ continue;
+ }
+ FluidStack aPlasma2 = FluidUtils.getFluidStack("plasma." + y.toLowerCase(), 2);
+ Materials aTestMat = MaterialUtils.getMaterial(y);
+ FluidStack aPlasma3 = aTestMat != null ? aTestMat.getPlasma(2) : aPlasma2;
+
+ // Ionize Plasma
+ if ((aPlasma2 != null && !aPlasma2.isFluidEqual(aPlasma_NULL))
+ || (aPlasma3 != null && !aPlasma3.isFluidEqual(aPlasma_NULL))) {
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1 + (tenCountA - 1)),
+ aPlasma2 != null ? aPlasma2 : aPlasma3,
+ new ItemStack[] { Particle.getIon(y, 1), Particle.getIon(y, 2), Particle.getIon(y, 3),
+ Particle.getIon(y, -1), Particle.getIon(y, -2), Particle.getIon(y, -3), Particle.getIon(y, 1),
+ Particle.getIon(y, 2), Particle.getIon(y, -1), },
+ null,
+ new int[] { 275, 250, 225, 275, 250, 225, 275, 250, 275 },
+ 20 * 20 * (IonCount++) * tenCountA,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 1500 * 20 * tenCountA);
+ } else {
+ Logger.INFO("Plasma for " + y + " does not exist, please report this to Alkalus.");
+ }
+
+ if (tenCountB == 12) {
+ tenCountB = 0;
+ tenCountA++;
+ } else {
+ tenCountB++;
+ }
+ }
+
+ // Generate Hydrogen Ion Recipe
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(24),
+ FluidUtils.getWildcardFluidStack("hydrogen", 1000),
+ new ItemStack[] { Particle.getIon("Hydrogen", 1), Particle.getIon("Hydrogen", 2),
+ Particle.getIon("Hydrogen", 3), Particle.getIon("Hydrogen", 1), Particle.getIon("Hydrogen", 2),
+ Particle.getIon("Hydrogen", 3), Particle.getIon("Hydrogen", -1), Particle.getIon("Hydrogen", -2),
+ Particle.getIon("Hydrogen", -3) },
+ null,
+ new int[] { 500, 500, 500, 500, 500, 500, 500, 500, 500 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 2500);
+
+ // Generate Hydrogen Plasma Recipe
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), Particle.getIon("Hydrogen", 0), },
+ FluidUtils.getFluidStack("hydrogen", 1000),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.NEUTRON),
+ Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new int[] { 1250, 1250, 1250, 750, 750, 750 },
+ 20 * 60 * 2,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 750 * 20);
+
+ // Generate Protons Easily
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), Particle.getIon("Hydrogen", 0) },
+ FluidUtils.getWildcardFluidStack("hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), },
+ null,
+ new int[] { 750, 750, 750, 750, 750, 750, 750, 750, 750 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1500);
+
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(22), Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getWildcardFluidStack("hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), },
+ null,
+ new int[] { 375, 375, 375, 375, 375, 375, 375, 375, 375 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1500);
+
+ // Create Strange Dust
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { ELEMENT.getInstance().PLUTONIUM238.getDust(1), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getFluidStack(FluidUtils.getWildcardFluidStack("ender", 1000), 1000),
+ new ItemStack[] { ORES.DEEP_EARTH_REACTOR_FUEL_DEPOSIT.getDust(1) },
+ null,
+ new int[] { 2500 },
+ 20 * 60 * 15,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 250);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java
new file mode 100644
index 0000000000..5e198bfac4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java
@@ -0,0 +1,475 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gtPlusPlus.core.recipe.common.CI.bitsd;
+import static gtPlusPlus.core.util.minecraft.ItemUtils.getSimpleStack;
+import static gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits.generatePipeRecipes;
+import static gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits.generateWireRecipes;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class RECIPES_General {
+
+ static final ItemStack NULL = null;
+ static ItemStack RECIPE_Paper;
+ static ItemStack RECIPE_Dirt;
+ static ItemStack RECIPE_Snow;
+ static ItemStack RECIPE_Obsidian;
+ static String RECIPE_LapisDust = "dustLazurite";
+ static ItemStack OUTPUT_Blueprint;
+ static ItemStack RECIPE_CraftingTable;
+ static ItemStack RECIPE_BasicCasingIC2;
+
+ public static void loadRecipes() {
+ RECIPE_Paper = ItemUtils.getSimpleStack(Items.paper);
+ RECIPE_Dirt = ItemUtils.getSimpleStack(Blocks.dirt);
+ RECIPE_Snow = ItemUtils.getSimpleStack(Blocks.snow);
+ RECIPE_Obsidian = ItemUtils.getSimpleStack(Blocks.obsidian);
+ RECIPE_CraftingTable = ItemUtils.getSimpleStack(Blocks.crafting_table);
+ RECIPE_BasicCasingIC2 = ItemUtils.getItemStackFromFQRN("IC2:blockMachine", 1);
+ OUTPUT_Blueprint = ItemUtils.getSimpleStack(ModItems.itemBlueprintBase, 2);
+ run();
+ addCompressedObsidian();
+ migratedRecipes();
+ }
+
+ private static void run() {
+ // Workbench Blueprint
+ RecipeUtils.addShapedRecipe(
+ RECIPE_Paper,
+ RECIPE_LapisDust,
+ NULL,
+ RECIPE_Paper,
+ RECIPE_LapisDust,
+ NULL,
+ RECIPE_LapisDust,
+ RECIPE_LapisDust,
+ NULL,
+ OUTPUT_Blueprint);
+
+ // Rainforest oak Sapling
+ if (RecipeUtils.addShapedRecipe(
+ "stickWood",
+ "stickWood",
+ "stickWood",
+ "stickWood",
+ "treeSapling",
+ "stickWood",
+ "stickWood",
+ "dustBone",
+ "stickWood",
+ ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))) {
+ Logger.INFO("Added a recipe for Rainforest oak Saplings.");
+ }
+
+ // Iron bars
+ final ItemStack ironBars = ItemUtils.getItemStackFromFQRN("dreamcraft:item.SteelBars", 1);
+
+ // Fish Trap
+ if (RecipeUtils.addShapedRecipe(
+ ironBars,
+ ironBars,
+ ironBars,
+ ironBars,
+ "frameGtWroughtIron",
+ ironBars,
+ ironBars,
+ ironBars,
+ ironBars,
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap))) {
+ Logger.INFO("Added a recipe for the Fish Trap.");
+ }
+
+ // Potin
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { "dustLead", "dustBronze", "dustTin", "dustLead", "dustBronze" },
+ ALLOY.POTIN.getDust(5))) {
+ Logger.INFO("Added shapeless recipe for Potin Dust.");
+ }
+
+ // Tumbaga
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { "dustGold", "dustGold", "dustCopper" },
+ ItemUtils.getSimpleStack(ModItems.dustTumbagaMix))) {
+ Logger.INFO("Added shapeless recipe for Tumbaga Mix.");
+ }
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { ItemUtils.getSimpleStack(ModItems.dustTumbagaMix),
+ ItemUtils.getSimpleStack(ModItems.dustTumbagaMix), ItemUtils.getSimpleStack(ModItems.dustTumbagaMix),
+ "dustGold" },
+ ALLOY.TUMBAGA.getDust(10))) {
+ Logger.INFO("Added shapeless recipe for Tumbaga Dust.");
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateIron",
+ "stickIron",
+ "plateIron",
+ "ringIron",
+ "plateIron",
+ "stickIron",
+ "plateIron",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 0, 1));
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateBronze",
+ "stickBronze",
+ "plateBronze",
+ "ringBronze",
+ "plateBronze",
+ "stickBronze",
+ "plateBronze",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 1, 1));
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateSteel",
+ "stickSteel",
+ "plateSteel",
+ "ringSteel",
+ "plateSteel",
+ "stickSteel",
+ "plateSteel",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 2, 1));
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Blocks.glass, 16),
+ ItemUtils.getSimpleStack(Blocks.glowstone, 16),
+ ItemList.Large_Fluid_Cell_Steel.get(1),
+ CI.getNumberedAdvancedCircuit(4))
+ .itemOutputs(VolumetricFlaskHelper.getLargeVolumetricFlask(2))
+ .fluidInputs(FluidUtils.getFluidStack("molten.borosilicateglass", 2000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Blocks.glass, 64),
+ ItemUtils.getSimpleStack(Blocks.glowstone, 64),
+ ItemList.Large_Fluid_Cell_TungstenSteel.get(1),
+ CI.getNumberedAdvancedCircuit(5))
+ .itemOutputs(VolumetricFlaskHelper.getGiganticVolumetricFlask(2))
+ .fluidInputs(FluidUtils.getFluidStack("molten.borosilicateglass", 8000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ // Mining Explosive
+ Logger.RECIPE("[Inspection] Explosives");
+ if (RecipeUtils.addShapedRecipe(
+ CI.explosiveITNT,
+ CI.explosiveTNT,
+ CI.explosiveITNT,
+ CI.explosiveTNT,
+ "frameGtIron",
+ CI.explosiveTNT,
+ "dustSulfur",
+ CI.explosiveTNT,
+ "dustSulfur",
+ ItemUtils.getSimpleStack(ModBlocks.blockMiningExplosive, 3))) {
+ Logger.INFO("Added a recipe for Mining Explosives.");
+ }
+
+ // Alkalus Coin
+ if (RecipeUtils.addShapedRecipe(
+ "gemExquisiteRuby",
+ "gemFlawlessDiamond",
+ "gemExquisiteDiamond",
+ "gemFlawlessRuby",
+ ItemList.Credit_Greg_Osmium.get(1),
+ "gemFlawlessSapphire",
+ "gemExquisiteEmerald",
+ "gemFlawlessEmerald",
+ "gemExquisiteSapphire",
+ ItemUtils.getSimpleStack(ModItems.itemAlkalusDisk))) {
+ Logger.INFO("Added a recipe for The Alkalus Disk.");
+ }
+
+ /*
+ * final String fancyGems[] = new String[]{"gemExquisiteDiamond", "gemExquisiteEmerald", "gemExquisiteRuby",
+ * "gemExquisiteSapphire"}; final ItemStack gemShards[] = new
+ * ItemStack[]{ItemUtils.simpleMetaStack(ModItems.itemGemShards, 0, 1),
+ * ItemUtils.simpleMetaStack(ModItems.itemGemShards, 1, 1), ItemUtils.simpleMetaStack(ModItems.itemGemShards, 2,
+ * 1), ItemUtils.simpleMetaStack(ModItems.itemGemShards, 3, 1)}; int l=0; for (final String gem : fancyGems){
+ * GameRegistry.addShapelessRecipe( gemShards[l], ItemUtils.getItemStackOfAmountFromOreDict(gem, 1), new
+ * ItemStack(ModItems.itemAlkalusDisk, 1, OreDictionary.WILDCARD_VALUE)); l++; }
+ */
+
+ Logger.RECIPE("[Inspection] Wither Cage");
+ if (RecipeUtils.addShapedRecipe(
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ getSimpleStack(Items.nether_star),
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard, 32))) {
+ Logger.INFO("Added a recipe for Wither Cages.");
+ }
+
+ // Magic Feather
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Items.feather, 64),
+ ItemUtils.getSimpleStack(Blocks.emerald_block, 32),
+ ItemUtils.getSimpleStack(Blocks.diamond_block, 32),
+ Materials.Ruby.getBlocks(32),
+ Materials.Sapphire.getBlocks(32),
+ ItemUtils.getSimpleStack(Blocks.gold_block, 32))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.itemMagicFeather, 1))
+ .fluidInputs(Materials.Silver.getMolten(32 * 144))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ // Pest Killer
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getTieredMachineCasing(1),
+ CI.getElectricPump(2, 1),
+ CI.getPlate(2, 4),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(0), 2),
+ CI.getNumberedCircuit(16))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockPestKiller))
+ .fluidInputs(FluidUtils.getHotWater(500))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_LV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private static boolean addCompressedObsidian() {
+ // Invert Obsidian
+ ItemStack aInvertedObsidian = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 5, 1);
+ if (RecipeUtils.addShapedRecipe(
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 1, 1),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ aInvertedObsidian)) {
+ Logger.INFO("Added a recipe for Inverted Obsidian.");
+ }
+
+ final ItemStack[] mItems = new ItemStack[6];
+ mItems[0] = ItemUtils.getSimpleStack(Blocks.obsidian);
+ for (int r = 0; r < 5; r++) {
+ mItems[r + 1] = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, r, 1);
+ }
+
+ final ItemStack[] mItems2 = new ItemStack[6];
+ mItems2[0] = ItemUtils.getSimpleStack(Blocks.glowstone);
+ for (int r = 0; r < 5; r++) {
+ mItems2[r + 1] = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 6 + r, 1);
+ }
+
+ // Compressed Obsidian 1-5
+ for (int r = 0; r < 5; r++) {
+
+ final ItemStack input = mItems[r];
+ final ItemStack output = mItems[r + 1];
+
+ if (RecipeUtils.addShapedRecipe(input, input, input, input, input, input, input, input, input, output)) {
+ Logger.INFO("Added a recipe for Compressed Obsidian [" + r + "]");
+ }
+
+ if (RecipeUtils
+ .addShapelessGregtechRecipe(new ItemStack[] { output }, ItemUtils.getSimpleStack(input, 9))) {
+ Logger.INFO("Added a shapeless recipe for Compressed Obsidian [" + r + "]");
+ }
+ }
+
+ // Compressed Glowstone 1-5
+ for (int r = 0; r < 5; r++) {
+
+ final ItemStack input = mItems2[r];
+ final ItemStack output = mItems2[r + 1];
+
+ if (RecipeUtils.addShapedRecipe(
+ input,
+ input,
+ input,
+ input,
+ r == 2 ? aInvertedObsidian : input,
+ input,
+ input,
+ input,
+ input,
+ output)) {
+ Logger.INFO("Added a recipe for Compressed Glowstone [" + r + "]");
+ }
+
+ if (RecipeUtils
+ .addShapelessGregtechRecipe(new ItemStack[] { output }, ItemUtils.getSimpleStack(input, 9))) {
+ Logger.INFO("Added a shapeless recipe for Compressed Glowstone [" + r + "]");
+ }
+ }
+ return true;
+ }
+
+ private static void migratedRecipes() {
+
+ RecipeUtils.generateMortarRecipe(
+ ItemUtils.getSimpleStack(ModItems.itemPlateRawMeat),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1));
+
+ generateWireRecipes(ELEMENT.getInstance().ZIRCONIUM);
+ generateWireRecipes(ALLOY.HG1223);
+ generateWireRecipes(ALLOY.LEAGRISIUM);
+ generateWireRecipes(ALLOY.TRINIUM_TITANIUM);
+ generateWireRecipes(ELEMENT.STANDALONE.HYPOGEN);
+ generateWireRecipes(ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // No Material for void, natch.
+ if (Thaumcraft.isModLoaded()) {
+ generatePipeRecipes(GT_Materials.Void.mDefaultLocalName, GT_Materials.Void.getMass(), 16);
+ }
+
+ Material[] gtpp = new Material[] { ALLOY.STABALLOY, ALLOY.TANTALLOY_60, ALLOY.TANTALLOY_61, ALLOY.POTIN,
+ ALLOY.MARAGING300, ALLOY.MARAGING350, ALLOY.INCONEL_690, ALLOY.INCONEL_792, ALLOY.HASTELLOY_X,
+ ALLOY.TRINIUM_NAQUADAH_CARBON };
+
+ for (Material mat : gtpp) {
+ // generatePipeRecipes multiplies the voltage multiplier by 8 because ??! reasons.
+ generatePipeRecipes(mat.getLocalizedName(), mat.getMass(), mat.vVoltageMultiplier / 8);
+ }
+
+ Materials[] h = new Materials[] { Materials.Europium, Materials.Tungsten, Materials.DarkSteel, Materials.Clay,
+ Materials.Lead, };
+
+ for (Materials e : h) {
+ if (e == Materials.DarkSteel) {
+ if (!EnderIO.isModLoaded()) {
+ continue;
+ }
+ }
+ int tVoltageMultiplier = (e.mBlastFurnaceTemp >= 2800) ? 64 : 16;
+ generatePipeRecipes(e.mDefaultLocalName, e.getMass(), tVoltageMultiplier);
+ }
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ALLOY.MARAGING250.getGear(1),
+ CI.component_Plate[6],
+ CI.getTieredCircuitOreDictName(4),
+ GregtechItemList.Casing_AdvancedVacuum.get(1),
+ CI.getTieredCircuitOreDictName(4),
+ CI.component_Plate[5],
+ ItemList.Hatch_Input_IV.get(1),
+ CI.component_Plate[5],
+ GregtechItemList.Hatch_Input_Cryotheum.get(1L));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ALLOY.MARAGING300.getGear(1),
+ CI.component_Plate[6],
+ CI.getTieredCircuitOreDictName(5),
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ CI.getTieredCircuitOreDictName(5),
+ CI.component_Plate[6],
+ ItemList.Hatch_Input_IV.get(1),
+ CI.component_Plate[6],
+ GregtechItemList.Hatch_Input_Pyrotheum.get(1L));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ ALLOY.PIKYONIUM.getGear(1),
+ CI.component_Plate[9],
+ CI.getTieredCircuitOreDictName(7),
+ GregtechItemList.Casing_Naq_Reactor_A.get(1),
+ CI.getTieredCircuitOreDictName(7),
+ CI.component_Plate[9],
+ ItemList.Hatch_Input_ZPM.get(1),
+ CI.component_Plate[8],
+ GregtechItemList.Hatch_Input_Naquadah.get(1L, new Object[0]));
+
+ if (PollutionUtils.isPollutionEnabled()) {
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_LV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_LV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_MV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_MV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_HV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_HV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_EV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_EV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_IV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_IV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_LuV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_LuV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_ZPM.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_ZPM.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_UV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_UV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_MAX.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_MAX.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_MAX.get(1) });
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java
new file mode 100644
index 0000000000..1f8d5d9a8e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class RECIPES_LaserEngraver implements IOreRecipeRegistrator {
+
+ public RECIPES_LaserEngraver() {
+ OrePrefixes.crafting.add(this);
+ }
+
+ @Override
+ public void registerOre(final OrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if (aOreDictName.equals(OreDictNames.craftingLensWhite.toString())) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lithium, 2L),
+ GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("plateDoubleLithium7", 1))
+ .duration(4 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 3L),
+ GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 1))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ } else if (aOreDictName.equals(OreDictNames.craftingLensLime.toString())) {
+ // Coil Wires
+ ItemStack coilWire1 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire", "coilWire1", 0, 1);
+ ItemStack coilWire2 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:1", "coilWire2", 1, 1);
+ ItemStack coilWire3 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:2", "coilWire3", 2, 1);
+ ItemStack coilWire4 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:3", "coilWire4", 3, 1);
+
+ // Simple Life
+ String wire = "wireGt02";
+
+ // Wires to Laser
+ ItemStack wireT1a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Aluminium", 1);
+ ItemStack wireT1b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Nichrome", 1);
+ ItemStack wireT2a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Osmium", 1);
+ ItemStack wireT2b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Platinum", 1);
+ ItemStack wireT3a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "VanadiumGallium", 1);
+ ItemStack wireT3b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "YttriumBariumCuprate", 1);
+ ItemStack wireT3c = ItemUtils.getItemStackOfAmountFromOreDict(wire + "NiobiumTitanium", 1);
+ ItemStack wireT4a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Naquadah", 1);
+
+ // T1
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT1a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire1)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT1b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire1)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+ // T2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT2a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire2)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT2b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire2)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ // T3
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3c, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ // T4
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT4a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire4)
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+
+ } else if (aOreDictName.equals(OreDictNames.craftingLensOrange.toString())) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(ModItems.itemAlkalusDisk), GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getSimpleStack(Dimension_Everglades.portalItem))
+ .duration(3 * HOURS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java
new file mode 100644
index 0000000000..4929872caa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.recipe;
+
+public class RECIPES_MachineComponents {
+
+ // Fluid Pipe
+ public static String pipeTier7 = "pipeHugeSteel";
+ public static String pipeTier8 = "pipeHugeStainlessSteel";
+ public static String pipeTier9 = "pipeHugeTitanium";
+
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java
new file mode 100644
index 0000000000..2f9e347b52
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java
@@ -0,0 +1,2960 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.EternalSingularity;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.RemoteIO;
+
+import java.util.List;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+import com.github.technus.tectech.thing.CustomItemList;
+import com.google.common.collect.ImmutableList;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch.ASSEMBLY_LINE_RESEARCH;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.covers.CoverManager;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class RECIPES_Machines {
+
+ // Outputs
+ public static ItemStack RECIPE_Buffer_ULV = GregtechItemList.Energy_Buffer_1by1_ULV.get(1);
+ public static ItemStack RECIPE_Buffer_LV = GregtechItemList.Energy_Buffer_1by1_LV.get(1);
+ public static ItemStack RECIPE_Buffer_MV = GregtechItemList.Energy_Buffer_1by1_MV.get(1);
+ public static ItemStack RECIPE_Buffer_HV = GregtechItemList.Energy_Buffer_1by1_HV.get(1);
+ public static ItemStack RECIPE_Buffer_EV = GregtechItemList.Energy_Buffer_1by1_EV.get(1);
+ public static ItemStack RECIPE_Buffer_IV = GregtechItemList.Energy_Buffer_1by1_IV.get(1);
+ public static ItemStack RECIPE_Buffer_LuV = GregtechItemList.Energy_Buffer_1by1_LuV.get(1);
+ public static ItemStack RECIPE_Buffer_ZPM = GregtechItemList.Energy_Buffer_1by1_ZPM.get(1);
+ public static ItemStack RECIPE_Buffer_UV = GregtechItemList.Energy_Buffer_1by1_UV.get(1);
+ public static ItemStack RECIPE_Buffer_MAX = GregtechItemList.Energy_Buffer_1by1_MAX.get(1);
+ // Industrial Centrifuge
+ public static ItemStack RECIPE_IndustrialCentrifugeController;
+ public static ItemStack RECIPE_IndustrialCentrifugeCasing;
+ // Industrial Coke Oven
+ public static ItemStack RECIPE_IndustrialCokeOvenController;
+ public static ItemStack RECIPE_IndustrialCokeOvenFrame;
+ public static ItemStack RECIPE_IndustrialCokeOvenCasingA;
+ public static ItemStack RECIPE_IndustrialCokeOvenCasingB;
+ // Industrial Electrolyzer
+ public static ItemStack RECIPE_IndustrialElectrolyzerController;
+ public static ItemStack RECIPE_IndustrialElectrolyzerFrame;
+ // Industrial Material Press
+ public static ItemStack RECIPE_IndustrialMaterialPressController;
+ public static ItemStack RECIPE_IndustrialMaterialPressFrame;
+ // Industrial Maceration Stack
+ public static ItemStack RECIPE_IndustrialMacerationStackController;
+ public static ItemStack RECIPE_IndustrialMacerationStackFrame;
+ // Industrial Wire Factory
+ public static ItemStack RECIPE_IndustrialWireFactoryController;
+ public static ItemStack RECIPE_IndustrialWireFactoryFrame;
+ // Industrial Multi Tank
+ public static ItemStack RECIPE_IndustrialMultiTankController;
+ public static ItemStack RECIPE_IndustrialMultiTankFrame;
+ // Industrial Matter Fabricator
+ public static ItemStack RECIPE_IndustrialMatterFabController;
+ public static ItemStack RECIPE_IndustrialMatterFabFrame;
+ public static ItemStack RECIPE_IndustrialMatterFabCoil;
+ // Industrial Blast Smelter
+ public static ItemStack RECIPE_IndustrialBlastSmelterController;
+ public static ItemStack RECIPE_IndustrialBlastSmelterFrame;
+ public static ItemStack RECIPE_IndustrialBlastSmelterCoil;
+ // Industrial Sieve
+ public static ItemStack RECIPE_IndustrialSieveController;
+ public static ItemStack RECIPE_IndustrialSieveFrame;
+ public static ItemStack RECIPE_IndustrialSieveGrate;
+ // Industrial Tree Farmer
+ public static ItemStack RECIPE_TreeFarmController;
+ public static ItemStack RECIPE_TreeFarmFrame;
+ // Tesseracts
+ public static ItemStack RECIPE_TesseractGenerator;
+ public static ItemStack RECIPE_TesseractTerminal;
+ // Thermal Boiler
+ public static ItemStack RECIPE_ThermalBoilerController;
+ public static ItemStack RECIPE_ThermalBoilerCasing;
+
+ // Thorium Reactor
+ public static ItemStack RECIPE_LFTRController;
+ public static ItemStack RECIPE_LFTROuterCasing;
+ public static ItemStack RECIPE_LFTRInnerCasing;
+
+ // Nuclear Salt Processing Plant
+ public static ItemStack RECIPE_SaltPlantController;
+
+ // Cyclotron
+ public static ItemStack RECIPE_CyclotronController;
+ public static ItemStack RECIPE_CyclotronOuterCasing;
+ public static ItemStack RECIPE_CyclotronInnerCoil;
+
+ // Wire
+ public static String cableTier4 = "cableGt04Gold";
+ public static String cableTier6 = "cableGt04Tungsten";
+
+ public static String pipeTier1 = "pipeHuge" + "Clay";
+ public static String pipeTier2 = "pipeHuge" + "Potin";
+ public static String pipeTier3 = "pipeHuge" + "Steel";
+ public static String pipeTier4 = "pipeHuge" + "StainlessSteel";
+ public static String pipeTier7 = "pipeHuge" + "Tantalloy60";
+
+ // EV/IV MACHINES
+ public static ItemStack IV_MACHINE_Electrolyzer;
+ public static ItemStack EV_MACHINE_Centrifuge;
+ public static ItemStack EV_MACHINE_BendingMachine;
+ public static ItemStack IV_MACHINE_Wiremill;
+ public static ItemStack EV_MACHINE_Macerator;
+ public static ItemStack IV_MACHINE_Macerator;
+ public static ItemStack IV_MACHINE_Cutter;
+ public static ItemStack IV_MACHINE_Extruder;
+ public static ItemStack HV_MACHINE_Sifter;
+ public static ItemStack EV_MACHINE_ThermalCentrifuge;
+ public static ItemStack EV_MACHINE_OreWasher;
+ public static ItemStack IV_MACHINE_AlloySmelter;
+ public static ItemStack IV_MACHINE_Mixer;
+ public static ItemStack EV_MACHINE_ChemicalBath;
+
+ // Plates
+ public static String plateBronze = "plateBronze";
+ public static String plateSteel = "plateSteel";
+
+ // Pipes
+ public static String pipeHugeStainlessSteel = "pipeHugeStainlessSteel";
+
+ // Lava Boiler
+ public static ItemStack boiler_Coal;
+ public static ItemStack IC2MFE;
+ public static ItemStack IC2MFSU;
+
+ // Misc
+ public static ItemStack INPUT_RCCokeOvenBlock;
+
+ public static final void loadRecipes() {
+ run();
+ Logger.INFO("Loading Recipes for the Various machine blocks.");
+ }
+
+ private static void run() {
+
+ initModItems();
+ tieredMachineHulls();
+ energyCores();
+ wirelessChargers();
+ largeArcFurnace();
+ industrialVacuumFurnace();
+ fakeMachineCasingCovers();
+ overflowValveCovers();
+ superBuses();
+ distillus();
+ algaeFarm();
+ chemPlant();
+ zyngen();
+ milling();
+ sparging();
+ chisels();
+ rockBreaker();
+ thermicFluidHeater();
+ advHeatExchanger();
+ chiselBuses();
+ solidifierHatches();
+
+ gt4FarmManager();
+ gt4Inventory();
+
+ multiForgeHammer();
+ multiMolecularTransformer();
+ multiXlTurbines();
+ multiSolarTower();
+ multiElementalDuplicator();
+
+ resonanceChambers();
+ modulators();
+ }
+
+ private static void thermicFluidHeater() {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(5, 1),
+ CI.circuitTier5,
+ CI.getPlate(5, 1),
+ pipeTier7,
+ ItemList.Machine_IV_FluidHeater.get(1),
+ pipeTier7,
+ CI.getPlate(5, 1),
+ CI.circuitTier4,
+ CI.getPlate(5, 1),
+ GregtechItemList.Controller_IndustrialFluidHeater.get(1));
+ }
+
+ private static void advHeatExchanger() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Machine_Multi_HeatExchanger.get(1),
+ CI.getDoublePlate(6, 8), CI.getScrew(6, 16), CI.getCircuit(5, 8) },
+ CI.tieredMaterials[5].getMolten(144 * 8),
+ GregtechItemList.XL_HeatExchanger.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_StableTitanium.get(1),
+ CI.getPlate(5, 4), CI.getScrew(5, 8), },
+ CI.tieredMaterials[5].getMolten(144 * 2),
+ GregtechItemList.Casing_XL_HeatExchanger.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void gt4FarmManager() {
+
+ ItemList[] aInputHatches = new ItemList[] { ItemList.Hatch_Input_LV, ItemList.Hatch_Input_MV,
+ ItemList.Hatch_Input_HV, ItemList.Hatch_Input_EV, ItemList.Hatch_Input_IV, ItemList.Hatch_Input_LuV,
+ ItemList.Hatch_Input_ZPM, ItemList.Hatch_Input_UV };
+ GregtechItemList[] aOutputMachines = new GregtechItemList[] { GregtechItemList.GT4_Crop_Harvester_LV,
+ GregtechItemList.GT4_Crop_Harvester_MV, GregtechItemList.GT4_Crop_Harvester_HV,
+ GregtechItemList.GT4_Crop_Harvester_EV, GregtechItemList.GT4_Crop_Harvester_IV,
+ GregtechItemList.GT4_Crop_Harvester_LuV, GregtechItemList.GT4_Crop_Harvester_ZPM,
+ GregtechItemList.GT4_Crop_Harvester_UV };
+
+ int aTier = 1;
+ for (int i = 0; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getRobotArm(aTier, 1),
+ CI.getSensor(aTier, 1),
+ CI.getRobotArm(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.toolHeadSense, CI.tieredMaterials[aTier], 1),
+ CI.getTieredMachineHull(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.toolHeadSense, CI.tieredMaterials[aTier], 1),
+ CI.getTieredCircuitOreDictName(aTier),
+ aInputHatches[i].get(1),
+ CI.getTieredCircuitOreDictName(aTier),
+ aOutputMachines[i].get(1));
+ aTier++;
+ }
+ }
+
+ private static void gt4Inventory() {
+
+ GregtechItemList[] aOutputElectricCraftingTable = new GregtechItemList[] {
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV, GregtechItemList.GT4_Electric_Auto_Workbench_MV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV, GregtechItemList.GT4_Electric_Auto_Workbench_EV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV, GregtechItemList.GT4_Electric_Auto_Workbench_LuV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM, GregtechItemList.GT4_Electric_Auto_Workbench_UV };
+
+ int aTier = 1;
+ for (int i = 0; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ ItemUtils.getSimpleStack(Blocks.crafting_table),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ CI.getTieredCircuitOreDictName(aTier),
+ CI.getTieredMachineHull(aTier),
+ CI.getTieredCircuitOreDictName(aTier),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ CI.getRobotArm(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ aOutputElectricCraftingTable[i].get(1));
+ aTier++;
+ }
+ }
+
+ private static void multiForgeHammer() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.machineHull_IV, 2), ItemList.Machine_IV_Hammer.get(1),
+ CI.getPlate(4, 8), CI.getBolt(5, 32), ELEMENT.getInstance().ZIRCONIUM.getFineWire(32),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitElite", 4) },
+ CI.getTieredFluid(4, 144 * 12),
+ GregtechItemList.Controller_IndustrialForgeHammer.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(5));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_IndustrialForgeHammer.get(1),
+ CI.bitsd,
+ new Object[] { "IBI", "HCH", "IHI", 'I', CI.getPlate(4, 1), 'B', ALLOY.BABBIT_ALLOY.getPlate(1), 'C',
+ ItemList.Casing_HeatProof.get(1), 'H', ALLOY.HASTELLOY_X.getRod(1) });
+ }
+
+ private static void multiMolecularTransformer() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredGTPPMachineCasing(6, 1), CI.getPlate(5, 16), CI.getBolt(5, 32),
+ ALLOY.HG1223.getFineWire(64), CI.getEmitter(4, 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitMaster", 10) },
+ CI.getTieredFluid(5, 144 * 16),
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_11_MOLECULAR_TRANSFORMER, 1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addAssemblylineRecipe(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_11_MOLECULAR_TRANSFORMER, 1),
+ 20 * 60 * 30,
+ new Object[] { ALLOY.HG1223.getFineWire(64), ALLOY.HG1223.getFineWire(64),
+ ItemList.Electric_Motor_IV.get(16), ItemList.Energy_LapotronicOrb.get(16),
+ CI.getTieredComponent(OrePrefixes.cableGt12, 6, 16), CI.getTieredComponent(OrePrefixes.wireGt16, 5, 32),
+ ALLOY.ZERON_100.getFrameBox(4), ALLOY.ZIRCONIUM_CARBIDE.getPlateDouble(32),
+ ALLOY.BABBIT_ALLOY.getPlate(64), ALLOY.LEAGRISIUM.getGear(8),
+ new Object[] { CI.getTieredCircuitOreDictName(4), 64 },
+ new Object[] { CI.getTieredCircuitOreDictName(5), 32 },
+ new Object[] { CI.getTieredCircuitOreDictName(6), 16 },
+ GregtechItemList.Laser_Lens_WoodsGlass.get(1), },
+ new FluidStack[] { ALLOY.NITINOL_60.getFluidStack(144 * 9 * (2)),
+ ALLOY.INCOLOY_MA956.getFluidStack(144 * 9 * (8)), ALLOY.KANTHAL.getFluidStack(144 * 1 * (4)), },
+ GregtechItemList.Controller_MolecularTransformer.get(1),
+ 20 * 60 * 10 * (1),
+ MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPlate(6, 4), CI.getScrew(6, 8),
+ ELEMENT.getInstance().PALLADIUM.getFineWire(16), CI.getSensor(5, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitElite", 4) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_1.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPlate(5, 4), CI.getScrew(5, 8),
+ ItemList.Casing_Coil_Nichrome.get(2), CI.getFieldGenerator(3, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitData", 8) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_2.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), ItemUtils.getSimpleStack(Blocks.glowstone, 16),
+ CI.getGear(5, 8), ELEMENT.getInstance().TITANIUM.getWire04(4), CI.getFieldGenerator(4, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitData", 8) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_3.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void multiXlTurbines() {
+
+ RecipeUtils.addShapedRecipe(
+ CI.getDoublePlate(4, 1),
+ CI.getElectricMotor(3, 1),
+ CI.getDoublePlate(4, 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellLubricant", 1),
+ ItemList.Casing_Gearbox_Titanium.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellLubricant", 1),
+ CI.getDoublePlate(4, 1),
+ CI.getElectricMotor(3, 1),
+ CI.getDoublePlate(4, 1),
+ GregtechItemList.Casing_Turbine_Shaft.get(1));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine.get(1), CI.getPlate(4, 4),
+ CI.getScrew(4, 8), CI.getCircuit(4, 4), CI.getGear(3, 8) },
+ CI.tieredMaterials[3].getMolten(144 * 8),
+ GregtechItemList.Hatch_Turbine_Rotor.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Steam
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine.get(1), CI.getPlate(3, 4),
+ CI.getScrew(3, 8), },
+ CI.tieredMaterials[2].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_LP.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(3));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeSteamTurbine.get(1), CI.getPlate(4, 8),
+ CI.getScrew(4, 16), CI.getGear(4, 4), CI.getCircuit(4, 8) },
+ CI.tieredMaterials[4].getMolten(144 * 8),
+ GregtechItemList.Large_Steam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Gas
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine1.get(1), CI.getPlate(4, 4),
+ CI.getScrew(4, 8), },
+ CI.tieredMaterials[3].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_Gas.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(4));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeGasTurbine.get(1), CI.getPlate(5, 8),
+ CI.getScrew(5, 16), CI.getGear(5, 4), CI.getCircuit(5, 8) },
+ CI.tieredMaterials[5].getMolten(144 * 8),
+ GregtechItemList.Large_Gas_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+
+ // HP Steam
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine2.get(1), CI.getPlate(5, 4),
+ CI.getScrew(5, 8), },
+ CI.tieredMaterials[4].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_HP.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeHPSteamTurbine.get(1), CI.getPlate(6, 8),
+ CI.getScrew(6, 16), CI.getGear(6, 4), CI.getCircuit(6, 8) },
+ CI.tieredMaterials[6].getMolten(144 * 8),
+ GregtechItemList.Large_HPSteam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Plasma
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine3.get(1), CI.getPlate(6, 4),
+ CI.getScrew(6, 8), },
+ CI.tieredMaterials[5].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_Plasma.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargePlasmaTurbine.get(1), CI.getPlate(7, 8),
+ CI.getScrew(7, 16), CI.getGear(7, 4), CI.getCircuit(7, 8) },
+ CI.tieredMaterials[7].getMolten(144 * 8),
+ GregtechItemList.Large_Plasma_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(7));
+ if (GoodGenerator.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(GoodGenerator.ID, "supercriticalFluidTurbineCasing", 1),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedplate", 4, 10101),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedscrew", 8, 10101) },
+ FluidRegistry.getFluidStack("molten.adamantium alloy", 144 * 2),
+ GregtechItemList.Casing_Turbine_SC.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 1, 32016),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedplate", 8, 10104),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedscrew", 16, 10104),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedgearGt", 4, 10104), CI.getCircuit(7, 8) },
+ FluidRegistry.getFluidStack("molten.hikarium", 144 * 8),
+ GregtechItemList.Large_SCSteam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(7));
+ }
+ }
+
+ private static void multiSolarTower() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getTieredGTPPMachineCasing(3, 4),
+ ALLOY.MARAGING250.getPlate(8), ALLOY.MARAGING250.getBolt(8), ALLOY.MARAGING250.getScrew(8),
+ CI.getCircuit(5, 8) },
+ CI.getTieredFluid(3, 144 * 16),
+ GregtechItemList.Industrial_Solar_Tower.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(4));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING350.getFrameBox(1),
+ ALLOY.STAINLESS_STEEL.getPlate(4), ALLOY.MARAGING350.getScrew(8) },
+ CI.getTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_Structural.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING250.getFrameBox(1),
+ ALLOY.STAINLESS_STEEL.getPlate(4), ALLOY.MARAGING250.getBolt(16),
+ ELEMENT.getInstance().ALUMINIUM.getScrew(8) },
+ CI.getTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_SaltContainment.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING250.getFrameBox(1),
+ ALLOY.STEEL_BLACK.getPlate(4), ALLOY.MARAGING250.getScrew(8) },
+ CI.getAlternativeTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_HeatContainment.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getTieredGTPPMachineCasing(2, 1), CI.getPlate(3, 2),
+ CI.getGear(3, 4), CI.getElectricMotor(3, 2), CI.getCircuit(3, 4) },
+ CI.getTertiaryTieredFluid(3, 144 * 4),
+ GregtechItemList.Solar_Tower_Reflector.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(3));
+ }
+
+ private static void multiElementalDuplicator() {
+
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Machine_IV_Replicator.get(1),
+ 20 * 60 * 60 * 12,
+ new Object[] { CI.getTieredMachineHull(7, 4), CI.getFieldGenerator(5, 16), CI.getElectricMotor(7, 16),
+ CI.getElectricPiston(7, 4), CI.getEnergyCore(6, 2), CI.getPlate(7, 16), CI.getScrew(7, 32),
+ CI.getBolt(6, 32), CI.getTieredComponent(OrePrefixes.rod, 6, 10),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 20 }, ItemList.Tool_DataOrb.get(32),
+ GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { CI.getTieredFluid(7, 144 * 32), CI.getAlternativeTieredFluid(6, 144 * 16),
+ CI.getTertiaryTieredFluid(6, 144 * 16), ALLOY.BABBIT_ALLOY.getFluidStack(128 * 144), },
+ GregtechItemList.Controller_ElementalDuplicator.get(1),
+ 20 * 60 * 60,
+ (int) MaterialUtils.getVoltageForTier(7));
+
+ CORE.RA.addAssemblylineRecipe(
+ GregtechItemList.Modulator_III.get(1),
+ 20 * 60 * 60 * 4,
+ new Object[] { CI.getTieredGTPPMachineCasing(7, 2), CI.getFieldGenerator(4, 4), CI.getEnergyCore(4, 2),
+ CI.getPlate(7, 8), CI.getScrew(6, 16), CI.getBolt(6, 16), CI.getTieredComponent(OrePrefixes.rod, 5, 16),
+ new Object[] { CI.getTieredCircuitOreDictName(6), 32 }, ItemList.Tool_DataOrb.get(32), },
+ new FluidStack[] { CI.getTieredFluid(6, 144 * 16), CI.getAlternativeTieredFluid(5, 144 * 8),
+ CI.getTertiaryTieredFluid(5, 144 * 8), ALLOY.BABBIT_ALLOY.getFluidStack(64 * 144), },
+ GregtechItemList.Hatch_Input_Elemental_Duplicator.get(1),
+ 20 * 60 * 60 * (2),
+ (int) MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addAssemblylineRecipe(
+ GregtechItemList.ResonanceChamber_III.get(1),
+ 20 * 60 * 60 * 2,
+ new Object[] { CI.getTieredMachineHull(6, 5), CI.getFieldGenerator(3, 16), CI.getEnergyCore(2, 2),
+ CI.getPlate(7, 4), CI.getScrew(7, 4), CI.getBolt(6, 8), CI.getTieredComponent(OrePrefixes.rod, 5, 4),
+ new Object[] { CI.getTieredCircuitOreDictName(5), 4 }, ItemList.Tool_DataStick.get(4), },
+ new FluidStack[] { CI.getTieredFluid(5, 144 * 16), CI.getAlternativeTieredFluid(4, 144 * 8),
+ CI.getTertiaryTieredFluid(4, 144 * 8), ALLOY.BABBIT_ALLOY.getFluidStack(16 * 144), },
+ GregtechItemList.Casing_ElementalDuplicator.get(1),
+ 20 * 60 * (10),
+ (int) MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void resonanceChambers() {
+ int aFieldTier = 1;
+ int aCasingTier = 4;
+ for (int i = 0; i < 4; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getTieredMachineCasing(aCasingTier),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ ItemUtils.simpleMetaStack(ModBlocks.blockSpecialMultiCasings2, i, 1));
+ aCasingTier++;
+ aFieldTier++;
+ }
+ }
+
+ private static void modulators() {
+ int aCasingTier = 4;
+ for (int i = 4; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredMachineCasing(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ ItemUtils.simpleMetaStack(ModBlocks.blockSpecialMultiCasings2, i, 1));
+ aCasingTier++;
+ }
+ }
+
+ private static void zyngen() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(6), CI.getTieredMachineHull(4),
+ ItemList.Machine_IV_AlloySmelter.get(1), CI.getGear(3, 16), CI.getBolt(3, 64), CI.getPlate(4, 16) },
+ CI.getAlternativeTieredFluid(4, 144 * 8),
+ GregtechItemList.Industrial_AlloySmelter.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ private static void chemPlant() {
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_Machine_Custom_1.get(2L, new Object[0]),
+ CI.bits,
+ new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F',
+ OrePrefixes.frameGt.get(Materials.Bronze) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_Machine_Custom_2.get(2L, new Object[0]),
+ CI.bits,
+ new Object[] { "PPP", "hFw", "PPP", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'F',
+ OrePrefixes.frameGt.get(Materials.Aluminium) });
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(19), CI.getTieredGTPPMachineCasing(2, 4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.gearGt, 4),
+ CI.getTieredComponentOfMaterial(Materials.AnnealedCopper, OrePrefixes.plate, 16),
+ CI.getTieredComponentOfMaterial(Materials.Plastic, OrePrefixes.pipeLarge, 4),
+ CI.getTieredComponent(OrePrefixes.frameGt, 2, 4), },
+ ALLOY.STEEL_BLACK.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.ChemicalPlant_Controller.get(1),
+ 120 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(15), CI.getTieredGTPPMachineCasing(1, 2),
+ ItemList.Hatch_Input_Bus_MV.get(1),
+ CI.getTieredComponentOfMaterial(Materials.Bronze, OrePrefixes.gearGt, 8),
+ CI.getTieredComponentOfMaterial(Materials.Lead, OrePrefixes.plate, 48),
+ CI.getTieredComponentOfMaterial(Materials.SolderingAlloy, OrePrefixes.wireFine, 16), },
+ ALLOY.BRONZE.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.Bus_Catalysts.get(1),
+ 60 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+
+ private static void algaeFarm() {
+
+ // Give the bad algae a use.
+ CORE.RA.addDistilleryRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 32),
+ null,
+ null,
+ ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4),
+ 20 * 15,
+ 16,
+ false);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(21), CI.getTieredGTPPMachineCasing(0, 4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.rod, 12),
+ CI.getTieredComponentOfMaterial(Materials.Wood, OrePrefixes.plate, 32),
+ CI.getTieredComponentOfMaterial(Materials.Steel, OrePrefixes.bolt, 16),
+ CI.getTieredComponentOfMaterial(Materials.Redstone, OrePrefixes.dust, 32), },
+ ALLOY.POTIN.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.AlgaeFarm_Controller.get(1),
+ 60 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+
+ private static void distillus() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(19), ItemList.Distillation_Tower.get(2),
+ GregtechItemList.GTPP_Casing_IV.get(16), CI.getTieredComponent(OrePrefixes.circuit, 6, 8) },
+ new FluidStack[] { ALLOY.AQUATIC_STEEL.getFluidStack(144 * 32), ALLOY.BABBIT_ALLOY.getFluidStack(144 * 16),
+ ALLOY.BRONZE.getFluidStack(144 * 64), ALLOY.KANTHAL.getFluidStack(144 * 16), },
+ new ItemStack[] { GregtechItemList.Machine_Adv_DistillationTower.get(1) },
+ new FluidStack[] {},
+ 20 * 600,
+ MaterialUtils.getVoltageForTier(6),
+ 5);
+ }
+
+ private static void overflowValveCovers() {
+ ItemStack aOutputs[] = new ItemStack[] { GregtechItemList.Cover_Overflow_LV.get(1L),
+ GregtechItemList.Cover_Overflow_MV.get(1L), GregtechItemList.Cover_Overflow_HV.get(1L),
+ GregtechItemList.Cover_Overflow_EV.get(1L), GregtechItemList.Cover_Overflow_IV.get(1L), };
+
+ for (int tier = 1; tier < aOutputs.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(19), CI.getElectricPump(tier, 2),
+ CI.getElectricMotor(tier, 2), CI.getPlate(tier, 4) },
+ Materials.SolderingAlloy.getFluid(tier * (144)),
+ aOutputs[tier - 1].copy(),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(tier));
+ }
+ }
+
+ private static void tieredMachineHulls() {
+
+ GregtechItemList[] aHulls = new GregtechItemList[] { GregtechItemList.GTPP_Casing_ULV,
+ GregtechItemList.GTPP_Casing_LV, GregtechItemList.GTPP_Casing_MV, GregtechItemList.GTPP_Casing_HV,
+ GregtechItemList.GTPP_Casing_EV, GregtechItemList.GTPP_Casing_IV, GregtechItemList.GTPP_Casing_LuV,
+ GregtechItemList.GTPP_Casing_ZPM, GregtechItemList.GTPP_Casing_UV, GregtechItemList.GTPP_Casing_UHV };
+
+ for (int i = 0; i < 10; i++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20), CI.getTieredMachineCasing(i), CI.getPlate(i, 8),
+ CI.getGear(i, 2), CI.getTieredComponent(OrePrefixes.cableGt02, i, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, i, 2) },
+ CI.getAlternativeTieredFluid(i, 144 * (i + 1) * 2),
+ aHulls[i].get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(i));
+ }
+ }
+
+ private static void initModItems() {
+ IC2MFE = ItemUtils.getItemStackWithMeta(true, "IC2:blockElectric", "IC2_MFE", 1, 1);
+ IC2MFSU = ItemUtils.getItemStackWithMeta(true, "IC2:blockElectric", "IC2_MFSU", 2, 1);
+
+ // Lava Boiler
+ boiler_Coal = ItemList.Machine_Bronze_Boiler.get(1);
+
+ // IV/EV/HV MACHINES
+ IV_MACHINE_Electrolyzer = ItemList.Machine_IV_Electrolyzer.get(1);
+ EV_MACHINE_Centrifuge = ItemList.Machine_EV_Centrifuge.get(1);
+ EV_MACHINE_BendingMachine = ItemList.Machine_EV_Bender.get(1);
+ IV_MACHINE_Wiremill = ItemList.Machine_IV_Wiremill.get(1);
+ EV_MACHINE_Macerator = ItemList.Machine_EV_Macerator.get(1);
+ IV_MACHINE_Macerator = ItemList.Machine_IV_Macerator.get(1);
+ IV_MACHINE_Cutter = ItemList.Machine_IV_Cutter.get(1);
+ IV_MACHINE_Extruder = ItemList.Machine_IV_Extruder.get(1);
+ HV_MACHINE_Sifter = ItemList.Machine_HV_Sifter.get(1);
+ EV_MACHINE_ThermalCentrifuge = ItemList.Machine_EV_ThermalCentrifuge.get(1);
+ EV_MACHINE_OreWasher = ItemList.Machine_EV_OreWasher.get(1);
+ IV_MACHINE_AlloySmelter = ItemList.Machine_IV_AlloySmelter.get(1);
+ IV_MACHINE_Mixer = ItemList.Machine_IV_Mixer.get(1);
+ EV_MACHINE_ChemicalBath = ItemList.Machine_EV_ChemicalBath.get(1);
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ if (Railcraft.isModLoaded()) {
+ // Misc
+ INPUT_RCCokeOvenBlock = ItemUtils
+ .getItemStackWithMeta(Railcraft.isModLoaded(), "Railcraft:machine.alpha", "Coke_Oven_RC", 7, 1);
+ }
+ }
+ runModRecipes();
+ }
+
+ private static void runModRecipes() {
+ // Computer Cube
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.getDataOrb(), 4 * (1)), ItemList.Cover_Screen.get(4),
+ CI.machineHull_IV, ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 2) },
+ ELEMENT.getInstance().TANTALUM.getFluidStack(144 * 16),
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ 60 * 20 * 3,
+ 8000);
+
+ // Circuit programmer
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.robotArm_LV, 4 * (1)),
+ ItemList.Cover_Controller.get(1, CI.electricMotor_MV), CI.machineHull_MV,
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(1), 2),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(2), 2) },
+ ELEMENT.getInstance().IRON.getFluidStack(144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockCircuitProgrammer),
+ 60 * 10 * 1,
+ 30);
+
+ // Lead Lined Chest
+ for (ItemStack plateRubber : OreDictionary.getOres("plateAnyRubber")) CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_LV, GT_Utility.copyAmount(32, plateRubber),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateDenseLead", 9),
+ ItemUtils.getSimpleStack(Blocks.chest) },
+ ELEMENT.getInstance().LEAD.getFluidStack(144 * 16),
+ ItemUtils.getSimpleStack(ModBlocks.blockDecayablesChest),
+ 60 * 10 * 3,
+ 60);
+
+ // RTG
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackWithMeta(true, "IC2:blockGenerator:6", "IC2-RTG", 6, 1),
+ ALLOY.NITINOL_60.getPlate(8), ALLOY.MARAGING350.getGear(4),
+ ItemUtils.getSimpleStack(CI.fieldGenerator_EV, 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireFinePlatinum", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 4) },
+ ALLOY.NIOBIUM_CARBIDE.getFluidStack(144 * 16),
+ GregtechItemList.RTG.get(1),
+ 60 * 20 * 10,
+ 8000);
+
+ // Super Jukebox
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_LV, ItemUtils.getItemStackOfAmountFromOreDict("circuitBasic", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateTumbaga", 8),
+ ItemUtils.getSimpleStack(Blocks.jukebox) },
+ ELEMENT.getInstance().COPPER.getFluidStack(144 * 2),
+ ItemUtils.getSimpleStack(ModBlocks.blockCustomJukebox),
+ 20 * 30,
+ 30);
+
+ // Poo Collector
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_MV, ItemList.FluidRegulator_MV.get(2),
+ CI.getTieredComponent(OrePrefixes.pipeMedium, 2, 2), ALLOY.EGLIN_STEEL.getPlate(4),
+ ALLOY.POTIN.getScrew(6) },
+ ALLOY.TUMBAGA.getFluidStack(144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockPooCollector),
+ 20 * 60,
+ 30);
+
+ // Adv. Poo Collector
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredMachineHull(-1), ItemUtils.getSimpleStack(ModBlocks.blockPooCollector),
+ ItemList.FluidRegulator_IV.get(2), CI.getTieredComponent(OrePrefixes.pipeHuge, 6, 4),
+ CI.getTieredComponent(OrePrefixes.screw, 6, 16) },
+ CI.getAlternativeTieredFluid(5, 144 * 9),
+ ItemUtils.getSimpleStack(ModBlocks.blockPooCollector, 8, 1),
+ 20 * 60 * 5,
+ 500);
+
+ ItemStack aBronzeBricks = ItemUtils.simpleMetaStack(GregTech_API.sBlockCasings1, 10, 1);
+ // Steam Macerator Multi
+ RecipeUtils.addShapedGregtechRecipe(
+ aBronzeBricks,
+ "gemDiamond",
+ aBronzeBricks,
+ "craftingPiston",
+ ALLOY.TUMBAGA.getFrameBox(1),
+ "craftingPiston",
+ aBronzeBricks,
+ "gemDiamond",
+ aBronzeBricks,
+ GregtechItemList.Controller_SteamMaceratorMulti.get(1));
+ // Steam Compressor Multi
+ RecipeUtils.addShapedGregtechRecipe(
+ aBronzeBricks,
+ "craftingPiston",
+ aBronzeBricks,
+ ALLOY.TUMBAGA.getGear(1),
+ ALLOY.TUMBAGA.getFrameBox(1),
+ ALLOY.TUMBAGA.getGear(1),
+ aBronzeBricks,
+ "craftingPiston",
+ aBronzeBricks,
+ GregtechItemList.Controller_SteamCompressorMulti.get(1));
+
+ // Steam Hatch
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ "pipeMediumBronze",
+ "plateBronze",
+ "plateBronze",
+ GregtechItemList.GT_FluidTank_ULV.get(1),
+ "plateBronze",
+ "plateBronze",
+ "pipeMediumBronze",
+ "plateBronze",
+ GregtechItemList.Hatch_Input_Steam.get(1));
+
+ // Steam Input Bus
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ "plateTin",
+ ItemUtils.getSimpleStack(Blocks.hopper),
+ "plateTin",
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ GregtechItemList.Hatch_Input_Bus_Steam.get(1));
+
+ // Steam Output Bus
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ "plateTin",
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ ItemUtils.getSimpleStack(Blocks.hopper),
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ "plateTin",
+ "plateBronze",
+ GregtechItemList.Hatch_Output_Bus_Steam.get(1));
+
+ // Flask Configurator
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), CI.getTieredMachineHull(2),
+ ItemUtils.getSimpleStack(ModBlocks.blockCircuitProgrammer), VolumetricFlaskHelper.getVolumetricFlask(8),
+ CI.getTieredComponent(OrePrefixes.pipeSmall, 2, 2), CI.getPlate(2, 4) },
+ CI.getAlternativeTieredFluid(1, 144 * 8),
+ ItemUtils.getSimpleStack(ModBlocks.blockVolumetricFlaskSetter, 1),
+ 20 * 60,
+ 120);
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge) {
+ // Industrial Centrifuge
+ RECIPE_IndustrialCentrifugeController = GregtechItemList.Industrial_Centrifuge.get(1);
+ RECIPE_IndustrialCentrifugeCasing = GregtechItemList.Casing_Centrifuge1.get(1);
+
+ // Industrial Centrifuge
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.circuitTier4,
+ pipeHugeStainlessSteel,
+ CI.circuitTier4,
+ CI.component_Plate[6],
+ EV_MACHINE_Centrifuge,
+ CI.component_Plate[6],
+ CI.component_Plate[8],
+ CI.machineCasing_EV,
+ CI.component_Plate[8],
+ RECIPE_IndustrialCentrifugeController);
+ // Centrifuge Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ "stickTumbaga",
+ CI.component_Plate[6],
+ CI.component_Plate[8],
+ "stickTumbaga",
+ CI.component_Plate[8],
+ CI.component_Plate[6],
+ "stickTumbaga",
+ CI.component_Plate[6],
+ RECIPE_IndustrialCentrifugeCasing);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.MARAGING250.getPlate(4), ALLOY.INCONEL_792.getPlate(2), ALLOY.TUMBAGA.getRod(3),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialCentrifugeCasing,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ // Industrial Coke Oven
+ RECIPE_IndustrialCokeOvenController = GregtechItemList.Industrial_CokeOven.get(1);
+ RECIPE_IndustrialCokeOvenFrame = GregtechItemList.Casing_CokeOven.get(1);
+ RECIPE_IndustrialCokeOvenCasingA = GregtechItemList.Casing_CokeOven_Coil1.get(1);
+ RECIPE_IndustrialCokeOvenCasingB = GregtechItemList.Casing_CokeOven_Coil2.get(1);
+
+ if (Railcraft.isModLoaded()) {
+ // Industrial Coke Oven
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ CI.circuitTier4,
+ CI.component_Plate[7],
+ CI.machineCasing_EV,
+ INPUT_RCCokeOvenBlock,
+ CI.machineCasing_EV,
+ CI.component_Plate[7],
+ CI.circuitTier4,
+ CI.component_Plate[7],
+ RECIPE_IndustrialCokeOvenController);
+ }
+ // Coke Oven Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ "frameGtTantalloy61",
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ RECIPE_IndustrialCokeOvenFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.TANTALLOY_61.getPlate(4), ALLOY.TANTALLOY_61.getRod(4),
+ ALLOY.TANTALLOY_61.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialCokeOvenFrame,
+ 50,
+ 16);
+ // Coke Oven Coil 1
+ RecipeUtils.addShapedGregtechRecipe(
+ plateBronze,
+ plateBronze,
+ plateBronze,
+ "frameGtBronze",
+ CI.gearboxCasing_Tier_1,
+ "frameGtBronze",
+ plateBronze,
+ plateBronze,
+ plateBronze,
+ RECIPE_IndustrialCokeOvenCasingA);
+ // Coke Oven Coil 2
+ RecipeUtils.addShapedGregtechRecipe(
+ plateSteel,
+ plateSteel,
+ plateSteel,
+ "frameGtSteel",
+ CI.gearboxCasing_Tier_2,
+ "frameGtSteel",
+ plateSteel,
+ plateSteel,
+ plateSteel,
+ RECIPE_IndustrialCokeOvenCasingB);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer) {
+ // Industrial Electrolyzer
+ RECIPE_IndustrialElectrolyzerController = GregtechItemList.Industrial_Electrolyzer.get(1);
+ RECIPE_IndustrialElectrolyzerFrame = GregtechItemList.Casing_Electrolyzer.get(1);
+
+ // Electrolyzer Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "platePotin",
+ "stickLongChrome",
+ "platePotin",
+ "stickLongPotin",
+ "frameGtPotin",
+ "stickLongPotin",
+ "platePotin",
+ "stickLongPotin",
+ "platePotin",
+ RECIPE_IndustrialElectrolyzerFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.POTIN.getPlate(4), ALLOY.POTIN.getLongRod(3),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Chrome, 1), ALLOY.POTIN.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialElectrolyzerFrame,
+ 50,
+ 16);
+ // Industrial Electrolyzer
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateStellite",
+ CI.circuitTier5,
+ "plateStellite",
+ CI.machineCasing_IV,
+ IV_MACHINE_Electrolyzer,
+ CI.machineCasing_IV,
+ "plateStellite",
+ "rotorStellite",
+ "plateStellite",
+ RECIPE_IndustrialElectrolyzerController);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ // Industrial Material Press
+ RECIPE_IndustrialMaterialPressController = GregtechItemList.Industrial_PlatePress.get(1);
+ RECIPE_IndustrialMaterialPressFrame = GregtechItemList.Casing_MaterialPress.get(1);
+
+ // Material Press Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "stickLongTumbaga",
+ "plateTitanium",
+ "stickTantalloy60",
+ "frameGtTumbaga",
+ "stickTantalloy60",
+ "plateTitanium",
+ "stickLongTumbaga",
+ "plateTitanium",
+ RECIPE_IndustrialMaterialPressFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4),
+ ALLOY.TANTALLOY_60.getRod(2), ALLOY.TUMBAGA.getLongRod(2), ALLOY.TUMBAGA.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMaterialPressFrame,
+ 50,
+ 16);
+ // Industrial Material Press
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ CI.circuitTier4,
+ "plateTitanium",
+ CI.machineCasing_EV,
+ EV_MACHINE_BendingMachine,
+ CI.machineCasing_EV,
+ "plateTitanium",
+ CI.circuitTier4,
+ "plateTitanium",
+ RECIPE_IndustrialMaterialPressController);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack) {
+ // Industrial Maceration Stack
+ RECIPE_IndustrialMacerationStackController = GregtechItemList.Industrial_MacerationStack.get(1);
+ RECIPE_IndustrialMacerationStackFrame = GregtechItemList.Casing_MacerationStack.get(1);
+
+ // Maceration Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "platePalladium",
+ "platePalladium",
+ "platePalladium",
+ "stickPlatinum",
+ "frameGtInconel625",
+ "stickPlatinum",
+ "platePalladium",
+ "stickLongPalladium",
+ "platePalladium",
+ RECIPE_IndustrialMacerationStackFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Platinum, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Palladium, 1),
+ ALLOY.INCONEL_625.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMacerationStackFrame,
+ 50,
+ 16);
+ // Industrial Maceration stack
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ CI.circuitTier4,
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ RECIPE_IndustrialMacerationStackController);
+ // T2-Upgrade Card
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ CI.circuitTier7,
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ GregtechItemList.Maceration_Upgrade_Chip.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill) {
+ // Industrial Wire Factory
+ RECIPE_IndustrialWireFactoryController = GregtechItemList.Industrial_WireFactory.get(1);
+ RECIPE_IndustrialWireFactoryFrame = GregtechItemList.Casing_WireFactory.get(1);
+
+ // Wire Factory Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "frameGtBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ RECIPE_IndustrialWireFactoryFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlueSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.BlueSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlueSteel, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialWireFactoryFrame,
+ 50,
+ 16);
+ // Industrial Wire Factory
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZeron100",
+ CI.machineCasing_IV,
+ "plateZeron100",
+ CI.circuitTier5,
+ IV_MACHINE_Wiremill,
+ CI.circuitTier5,
+ "plateZeron100",
+ CI.machineCasing_IV,
+ "plateZeron100",
+ RECIPE_IndustrialWireFactoryController);
+ }
+
+ // Tiered Tanks
+ if (CORE.ConfigSwitches.enableMachine_FluidTanks) {
+ CI.component_Plate[1] = "plateTin";
+ pipeTier1 = "pipeLargeClay";
+ CI.circuitTier1 = ItemList.Circuit_Primitive.get(1);
+ CI.component_Plate[2] = "plateCopper";
+ pipeTier2 = "pipeHugeClay";
+ CI.component_Plate[3] = "plateBronze";
+ pipeTier3 = "pipeMediumBronze";
+ CI.component_Plate[4] = "plateIron";
+ pipeTier4 = "pipeMediumSteel";
+ CI.component_Plate[5] = "plateSteel";
+ CI.component_Plate[6] = "plateRedstone";
+ CI.component_Plate[7] = "plateAluminium";
+ CI.component_Plate[8] = "plateDarkSteel";
+ ItemStack waterBucket = ItemUtils.getSimpleStack(Items.water_bucket);
+
+ // Allows clearing stored fluids.
+ GregtechItemList[] aTanks = new GregtechItemList[] { GregtechItemList.GT_FluidTank_ULV,
+ GregtechItemList.GT_FluidTank_LV, GregtechItemList.GT_FluidTank_MV, GregtechItemList.GT_FluidTank_HV };
+ for (GregtechItemList aTank : aTanks) {
+ RecipeUtils.addShapelessGregtechRecipe(new Object[] { aTank.get(1) }, aTank.get(1));
+ }
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[1],
+ CI.component_Plate[5],
+ CI.component_Plate[1],
+ CI.component_Plate[4],
+ pipeTier1,
+ CI.component_Plate[4],
+ CI.component_Plate[4],
+ waterBucket,
+ CI.component_Plate[4],
+ GregtechItemList.GT_FluidTank_ULV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[5],
+ CI.component_Plate[4],
+ CI.component_Plate[5],
+ CI.component_Plate[3],
+ pipeTier2,
+ CI.component_Plate[3],
+ CI.component_Plate[3],
+ CI.electricPump_LV,
+ CI.component_Plate[3],
+ GregtechItemList.GT_FluidTank_LV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ CI.component_Plate[3],
+ CI.component_Plate[8],
+ CI.component_Plate[5],
+ pipeTier3,
+ CI.component_Plate[5],
+ CI.component_Plate[5],
+ CI.electricPump_LV,
+ CI.component_Plate[5],
+ GregtechItemList.GT_FluidTank_MV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.circuitTier1,
+ CI.component_Plate[7],
+ CI.circuitTier1,
+ CI.component_Plate[8],
+ pipeTier4,
+ CI.component_Plate[8],
+ CI.circuitTier1,
+ CI.electricPump_MV,
+ CI.circuitTier1,
+ GregtechItemList.GT_FluidTank_HV.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_MultiTank) {
+ // Industrial Multi Tank
+ // RECIPE_IndustrialMultiTankController = GregtechItemList.Industrial_MultiTank.get(1);
+ RECIPE_IndustrialMultiTankFrame = GregtechItemList.Casing_MultitankExterior.get(1);
+
+ // Industrial Multi Tank Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickGrisium",
+ "plateGrisium",
+ "stickGrisium",
+ "plateGrisium",
+ "frameGtGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ RECIPE_IndustrialMultiTankFrame);
+ // Industrial Multi Tank
+ RecipeUtils.addShapedGregtechRecipe(
+ "pipeHugeTantalloy60",
+ "gearGrisium",
+ "pipeHugeTantalloy60",
+ CI.circuitTier4,
+ RECIPE_IndustrialMultiTankFrame,
+ CI.circuitTier4,
+ "plateDoubleGrisium",
+ "rotorGrisium",
+ "plateDoubleGrisium",
+ RECIPE_IndustrialMultiTankController);
+ }
+ // TODO
+
+ // Semi-Fluid Generators
+ ItemStack[][] aSemiFluidInputs = new ItemStack[5][10];
+ aSemiFluidInputs[0] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(1, 1),
+ CI.getElectricMotor(1, 2), CI.getElectricPiston(1, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 1, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 1, 1), CI.getGear(1, 2) };
+ aSemiFluidInputs[1] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(2, 1),
+ CI.getElectricMotor(2, 2), CI.getElectricPiston(2, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 2, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 2, 1), CI.getGear(2, 2) };
+ aSemiFluidInputs[2] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(3, 1),
+ CI.getElectricMotor(3, 2), CI.getElectricPiston(3, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 3, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 3, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Chrome, 2) };
+ aSemiFluidInputs[3] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(4, 1),
+ CI.getElectricMotor(4, 2), CI.getElectricPiston(4, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 4, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 4, 1), CI.getGear(4, 2) };
+ aSemiFluidInputs[4] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(5, 1),
+ CI.getElectricMotor(5, 2), CI.getElectricPiston(5, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 5, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 5, 1), CI.getGear(5, 2) };
+ FluidStack[] aSemiFluidFluidInputs = new FluidStack[] { ALLOY.POLYETHYLENE.getFluidStack(144),
+ ALLOY.POLYETHYLENE.getFluidStack(144), ALLOY.POLYETHYLENE.getFluidStack(144),
+ ALLOY.POLYETHYLENE.getFluidStack(144), ALLOY.POLYTETRAFLUOROETHYLENE.getFluidStack(144) };
+
+ ItemStack[] aSemifluids = new ItemStack[] { GregtechItemList.Generator_SemiFluid_LV.get(1),
+ GregtechItemList.Generator_SemiFluid_MV.get(1), GregtechItemList.Generator_SemiFluid_HV.get(1),
+ GregtechItemList.Generator_SemiFluid_EV.get(1), GregtechItemList.Generator_SemiFluid_IV.get(1) };
+ for (int o = 0; o < 5; o++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ aSemiFluidInputs[o],
+ aSemiFluidFluidInputs[o],
+ aSemifluids[o],
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(o + 1));
+ }
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_LV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Piston_LV, 'E',
+ ItemList.Electric_Motor_LV, 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'G', ALLOY.TUMBAGA.getGear(2) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_MV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Piston_MV, 'E',
+ ItemList.Electric_Motor_MV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', ALLOY.EGLIN_STEEL.getGear(2) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_HV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Piston_HV, 'E',
+ ItemList.Electric_Motor_HV, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'G',
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Chrome, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_EV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ ItemList.Electric_Motor_EV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', ALLOY.INCOLOY_DS.getGear(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_IV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Piston_IV, 'E',
+ ItemList.Electric_Motor_IV, 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', ALLOY.NITINOL_60.getGear(1) });
+
+ if (CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter) {
+ // Industrial Blast Smelter
+ RECIPE_IndustrialBlastSmelterController = GregtechItemList.Industrial_AlloyBlastSmelter.get(1);
+ RECIPE_IndustrialBlastSmelterFrame = GregtechItemList.Casing_BlastSmelter.get(1);
+ RECIPE_IndustrialBlastSmelterCoil = GregtechItemList.Casing_Coil_BlastSmelter.get(1);
+
+ // Blast Smelter
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZirconiumCarbide",
+ CI.circuitTier5,
+ "plateZirconiumCarbide",
+ cableTier6,
+ IV_MACHINE_AlloySmelter,
+ cableTier6,
+ "plateZirconiumCarbide",
+ CI.circuitTier5,
+ "plateZirconiumCarbide",
+ RECIPE_IndustrialBlastSmelterController);
+ // Blast Smelter Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZirconiumCarbide",
+ CI.craftingToolHammer_Hard,
+ "plateZirconiumCarbide",
+ "plateZirconiumCarbide",
+ "frameGtZirconiumCarbide",
+ "plateZirconiumCarbide",
+ "plateZirconiumCarbide",
+ CI.craftingToolWrench,
+ "plateZirconiumCarbide",
+ RECIPE_IndustrialBlastSmelterFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.ZIRCONIUM_CARBIDE.getPlate(6), ALLOY.ZIRCONIUM_CARBIDE.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialBlastSmelterFrame,
+ 50,
+ 16);
+ // Blast Smelter Coil
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ "frameGtStaballoy",
+ CI.gearboxCasing_Tier_3,
+ "frameGtStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ RECIPE_IndustrialBlastSmelterCoil);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.STABALLOY.getPlate(6), ALLOY.STABALLOY.getFrameBox(2), CI.gearboxCasing_Tier_3,
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialBlastSmelterCoil,
+ 50,
+ 16);
+ }
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_Coil_Infinity.get(1), ItemList.Reactor_Coolant_Sp_6.get(4),
+ ALLOY.LAURENIUM.getPlateDouble(2), CustomItemList.eM_Coil.get(1) },
+ ALLOY.QUANTUM.getFluidStack(144 * 4),
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.get(1),
+ 60 * 30,
+ MaterialUtils.getVoltageForTier(6));
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.get(1),
+ 2048 * 120 * 20,
+ 2048,
+ (int) GT_Values.VP[11],
+ 16,
+ new Object[] { GregtechItemList.Controller_MolecularTransformer.get(1),
+ GT_ModHandler.getModItem(EternalSingularity.ID, "eternal_singularity", 1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 8 }, ItemList.Electric_Pump_UEV.get(4),
+ ItemList.Field_Generator_UEV.get(4), GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 10),
+ ALLOY.PIKYONIUM.getFluidStack(144 * 32) },
+ GregtechItemList.QuantumForceTransformer.get(1),
+ 1200 * 20,
+ (int) GT_Values.VP[11]);
+
+ if (CORE.ConfigSwitches.enableMultiblock_MatterFabricator) {
+ // Industrial Matter Fabricator
+ RECIPE_IndustrialMatterFabController = GregtechItemList.Industrial_MassFab.get(1);
+ RECIPE_IndustrialMatterFabFrame = GregtechItemList.Casing_MatterFab.get(1);
+ RECIPE_IndustrialMatterFabCoil = GregtechItemList.Casing_MatterGen.get(1);
+
+ // Matter Fabricator CPU
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(8, 1),
+ CI.circuitTier8,
+ CI.getPlate(8, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), 1L),
+ CI.machineCasing_UV,
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), 1L),
+ CI.getPlate(8, 1),
+ CI.circuitTier8,
+ CI.getPlate(8, 1),
+ RECIPE_IndustrialMatterFabController);
+ // Matter Fabricator Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "frameGtInconel690",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ RECIPE_IndustrialMatterFabFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.NIOBIUM_CARBIDE.getPlate(4), ALLOY.INCONEL_792.getRod(4),
+ ALLOY.INCONEL_690.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMatterFabFrame,
+ 50,
+ 16);
+ // Matter Fabricator Coil
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(6, 1),
+ CI.getPlate(7, 1),
+ CI.getPlate(6, 1),
+ "frameGtStellite",
+ CI.machineCasing_UV,
+ "frameGtStellite",
+ CI.getPlate(6, 1),
+ CI.getPlate(7, 1),
+ CI.getPlate(6, 1),
+ RECIPE_IndustrialMatterFabCoil);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.machineCasing_UV, ALLOY.ZERON_100.getPlate(4), ALLOY.PIKYONIUM.getPlate(2),
+ ALLOY.STELLITE.getFrameBox(2), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMatterFabCoil,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialSifter) {
+ // Industrial Sieve
+ RECIPE_IndustrialSieveController = GregtechItemList.Industrial_Sifter.get(1);
+ RECIPE_IndustrialSieveFrame = GregtechItemList.Casing_Sifter.get(1);
+ RECIPE_IndustrialSieveGrate = GregtechItemList.Casing_SifterGrate.get(1);
+
+ // Industrial Sieve
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateEglinSteel",
+ CI.circuitTier3,
+ "plateEglinSteel",
+ cableTier4,
+ HV_MACHINE_Sifter,
+ cableTier4,
+ "plateEglinSteel",
+ CI.circuitTier3,
+ "plateEglinSteel",
+ RECIPE_IndustrialSieveController);
+ // Industrial Sieve Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "frameGtTumbaga",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ RECIPE_IndustrialSieveFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.EGLIN_STEEL.getPlate(8), ALLOY.TUMBAGA.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialSieveFrame,
+ 50,
+ 16);
+ // Industrial Sieve Grate
+ RecipeUtils.addShapedGregtechRecipe(
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "wireFineSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ RECIPE_IndustrialSieveGrate);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 5),
+ ALLOY.EGLIN_STEEL.getFrameBox(4), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialSieveGrate,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ // Industrial Tree Farmer
+ RECIPE_TreeFarmController = GregtechItemList.Industrial_TreeFarm.get(1);
+ RECIPE_TreeFarmFrame = GregtechItemList.Casing_PLACEHOLDER_TreeFarmer.get(1);
+ // Industrial Tree Farm Controller
+ RecipeUtils.addShapedGregtechRecipe(
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.INCOLOY_MA956.getRotor(1),
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.NITINOL_60.getPlate(1),
+ GregtechItemList.GTPP_Casing_IV.get(1),
+ ALLOY.NITINOL_60.getPlate(1),
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.INCONEL_792.getComponentByPrefix(OrePrefixes.pipeMedium, 1),
+ ItemList.Field_Generator_IV.get(1),
+ RECIPE_TreeFarmController);
+ // Industrial Tree Farm Frame
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(2), ALLOY.TUMBAGA.getFrameBox(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipeTinySteel", 1), ItemList.MV_Coil.get(1),
+ ItemList.IC2_Plantball.get(4), GT_OreDictUnificator.get(OrePrefixes.plank, Materials.Wood, 8), },
+ GT_ModHandler.getDistilledWater(2000),
+ RECIPE_TreeFarmFrame,
+ 200,
+ 64);
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Tesseracts) {
+ // Tesseracts
+ RECIPE_TesseractGenerator = GregtechItemList.GT4_Tesseract_Generator.get(1);
+ RECIPE_TesseractTerminal = GregtechItemList.GT4_Tesseract_Terminal.get(1);
+ // Tesseract Generator
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "circuitMaster",
+ "plateTitanium",
+ "circuitMaster",
+ ItemUtils.getSimpleStack(Blocks.ender_chest),
+ "circuitMaster",
+ "plateTitanium",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateTitanium",
+ RECIPE_TesseractGenerator);
+ // Tesseract Terminal
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "circuitElite",
+ "plateTitanium",
+ "circuitElite",
+ ItemUtils.getSimpleStack(Blocks.ender_chest),
+ "circuitElite",
+ "plateTitanium",
+ CI.machineHull_EV,
+ "plateTitanium",
+ RECIPE_TesseractTerminal);
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_SimpleWasher) {
+ final List<ItemStack> washers = ImmutableList.of(
+ GregtechItemList.SimpleDustWasher_LV.get(1),
+ GregtechItemList.SimpleDustWasher_MV.get(1),
+ GregtechItemList.SimpleDustWasher_HV.get(1),
+ GregtechItemList.SimpleDustWasher_EV.get(1),
+ GregtechItemList.SimpleDustWasher_IV.get(1),
+ GregtechItemList.SimpleDustWasher_LuV.get(1),
+ GregtechItemList.SimpleDustWasher_ZPM.get(1),
+ GregtechItemList.SimpleDustWasher_UV.get(1));
+
+ for (int i = 0; i < washers.size(); i++) {
+ final int tier = i + 1;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredMachineHull(tier),
+ CI.getTieredComponent(OrePrefixes.screw, tier, tier * 4),
+ CI.getTieredComponent(OrePrefixes.plate, tier - 1, tier * 2),
+ CI.getTieredComponent(OrePrefixes.rod, tier, tier),
+ CI.getTieredComponent(OrePrefixes.circuit, tier, 1) },
+ CI.getTieredFluid(tier, 144 * tier),
+ washers.get(i),
+ 20 * 5 * tier,
+ (int) GT_Values.V[tier]);
+ }
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution && PollutionUtils.isPollutionEnabled()) {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "dustCarbon",
+ "dustCarbon",
+ "dustCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "cellLithiumPeroxide",
+ "dustCarbon",
+ "cellLithiumPeroxide",
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1));
+
+ // Pollution Detector
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateSteel",
+ CI.sensor_LV,
+ "plateSteel",
+ "plateSteel",
+ CI.electricMotor_LV,
+ "plateSteel",
+ CI.getTieredCircuit(1),
+ CI.machineHull_LV,
+ CI.getTieredCircuit(1),
+ GregtechItemList.Pollution_Detector.get(1));
+
+ // LV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[1],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[1],
+ CI.component_Plate[1],
+ CI.electricMotor_LV,
+ CI.component_Plate[1],
+ CI.getTieredCircuit(1),
+ CI.machineHull_LV,
+ CI.getTieredCircuit(1),
+ GregtechItemList.Pollution_Cleaner_LV.get(1));
+ // MV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[2],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[2],
+ CI.component_Plate[2],
+ CI.electricMotor_MV,
+ CI.component_Plate[2],
+ CI.getTieredCircuit(2),
+ CI.machineHull_MV,
+ CI.getTieredCircuit(2),
+ GregtechItemList.Pollution_Cleaner_MV.get(1));
+ // HV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[3],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[3],
+ CI.component_Plate[3],
+ CI.electricMotor_HV,
+ CI.component_Plate[3],
+ CI.getTieredCircuit(3),
+ CI.machineHull_HV,
+ CI.getTieredCircuit(3),
+ GregtechItemList.Pollution_Cleaner_HV.get(1));
+ // EV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[4],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[4],
+ CI.component_Plate[4],
+ CI.electricMotor_EV,
+ CI.component_Plate[4],
+ CI.getTieredCircuit(4),
+ CI.machineHull_EV,
+ CI.getTieredCircuit(4),
+ GregtechItemList.Pollution_Cleaner_EV.get(1));
+ // IV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[5],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[5],
+ CI.component_Plate[5],
+ CI.electricMotor_IV,
+ CI.component_Plate[5],
+ CI.getTieredCircuit(5),
+ CI.machineHull_IV,
+ CI.getTieredCircuit(5),
+ GregtechItemList.Pollution_Cleaner_IV.get(1));
+ // LuV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[6],
+ CI.component_Plate[6],
+ CI.electricMotor_LuV,
+ CI.component_Plate[6],
+ CI.getTieredCircuit(6),
+ CI.machineHull_LuV,
+ CI.getTieredCircuit(6),
+ GregtechItemList.Pollution_Cleaner_LuV.get(1));
+ // ZPM
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[7],
+ CI.component_Plate[7],
+ CI.electricMotor_ZPM,
+ CI.component_Plate[7],
+ CI.getTieredCircuit(7),
+ CI.machineHull_ZPM,
+ CI.getTieredCircuit(7),
+ GregtechItemList.Pollution_Cleaner_ZPM.get(1));
+ // UV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[8],
+ CI.component_Plate[8],
+ CI.electricMotor_UV,
+ CI.component_Plate[8],
+ CI.getTieredCircuit(8),
+ CI.machineHull_UV,
+ CI.getTieredCircuit(8),
+ GregtechItemList.Pollution_Cleaner_UV.get(1));
+ // MAX
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[9],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[9],
+ CI.component_Plate[9],
+ CI.electricMotor_UHV,
+ CI.component_Plate[9],
+ CI.getTieredCircuit(9),
+ CI.machineHull_UHV,
+ CI.getTieredCircuit(9),
+ GregtechItemList.Pollution_Cleaner_MAX.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_ThermalBoiler) {
+ RECIPE_ThermalBoilerController = GregtechItemList.GT4_Thermal_Boiler.get(1);
+ RECIPE_ThermalBoilerCasing = GregtechItemList.Casing_ThermalContainment.get(2);
+ ItemStack centrifugeEV = ItemList.Machine_EV_Centrifuge.get(1);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ "gearGtTitanium",
+ CI.getTieredCircuitOreDictName(6),
+ "gearGtTitanium",
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ RECIPE_ThermalBoilerController);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ "gearGtTungstenSteel",
+ CI.getTieredCircuitOreDictName(5),
+ "gearGtTungstenSteel",
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ RECIPE_ThermalBoilerController);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ ALLOY.MARAGING350.getPlate(1),
+ "plateStainlessSteel",
+ ALLOY.MARAGING350.getPlate(1),
+ "circuitAdvanced",
+ CI.machineCasing_HV,
+ "circuitAdvanced",
+ ALLOY.MARAGING350.getPlate(1),
+ ALLOY.MARAGING350.getPlate(1),
+ ALLOY.MARAGING350.getPlate(1),
+ RECIPE_ThermalBoilerCasing);
+
+ // Lava Filter Recipe
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireFineSteel", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict("ringTumbaga", 16),
+ ItemUtils.getItemStackOfAmountFromOreDict("foilCopper", 4),
+ ItemUtils.getItemStackWithMeta(true, "IC2:itemPartCarbonMesh", "RawCarbonMesh", 0, 64), },
+ CI.getTieredFluid(3, 144),
+ ItemUtils.getSimpleStack(ModItems.itemLavaFilter, 16),
+ 1600,
+ 240);
+ }
+
+ // Air Intake Hatch
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ItemList.Casing_Grate.get(1),
+ CI.component_Plate[6],
+ CI.component_Plate[6],
+ CI.getFluidRegulator(5, 1),
+ CI.component_Plate[6],
+ CI.getTieredCircuit(5),
+ ItemList.Hatch_Input_IV.get(1),
+ CI.getTieredCircuit(5),
+ GregtechItemList.Hatch_Air_Intake.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(7, 1),
+ GregtechItemList.Hatch_Air_Intake.get(1),
+ CI.getPlate(7, 1),
+ CI.getPlate(7, 1),
+ CI.getFluidRegulator(7, 1),
+ CI.getPlate(7, 1),
+ CI.getTieredCircuit(7),
+ ItemList.Hatch_Input_ZPM.get(1),
+ CI.getTieredCircuit(7),
+ GregtechItemList.Hatch_Air_Intake_Extreme.get(1));
+
+ if (CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor) {
+
+ // Thorium Reactor
+ RECIPE_LFTRController = GregtechItemList.ThoriumReactor.get(1);
+ RECIPE_LFTRInnerCasing = GregtechItemList.Casing_Reactor_II.get(1); // Zeron
+ RECIPE_LFTROuterCasing = GregtechItemList.Casing_Reactor_I.get(1); // Hastelloy
+
+ ItemStack controlCircuit = ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR);
+ RecipeUtils.addShapedGregtechRecipe(
+ controlCircuit,
+ "cableGt12Naquadah",
+ controlCircuit,
+ "plateDoubleHastelloyN",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateDoubleHastelloyN",
+ "plateThorium232",
+ CI.machineHull_IV,
+ "plateThorium232",
+ RECIPE_LFTRController);
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateDoubleHastelloyC276",
+ CI.craftingToolScrewdriver,
+ "plateDoubleHastelloyC276",
+ "gearGtTalonite",
+ CI.fieldGenerator_LV,
+ "gearGtTalonite",
+ "plateDoubleHastelloyC276",
+ CI.craftingToolHammer_Hard,
+ "plateDoubleHastelloyC276",
+ RECIPE_LFTRInnerCasing);
+
+ ItemStack IC2HeatPlate = ItemUtils.getItemStackFromFQRN("IC2:reactorPlatingHeat", 1);
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "frameGtHastelloyC276",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ RECIPE_LFTROuterCasing);
+
+ // LFTR Control Circuit
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 1),
+ CI.fieldGenerator_HV },
+ null,
+ controlCircuit,
+ 240 * 20,
+ 500);
+
+ // Fission Fuel Plant
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getTieredCircuitOreDictName(5),
+ CI.craftingToolSolderingIron,
+ CI.getTieredCircuitOreDictName(5),
+ "plateDenseTungstenSteel",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateDenseTungstenSteel",
+ "gearGtStellite",
+ CI.machineHull_IV,
+ "gearGtStellite",
+ GregtechItemList.Industrial_FuelRefinery.get(1));
+
+ ItemStack mInnerTank = ItemList.Super_Tank_IV.get(1);
+
+ // Incoloy Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateIncoloyDS",
+ "pipeHugeStaballoy",
+ "plateIncoloyDS",
+ "gearGtIncoloyDS",
+ mInnerTank,
+ "gearGtIncoloyDS",
+ "plateIncoloyDS",
+ "pipeHugeStaballoy",
+ "plateIncoloyDS",
+ GregtechItemList.Casing_Refinery_Internal.get(1));
+
+ // Hastelloy-N Sealant Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "frameGtHastelloyC276",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ GregtechItemList.Casing_Refinery_External.get(1));
+
+ // Hastelloy-X Structural Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "ringInconel792",
+ "gearGtHastelloyX",
+ CI.component_Plate[5],
+ CI.craftingToolHammer_Hard,
+ "frameGtHastelloyC276",
+ CI.craftingToolWrench,
+ CI.component_Plate[5],
+ CI.getTieredMachineCasing(4),
+ "ringInconel792",
+ GregtechItemList.Casing_Refinery_Structural.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_X.getPlateDouble(1),
+ CI.getPlate(5, 1),
+ CI.getPlate(5, 1),
+ CI.getTieredMachineCasing(5),
+ CI.getPlate(5, 1),
+ CI.getRobotArm(5, 1),
+ ItemList.Casing_FrostProof.get(1),
+ CI.getRobotArm(5, 1),
+ GregtechItemList.ColdTrap_IV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getPlate(7, 1),
+ CI.getPlate(7, 1),
+ GregtechItemList.ColdTrap_IV.get(1),
+ CI.getPlate(7, 1),
+ CI.getRobotArm(7, 1),
+ ItemList.Casing_FrostProof.get(1),
+ CI.getRobotArm(7, 1),
+ GregtechItemList.ColdTrap_ZPM.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getFieldGenerator(3, 1),
+ CI.getRobotArm(5, 1),
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ ItemList.Machine_IV_ChemicalReactor.get(1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ CI.getFieldGenerator(3, 1),
+ GregtechItemList.ReactorProcessingUnit_IV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getFieldGenerator(5, 1),
+ CI.getRobotArm(7, 1),
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ GregtechItemList.ReactorProcessingUnit_IV.get(1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getFieldGenerator(5, 1),
+ GregtechItemList.ReactorProcessingUnit_ZPM.get(1));
+
+ // Nuclear Salt Processing Plant Controller
+ RECIPE_SaltPlantController = GregtechItemList.Nuclear_Salt_Processing_Plant.get(1);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateOsmiridium",
+ GregtechItemList.ReactorProcessingUnit_IV.get(1),
+ "plateOsmiridium",
+ "plateRuridit",
+ CI.getTieredCircuitOreDictName(7),
+ "plateRuridit",
+ "plateOsmiridium",
+ GregtechItemList.ColdTrap_IV.get(1),
+ "plateOsmiridium",
+ RECIPE_SaltPlantController);
+ }
+
+ // Cyclotron
+ if (CORE.ConfigSwitches.enableMultiblock_Cyclotron) {
+ RECIPE_CyclotronController = GregtechItemList.COMET_Cyclotron.get(1);
+ RECIPE_CyclotronOuterCasing = GregtechItemList.Casing_Cyclotron_External.get(1);
+ RECIPE_CyclotronInnerCoil = GregtechItemList.Casing_Cyclotron_Coil.get(1);
+
+ // Outer Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_FrostProof.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 0, 4), ALLOY.INCOLOY_DS.getPlate(8),
+ ALLOY.INCONEL_690.getScrew(16), ALLOY.EGLIN_STEEL.getLongRod(4), CI.getElectricPiston(3, 2) },
+ ALLOY.ZIRCONIUM_CARBIDE.getFluidStack(144 * 8), // Input Fluid
+ RECIPE_CyclotronOuterCasing,
+ 30 * 20 * 2,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Inner Coil
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_Coil_Nichrome.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 1, 8),
+ ALLOY.INCOLOY_MA956.getPlate(8), ALLOY.TANTALLOY_61.getBolt(16), ALLOY.INCOLOY_020.getScrew(32),
+ CI.getFieldGenerator(4, 1) },
+ ALLOY.HG1223.getFluidStack(144 * 5), // Input Fluid
+ RECIPE_CyclotronInnerCoil,
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Controller
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_IV, ItemUtils.getSimpleStack(RECIPE_CyclotronInnerCoil, 2),
+ ALLOY.INCOLOY_020.getPlate(8), ALLOY.TANTALLOY_61.getGear(2), ALLOY.INCOLOY_MA956.getScrew(16),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(5), 16) },
+ ALLOY.INCOLOY_020.getFluidStack(144 * 9), // Input Fluid
+ RECIPE_CyclotronController,
+ 60 * 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ // Mazut
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Controller_LargeSemifluidGenerator.get(1L),
+ CI.bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ ItemList.Electric_Pump_EV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt08.get(Materials.Electrum), 'G', ALLOY.INCONEL_792.getGear(1) });
+
+ if (CORE.ConfigSwitches.enableMultiblock_PowerSubstation) {
+ RecipeUtils.addShapedRecipe(
+ "screwTitanium",
+ "plateIncoloy020",
+ "screwTitanium",
+ "plateIncoloy020",
+ "frameGtIncoloyMA956",
+ "plateIncoloy020",
+ "screwTitanium",
+ "plateIncoloy020",
+ "screwTitanium",
+ GregtechItemList.Casing_Power_SubStation.get(1));
+
+ ItemStack mBattery = ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR);
+
+ RecipeUtils.addShapedRecipe(
+ "plateIncoloyMA956",
+ mBattery,
+ "plateIncoloyMA956",
+ GregtechItemList.Casing_Power_SubStation.get(1),
+ GregtechItemList.Casing_Vanadium_Redox.get(1),
+ GregtechItemList.Casing_Power_SubStation.get(1),
+ "plateIncoloy020",
+ "plateIncoloyMA956",
+ "plateIncoloy020",
+ GregtechItemList.PowerSubStation.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge) {
+ RecipeUtils.addShapedRecipe(
+ "plateRedSteel",
+ CI.craftingToolHammer_Hard,
+ "plateRedSteel",
+ "plateRedSteel",
+ "frameGtBlackSteel",
+ "plateRedSteel",
+ "plateRedSteel",
+ CI.craftingToolWrench,
+ "plateRedSteel",
+ GregtechItemList.Casing_ThermalCentrifuge.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_ThermalCentrifuge.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ "plateRedSteel",
+ "circuitData",
+ "plateRedSteel",
+ "stickTalonite",
+ EV_MACHINE_ThermalCentrifuge,
+ "stickTalonite",
+ "plateRedSteel",
+ "gearGtTalonite",
+ "plateRedSteel",
+ GregtechItemList.Industrial_ThermalCentrifuge.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant) {
+ RecipeUtils.addShapedRecipe(
+ "plateGrisium",
+ CI.craftingToolHammer_Hard,
+ "plateGrisium",
+ "plateTalonite",
+ "frameGtGrisium",
+ "plateTalonite",
+ "plateGrisium",
+ CI.craftingToolWrench,
+ "plateGrisium",
+ GregtechItemList.Casing_WashPlant.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.LEAGRISIUM.getPlate(4), ALLOY.TALONITE.getPlate(2),
+ ALLOY.LEAGRISIUM.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_WashPlant.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ "plateGrisium",
+ EV_MACHINE_OreWasher,
+ "plateGrisium",
+ "plateTalonite",
+ "circuitData",
+ "plateTalonite",
+ "plateGrisium",
+ EV_MACHINE_ChemicalBath,
+ "plateGrisium",
+ GregtechItemList.Industrial_WashPlant.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_LargeAutoCrafter) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GregtechItemList.Casing_Multi_Use.get(1), 1),
+ ItemList.Block_IridiumTungstensteel.get(1), CI.getTieredComponent(OrePrefixes.circuit, 2, 16),
+ CI.getTieredComponent(OrePrefixes.screw, 5, 32), CI.getTieredComponent(OrePrefixes.bolt, 5, 12),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8), },
+ CI.getTertiaryTieredFluid(6, 144 * (4)),
+ GregtechItemList.Casing_Autocrafter.get(1),
+ 20 * 60 * 2,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Refinery_Structural.get(4),
+ ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR, 1),
+ CI.getTieredComponent(OrePrefixes.cableGt08, 6, 16), CI.getTransmissionComponent(5, 2),
+ GregtechItemList.Gregtech_Computer_Cube.get(1), },
+ CI.getTieredFluid(7, 144 * 8),
+ GregtechItemList.GT4_Multi_Crafter.get(1),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GregtechItemList.Casing_Multi_Use.get(1), 1),
+ CI.getEmitter(4, 2), CI.getRobotArm(4, 2), CI.getTieredComponent(OrePrefixes.circuit, 2, 8),
+ CI.getTieredComponent(OrePrefixes.screw, 3, 8), CI.getTieredComponent(OrePrefixes.plate, 5, 4), },
+ CI.getAlternativeTieredFluid(5, 144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockProjectTable),
+ 20 * 30 * 3,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine) {
+ ItemStack plate = ALLOY.MARAGING300.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateStellite",
+ "frameGtTalonite",
+ "plateStellite",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_CuttingFactoryFrame.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.MARAGING300.getPlate(4), ALLOY.STELLITE.getPlate(2),
+ ALLOY.TALONITE.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_CuttingFactoryFrame.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(4),
+ plate,
+ "wireFinePlatinum",
+ IV_MACHINE_Cutter,
+ "wireFinePlatinum",
+ plate,
+ CI.getTieredCircuit(4),
+ plate,
+ GregtechItemList.Industrial_CuttingFactoryController.get(1));
+ }
+
+ // IV_MACHINE_Extruder
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine) {
+ ItemStack plate = ALLOY.INCONEL_690.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateTalonite",
+ "frameGtStaballoy",
+ "plateTalonite",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_Extruder.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.INCONEL_690.getPlate(4), ALLOY.TALONITE.getPlate(2),
+ ALLOY.STABALLOY.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Extruder.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ CI.electricPiston_IV,
+ IV_MACHINE_Extruder,
+ CI.electricPiston_IV,
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ GregtechItemList.Industrial_Extruder.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialFishingPort) {
+ ItemStack plate = ALLOY.AQUATIC_STEEL.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateEglinSteel",
+ "frameGtEglinSteel",
+ "plateEglinSteel",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_FishPond.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.AQUATIC_STEEL.getPlate(4), ALLOY.EGLIN_STEEL.getPlate(2),
+ ALLOY.EGLIN_STEEL.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_FishPond.get(1L),
+ 50,
+ 16);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ "wireFineElectrum",
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap),
+ "wireFineElectrum",
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ GregtechItemList.Industrial_FishingPond.get(1));
+ }
+
+ if (true) {
+ // Advanced Vacuum Freezer
+ ItemStack plate = ALLOY.HG1223.getPlateDouble(1);
+ ItemStack gear = ALLOY.INCOLOY_MA956.getGear(1);
+ ItemStack frame = ALLOY.LAFIUM.getFrameBox(1);
+ ItemStack cell1 = ItemList.Reactor_Coolant_He_6.get(1);
+ ItemStack cell2 = ItemList.Reactor_Coolant_NaK_6.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ gear,
+ plate,
+ cell1,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_AdvancedVacuum.get(1));
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.electricPiston_IV,
+ GregtechItemList.Casing_AdvancedVacuum.get(1),
+ CI.electricPiston_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Industrial_Cryogenic_Freezer.get(1));
+
+ // Advanced Blast Furnace
+ plate = ALLOY.HASTELLOY_N.getPlateDouble(1);
+ gear = ALLOY.HASTELLOY_W.getGear(1);
+ frame = ALLOY.HASTELLOY_X.getFrameBox(1);
+ cell1 = ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1);
+ cell2 = ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1);
+ ItemStack cell3 = ItemUtils.simpleMetaStack("IC2:reactorVentDiamond:1:1", 1, 1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ cell1,
+ plate,
+ cell3,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1));
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.robotArm_IV,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ CI.robotArm_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Machine_Adv_BlastFurnace.get(1));
+ // Hatch_Input_Pyrotheum
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_IV.get(1), GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ ALLOY.MARAGING250.getPlate(4), ALLOY.MARAGING300.getGear(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 2),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Hatch_Input_Pyrotheum.get(1L),
+ 50,
+ 16);
+ // Casing_Adv_BlastFurnace
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.HASTELLOY_X.getFrameBox(1), ALLOY.HASTELLOY_N.getPlateDouble(4),
+ ALLOY.HASTELLOY_W.getGear(1), ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1),
+ ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1),
+ ItemUtils.simpleMetaStack("IC2:reactorVentDiamond:1:1", 1, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1L),
+ 50,
+ 16);
+
+ // Advanced Implosion Compressor
+ plate = ItemUtils.getItemStackOfAmountFromOreDict("plateAlloyIridium", 1);
+ gear = ALLOY.LEAGRISIUM.getGear(1);
+ frame = ALLOY.CINOBITE.getFrameBox(1);
+ cell1 = ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1);
+ cell2 = ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1);
+
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.fieldGenerator_IV,
+ CI.machineHull_ZPM,
+ CI.robotArm_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Machine_Adv_ImplosionCompressor.get(1));
+
+ // Supply Depot
+ plate = ALLOY.TUNGSTEN_CARBIDE.getPlateDouble(1);
+ gear = ALLOY.TRINIUM_TITANIUM.getRing(1);
+ frame = ALLOY.TUNGSTEN_CARBIDE.getFrameBox(1);
+ cell1 = CI.conveyorModule_LuV;
+ cell2 = CI.electricMotor_LuV;
+ ItemStack casingAmazon = GregtechItemList.Casing_AmazonWarehouse.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ ItemUtils.getItemStackOfAmountFromOreDict("cableGt12VanadiumGallium", 1),
+ plate,
+ cell1,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_AmazonWarehouse.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.TUNGSTEN_CARBIDE.getFrameBox(1), ALLOY.TUNGSTEN_CARBIDE.getPlateDouble(4),
+ ALLOY.TRINIUM_TITANIUM.getRing(1), ItemList.Electric_Motor_LuV.get(1),
+ ItemList.Conveyor_Module_LuV.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cableGt12VanadiumGallium", 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_AmazonWarehouse.get(1L),
+ 50,
+ 16);
+ RecipeUtils.addShapedRecipe(
+ casingAmazon,
+ CI.getTieredCircuit(7),
+ casingAmazon,
+ CI.robotArm_LuV,
+ ItemList.Machine_LuV_Unboxinator.get(1),
+ CI.robotArm_LuV,
+ CI.conveyorModule_LuV,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ CI.conveyorModule_LuV,
+ GregtechItemList.Amazon_Warehouse_Controller.get(1));
+
+ // Industrial Mixing Machine
+ RecipeUtils.addShapedRecipe(
+ "plateStaballoy",
+ CI.getTieredCircuit(5),
+ "plateStaballoy",
+ "plateZirconiumCarbide",
+ IV_MACHINE_Mixer,
+ "plateZirconiumCarbide",
+ "plateStaballoy",
+ CI.getTieredCircuit(5),
+ "plateStaballoy",
+ GregtechItemList.Industrial_Mixer.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine) {
+ ItemStack plate = ALLOY.STABALLOY.getPlate(1);
+
+ ItemStack o_Compressor = ItemList.Machine_IV_Compressor.get(1);
+ ItemStack o_Lathe = ItemList.Machine_IV_Lathe.get(1);
+ ItemStack o_Electromagnet = ItemList.Machine_IV_Polarizer.get(1);
+ ItemStack o_Fermenter = ItemList.Machine_IV_Fermenter.get(1);
+ ItemStack o_Distillery = ItemList.Machine_IV_FluidExtractor.get(1);
+ ItemStack o_Extractor = ItemList.Machine_IV_Extractor.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateStainlessSteel",
+ "frameGtZirconiumCarbide",
+ "plateStainlessSteel",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_Multi_Use.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.STABALLOY.getPlate(4),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+ ALLOY.ZIRCONIUM_CARBIDE.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Multi_Use.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ o_Compressor,
+ o_Lathe,
+ o_Electromagnet,
+ plate,
+ ItemUtils.getSimpleStack(ModBlocks.blockProjectTable),
+ plate,
+ o_Fermenter,
+ o_Distillery,
+ o_Extractor,
+ GregtechItemList.Industrial_MultiMachine.get(1));
+ }
+
+ /*
+ * 6/1/19 - Content additions
+ */
+
+ // Drilling Platform Casings
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("frameGtTriniumNaquadahCarbonite", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateDoubleTriniumTitaniumAlloy", 1 * (1)),
+ ItemUtils.getItemStackOfAmountFromOreDict("gearGtPikyonium64B", 2 * (1)),
+ ALLOY.TRINIUM_REINFORCED_STEEL.getPlateDouble(4 * 1),
+ ItemUtils.getSimpleStack((CI.machineHull_LuV), 1 * 1), },
+ ALLOY.MARAGING350.getFluidStack(144 * 16 * 1),
+ GregtechItemList.Casing_BedrockMiner.get(1),
+ (int) GT_Values.V[4],
+ (int) GT_Values.V[6]);
+
+ int aCostMultiplier = 1;
+
+ // Reservoir Hatch
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_EV.get(1), GT_ModHandler.getModItem(RemoteIO.ID, "tile.machine", 1),
+ ItemList.Electric_Pump_EV.get(1) },
+ GT_Values.NF,
+ GregtechItemList.Hatch_Reservoir.get(1),
+ 100,
+ 1920);
+
+ // Mystic Frame
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(1),
+ ItemList.Field_Generator_MV.get(1, CI.circuitTier7),
+ ItemList.Field_Generator_HV.get(1, CI.circuitTier7), ItemList.Emitter_HV.get(1, CI.circuitTier7),
+ ItemList.Sensor_HV.get(1, CI.circuitTier7),
+ CI.getTieredComponent(OrePrefixes.plate, 7, 8 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.wireGt08, 8, 4 * aCostMultiplier), },
+ CI.getTieredFluid(6, (144 * 8)), // Input Fluid
+ ItemUtils.getSimpleStack(Dimension_Everglades.blockPortalFrame, 2),
+ 45 * 20 * 1 * (6),
+ MaterialUtils.getVoltageForTier(6));
+
+ // Player Doors
+ ItemStack[] aDoorInputs = new ItemStack[] { ItemUtils.getSimpleStack(Blocks.log2),
+ ItemUtils.getSimpleStack(Blocks.iron_block), ItemUtils.getSimpleStack(Blocks.glass),
+ ItemUtils.getSimpleStack(Blocks.packed_ice), ItemUtils.getSimpleStack(Blocks.cactus), };
+ ItemStack[] aDoorOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorWooden),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorIron),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Glass),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Ice),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Cactus), };
+
+ for (int y = 0; y < aDoorInputs.length; y++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.iron_door), aDoorInputs[y],
+ ItemList.Sensor_LV.get(1, CI.circuitTier7),
+ CI.getTieredComponent(OrePrefixes.plate, 1, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.wireGt02, 1, 2 * aCostMultiplier),
+ ItemUtils.getSimpleStack(Items.redstone, 16) },
+ CI.getTieredFluid(1, (144 * 2)), // Input Fluid
+ aDoorOutputs[y],
+ 100,
+ MaterialUtils.getVoltageForTier(1));
+ }
+
+ Logger.INFO("Done loading recipes for the Various machine blocks.");
+ }
+
+ private static void energyCores() {
+
+ ItemStack[] aBufferOutput = new ItemStack[] { RECIPE_Buffer_ULV, RECIPE_Buffer_LV, RECIPE_Buffer_MV,
+ RECIPE_Buffer_HV, RECIPE_Buffer_EV, RECIPE_Buffer_IV, RECIPE_Buffer_LuV, RECIPE_Buffer_ZPM,
+ RECIPE_Buffer_UV, RECIPE_Buffer_MAX };
+
+ ItemStack[] aOutput = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "1", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "2", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "3", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "4", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "5", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "6", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "10", 1) };
+
+ for (int i = 0; i < 10; i++) {
+
+ ItemStack aPrevTier = (i == 0 ? CI.getTieredMachineHull(1) : aOutput[i - 1]);
+ aPrevTier.stackSize = 1;
+ int aTier = (i + 1);
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { aPrevTier, CI.getTieredComponent(OrePrefixes.plate, aTier, 4),
+ CI.getTieredComponent(OrePrefixes.cableGt04, i, 2),
+ CI.getTieredComponent(OrePrefixes.circuit, aTier, 2),
+ CI.getTieredComponent(OrePrefixes.screw, aTier, 6),
+ CI.getTieredComponent(OrePrefixes.bolt, i, 12), },
+ CI.getTieredFluid(i, (144 * 4 * aTier)), // Input Fluid
+ aOutput[i],
+ 45 * 10 * 1 * (aTier),
+ MaterialUtils.getVoltageForTier(i));
+
+ // Energy Buffer
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(aOutput[i], 4),
+ CI.getTieredComponent(OrePrefixes.plate, aTier, 8),
+ CI.getTieredComponent(OrePrefixes.wireGt08, i, 4), CI.getTieredComponent(OrePrefixes.circuit, i, 4),
+ CI.getTieredComponent(OrePrefixes.stickLong, aTier, 4),
+ CI.getTieredComponent(OrePrefixes.gearGt, i, 5), },
+ CI.getTieredFluid(aTier, (144 * 16 * aTier)), // Input Fluid
+ aBufferOutput[i],
+ 45 * 20 * 1 * (aTier),
+ MaterialUtils.getVoltageForTier(i));
+ }
+ }
+
+ private static void wirelessChargers() {
+
+ ItemStack[] aChargers = new ItemStack[] { GregtechItemList.Charger_LV.get(1),
+ GregtechItemList.Charger_MV.get(1), GregtechItemList.Charger_HV.get(1), GregtechItemList.Charger_EV.get(1),
+ GregtechItemList.Charger_IV.get(1), GregtechItemList.Charger_LuV.get(1),
+ GregtechItemList.Charger_ZPM.get(1), GregtechItemList.Charger_UV.get(1),
+ GregtechItemList.Charger_UHV.get(1) };
+
+ for (int tier = 1; tier < aChargers.length + 1; tier++) {
+
+ ItemStack[] aInputs = new ItemStack[] { CI.getTieredMachineHull(tier, 1),
+ CI.getTransmissionComponent(tier, 2), CI.getFieldGenerator(tier, 1),
+ CI.getTieredComponent(OrePrefixes.plate, tier + 1, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, tier + 1, 2), };
+ CORE.RA.addSixSlotAssemblingRecipe(
+ aInputs,
+ CI.getAlternativeTieredFluid(tier, (144 * 2 * (tier + 1))), // Input Fluid
+ aChargers[tier - 1],
+ 45 * 10 * (tier + 1),
+ MaterialUtils.getVoltageForTier(tier));
+ }
+ }
+
+ private static void largeArcFurnace() {
+ int aCostMultiplier = 1;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(aCostMultiplier),
+ CI.getTransmissionComponent(2, 2 * aCostMultiplier), CI.getElectricPiston(4, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.plate, 5, 4 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.pipeSmall, 4, 1 * aCostMultiplier), },
+ CI.getAlternativeTieredFluid(5, (144 * 2 * 4)), // Input Fluid
+ GregtechItemList.Casing_Industrial_Arc_Furnace.get(1),
+ 20 * 10 * 1 * (6),
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Industrial_Arc_Furnace.get(1),
+ CI.getFieldGenerator(4, 2 * aCostMultiplier), CI.getRobotArm(5, 4 * aCostMultiplier),
+ CI.getEnergyCore(4, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.circuit, 5, 8 * aCostMultiplier), },
+ CI.getAlternativeTieredFluid(6, (144 * 4 * 5)), // Input Fluid
+ GregtechItemList.Industrial_Arc_Furnace.get(1),
+ 60 * 20 * 8,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void industrialVacuumFurnace() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(1), CI.getHeatCoil(2), CI.getElectricPiston(3, 2),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 4), CI.getTieredComponent(OrePrefixes.gearGt, 6, 2), },
+ CI.getTertiaryTieredFluid(5, (144 * 2 * 4)), // Input Fluid
+ GregtechItemList.Casing_Vacuum_Furnace.get(1),
+ 20 * 10 * 6,
+ MaterialUtils.getVoltageForTier(6));
+
+ ;
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Vacuum_Furnace.get(1),
+ CI.getTieredComponent(OrePrefixes.wireGt16, 7, 4), CI.getEnergyCore(5, 1), CI.getRobotArm(4, 4),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8), CI.getTieredComponent(OrePrefixes.circuit, 6, 8), },
+ CI.getTieredFluid(6, (144 * 4 * 5)), // Input Fluid
+ GregtechItemList.Controller_Vacuum_Furnace.get(1),
+ 60 * 20 * 12,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void milling() {
+
+ /*
+ * public static ItemStack RECIPE_ISAMill_Controller; public static ItemStack RECIPE_ISAMill_Gearbox; public
+ * static ItemStack RECIPE_ISAMill_Casing; public static ItemStack RECIPE_ISAMill_Hatch; public static ItemStack
+ * RECIPE_Flotation_Controller; public static ItemStack RECIPE_Flotation_Casing;
+ */
+
+ // Isa Mill Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Machine_IV_Macerator.get(1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_IsaMill_Gearbox.get(4), CI.getTieredGTPPMachineCasing(6, 4),
+ ItemList.Component_Grinder_Tungsten.get(16), new Object[] { CI.getTieredCircuitOreDictName(6), 8 },
+ ALLOY.INCONEL_625.getGear(8), ALLOY.INCONEL_625.getPlate(32), ALLOY.ZERON_100.getPlateDouble(8),
+ ALLOY.ZERON_100.getPlateDouble(8), ALLOY.ZERON_100.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.NiobiumTitanium, OrePrefixes.wireFine, 32),
+ CI.getTieredComponentOfMaterial(Materials.NiobiumTitanium, OrePrefixes.wireFine, 32),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.foil, 16),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.foil, 16), },
+ new FluidStack[] { CI.getTieredFluid(6, 16 * 144), CI.getAlternativeTieredFluid(6, 32 * 144),
+ CI.getTertiaryTieredFluid(6, 32 * 144) },
+ GregtechItemList.Controller_IsaMill.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Gearbox
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), ItemList.Casing_Gearbox_Titanium.get(2),
+ ALLOY.INCONEL_625.getGear(4),
+ CI.getTieredComponentOfMaterial(Materials.HSSE, OrePrefixes.gearGtSmall, 8),
+ ALLOY.INCONEL_625.getPlate(16), ALLOY.ZERON_100.getBolt(16), },
+ ALLOY.TUNGSTENSTEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_IsaMill_Gearbox.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(5, 1),
+ ALLOY.INCONEL_625.getPlate(8), ALLOY.ZERON_100.getRod(4),
+ CI.getTieredComponentOfMaterial(Materials.HSSG, OrePrefixes.gearGtSmall, 4),
+ ALLOY.ZERON_100.getScrew(8), },
+ ELEMENT.getInstance().TITANIUM.getFluidStack(4 * 144),
+ GregtechItemList.Casing_IsaMill_Casing.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Pipe
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(4, 2),
+ ALLOY.INCONEL_625.getPlateDouble(4), ALLOY.INCOLOY_MA956.getRing(8),
+ CI.getTieredComponentOfMaterial(Materials.HSSE, OrePrefixes.plate, 8),
+ ALLOY.INCOLOY_MA956.getBolt(16), },
+ ELEMENT.getInstance().ALUMINIUM.getFluidStack(8 * 144),
+ GregtechItemList.Casing_IsaMill_Pipe.get(1),
+ 60 * 20 * 8,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Flotation Cell Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Distillation_Tower.get(1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_Flotation_Cell.get(4), CI.getTieredGTPPMachineCasing(5, 4),
+ ItemList.Machine_IV_Distillery.get(1), new Object[] { CI.getTieredCircuitOreDictName(6), 8 },
+ ALLOY.STELLITE.getGear(8), ALLOY.STELLITE.getPlate(32), ALLOY.HASTELLOY_N.getPlateDouble(8),
+ ALLOY.HASTELLOY_N.getPlateDouble(8), ALLOY.HASTELLOY_N.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32), },
+ new FluidStack[] { CI.getTieredFluid(5, 16 * 144), CI.getAlternativeTieredFluid(4, 32 * 144),
+ CI.getTertiaryTieredFluid(4, 32 * 144) },
+ GregtechItemList.Controller_Flotation_Cell.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Flotation Cell Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(4, 1),
+ ALLOY.AQUATIC_STEEL.getPlate(8), ALLOY.STELLITE.getRing(8),
+ CI.getTieredComponentOfMaterial(Materials.HSSG, OrePrefixes.plateDouble, 4),
+ ALLOY.HASTELLOY_N.getScrew(8), },
+ ALLOY.STAINLESS_STEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_Flotation_Cell.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Milling Bus
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(5, 1),
+ ItemList.Hatch_Input_Bus_EV.get(1),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.gearGt, 8),
+ CI.getTieredComponentOfMaterial(Materials.TungstenSteel, OrePrefixes.plate, 32),
+ CI.getTieredComponentOfMaterial(Materials.SolderingAlloy, OrePrefixes.wireFine, 16), },
+ ELEMENT.getInstance().TUNGSTEN.getFluidStack(8 * 144),
+ GregtechItemList.Bus_Milling_Balls.get(1),
+ 60 * 20 * 4,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void sparging() {
+
+ // Sparge Tower Research
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), ELEMENT.getInstance().HELIUM.getCell(8),
+ ELEMENT.getInstance().FLUORINE.getCell(8), ALLOY.HS188A.getIngot(8),
+ ItemList.Distillation_Tower.get(1) },
+ null,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_10_SPARGING, 1),
+ 60 * 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Sparge Tower Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_10_SPARGING, 1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_Sparge_Tower_Exterior.get(4), CI.getTieredGTPPMachineCasing(4, 4),
+ ItemList.Machine_IV_Distillery.get(1), new Object[] { CI.getTieredCircuitOreDictName(5), 8 },
+ ALLOY.HS188A.getGear(8), ALLOY.HS188A.getPlate(32), ALLOY.HASTELLOY_N.getPlateDouble(8),
+ ALLOY.HASTELLOY_N.getPlateDouble(8), ALLOY.HASTELLOY_N.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32), },
+ new FluidStack[] { CI.getTieredFluid(4, 16 * 144), CI.getAlternativeTieredFluid(3, 32 * 144),
+ CI.getTertiaryTieredFluid(3, 32 * 144) },
+ GregtechItemList.Controller_Sparge_Tower.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Sparge Tower Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), CI.getTieredGTPPMachineCasing(3, 1),
+ ALLOY.HS188A.getPlate(2), ALLOY.HASTELLOY_N.getRing(4),
+ CI.getTieredComponentOfMaterial(Materials.TungstenSteel, OrePrefixes.plateDouble, 4),
+ ALLOY.HASTELLOY_N.getScrew(4), },
+ ALLOY.STAINLESS_STEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_Sparge_Tower_Exterior.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void chisels() {
+ ItemStack[] aChisels = new ItemStack[] { GregtechItemList.GT_Chisel_LV.get(1),
+ GregtechItemList.GT_Chisel_MV.get(1), GregtechItemList.GT_Chisel_HV.get(1), };
+ for (int i = 1; i < 4; i++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(10 + i), CI.getTieredMachineCasing(i), CI.getPlate(i, 4),
+ CI.getElectricMotor(i, 2), CI.getConveyor(i, 2), CI.getRobotArm(i, 1) },
+ CI.getTieredFluid(i, 144 * 4),
+ aChisels[i - 1],
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(i));
+ }
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14), aChisels[2], CI.getPlate(4, 8), CI.getElectricMotor(4, 8),
+ CI.getConveyor(4, 8), CI.getRobotArm(4, 4) },
+ CI.getTieredFluid(4, 144 * 8),
+ GregtechItemList.Controller_IndustrialAutoChisel.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(4));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14), ItemList.Casing_SolidSteel.get(2), CI.getPlate(4, 2),
+ CI.getTieredComponent(OrePrefixes.plate, 3, 4), CI.getTieredComponent(OrePrefixes.ring, 3, 8),
+ CI.getTieredComponent(OrePrefixes.rod, 2, 4), },
+ CI.getTieredFluid(2, 144 * 2),
+ GregtechItemList.Casing_IndustrialAutoChisel.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(3));
+ }
+
+ private static void rockBreaker() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), ItemList.Machine_EV_RockBreaker.get(1),
+ ALLOY.STAINLESS_STEEL.getPlate(8), ALLOY.STAINLESS_STEEL.getRing(4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.plateDouble, 8),
+ ALLOY.EGLIN_STEEL.getScrew(8), },
+ ELEMENT.getInstance().ALUMINIUM.getFluidStack(144 * 8),
+ GregtechItemList.Controller_IndustrialRockBreaker.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ private static void fakeMachineCasingCovers() {
+ int aMaxTier = GT_Values.VOLTAGE_NAMES.length;
+ ItemStack aTier[] = new ItemStack[aMaxTier];
+ for (int i = 0; i < aMaxTier; i++) {
+ aTier[i] = ItemUtils.simpleMetaStack(CoverManager.Cover_Gt_Machine_Casing, i, 7);
+ }
+ // Add recipes for new ones
+ for (int i = 0; i < aMaxTier; i++) {
+ GT_Values.RA
+ .addCutterRecipe(CI.getTieredMachineCasing(i), aTier[i], null, 20 * 5 * i, (int) GT_Values.V[i]);
+ }
+ }
+
+ private static void superBuses() {
+ GregtechItemList[] mSuperBusesInput = new GregtechItemList[] { GregtechItemList.Hatch_SuperBus_Input_LV,
+ GregtechItemList.Hatch_SuperBus_Input_MV, GregtechItemList.Hatch_SuperBus_Input_HV,
+ GregtechItemList.Hatch_SuperBus_Input_EV, GregtechItemList.Hatch_SuperBus_Input_IV,
+ GregtechItemList.Hatch_SuperBus_Input_LuV, GregtechItemList.Hatch_SuperBus_Input_ZPM,
+ GregtechItemList.Hatch_SuperBus_Input_UV, GregtechItemList.Hatch_SuperBus_Input_MAX, };
+
+ GregtechItemList[] mSuperBusesOutput = new GregtechItemList[] { GregtechItemList.Hatch_SuperBus_Output_LV,
+ GregtechItemList.Hatch_SuperBus_Output_MV, GregtechItemList.Hatch_SuperBus_Output_HV,
+ GregtechItemList.Hatch_SuperBus_Output_EV, GregtechItemList.Hatch_SuperBus_Output_IV,
+ GregtechItemList.Hatch_SuperBus_Output_LuV, GregtechItemList.Hatch_SuperBus_Output_ZPM,
+ GregtechItemList.Hatch_SuperBus_Output_UV, GregtechItemList.Hatch_SuperBus_Output_MAX, };
+
+ ItemStack[] mInputHatch = new ItemStack[] { ItemList.Hatch_Input_Bus_EV.get(1),
+ ItemList.Hatch_Input_Bus_IV.get(1), ItemList.Hatch_Input_Bus_LuV.get(1),
+ ItemList.Hatch_Input_Bus_ZPM.get(1), ItemList.Hatch_Input_Bus_UV.get(1),
+ ItemList.Hatch_Input_Bus_MAX.get(1), GregtechItemList.Hatch_SuperBus_Input_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_MV.get(1), GregtechItemList.Hatch_SuperBus_Input_HV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_EV.get(1), };
+
+ ItemStack[] mOutputHatch = new ItemStack[] { ItemList.Hatch_Output_Bus_EV.get(1),
+ ItemList.Hatch_Output_Bus_IV.get(1), ItemList.Hatch_Output_Bus_LuV.get(1),
+ ItemList.Hatch_Output_Bus_ZPM.get(1), ItemList.Hatch_Output_Bus_UV.get(1),
+ ItemList.Hatch_Output_Bus_MAX.get(1), GregtechItemList.Hatch_SuperBus_Output_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Output_MV.get(1), GregtechItemList.Hatch_SuperBus_Output_HV.get(1),
+ GregtechItemList.Hatch_SuperBus_Output_EV.get(1), };
+
+ // Input Buses
+ for (int tier = 1; tier < mSuperBusesInput.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mInputHatch[tier - 1], CI.getElectricMotor(tier, 2),
+ CI.getConveyor(tier, 5), CI.getBolt(tier, 16),
+ CI.getTieredComponent(OrePrefixes.circuit, tier, 2) },
+ CI.getAlternativeTieredFluid(tier, 144 * 8),
+ mSuperBusesInput[tier - 1].get(1),
+ 20 * 30 * 2,
+ (int) GT_Values.V[tier]);
+ }
+ // Output Buses
+ for (int tier = 1; tier < mSuperBusesOutput.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18), mOutputHatch[tier - 1], CI.getElectricPiston(tier, 2),
+ CI.getConveyor(tier, 5), CI.getGear(tier, 3), CI.getTieredComponent(OrePrefixes.circuit, tier, 2) },
+ CI.getTertiaryTieredFluid(tier, 144 * 8),
+ mSuperBusesOutput[tier - 1].get(1),
+ 20 * 30 * 2,
+ (int) GT_Values.V[tier]);
+ }
+ }
+
+ private static void chiselBuses() {
+ ItemStack[] mSuperBusesInput = new ItemStack[] { GregtechItemList.Hatch_SuperBus_Input_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_MV.get(1), GregtechItemList.Hatch_SuperBus_Input_HV.get(1), };
+
+ ItemStack[] mChiselBuses = new ItemStack[] { GregtechItemList.GT_MetaTileEntity_ChiselBus_LV.get(1),
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_MV.get(1),
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_HV.get(1), };
+
+ for (int tier = 1; tier < mChiselBuses.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mSuperBusesInput[tier - 1], CI.getSensor(tier, 1),
+ CI.getRobotArm(tier, 2), CI.getBolt(tier, 16), ItemUtils.getSimpleStack(Blocks.chest) },
+ CI.getAlternativeTieredFluid(tier, 144 * 2),
+ mChiselBuses[tier - 1],
+ 20 * 30 * 2,
+ (int) GT_Values.VP[tier + 1]);
+ }
+ }
+
+ private static void solidifierHatches() {
+ ItemStack[] mSuperBusesInput = new ItemStack[] { ItemList.Hatch_Input_IV.get(1),
+ ItemList.Hatch_Input_LuV.get(1), ItemList.Hatch_Input_ZPM.get(1), ItemList.Hatch_Input_UV.get(1), };
+
+ ItemStack[] mSolidifierHatches = new ItemStack[] { GregtechItemList.GT_MetaTileEntity_Solidifier_I.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_II.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_III.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_IV.get(1), };
+
+ for (int i = 0; i < 4; i++) {
+ int componentTier = i + 5;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mSuperBusesInput[i], CI.getSensor(componentTier, 1),
+ CI.getFluidRegulator(componentTier, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, componentTier + 1, 4),
+ ItemUtils.getSimpleStack(Blocks.chest) },
+ CI.getTieredFluid(componentTier, 144 * 2),
+ mSolidifierHatches[i],
+ 20 * 30,
+ (int) GT_Values.VP[componentTier]);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java
new file mode 100644
index 0000000000..0cf0152c53
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java
@@ -0,0 +1,168 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gtPlusPlus.core.material.MISC_MATERIALS.BRINE;
+import static gtPlusPlus.core.material.MISC_MATERIALS.HYDROGEN_CHLORIDE;
+import static gtPlusPlus.core.material.MISC_MATERIALS.HYDROGEN_CHLORIDE_MIX;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_HIGH;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_LOW;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_MID;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPES_RareEarthProcessing {
+
+ public static void init() {
+
+ // Brine Check and assignment
+ FluidStack mBrine = FluidUtils.getFluidStack("brine", 1000);
+ if (mBrine == null) {
+ Fluid f = BRINE.generateFluid();
+ BRINE.registerComponentForMaterial(FluidUtils.getFluidStack(f, 1000));
+ mBrine = BRINE.getFluidStack(1000);
+ } else {
+ BRINE.registerComponentForMaterial(FluidUtils.getFluidStack(mBrine, 1000));
+ }
+
+ // Hydrogen Chloride Check and assignment
+ FluidStack mHydrogenChloride = FluidUtils.getFluidStack("hydrogenchloride", 1000);
+ if (mHydrogenChloride == null) {
+ HYDROGEN_CHLORIDE.generateFluid();
+ mHydrogenChloride = BRINE.getFluidStack(1000);
+ } else {
+ HYDROGEN_CHLORIDE.registerComponentForMaterial(FluidUtils.getFluidStack(mHydrogenChloride, 1000));
+ }
+
+ // Add Process for creating Brine
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 16L))
+ .fluidInputs(Materials.SaltWater.getFluid(2000L))
+ .fluidOutputs(FluidUtils.getFluidStack(mBrine, 4000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+
+ // Chloralkali process
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1), ItemList.Cell_Empty.get(2L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1L))
+ .fluidInputs(FluidUtils.getFluidStack(mBrine, 2000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+
+ // Generate Special Laser Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L),
+ CI.getNumberedBioCircuit(2))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.cellHydrogenChlorideMix, 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GregtechItemList.Laser_Lens_WoodsGlass.get(0))
+ .fluidInputs(HYDROGEN_CHLORIDE_MIX.getFluidStack(4000))
+ .fluidOutputs(HYDROGEN_CHLORIDE.getFluidStack(4000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ // Set Material Tiers correctly
+ ORES.GREENOCKITE.vTier = 1;
+ RARE_EARTH_LOW.vTier = 1;
+ RARE_EARTH_MID.vTier = 3;
+ RARE_EARTH_HIGH.vTier = 5;
+
+ // Set Material Voltages correctly
+ ORES.GREENOCKITE.vVoltageMultiplier = 30;
+ RARE_EARTH_LOW.vVoltageMultiplier = 30;
+ RARE_EARTH_MID.vVoltageMultiplier = 480;
+ RARE_EARTH_HIGH.vVoltageMultiplier = 7680;
+
+ // Set Material Tooltips to be shorter
+ RARE_EARTH_LOW.vChemicalFormula = "??????";
+ RARE_EARTH_MID.vChemicalFormula = "??????";
+ RARE_EARTH_HIGH.vChemicalFormula = "??????";
+
+ // Set Material Tooltips to be shorter
+ RARE_EARTH_LOW.vChemicalSymbol = "??";
+ RARE_EARTH_MID.vChemicalSymbol = "??";
+ RARE_EARTH_HIGH.vChemicalSymbol = "??";
+
+ // Generate Ore Materials
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_LOW);
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_MID);
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_HIGH);
+
+ // industrial strength HCl
+ Fluid aHydrochloric = FluidUtils.getFluidStack("hydrogenchloride", 1)
+ .getFluid();
+
+ // LV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_LOW.getCrushed(2), RARE_EARTH_LOW.getCrushed(2), RARE_EARTH_LOW.getCrushed(2))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ // HV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_MID.getCrushed(2), RARE_EARTH_MID.getCrushed(2), RARE_EARTH_MID.getCrushed(2))
+ .outputChances(10000, 9000, 8000)
+ .fluidInputs(FluidUtils.getFluidStack(aHydrochloric, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalBathRecipes);
+
+ // IV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2))
+ .outputChances(10000, 9000, 8000)
+ .fluidInputs(FluidUtils.getHydrofluoricAcid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(chemicalBathRecipes);
+
+ // IV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2))
+ .outputChances(9000, 8000, 7000)
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(2000L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(chemicalBathRecipes);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java
new file mode 100644
index 0000000000..b7a7b43549
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class RECIPES_SeleniumProcessing {
+
+ public static void init() {
+
+ // We need this
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(MISC_MATERIALS.SELENIUM_DIOXIDE, false);
+
+ // Makes Selenium Dioxide
+ processCopperRecipes();
+
+ // Liquify the Dried Dioxide
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ 13,
+ FluidUtils.getSteam(500),
+ null,
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(1000),
+ 20,
+ 1024);
+
+ // Produce Selenious Acid
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getCell(1),
+ 14,
+ FluidUtils.getHotWater(4000),
+ CI.emptyCells(1),
+ MISC_MATERIALS.SELENIOUS_ACID.getFluidStack(1000),
+ 20,
+ 2048);
+
+ // Make Selenium
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(14), ELEMENT.getInstance().CARBON.getDust(16), },
+ new FluidStack[] { MISC_MATERIALS.SELENIOUS_ACID.getFluidStack(750),
+ Materials.SulfuricAcid.getFluid(8000), },
+ ELEMENT.getInstance().SELENIUM.getFluidStack(144 * 1),
+ new ItemStack[] { ELEMENT.getInstance().SELENIUM.getIngot(1), ELEMENT.getInstance().SELENIUM.getIngot(1), },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 300,
+ 7200);
+
+ /*
+ * // Old recipes for Selenium Roasting CORE.RA.addBlastSmelterRecipe( new ItemStack[] {
+ * ItemUtils.getGregtechCircuit(16), ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPyrite", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000); CORE.RA.addBlastSmelterRecipe( new
+ * ItemStack[] { ItemUtils.getGregtechCircuit(17),
+ * ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedChalcopyrite", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000); CORE.RA.addBlastSmelterRecipe( new
+ * ItemStack[] { ItemUtils.getGregtechCircuit(18),
+ * ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedGalena", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000);
+ */
+ }
+
+ public static void processCopperRecipes() {
+
+ // Copper
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Copper, 1), // Item Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(20), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Copper, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 500, 500, 500, 1000, 1000, 1000 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Tetra
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Tetrahedrite, 1), // Item
+ // Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Tetrahedrite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Chalco
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 1), // Item
+ // Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Chalcopyrite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Malachite
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Malachite, 1), // Item Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Malachite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java b/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java
new file mode 100644
index 0000000000..229b7cc045
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java
@@ -0,0 +1,118 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RECIPES_Tools {
+
+ // Outputs
+ public static ItemStack RECIPE_SandStone = new ItemStack(Blocks.sandstone, 2);
+ public static ItemStack RECIPE_Sand = new ItemStack(Blocks.sand, 4);
+
+ public static ItemStack RECIPE_DivisionSigil;
+
+ // MC Items
+ public static Item Apple = Items.apple;
+
+ // MC Blocks
+ public static Block CobbleStone = Blocks.cobblestone;
+ public static Block Dirt = Blocks.dirt;
+ public static Block Sand = Blocks.sand;
+ public static Block Gravel = Blocks.gravel;
+ public static Block Sandstone = Blocks.sandstone;
+
+ // null
+ public static String empty = " ";
+
+ // Batteries
+ public static String batteryBasic = "batteryBasic";
+ public static String batteryAdvanced = "batteryAdvanced";
+ public static String batteryElite = "batteryElite";
+ public static String batteryMaster = "batteryMaster";
+ public static String batteryUltimate = "batteryUltimate";
+
+ // Circuits
+ public static String circuitPrimitive = "circuitPrimitive";
+ public static String circuitBasic = "circuitBasic";
+ public static String circuitGood = "circuitGood";
+ public static String circuitAdvanced = "circuitAdvanced";
+ public static String circuitElite = "circuitElite";
+ public static String circuitMaster = "circuitMaster";
+ public static String circuitUltimate = "circuitUltimate";
+
+ // Cables
+ public static String cableGt01Electrum = "cableGt01Electrum";
+ public static String cableGt02Electrum = "cableGt02Electrum";
+ public static String cableGt01RedstoneAlloy = "cableGt01RedstoneAlloy";
+ public static String cableGt02RedstoneAlloy = "cableGt02RedstoneAlloy";
+ public static String cableGt01Copper = "cableGt01Copper";
+ public static String cableGt02Copper = "cableGt02Copper";
+ public static String cableGt01AnnealedCopper = "cableGt01AnnealedCopper";
+ public static String cableGt02AnnealedCopper = "cableGt02AnnealedCopper";
+
+ // Rods
+ public static String stickWood = "stickWood";
+ public static String stickStaballoy = "stickStaballoy";
+ public static String stickTitanium = "stickTitanium";
+ public static String stickIron = "stickIron";
+ public static String stickGold = "stickGold";
+ public static String stickSilver = "stickSilver";
+ public static String stickSteel = "stickSteel";
+ public static String stickBronze = "stickBronze";
+ public static String stickTungsten = "stickTungsten";
+ public static String stickRedAlloy = "stickRedAlloy";
+ public static String stickInvar = "stickInvar";
+ public static String stickElectrum = "stickElectrum";
+ public static String stickElectricalSteel = "stickElectricalSteel";
+
+ // Plates
+ public static String plateStaballoy = "plateStaballoy";
+ public static String plateTitanium = "plateTitanium";
+ public static String plateIron = "plateIron";
+ public static String plateGold = "plateGold";
+ public static String plateSilver = "plateSilver";
+ public static String plateSteel = "plateSteel";
+ public static String plateBronze = "plateBronze";
+ public static String plateTungsten = "plateTungsten";
+ public static String plateRedAlloy = "plateRedAlloy";
+ public static String plateInvar = "plateInvar";
+ public static String plateElectrum = "plateElectrum";
+ public static String plateElectricalSteel = "plateElectricalSteel";
+
+ // Ingots
+ public static String ingotStaballoy = "ingotStaballoy";
+ public static String ingotTitanium = "ingotTitanium";
+ public static String ingotIron = "ingotIron";
+ public static String ingotGold = "ingotGold";
+ public static String ingotSilver = "ingotSilver";
+ public static String ingotSteel = "ingotSteel";
+ public static String ingotBronze = "ingotBronze";
+ public static String ingotTungsten = "ingotTungsten";
+ public static String ingotRedAlloy = "ingotRedAlloy";
+ public static String ingotInvar = "ingotInvar";
+ public static String ingotElectrum = "ingotElectrum";
+ public static String ingotUranium = "ingotUranium";
+ public static String ingotElectricalSteel = "ingotElectricalSteel";
+
+ // Crafting Tools
+ public static String craftingToolHardHammer = "craftingToolHardHammer";
+ public static String craftingToolSoftHammer = "craftingToolSoftHammer";
+ public static String craftingToolFile = "craftingToolFile";
+ public static String craftingToolSaw = "craftingToolSaw";
+ public static String craftingToolPickaxe = "craftingToolPickaxe";
+ public static String craftingToolWrench = "craftingToolWrench";
+ public static String craftingToolCrowbar = "craftingToolCrowbar";
+ public static String craftingToolKnife = "craftingToolKnife";
+ public static String craftingToolScrewdriver = "craftingToolScrewdriver";
+
+ public static ItemStack personalCloakingDevice = ItemUtils.getSimpleStack(ModItems.itemPersonalCloakingDevice);
+ public static String plateDoubleNiChrome = "plateDoubleNichrome";
+ public static String plateIridiumAlloy = "plateAlloyIridium";
+
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java b/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java
new file mode 100644
index 0000000000..4369fdbfa3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPE_Batteries {
+
+ static ItemStack RECIPE_Battery_Sodium = GregtechItemList.Battery_RE_EV_Sodium.get(1);
+ static ItemStack RECIPE_Battery_Cadmium = GregtechItemList.Battery_RE_EV_Cadmium.get(1);
+ static ItemStack RECIPE_Battery_Lithium = GregtechItemList.Battery_RE_EV_Lithium.get(1);
+ static ItemStack GT_Battery_Sodium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32539, 1);
+ static ItemStack GT_Battery_Cadmium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32537, 1);
+ static ItemStack GT_Battery_Lithium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32538, 1);
+ static ItemStack machineTransformer_EV;
+
+ public static void loadRecipes() {
+ machineTransformer_EV = ItemList.Transformer_EV_HV.get(1);
+ run();
+ }
+
+ private static void run() {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Sodium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Sodium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Sodium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Sodium,
+ RECIPE_Battery_Sodium);
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Cadmium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Cadmium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Cadmium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Cadmium,
+ RECIPE_Battery_Cadmium);
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Lithium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Lithium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Lithium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Lithium,
+ RECIPE_Battery_Lithium);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java b/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java
new file mode 100644
index 0000000000..18c1c2c70c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class ShapedRecipeObject {
+
+ public Object object_A;
+ public Object object_B;
+ public Object object_C;
+ public Object object_D;
+ public Object object_E;
+ public Object object_F;
+ public Object object_G;
+ public Object object_H;
+ public Object object_I;
+ public ItemStack object_OUTPUT;
+
+ public ShapedRecipeObject(final Object input_A, final Object input_B, final Object input_C, final Object input_D,
+ final Object input_E, final Object input_F, final Object input_G, final Object input_H, final Object input_I,
+ final ItemStack input_Output) {
+ this.object_A = input_A;
+ this.object_B = input_B;
+ this.object_C = input_C;
+ this.object_D = input_D;
+ this.object_E = input_E;
+ this.object_F = input_F;
+ this.object_G = input_G;
+ this.object_H = input_H;
+ this.object_I = input_I;
+ this.object_OUTPUT = input_Output;
+ Logger.SPECIFIC_WARNING("ShapedRecipeObject", "New object created.", 36);
+ }
+
+ public void buildRecipe() {
+ RecipeUtils.recipeBuilder(
+ this.object_A,
+ this.object_B,
+ this.object_C,
+ this.object_D,
+ this.object_E,
+ this.object_F,
+ this.object_G,
+ this.object_H,
+ this.object_I,
+ this.object_OUTPUT);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/recipe/common/CI.java b/src/main/java/gtPlusPlus/core/recipe/common/CI.java
new file mode 100644
index 0000000000..5c1620160d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/recipe/common/CI.java
@@ -0,0 +1,1008 @@
+package gtPlusPlus.core.recipe.common;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.LOADER_Machine_Components;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import ic2.core.Ic2Items;
+
+public class CI {
+
+ // null
+ public static ItemStack _NULL = ItemUtils.getErrorStack(1);
+
+ // bits
+ public static long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ public static long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+
+ // Circuits
+ public static Object circuitPrimitive;
+ public static Object circuitTier1;
+ public static Object circuitTier2;
+ public static Object circuitTier3;
+ public static Object circuitTier4;
+ public static Object circuitTier5;
+ public static Object circuitTier6;
+ public static Object circuitTier7;
+ public static Object circuitTier8;
+ public static Object circuitTier9;
+
+ // Machine Components
+ public static ItemStack electricMotor_LV;
+ public static ItemStack electricMotor_MV;
+ public static ItemStack electricMotor_HV;
+ public static ItemStack electricMotor_EV;
+ public static ItemStack electricMotor_IV;
+ public static ItemStack electricMotor_LuV;
+ public static ItemStack electricMotor_ZPM;
+ public static ItemStack electricMotor_UV;
+ public static ItemStack electricMotor_UHV;
+ public static ItemStack electricPump_LV;
+ public static ItemStack electricPump_MV;
+ public static ItemStack electricPump_HV;
+ public static ItemStack electricPump_EV;
+ public static ItemStack electricPump_IV;
+ public static ItemStack electricPump_LuV;
+ public static ItemStack electricPump_ZPM;
+ public static ItemStack electricPump_UV;
+ public static ItemStack electricPump_UHV;
+ public static ItemStack electricPiston_LV;
+ public static ItemStack electricPiston_MV;
+ public static ItemStack electricPiston_HV;
+ public static ItemStack electricPiston_EV;
+ public static ItemStack electricPiston_IV;
+ public static ItemStack electricPiston_LuV;
+ public static ItemStack electricPiston_ZPM;
+ public static ItemStack electricPiston_UV;
+ public static ItemStack electricPiston_UHV;
+ public static ItemStack robotArm_LV;
+ public static ItemStack robotArm_MV;
+ public static ItemStack robotArm_HV;
+ public static ItemStack robotArm_EV;
+ public static ItemStack robotArm_IV;
+ public static ItemStack robotArm_LuV;
+ public static ItemStack robotArm_ZPM;
+ public static ItemStack robotArm_UV;
+ public static ItemStack robotArm_UHV;
+ public static ItemStack conveyorModule_LV;
+ public static ItemStack conveyorModule_MV;
+ public static ItemStack conveyorModule_HV;
+ public static ItemStack conveyorModule_EV;
+ public static ItemStack conveyorModule_IV;
+ public static ItemStack conveyorModule_LuV;
+ public static ItemStack conveyorModule_ZPM;
+ public static ItemStack conveyorModule_UV;
+ public static ItemStack conveyorModule_UHV;
+ public static ItemStack emitter_LV;
+ public static ItemStack emitter_MV;
+ public static ItemStack emitter_HV;
+ public static ItemStack emitter_EV;
+ public static ItemStack emitter_IV;
+ public static ItemStack emitter_LuV;
+ public static ItemStack emitter_ZPM;
+ public static ItemStack emitter_UV;
+ public static ItemStack emitter_UHV;
+ public static ItemStack fieldGenerator_LV;
+ public static ItemStack fieldGenerator_MV;
+ public static ItemStack fieldGenerator_HV;
+ public static ItemStack fieldGenerator_EV;
+ public static ItemStack fieldGenerator_IV;
+ public static ItemStack fieldGenerator_LuV;
+ public static ItemStack fieldGenerator_ZPM;
+ public static ItemStack fieldGenerator_UV;
+ public static ItemStack fieldGenerator_UHV;
+ public static ItemStack sensor_LV;
+ public static ItemStack sensor_MV;
+ public static ItemStack sensor_HV;
+ public static ItemStack sensor_EV;
+ public static ItemStack sensor_IV;
+ public static ItemStack sensor_LuV;
+ public static ItemStack sensor_ZPM;
+ public static ItemStack sensor_UV;
+ public static ItemStack sensor_UHV;
+
+ public static ItemStack fluidRegulator_LV;
+ public static ItemStack fluidRegulator_MV;
+ public static ItemStack fluidRegulator_HV;
+ public static ItemStack fluidRegulator_EV;
+ public static ItemStack fluidRegulator_IV;
+ public static ItemStack fluidRegulator_LuV;
+ public static ItemStack fluidRegulator_ZPM;
+ public static ItemStack fluidRegulator_UV;
+
+ // Machine Casings
+ public static ItemStack machineCasing_ULV;
+ public static ItemStack machineCasing_LV;
+ public static ItemStack machineCasing_MV;
+ public static ItemStack machineCasing_HV;
+ public static ItemStack machineCasing_EV;
+ public static ItemStack machineCasing_IV;
+ public static ItemStack machineCasing_LuV;
+ public static ItemStack machineCasing_ZPM;
+ public static ItemStack machineCasing_UV;
+ public static ItemStack machineCasing_UHV;
+
+ // Machine Hulls
+ public static ItemStack machineHull_ULV;
+ public static ItemStack machineHull_LV;
+ public static ItemStack machineHull_MV;
+ public static ItemStack machineHull_HV;
+ public static ItemStack machineHull_EV;
+ public static ItemStack machineHull_IV;
+ public static ItemStack machineHull_LuV;
+ public static ItemStack machineHull_ZPM;
+ public static ItemStack machineHull_UV;
+ public static ItemStack machineHull_UHV;
+
+ // Gearbox Casings
+ public static ItemStack gearboxCasing_Tier_1;
+ public static ItemStack gearboxCasing_Tier_2;
+ public static ItemStack gearboxCasing_Tier_3;
+ public static ItemStack gearboxCasing_Tier_4;
+
+ public static String[] component_Plate;
+ public static String[] component_Rod;
+ public static String[] component_Ingot;
+
+ // Crafting Tools
+ public static String craftingToolWrench = "craftingToolWrench";
+ public static String craftingToolHammer_Hard = "craftingToolHardHammer";
+ public static String craftingToolScrewdriver = "craftingToolScrewdriver";
+ public static String craftingToolFile = "craftingToolFile";
+ public static String craftingToolMortar = "craftingToolMortar";
+ public static String craftingToolSaw = "craftingToolSaw";
+ public static String craftingToolWireCutter = "craftingToolWirecutter";
+ public static String craftingToolSolderingIron = "craftingToolSolderingIron";
+
+ // Explosives
+ public static ItemStack explosivePowderKeg;
+ public static ItemStack explosiveTNT;
+ public static ItemStack explosiveITNT;
+
+ public static Materials[] tieredMaterials = new Materials[] { Materials.Iron, Materials.Steel, Materials.Aluminium,
+ Materials.StainlessSteel, Materials.Titanium, Materials.TungstenSteel, Materials.Chrome, Materials.Iridium,
+ Materials.Osmium, Materials.Neutronium };
+
+ public static void preInit() {
+
+ // Tiered Components
+ component_Plate = new String[] { getTieredComponent(OrePrefixes.plate, 0),
+ getTieredComponent(OrePrefixes.plate, 1), getTieredComponent(OrePrefixes.plate, 2),
+ getTieredComponent(OrePrefixes.plate, 3), getTieredComponent(OrePrefixes.plate, 4),
+ getTieredComponent(OrePrefixes.plate, 5), getTieredComponent(OrePrefixes.plate, 6),
+ getTieredComponent(OrePrefixes.plate, 7), getTieredComponent(OrePrefixes.plate, 8),
+ getTieredComponent(OrePrefixes.plate, 9), getTieredComponent(OrePrefixes.plate, 10),
+ getTieredComponent(OrePrefixes.plate, 11) };
+ component_Rod = new String[] { getTieredComponent(OrePrefixes.stick, 0),
+ getTieredComponent(OrePrefixes.stick, 1), getTieredComponent(OrePrefixes.stick, 2),
+ getTieredComponent(OrePrefixes.stick, 3), getTieredComponent(OrePrefixes.stick, 4),
+ getTieredComponent(OrePrefixes.stick, 5), getTieredComponent(OrePrefixes.stick, 6),
+ getTieredComponent(OrePrefixes.stick, 7), getTieredComponent(OrePrefixes.stick, 8),
+ getTieredComponent(OrePrefixes.stick, 9), getTieredComponent(OrePrefixes.stick, 10),
+ getTieredComponent(OrePrefixes.stick, 11) };
+ component_Ingot = new String[] { getTieredComponent(OrePrefixes.ingot, 0),
+ getTieredComponent(OrePrefixes.ingot, 1), getTieredComponent(OrePrefixes.ingot, 2),
+ getTieredComponent(OrePrefixes.ingot, 3), getTieredComponent(OrePrefixes.ingot, 4),
+ getTieredComponent(OrePrefixes.ingot, 5), getTieredComponent(OrePrefixes.ingot, 6),
+ getTieredComponent(OrePrefixes.ingot, 7), getTieredComponent(OrePrefixes.ingot, 8),
+ getTieredComponent(OrePrefixes.ingot, 9), getTieredComponent(OrePrefixes.ingot, 10),
+ getTieredComponent(OrePrefixes.ingot, 11) };
+
+ // Circuits
+ circuitPrimitive = getTieredCircuit(0);
+ circuitTier1 = getTieredCircuit(1);
+ circuitTier2 = getTieredCircuit(2);
+ circuitTier3 = getTieredCircuit(3);
+ circuitTier4 = getTieredCircuit(4);
+ circuitTier5 = getTieredCircuit(5);
+ circuitTier6 = getTieredCircuit(6);
+ circuitTier7 = getTieredCircuit(7);
+ circuitTier8 = getTieredCircuit(8);
+ circuitTier9 = getTieredCircuit(9);
+ }
+
+ public static Object getTieredCircuit(int tier) {
+ return getTieredCircuitOreDictName(tier);
+ }
+
+ public static String getTieredCircuitOreDictName(int tier) {
+ if (tier == 0) {
+ return "circuitPrimitive";
+ } else if (tier == 1) {
+ return "circuitBasic";
+ } else if (tier == 2) {
+ return "circuitGood";
+ } else if (tier == 3) {
+ return "circuitAdvanced";
+ } else if (tier == 4) {
+ return "circuitData";
+ } else if (tier == 5) {
+ return "circuitElite";
+ } else if (tier == 6) {
+ return "circuitMaster";
+ } else if (tier == 7) {
+ return "circuitUltimate";
+ } else if (tier == 8) {
+ return "circuitSuperconductor";
+ } else if (tier == 9) {
+ return "circuitInfinite";
+ } else if (tier == 10) {
+ return "circuitQuantum";
+ } else {
+ return "circuitPrimitive";
+ }
+ }
+
+ public static ItemStack getNumberedCircuit(int Meta) {
+ return ItemUtils.getGregtechCircuit(Meta);
+ }
+
+ private static Object getMaterialFromTier(int tier) {
+ if (tier == 0) {
+ return Materials.Wood;
+ } else if (tier == 1) {
+ return Materials.Lead;
+ } else if (tier == 2) {
+ return Materials.Bronze;
+ } else if (tier == 3) {
+ return Materials.Steel;
+ } else if (tier == 4) {
+ return ALLOY.EGLIN_STEEL;
+ } else if (tier == 5) {
+ return Materials.Aluminium;
+ } else if (tier == 6) {
+ return ALLOY.MARAGING250;
+ } else if (tier == 7) {
+ return ALLOY.TANTALLOY_61;
+ } else if (tier == 8) {
+ return ALLOY.INCONEL_792;
+ } else if (tier == 9) {
+ return ALLOY.ZERON_100;
+ } else if (tier == 10) {
+ return Materials.NaquadahEnriched;
+ } else if (tier == 11) {
+ return Materials.Neutronium;
+ }
+ return Materials._NULL;
+ }
+
+ public static String getTieredComponent(OrePrefixes type, int tier) {
+ Object material = getMaterialFromTier(tier);
+ if (material != null) {
+ if (material instanceof Materials) {
+ // return (ItemStack) type.get(material);
+ String materialName = ((Materials) material).mDefaultLocalName;
+ Logger.INFO("Searching for a component named " + type.name() + materialName);
+ // return ItemUtils.getItemStackOfAmountFromOreDict(type.name()+materialName, 1);
+ return (type.name() + materialName);
+ } else {
+ String materialName = (Utils.sanitizeString(((Material) material).getLocalizedName()));
+ Logger.INFO("Searching for a component named " + type.name() + materialName);
+ // return ItemUtils.getItemStackOfAmountFromOreDict(type.name()+materialName, 1);
+ return (type.name() + materialName);
+ }
+ }
+ Logger.INFO("[Components] Failed getting a tiered component. " + type.name() + " | " + tier);
+ return null;
+ }
+
+ public static ItemStack getDataOrb() {
+ return ItemList.Tool_DataOrb.get(1);
+ }
+
+ public static ItemStack getDataStick() {
+ return ItemList.Tool_DataStick.get(1);
+ }
+
+ public static ItemStack getTieredMachineHull(int tier) {
+ if (tier == 0) {
+ return machineHull_ULV;
+ } else if (tier == 1) {
+ return machineHull_LV;
+ } else if (tier == 2) {
+ return machineHull_MV;
+ } else if (tier == 3) {
+ return machineHull_HV;
+ } else if (tier == 4) {
+ return machineHull_EV;
+ } else if (tier == 5) {
+ return machineHull_IV;
+ } else if (tier == 6) {
+ return machineHull_LuV;
+ } else if (tier == 7) {
+ return machineHull_ZPM;
+ } else if (tier == 8) {
+ return machineHull_UV;
+ } else if (tier == 9) {
+ return machineHull_UHV;
+ } else {
+ return GregtechItemList.Casing_Multi_Use.get(1);
+ }
+ }
+
+ public static ItemStack getTieredMachineCasing(int tier) {
+ if (tier == 0) {
+ if (machineCasing_ULV == null) {
+ machineCasing_ULV = ItemList.Casing_ULV.get(1);
+ }
+ return machineCasing_ULV;
+ } else if (tier == 1) {
+ return machineCasing_LV;
+ } else if (tier == 2) {
+ return machineCasing_MV;
+ } else if (tier == 3) {
+ return machineCasing_HV;
+ } else if (tier == 4) {
+ return machineCasing_EV;
+ } else if (tier == 5) {
+ return machineCasing_IV;
+ } else if (tier == 6) {
+ return machineCasing_LuV;
+ } else if (tier == 7) {
+ return machineCasing_ZPM;
+ } else if (tier == 8) {
+ return machineCasing_UV;
+ } else if (tier == 9) {
+ return machineCasing_UHV;
+ } else {
+ return GregtechItemList.Casing_Multi_Use.get(1);
+ }
+ }
+
+ public static void init() {
+ // Set Explosives
+ explosivePowderKeg = ItemList.Block_Powderbarrel.get(1);
+ explosiveTNT = ItemUtils.getSimpleStack(Blocks.tnt)
+ .copy();
+ explosiveITNT = Ic2Items.industrialTnt.copy();
+
+ // Machine Casings
+ machineCasing_ULV = ItemList.Casing_ULV.get(1);
+ machineCasing_LV = ItemList.Casing_LV.get(1);
+ machineCasing_MV = ItemList.Casing_MV.get(1);
+ machineCasing_HV = ItemList.Casing_HV.get(1);
+ machineCasing_EV = ItemList.Casing_EV.get(1);
+ machineCasing_IV = ItemList.Casing_IV.get(1);
+ machineCasing_LuV = ItemList.Casing_LuV.get(1);
+ machineCasing_ZPM = ItemList.Casing_ZPM.get(1);
+ machineCasing_UV = ItemList.Casing_UV.get(1);
+ machineCasing_UHV = ItemList.Casing_MAX.get(1);
+
+ // Machine Hulls
+ machineHull_ULV = ItemList.Hull_ULV.get(1);
+ machineHull_LV = ItemList.Hull_LV.get(1);
+ machineHull_MV = ItemList.Hull_MV.get(1);
+ machineHull_HV = ItemList.Hull_HV.get(1);
+ machineHull_EV = ItemList.Hull_EV.get(1);
+ machineHull_IV = ItemList.Hull_IV.get(1);
+ machineHull_LuV = ItemList.Hull_LuV.get(1);
+ machineHull_ZPM = ItemList.Hull_ZPM.get(1);
+ machineHull_UV = ItemList.Hull_UV.get(1);
+ machineHull_UHV = ItemList.Hull_MAX.get(1);
+
+ // Gear box Casings
+ gearboxCasing_Tier_1 = ItemList.Casing_Gearbox_Bronze.get(1);
+ gearboxCasing_Tier_2 = ItemList.Casing_Gearbox_Steel.get(1);
+ gearboxCasing_Tier_3 = ItemList.Casing_Gearbox_Titanium.get(1);
+ gearboxCasing_Tier_4 = ItemList.Casing_Gearbox_TungstenSteel.get(1);
+
+ // Machine Components
+ LOADER_Machine_Components.initialise();
+ }
+
+ public static ItemStack emptyCells(int i) {
+ return ItemUtils.getEmptyCell(i);
+ }
+
+ private static final Material[] aMaterial_Main = new Material[] { ALLOY.POTIN, ALLOY.TUMBAGA, ALLOY.EGLIN_STEEL,
+ ALLOY.INCONEL_625, ALLOY.INCOLOY_DS, ALLOY.NITINOL_60, ALLOY.ZERON_100, ALLOY.PIKYONIUM,
+ ELEMENT.STANDALONE.ADVANCED_NITINOL, ALLOY.ABYSSAL, ALLOY.QUANTUM, ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Material[] aMaterial_Secondary = new Material[] { ALLOY.STEEL, ALLOY.SILICON_CARBIDE,
+ ALLOY.BLOODSTEEL, ALLOY.TANTALUM_CARBIDE, ALLOY.INCONEL_792, ALLOY.ARCANITE, ALLOY.LAFIUM, ALLOY.CINOBITE,
+ ALLOY.TITANSTEEL, ALLOY.OCTIRON, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN, ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Material[] aMaterial_Tertiary = new Material[] { ELEMENT.getInstance().LEAD,
+ ELEMENT.getInstance().ALUMINIUM, ELEMENT.STANDALONE.BLACK_METAL, ELEMENT.getInstance().TITANIUM,
+ ALLOY.HASTELLOY_N, ALLOY.ENERGYCRYSTAL, ALLOY.TRINIUM_NAQUADAH_CARBON, ALLOY.TRINIUM_REINFORCED_STEEL, // Arceus
+ ALLOY.TITANSTEEL, ELEMENT.STANDALONE.ASTRAL_TITANIUM, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN,
+ ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Materials[] aMaterial_Cables = new Materials[] { Materials.Tin, Materials.Cobalt,
+ Materials.AnnealedCopper, Materials.Gold, Materials.Titanium, Materials.Nichrome, Materials.Platinum,
+ Materials.YttriumBariumCuprate, Materials.Naquadah, Materials.Duranium, Materials.SuperconductorUHV, };
+
+ private static final Materials[] aMaterial_Circuits = new Materials[] { Materials.Primitive, Materials.Basic,
+ Materials.Good, Materials.Advanced, Materials.Data, Materials.Data, Materials.Elite, Materials.Master,
+ Materials.Ultimate, Materials.SuperconductorUHV, Materials.Infinite, };
+
+ private static final Material[][] aMaster = new Material[][] { aMaterial_Main, aMaterial_Secondary,
+ aMaterial_Tertiary };
+
+ public static FluidStack getTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 0);
+ }
+
+ public static FluidStack getAlternativeTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 1);
+ }
+
+ public static FluidStack getTertiaryTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 2);
+ }
+
+ public static FluidStack getTieredFluid(int aTier, int aAmount, int aType) {
+ // Weird Legacy handling
+ /*
+ * ItemStack aCell = getTieredComponent(OrePrefixes.liquid, aTier, 1); FluidStack a =
+ * GT_Utility.getFluidForFilledItem(aCell, true); if (a == null) { a = aMaster[aType][aTier].getFluid(aAmount);
+ * }
+ */
+
+ // Modern Handling
+ FluidStack a = aMaster[aType][aTier].getFluidStack(aAmount);
+ if (a == null) {
+ ItemStack aCell = getTieredComponent(OrePrefixes.liquid, aTier, 1);
+ if (aCell != null) {
+ a = GT_Utility.getFluidForFilledItem(aCell, true);
+ a.amount = aAmount;
+ }
+ }
+ return a;
+ }
+
+ public static ItemStack getEnergyCore(int aTier, int aAmount) {
+ ItemStack[] aOutput = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "1", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "2", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "3", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "4", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "5", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "6", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "10", 1) };
+ return ItemUtils.getSimpleStack(aOutput[MathUtils.balance(aTier, 0, 9)], aAmount);
+ }
+
+ public static ItemStack getPlate(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.plate, aTier, aAmount);
+ }
+
+ public static ItemStack getDoublePlate(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.plateDouble, aTier, aAmount);
+ }
+
+ public static ItemStack getGear(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.gearGt, aTier, aAmount);
+ }
+
+ public static ItemStack getIngot(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.ingot, aTier, aAmount);
+ }
+
+ public static ItemStack getBolt(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.bolt, aTier, aAmount);
+ }
+
+ public static ItemStack getScrew(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.screw, aTier, aAmount);
+ }
+
+ public static ItemStack getCircuit(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.circuit, aTier, aAmount);
+ }
+
+ public static ItemStack getTieredComponent(OrePrefixes aPrefix, int aTier, int aAmount) {
+ aTier = Math.max(0, aTier);
+
+ Material m;
+
+ if (aPrefix == OrePrefixes.liquid) {
+ int aMatID = (aTier == 0 || aTier == 2 || aTier == 5 || aTier == 8 ? 0
+ : (aTier == 1 || aTier == 3 || aTier == 6 || aTier == 9 ? 1 : 2));
+ ItemStack aCell = aMaster[aMatID][aTier].getCell(aAmount);
+ return aCell;
+ }
+
+ if (aPrefix == OrePrefixes.circuit) {
+ /*
+ * if (aTier == 4) { return ItemUtils.getSimpleStack(CI.getDataStick(), aAmount); } else if (aTier == 5) {
+ * return ItemUtils.getSimpleStack(CI.getDataOrb(), aAmount); }
+ */
+ return ItemUtils.getOrePrefixStack(OrePrefixes.circuit, aMaterial_Circuits[aTier], aAmount);
+ }
+
+ // Check for Cables first, catch SuperConductor case and swap to wire.
+ if (aPrefix == OrePrefixes.cableGt01 || aPrefix == OrePrefixes.cableGt02
+ || aPrefix == OrePrefixes.cableGt04
+ || aPrefix == OrePrefixes.cableGt08
+ || aPrefix == OrePrefixes.cableGt12) {
+ // Special Handler
+ if (aTier == 10) {
+ if (aPrefix == OrePrefixes.cableGt01) {
+ aPrefix = OrePrefixes.wireGt02;
+ } else if (aPrefix == OrePrefixes.cableGt02) {
+ aPrefix = OrePrefixes.wireGt04;
+ } else if (aPrefix == OrePrefixes.cableGt04) {
+ aPrefix = OrePrefixes.wireGt08;
+ } else if (aPrefix == OrePrefixes.cableGt08) {
+ aPrefix = OrePrefixes.wireGt12;
+ } else if (aPrefix == OrePrefixes.cableGt12) {
+ aPrefix = OrePrefixes.wireGt16;
+ }
+ } else {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial_Cables[aTier], aAmount);
+ }
+ }
+ if (aPrefix == OrePrefixes.wireGt01 || aPrefix == OrePrefixes.wireGt02
+ || aPrefix == OrePrefixes.wireGt04
+ || aPrefix == OrePrefixes.wireGt08
+ || aPrefix == OrePrefixes.wireGt12
+ || aPrefix == OrePrefixes.wireGt16) {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial_Cables[aTier], aAmount);
+ }
+
+ if (aPrefix == OrePrefixes.pipeTiny || aPrefix == OrePrefixes.pipeSmall
+ || aPrefix == OrePrefixes.pipe
+ || aPrefix == OrePrefixes.pipeMedium
+ || aPrefix == OrePrefixes.pipeLarge
+ || aPrefix == OrePrefixes.pipeHuge) {
+
+ if (aPrefix == OrePrefixes.pipe) {
+ aPrefix = OrePrefixes.pipeMedium;
+ }
+
+ if (aTier == 0) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Lead, aAmount);
+ } else if (aTier == 1) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Steel, aAmount);
+ } else if (aTier == 2) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.StainlessSteel, aAmount);
+ } else if (aTier == 3) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Tungsten, aAmount);
+ } else if (aTier == 4) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.TungstenSteel, aAmount);
+ } else if (aTier == 5) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.MARAGING350, aAmount);
+ } else if (aTier == 6) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.STABALLOY, aAmount);
+ } else if (aTier == 7) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.HASTELLOY_X, aAmount);
+ } else if (aTier == 8) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Ultimate, aAmount);
+ } else if (aTier == 9) {
+ return ItemUtils.getOrePrefixStack(OrePrefixes.pipeMedium, Materials.SuperconductorUHV, aAmount);
+ } else if (aTier == 10) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Europium, aAmount);
+ } else {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Titanium, aAmount);
+ }
+ }
+
+ if (aPrefix == OrePrefixes.rod) {
+ aPrefix = OrePrefixes.stick;
+ }
+
+ if (aPrefix == OrePrefixes.gear || aPrefix == OrePrefixes.gearGt) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.rod || aPrefix == OrePrefixes.stick) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.stickLong) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.bolt) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.screw) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.rotor) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.frame || aPrefix == OrePrefixes.frameGt) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.ingot) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.plate) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.plateDouble) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.ring) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.cell) {
+ m = aMaster[1][aTier];
+ } else {
+ m = aMaterial_Main[aTier];
+ }
+
+ ItemStack aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try First Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[0][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try Second Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[1][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try Third Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[2][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // All Invalid?
+ // Let's add a special error ingot.
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ aReturn = ItemUtils.getErrorStack(1, (aPrefix + m.getLocalizedName() + " x" + aAmount));
+ }
+ }
+ }
+ }
+
+ return aReturn;
+ }
+
+ public static ItemStack getElectricMotor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricMotor_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getFluidRegulator(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 0;
+ if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.fluidRegulator_UV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getElectricPiston(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricPiston_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getElectricPump(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricPump_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricPump_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getRobotArm(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.robotArm_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.robotArm_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getConveyor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.conveyorModule_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getEmitter(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.emitter_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.emitter_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getSensor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.sensor_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.sensor_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getFieldGenerator(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.fieldGenerator_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getTieredMachineHull(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 0;
+ if (aTier == aLazyTier++) {
+ aType = CI.machineHull_ULV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.machineHull_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getHeatCoil(int i) {
+ if (i > 8) {
+ i = 8;
+ }
+ return ItemUtils.simpleMetaStack(GregTech_API.sBlockCasings5, i, 1);
+ }
+
+ public static ItemStack getNumberedBioCircuit(int i) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, i, 0);
+ }
+
+ public static ItemStack getNumberedAdvancedCircuit(int i) {
+ return ItemUtils.simpleMetaStack(GenericChem.mAdvancedCircuit, i, 0);
+ }
+
+ public static ItemStack getTieredGTPPMachineCasing(int aTier, int aAmount) {
+ GregtechItemList[] aHulls = new GregtechItemList[] { GregtechItemList.GTPP_Casing_ULV,
+ GregtechItemList.GTPP_Casing_LV, GregtechItemList.GTPP_Casing_MV, GregtechItemList.GTPP_Casing_HV,
+ GregtechItemList.GTPP_Casing_EV, GregtechItemList.GTPP_Casing_IV, GregtechItemList.GTPP_Casing_LuV,
+ GregtechItemList.GTPP_Casing_ZPM, GregtechItemList.GTPP_Casing_UV, GregtechItemList.GTPP_Casing_UHV };
+ return aHulls[aTier].get(aAmount);
+ }
+
+ public static ItemStack getTieredComponentOfMaterial(Materials aMaterial, OrePrefixes aPrefix, int aAmount) {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial, aAmount);
+ }
+
+ public static ItemStack getTransmissionComponent(int aTier, int aAmount) {
+ GregtechItemList[] aTransParts = new GregtechItemList[] { null, GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ return aTransParts[aTier].get(aAmount);
+ }
+
+ public static ItemStack getEmptyCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 13, aAmount);
+ }
+
+ /**
+ * Aluminium + Silver Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getGreenCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 14, aAmount);
+ }
+
+ /**
+ * Iridium + Ruthenium Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getPurpleCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(GenericChem.mGenericChemItem1, 4, aAmount);
+ }
+
+ /**
+ * Platinum + Rhodium Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getPinkCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(GenericChem.mGenericChemItem1, 6, aAmount);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java b/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java
new file mode 100644
index 0000000000..323943b950
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemHoe;
+import net.minecraft.item.ItemPickaxe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemSword;
+import net.minecraft.stats.AchievementList;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+
+public class SlotCrafting extends Slot {
+
+ /** The craft matrix inventory linked to this result slot. */
+ private final IInventory craftMatrix;
+ /** The player that is using the GUI where this slot resides. */
+ private final EntityPlayer thePlayer;
+ /**
+ * The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset.
+ */
+ private int amountCrafted;
+
+ public SlotCrafting(final EntityPlayer p_i1823_1_, final IInventory p_i1823_2_, final IInventory p_i1823_3_,
+ final int p_i1823_4_, final int p_i1823_5_, final int p_i1823_6_) {
+ super(p_i1823_3_, p_i1823_4_, p_i1823_5_, p_i1823_6_);
+ this.thePlayer = p_i1823_1_;
+ this.craftMatrix = p_i1823_2_;
+ }
+
+ /**
+ * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
+ */
+ @Override
+ public boolean isItemValid(final ItemStack p_75214_1_) {
+ return false;
+ }
+
+ /**
+ * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
+ * stack.
+ */
+ @Override
+ public ItemStack decrStackSize(final int p_75209_1_) {
+ if (this.getHasStack()) {
+ this.amountCrafted += Math.min(p_75209_1_, this.getStack().stackSize);
+ }
+
+ return super.decrStackSize(p_75209_1_);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
+ * internal count then calls onCrafting(item).
+ */
+ @Override
+ protected void onCrafting(final ItemStack p_75210_1_, final int p_75210_2_) {
+ this.amountCrafted += p_75210_2_;
+ this.onCrafting(p_75210_1_);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
+ */
+ @Override
+ protected void onCrafting(final ItemStack p_75208_1_) {
+ p_75208_1_.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
+ this.amountCrafted = 0;
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.crafting_table)) {
+ this.thePlayer.addStat(AchievementList.buildWorkBench, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemPickaxe) {
+ this.thePlayer.addStat(AchievementList.buildPickaxe, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.furnace)) {
+ this.thePlayer.addStat(AchievementList.buildFurnace, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemHoe) {
+ this.thePlayer.addStat(AchievementList.buildHoe, 1);
+ }
+
+ if (p_75208_1_.getItem() == Items.bread) {
+ this.thePlayer.addStat(AchievementList.makeBread, 1);
+ }
+
+ if (p_75208_1_.getItem() == Items.cake) {
+ this.thePlayer.addStat(AchievementList.bakeCake, 1);
+ }
+
+ if ((p_75208_1_.getItem() instanceof ItemPickaxe)
+ && (((ItemPickaxe) p_75208_1_.getItem()).func_150913_i() != Item.ToolMaterial.WOOD)) {
+ this.thePlayer.addStat(AchievementList.buildBetterPickaxe, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemSword) {
+ this.thePlayer.addStat(AchievementList.buildSword, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.enchanting_table)) {
+ this.thePlayer.addStat(AchievementList.enchantments, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) {
+ this.thePlayer.addStat(AchievementList.bookcase, 1);
+ }
+ }
+
+ @Override
+ public void onPickupFromSlot(final EntityPlayer p_82870_1_, final ItemStack p_82870_2_) {
+ FMLCommonHandler.instance()
+ .firePlayerCraftingEvent(p_82870_1_, p_82870_2_, this.craftMatrix);
+ this.onCrafting(p_82870_2_);
+
+ for (int i = 0; i < this.craftMatrix.getSizeInventory(); ++i) {
+ final ItemStack itemstack1 = this.craftMatrix.getStackInSlot(i);
+
+ if (itemstack1 != null) {
+ this.craftMatrix.decrStackSize(i, 1);
+
+ if (itemstack1.getItem()
+ .hasContainerItem(itemstack1)) {
+ final ItemStack itemstack2 = itemstack1.getItem()
+ .getContainerItem(itemstack1);
+
+ if ((itemstack2 != null) && itemstack2.isItemStackDamageable()
+ && (itemstack2.getItemDamage() > itemstack2.getMaxDamage())) {
+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(this.thePlayer, itemstack2));
+ continue;
+ }
+
+ if (!itemstack1.getItem()
+ .doesContainerItemLeaveCraftingGrid(itemstack1)
+ || !this.thePlayer.inventory.addItemStackToInventory(itemstack2)) {
+ if (this.craftMatrix.getStackInSlot(i) == null) {
+ this.craftMatrix.setInventorySlotContents(i, itemstack2);
+ } else {
+ this.thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java b/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java
new file mode 100644
index 0000000000..03581ef705
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemHoe;
+import net.minecraft.item.ItemPickaxe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemSword;
+import net.minecraft.stats.AchievementList;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+
+public class SlotCraftingNoCollect extends SlotCrafting {
+
+ /** The craft matrix inventory linked to this result slot. */
+ private final IInventory craftMatrix;
+ /** The player that is using the GUI where this slot resides. */
+ private EntityPlayer thePlayer;
+ /**
+ * The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset.
+ */
+ private int amountCrafted;
+
+ public SlotCraftingNoCollect(EntityPlayer player, IInventory inventory, IInventory inventory2, int x, int y,
+ int z) {
+ super(player, inventory, inventory2, x, y, z);
+ this.thePlayer = player;
+ this.craftMatrix = inventory;
+ }
+
+ /**
+ * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
+ */
+ @Override
+ public boolean isItemValid(ItemStack p_75214_1_) {
+ return false;
+ }
+
+ /**
+ * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
+ * stack.
+ */
+ @Override
+ public ItemStack decrStackSize(int amount) {
+ if (this.getHasStack()) {
+ this.amountCrafted += Math.min(amount, this.getStack().stackSize);
+ }
+
+ return super.decrStackSize(amount);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
+ * internal count then calls onCrafting(item).
+ */
+ @Override
+ protected void onCrafting(ItemStack output, int amount) {
+ this.amountCrafted += amount;
+ this.onCrafting(output);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
+ */
+ @Override
+ protected void onCrafting(ItemStack output) {
+ output.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
+ this.amountCrafted = 0;
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.crafting_table)) {
+ this.thePlayer.addStat(AchievementList.buildWorkBench, 1);
+ }
+
+ if (output.getItem() instanceof ItemPickaxe) {
+ this.thePlayer.addStat(AchievementList.buildPickaxe, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.furnace)) {
+ this.thePlayer.addStat(AchievementList.buildFurnace, 1);
+ }
+
+ if (output.getItem() instanceof ItemHoe) {
+ this.thePlayer.addStat(AchievementList.buildHoe, 1);
+ }
+
+ if (output.getItem() == Items.bread) {
+ this.thePlayer.addStat(AchievementList.makeBread, 1);
+ }
+
+ if (output.getItem() == Items.cake) {
+ this.thePlayer.addStat(AchievementList.bakeCake, 1);
+ }
+
+ if (output.getItem() instanceof ItemPickaxe
+ && ((ItemPickaxe) output.getItem()).func_150913_i() != Item.ToolMaterial.WOOD) {
+ this.thePlayer.addStat(AchievementList.buildBetterPickaxe, 1);
+ }
+
+ if (output.getItem() instanceof ItemSword) {
+ this.thePlayer.addStat(AchievementList.buildSword, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.enchanting_table)) {
+ this.thePlayer.addStat(AchievementList.enchantments, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) {
+ this.thePlayer.addStat(AchievementList.bookcase, 1);
+ }
+ }
+
+ @Override
+ public void onPickupFromSlot(EntityPlayer player, ItemStack output) {
+ FMLCommonHandler.instance()
+ .firePlayerCraftingEvent(player, output, craftMatrix);
+ this.onCrafting(output);
+
+ /*
+ * for (int i = 0; i < this.craftMatrix.getSizeInventory(); ++i) { ItemStack itemstack1 =
+ * this.craftMatrix.getStackInSlot(i); if (itemstack1 != null) { this.craftMatrix.decrStackSize(i, 1); if
+ * (itemstack1.getItem().hasContainerItem(itemstack1)) { ItemStack itemstack2 =
+ * itemstack1.getItem().getContainerItem(itemstack1); if (itemstack2 != null &&
+ * itemstack2.isItemStackDamageable() && itemstack2.getItemDamage() > itemstack2.getMaxDamage()) {
+ * MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, itemstack2)); continue; } if
+ * (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) ||
+ * !this.thePlayer.inventory.addItemStackToInventory(itemstack2)) { if (this.craftMatrix.getStackInSlot(i) ==
+ * null) { this.craftMatrix.setInventorySlotContents(i, itemstack2); } else {
+ * this.thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false); } } } } }
+ */
+ }
+
+ @Override
+ public boolean canTakeStack(EntityPlayer player) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java b/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java
new file mode 100644
index 0000000000..3b39da877a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.recipe.common.CI;
+
+public class SlotDataStick extends Slot {
+
+ public SlotDataStick(final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ }
+
+ public static ItemStack[] mDataItems = new ItemStack[2];
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ boolean isValid = false;
+ if (itemstack != null) {
+ if (mDataItems[0] == null) {
+ mDataItems[0] = CI.getDataStick();
+ }
+ if (mDataItems[1] == null) {
+ mDataItems[1] = CI.getDataOrb();
+ }
+ if (mDataItems[0] != null && mDataItems[1] != null) {
+ if (GT_Utility.areStacksEqual(itemstack, mDataItems[0], true)
+ || GT_Utility.areStacksEqual(itemstack, mDataItems[1], true)) {
+ isValid = true;
+ }
+ }
+ }
+ return isValid;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java b/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java
new file mode 100644
index 0000000000..bfb384efe8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotGeneric extends Slot {
+
+ public SlotGeneric(final IInventory inventory, final int aSlotID, final int x, final int y) {
+ super(inventory, aSlotID, x, y);
+ }
+
+ @Override
+ public boolean isItemValid(final ItemStack itemstack) {
+ return true;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 64;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java b/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java
new file mode 100644
index 0000000000..dc75c88369
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java
@@ -0,0 +1,110 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.recipe.common.CI;
+
+public class SlotIntegratedCircuit extends Slot {
+
+ public static Item mCircuitItem;
+ public static Item mCircuitItem2;
+ public static Item mCircuitItem3;
+ private final short mCircuitLock;
+
+ public SlotIntegratedCircuit(final IInventory inventory, final int slot, final int x, final int y) {
+ this(Short.MAX_VALUE + 1, inventory, slot, x, y);
+ }
+
+ public SlotIntegratedCircuit(int mTypeLock, final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ if (mTypeLock > Short.MAX_VALUE || mTypeLock < Short.MIN_VALUE) {
+ mCircuitLock = -1;
+ } else {
+ mCircuitLock = (short) mTypeLock;
+ }
+ }
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ return isItemValidForSlot(mCircuitLock, itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(final ItemStack itemstack) {
+ return isItemValidForSlot(-1, itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(int aLockedCircuitNumber, final ItemStack itemstack) {
+ boolean isValid = false;
+ if (mCircuitItem == null) {
+ mCircuitItem = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem2 == null) {
+ mCircuitItem2 = CI.getNumberedBioCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem3 == null) {
+ mCircuitItem3 = CI.getNumberedAdvancedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem != null && mCircuitItem2 != null && mCircuitItem3 != null) {
+ if (itemstack != null) {
+ if (itemstack.getItem() == mCircuitItem || itemstack.getItem() == mCircuitItem2
+ || itemstack.getItem() == mCircuitItem3) {
+ if (aLockedCircuitNumber == -1) {
+ isValid = true;
+ } else {
+ if (itemstack.getItemDamage() == aLockedCircuitNumber) {
+ isValid = true;
+ }
+ }
+ }
+ }
+ }
+ return isValid;
+ }
+
+ /**
+ * Returns the circuit type. -1 is invalid, 0 is standard, 1 is GT++ bio.
+ *
+ * @param itemstack - the Circuit Stack.
+ * @return
+ */
+ public static synchronized int isRegularProgrammableCircuit(final ItemStack itemstack) {
+ if (mCircuitItem == null) {
+ mCircuitItem = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem2 == null) {
+ mCircuitItem2 = CI.getNumberedBioCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem3 == null) {
+ mCircuitItem3 = CI.getNumberedAdvancedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem != null && mCircuitItem2 != null && mCircuitItem3 != null) {
+ if (itemstack != null) {
+ if (itemstack.getItem() == mCircuitItem || itemstack.getItem() == mCircuitItem2
+ || itemstack.getItem() == mCircuitItem3) {
+ if (itemstack.getItem() == mCircuitItem) {
+ return 0;
+ } else if (itemstack.getItem() == mCircuitItem2) {
+ return 1;
+ } else if (itemstack.getItem() == mCircuitItem3) {
+ return 2;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 64;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java b/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java
new file mode 100644
index 0000000000..1351e5c188
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemRecord;
+import net.minecraft.item.ItemStack;
+
+public class SlotJukebox extends SlotGeneric {
+
+ private final boolean isDisplay;
+
+ public SlotJukebox(IInventory inventory, int x, int y, int z) {
+ this(inventory, x, y, z, false);
+ }
+
+ public SlotJukebox(IInventory inventory, int x, int y, int z, boolean display) {
+ super(inventory, x, y, z);
+ isDisplay = display;
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack itemstack) {
+ return (itemstack != null && itemstack.getItem() instanceof ItemRecord);
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean canTakeStack(EntityPlayer p_82869_1_) {
+ return !isDisplay;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java b/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java
new file mode 100644
index 0000000000..d4e8696075
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotNoInput extends Slot {
+
+ public SlotNoInput(final IInventory inventory, final int index, final int x, final int y) {
+ super(inventory, index, x, y);
+ }
+
+ @Override
+ public boolean isItemValid(final ItemStack itemstack) {
+ return false;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java b/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java
new file mode 100644
index 0000000000..c84c88a0b5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class SlotVolumetricFlask extends Slot {
+
+ public SlotVolumetricFlask(final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ }
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ return isItemValidForSlot(itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(final ItemStack itemstack) {
+ return VolumetricFlaskHelper.isVolumetricFlask(itemstack);
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 16;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java b/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java
new file mode 100644
index 0000000000..56cf2fdbab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.tileentities;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.general.BlockSuperLight.TileEntitySuperLight;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityInfiniteFluid;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.tileentities.machines.TileEntityAdvPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.tileentities.machines.TileEntityPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class ModTileEntities {
+
+ public static void init() {
+ Logger.INFO("Registering Tile Entities.");
+ GameRegistry.registerTileEntity(TileEntityPooCollector.class, "TileEntityPooCollector");
+ GameRegistry.registerTileEntity(TileEntityAdvPooCollector.class, "TileEntityAdvPooCollector");
+ GameRegistry.registerTileEntity(TileEntityFishTrap.class, "TileFishTrap");
+ GameRegistry.registerTileEntity(TileEntityInfiniteFluid.class, "TileInfiniteFluid");
+ GameRegistry.registerTileEntity(TileEntityProjectTable.class, "TileProjectTable");
+ GameRegistry.registerTileEntity(TileEntityCircuitProgrammer.class, "TileCircuitProgrammer");
+ GameRegistry.registerTileEntity(TileEntityDecayablesChest.class, "TileDecayablesChest");
+ GameRegistry.registerTileEntity(TileEntitySuperJukebox.class, "TileEntitySuperJukebox");
+ GameRegistry.registerTileEntity(TileEntitySuperLight.class, "TileEntitySuperLight");
+ GameRegistry.registerTileEntity(TileEntityPestKiller.class, "TileEntityPestKiller");
+
+ GameRegistry.registerTileEntity(TileEntityVolumetricFlaskSetter.class, "TileEntityVolumetricFlaskSetter");
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java b/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java
new file mode 100644
index 0000000000..98f1d67439
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java
@@ -0,0 +1,1419 @@
+package gtPlusPlus.core.tileentities.base;
+
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.IDescribable;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.net.GT_Packet_Block_Event;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+import gtPlusPlus.api.interfaces.ILazyCoverable;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BTF_Inventory;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import ic2.api.Direction;
+
+public class TileEntityBase extends TileEntity implements ILazyCoverable, IGregTechDeviceInformation, IDescribable {
+
+ private String customName;
+ public String mOwnerName = "null";
+ public String mOwnerUUID = "null";
+ private boolean mIsOwnerOP = false;
+
+ public final BTF_Inventory mInventory;
+
+ public TileEntityBase(int aCapacity) {
+ mInventory = new BTF_Inventory(aCapacity, this);
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setBoolean("mIsOwnerOP", this.mIsOwnerOP);
+ nbt.setString("mOwnerName", this.mOwnerName);
+ nbt.setString("mOwnerUUID", this.mOwnerUUID);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+
+ super.readFromNBT(nbt);
+
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+
+ this.mIsOwnerOP = nbt.getBoolean("mIsOwnerOP");
+ this.mOwnerName = nbt.getString("mOwnerName");
+ this.mOwnerUUID = nbt.getString("mOwnerUUID");
+ }
+
+ @Override
+ public void updateEntity() {
+ long aTick = System.currentTimeMillis();
+ this.isDead = false;
+ if (!firstTicked) {
+ onFirstTick();
+ }
+ try {
+ if (this.isServerSide()) {
+ onPreTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's pre-tick stage.");
+ t.printStackTrace();
+ }
+ try {
+ if (this.isServerSide()) {
+ onTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's tick stage.");
+ t.printStackTrace();
+ }
+ try {
+ if (this.isServerSide()) {
+ onPostTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's post-tick stage.");
+ t.printStackTrace();
+ }
+ }
+
+ public boolean onPreTick(long aTick) {
+ return true;
+ }
+
+ public boolean onTick(long aTick) {
+ try {
+ if (this.isServerSide()) {
+ processRecipe();
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's processing of a recipe stage.");
+ t.printStackTrace();
+ }
+ return true;
+ }
+
+ public boolean onPostTick(long aTick) {
+ return true;
+ }
+
+ public boolean processRecipe() {
+ return true;
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return true;
+ }
+
+ public String getOwner() {
+ if (this.mOwnerName == null) {
+ return "null";
+ }
+ return this.mOwnerName;
+ }
+
+ public UUID getOwnerUUID() {
+ return UUID.fromString(this.mOwnerUUID);
+ }
+
+ public boolean isOwnerOP() {
+ return mIsOwnerOP;
+ }
+
+ public void setOwnerInformation(String mName, String mUUID, boolean mOP) {
+ if (isServerSide()) {
+ if (this.mOwnerName == null || this.mOwnerUUID == null
+ || this.mOwnerName.equals("null")
+ || this.mOwnerUUID.equals("null")) {
+ this.mOwnerName = mName;
+ this.mOwnerUUID = mUUID;
+ this.mIsOwnerOP = mOP;
+ }
+ }
+ }
+
+ @Override
+ public boolean isServerSide() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean isClientSide() {
+ return this.worldObj.isRemote;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.tileentity.name";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.customName != null && !this.customName.equals("");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.mInventory.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ return this.mInventory.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ if (canAccessData()) {
+ mInventoryChanged = true;
+ return mInventory.decrStackSize(aIndex, aAmount);
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
+ return this.mInventory.getStackInSlotOnClosing(p_70304_1_);
+ }
+
+ @Override
+ public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {
+ this.mInventory.setInventorySlotContents(p_70299_1_, p_70299_2_);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.mInventory.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer p_70300_1_) {
+ return this.mInventory.isUseableByPlayer(p_70300_1_);
+ }
+
+ @Override
+ public void openInventory() {
+ this.mInventory.openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.mInventory.closeInventory();
+ }
+
+ /**
+ * Can put aStack into Slot
+ */
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return canAccessData() && mInventory.isItemValidForSlot(aIndex, aStack);
+ }
+
+ /**
+ * returns all valid Inventory Slots, no matter which Side (Unless it's covered). The Side Stuff is done in the
+ * following two Functions.
+ */
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1)))
+ return mInventory.getAccessibleSlotsFromSide(ordinalSide);
+ return new int[0];
+ }
+
+ /**
+ * Can put aStack into Slot at Side
+ */
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData() && (mRunningThroughTick || !mInputDisabled)
+ && getCoverInfoAtSide(side).letsItemsIn(aIndex)
+ && mInventory.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ /**
+ * Can pull aStack out of Slot from Side
+ */
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData() && (mRunningThroughTick || !mOutputDisabled)
+ && getCoverInfoAtSide(side).letsItemsOut(aIndex)
+ && mInventory.canExtractItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return this.canAccessData() ? this.mInventory.isValidSlot(aIndex) : false;
+ }
+
+ private final GT_CoverBehavior[] mCoverBehaviors = new GT_CoverBehavior[] { GregTech_API.sNoBehavior,
+ GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior,
+ GregTech_API.sNoBehavior };
+ protected TileEntityBase mMetaTileEntity;
+ protected long mStoredEnergy = 0;
+ protected int mAverageEUInputIndex = 0, mAverageEUOutputIndex = 0;
+ protected boolean mReleaseEnergy = false;
+ protected int[] mAverageEUInput = new int[11], mAverageEUOutput = new int[11];
+ private boolean[] mActiveEUInputs = new boolean[] { false, false, false, false, false, false },
+ mActiveEUOutputs = new boolean[] { false, false, false, false, false, false };
+ private byte[] mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 };
+ private int[] mCoverSides = new int[] { 0, 0, 0, 0, 0, 0 }, mCoverData = new int[] { 0, 0, 0, 0, 0, 0 },
+ mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING];
+ private boolean mHasEnoughEnergy = true;
+ protected boolean mRunningThroughTick = false;
+ protected boolean mInputDisabled = false;
+ protected boolean mOutputDisabled = false;
+ private boolean mMuffler = false;
+ private boolean mLockUpgrade = false;
+ private boolean mActive = false;
+ private boolean mRedstone = false;
+ private boolean mWorkUpdate = false;
+ private boolean mSteamConverter = false;
+ private boolean mInventoryChanged = false;
+ private boolean mWorks = true;
+ private boolean mNeedsUpdate = true;
+ private boolean mNeedsBlockUpdate = true;
+ private boolean mSendClientData = false;
+ private boolean oRedstone = false;
+ private boolean mEnergyStateReady = false;
+ private byte mColor = 0, oColor = 0, mStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0,
+ oTexturePage = 0, oLightValueClient = -1, oLightValue = -1, mLightValue = 0, mOtherUpgrades = 0, mFacing = 0,
+ oFacing = 0, mWorkData = 0;
+ private int mDisplayErrorCode = 0, oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0, mLagWarningCount = 0;
+ private short mID = 0;
+ protected long mTickTimer = 0;
+ private long oOutput = 0;
+ private long mAcceptedAmperes = Long.MAX_VALUE;
+
+ /**
+ * Cover Support
+ */
+ public void issueClientUpdate() {
+ this.mSendClientData = true;
+ }
+
+ protected final boolean canAccessData() {
+ return !isDead() && !this.isInvalid();
+ }
+
+ @Override
+ public void issueBlockUpdate() {
+ super.markDirty();
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ this.issueClientUpdate();
+ }
+
+ @Override
+ public void receiveCoverData(ForgeDirection coverSide, int coverID, int coverData) {
+ if (coverSide != ForgeDirection.UNKNOWN && (mCoverSides[coverSide.ordinal()] == coverID))
+ setCoverDataAtSide(coverSide, coverData);
+ }
+
+ @Override
+ public long getTimer() {
+ return this.mTickTimer;
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxAmperesOut() : 0L;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetOutput()
+ ? this.mMetaTileEntity.maxEUOutput()
+ : 0L;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxAmperesIn() : 0L;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxEUInput()
+ : 2147483647L;
+ }
+
+ @Override
+ public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ return !this.canAccessData() ? false
+ : (this.mHasEnoughEnergy = this.decreaseStoredEU(aEnergy, aIgnoreTooLessEnergy));
+ }
+
+ @Override
+ public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else if (this.getStoredEU() >= this.getEUCapacity() && !aIgnoreTooMuchEnergy) {
+ return false;
+ } else {
+ this.setStoredEU(this.mMetaTileEntity.getEUVar() + aEnergy);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side) {
+ return side == ForgeDirection.UNKNOWN ? true
+ : (!this.isServerSide() ? this.isEnergyInputSide(side)
+ : side != ForgeDirection.UNKNOWN && this.mActiveEUInputs[side.ordinal()] && !this.mReleaseEnergy);
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side) {
+ return side == ForgeDirection.UNKNOWN ? true
+ : (!this.isServerSide() ? this.isEnergyOutputSide(side)
+ : side != ForgeDirection.UNKNOWN && this.mActiveEUOutputs[side.ordinal()] || this.mReleaseEnergy);
+ }
+
+ private boolean isEnergyInputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!this.getCoverInfoAtSide(side)
+ .letsEnergyIn()) {
+ return false;
+ }
+
+ if (this.isInvalid() || this.mReleaseEnergy) {
+ return false;
+ }
+
+ if (this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetInput()) {
+ return this.mMetaTileEntity.isInputFacing(side);
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isEnergyOutputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!this.getCoverInfoAtSide(side)
+ .letsEnergyOut()) {
+ return false;
+ }
+
+ if (this.isInvalid() || this.mReleaseEnergy) {
+ return this.mReleaseEnergy;
+ }
+
+ if (this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetOutput()) {
+ return this.mMetaTileEntity.isOutputFacing(side);
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ private final TileEntity[] mBufferedTileEntities = new TileEntity[6];
+ public boolean ignoreUnloadedChunks = true;
+ public boolean isDead = false;
+
+ private void clearNullMarkersFromTileEntityBuffer() {
+ for (int i = 0; i < this.mBufferedTileEntities.length; ++i) {
+ if (this.mBufferedTileEntities[i] == this) {
+ this.mBufferedTileEntities[i] = null;
+ }
+ }
+ }
+
+ protected final void clearTileEntityBuffer() {
+ for (int i = 0; i < this.mBufferedTileEntities.length; ++i) {
+ this.mBufferedTileEntities[i] = null;
+ }
+ }
+
+ @Override
+ public final World getWorld() {
+ return this.worldObj;
+ }
+
+ @Override
+ public final int getXCoord() {
+ return this.xCoord;
+ }
+
+ @Override
+ public final short getYCoord() {
+ return (short) this.yCoord;
+ }
+
+ @Override
+ public final int getZCoord() {
+ return this.zCoord;
+ }
+
+ @Override
+ public final int getOffsetX(ForgeDirection side, int aMultiplier) {
+ return this.xCoord + side.offsetX * aMultiplier;
+ }
+
+ @Override
+ public final short getOffsetY(ForgeDirection side, int aMultiplier) {
+ return (short) (this.yCoord + side.offsetY * aMultiplier);
+ }
+
+ @Override
+ public final int getOffsetZ(ForgeDirection side, int aMultiplier) {
+ return this.zCoord + side.offsetZ * aMultiplier;
+ }
+
+ @Override
+ public final int getRandomNumber(int aRange) {
+ return this.worldObj.rand.nextInt(aRange);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome(int aX, int aZ) {
+ return this.worldObj.getBiomeGenForCoords(aX, aZ);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome() {
+ return this.getBiome(this.xCoord, this.zCoord);
+ }
+
+ @Override
+ public final Block getBlockOffset(int aX, int aY, int aZ) {
+ return this.getBlock(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final Block getBlockAtSide(ForgeDirection side) {
+ return this.getBlockAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final Block getBlockAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getBlock(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getMetaIDOffset(int aX, int aY, int aZ) {
+ return this.getMetaID(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final byte getMetaIDAtSide(ForgeDirection side) {
+ return this.getMetaIDAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getMetaIDAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getMetaID(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getLightLevelOffset(int aX, int aY, int aZ) {
+ return this.getLightLevel(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final byte getLightLevelAtSide(ForgeDirection side) {
+ return this.getLightLevelAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getLightLevelAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getLightLevel(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getOpacityOffset(int aX, int aY, int aZ) {
+ return this.getOpacity(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getOpacityAtSide(ForgeDirection side) {
+ return this.getOpacityAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getOpacityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getOpacity(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getSkyOffset(int aX, int aY, int aZ) {
+ return this.getSky(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getSkyAtSide(ForgeDirection side) {
+ return this.getSkyAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getSkyAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getSky(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getAirOffset(int aX, int aY, int aZ) {
+ return this.getAir(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getAirAtSide(ForgeDirection side) {
+ return this.getAirAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getAirAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getAir(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final TileEntity getTileEntityOffset(int aX, int aY, int aZ) {
+ return this.getTileEntity(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return aDistance == 1 ? this.getTileEntityAtSide(side)
+ : this.getTileEntity(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final IInventory getIInventory(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainer(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntity(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final Block getBlock(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? Blocks.air
+ : this.worldObj.getBlock(aX, aY, aZ);
+ }
+
+ @Override
+ public final byte getMetaID(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? 0
+ : (byte) this.worldObj.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public final byte getLightLevel(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? 0
+ : (byte) ((int) (this.worldObj.getLightBrightness(aX, aY, aZ) * 15.0F));
+ }
+
+ @Override
+ public final boolean getSky(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? true
+ : this.worldObj.canBlockSeeTheSky(aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getOpacity(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? false
+ : GT_Utility.isOpaqueBlock(this.worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getAir(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? true
+ : GT_Utility.isBlockAir(this.worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntity(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? null
+ : this.worldObj.getTileEntity(aX, aY, aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSide(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ if (side != ForgeDirection.UNKNOWN && this.mBufferedTileEntities[ordinalSide] != this) {
+ int tX = this.getOffsetX(side, 1);
+ short tY = this.getOffsetY(side, 1);
+ int tZ = this.getOffsetZ(side, 1);
+ if (this.crossedChunkBorder(tX, tZ)) {
+ this.mBufferedTileEntities[ordinalSide] = null;
+ if (this.ignoreUnloadedChunks && !this.worldObj.blockExists(tX, tY, tZ)) {
+ return null;
+ }
+ }
+
+ if (this.mBufferedTileEntities[ordinalSide] == null) {
+ this.mBufferedTileEntities[ordinalSide] = this.worldObj.getTileEntity(tX, tY, tZ);
+ if (this.mBufferedTileEntities[ordinalSide] == null) {
+ this.mBufferedTileEntities[ordinalSide] = this;
+ return null;
+ } else {
+ return this.mBufferedTileEntities[ordinalSide];
+ }
+ } else if (this.mBufferedTileEntities[ordinalSide].isInvalid()) {
+ this.mBufferedTileEntities[ordinalSide] = null;
+ return this.getTileEntityAtSide(side);
+ } else {
+ return this.mBufferedTileEntities[ordinalSide].xCoord == tX
+ && this.mBufferedTileEntities[ordinalSide].yCoord == tY
+ && this.mBufferedTileEntities[ordinalSide].zCoord == tZ ? this.mBufferedTileEntities[ordinalSide]
+ : null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isDead() {
+ return this.isDead || this.isInvalidTileEntity();
+ }
+
+ @Override
+ public void validate() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.validate();
+ }
+
+ @Override
+ public void invalidate() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.invalidate();
+ }
+
+ @Override
+ public void onChunkUnload() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.onChunkUnload();
+ this.isDead = true;
+ }
+
+ public final void onAdjacentBlockChange(int aX, int aY, int aZ) {
+ this.clearNullMarkersFromTileEntityBuffer();
+ }
+
+ @Override
+ public final void sendBlockEvent(byte aID, byte aValue) {
+ GT_Values.NW.sendPacketToAllPlayersInRange(
+ this.worldObj,
+ new GT_Packet_Block_Event(this.xCoord, (short) this.yCoord, this.zCoord, aID, aValue),
+ this.xCoord,
+ this.zCoord);
+ }
+
+ private boolean crossedChunkBorder(int aX, int aZ) {
+ return aX >> 4 != this.xCoord >> 4 || aZ >> 4 != this.zCoord >> 4;
+ }
+
+ public final void setOnFire() {
+ GT_Utility.setCoordsOnFire(this.worldObj, this.xCoord, this.yCoord, this.zCoord, false);
+ }
+
+ public final void setToFire() {
+ this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.fire);
+ }
+
+ @Override
+ public byte getInternalInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (getCoverBehaviorAtSide(side).getRedstoneInput(
+ side,
+ getInputRedstoneSignal(side),
+ getCoverIDAtSide(side),
+ getCoverDataAtSide(side),
+ this) & 15);
+ }
+
+ @Override
+ public byte getInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (worldObj
+ .getIndirectPowerLevelTo(getOffsetX(side, 1), getOffsetY(side, 1), getOffsetZ(side, 1), side.ordinal())
+ & 15);
+ }
+
+ @Override
+ public byte getOutputRedstoneSignal(ForgeDirection side) {
+ return getCoverBehaviorAtSide(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this)
+ ? mSidedRedstone[side.ordinal()]
+ : getGeneralRS(side);
+ }
+
+ public boolean allowGeneralRedstoneOutput() {
+ return false;
+ }
+
+ @Override
+ public byte getGeneralRS(ForgeDirection side) {
+ return allowGeneralRedstoneOutput() ? mSidedRedstone[side.ordinal()] : 0;
+ }
+
+ @Override
+ public void setInternalOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ if (!getCoverBehaviorAtSide(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this))
+ setOutputRedstoneSignal(side, aStrength);
+ }
+
+ @Override
+ public void setOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ aStrength = (byte) Math.min(Math.max(0, aStrength), 15);
+ if (side != ForgeDirection.UNKNOWN && mSidedRedstone[side.ordinal()] != aStrength) {
+ mSidedRedstone[side.ordinal()] = aStrength;
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public boolean hasInventoryBeenModified() {
+ return mInventoryChanged;
+ }
+
+ @Override
+ public void setGenericRedstoneOutput(boolean aOnOff) {
+ mRedstone = aOnOff;
+ }
+
+ @Override
+ public GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side) {
+ return side != ForgeDirection.UNKNOWN ? mCoverBehaviors[side.ordinal()] : GregTech_API.sNoBehavior;
+ }
+
+ @Override
+ public void setCoverIDAtSide(ForgeDirection side, int aID) {
+ if (setCoverIDAtSideNoUpdate(side, aID)) {
+ issueCoverUpdate(side);
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public boolean setCoverIDAtSideNoUpdate(ForgeDirection side, int aID) {
+ if (side != ForgeDirection.UNKNOWN) {
+ final int ordinalSide = side.ordinal();
+ mCoverSides[ordinalSide] = aID;
+ mCoverData[ordinalSide] = 0;
+ mCoverBehaviors[ordinalSide] = (GT_CoverBehavior) GregTech_API.getCoverBehaviorNew(aID);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void setCoverIdAndDataAtSide(ForgeDirection side, int aId, ISerializableObject aData) {
+ setCoverIDAtSide(side, aId);
+ setCoverDataAtSide(side, aData);
+ }
+
+ @Override
+ public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ GregTech_API.getCoverBehaviorNew(aCover)
+ .placeCover(side, aCover, this);
+ }
+
+ @Override
+ public int getCoverIDAtSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) return mCoverSides[side.ordinal()];
+ return 0;
+ }
+
+ @Override
+ public ItemStack getCoverItemAtSide(ForgeDirection side) {
+ return GT_Utility.intToStack(getCoverIDAtSide(side));
+ }
+
+ @Override
+ public boolean canPlaceCoverIDAtSide(ForgeDirection side, int aID) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ public boolean canPlaceCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ public void setCoverDataAtSide(ForgeDirection side, int aData) {
+ if (side != ForgeDirection.UNKNOWN) mCoverData[side.ordinal()] = aData;
+ }
+
+ @Override
+ public int getCoverDataAtSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) return mCoverData[side.ordinal()];
+ return 0;
+ }
+
+ public byte getLightValue() {
+ return mLightValue;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {
+ mLightValue = (byte) (aLightValue & 15);
+ }
+
+ @Override
+ public long getAverageElectricInput() {
+ int rEU = 0;
+ for (int i = 0; i < mAverageEUInput.length; i++) {
+ if (i != mAverageEUInputIndex) rEU += mAverageEUInput[i];
+ }
+ return rEU / (mAverageEUInput.length - 1);
+ }
+
+ @Override
+ public long getAverageElectricOutput() {
+ int rEU = 0;
+ for (int i = 0; i < mAverageEUOutput.length; i++) {
+ if (i != mAverageEUOutputIndex) rEU += mAverageEUOutput[i];
+ }
+ return rEU / (mAverageEUOutput.length - 1);
+ }
+
+ public boolean hasSidedRedstoneOutputBehavior() {
+ return false;
+ }
+
+ @Override
+ public boolean dropCover(ForgeDirection side, ForgeDirection droppedSide, boolean aForced) {
+ if (getCoverBehaviorAtSide(side)
+ .onCoverRemoval(side, getCoverIDAtSide(side), mCoverData[side.ordinal()], this, aForced) || aForced) {
+ ItemStack tStack = getCoverBehaviorAtSide(side)
+ .getDrop(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this);
+ if (tStack != null) {
+ tStack.setTagCompound(null);
+ EntityItem tEntity = new EntityItem(
+ worldObj,
+ getOffsetX(droppedSide, 1) + 0.5,
+ getOffsetY(droppedSide, 1) + 0.5,
+ getOffsetZ(droppedSide, 1) + 0.5,
+ tStack);
+ tEntity.motionX = 0;
+ tEntity.motionY = 0;
+ tEntity.motionZ = 0;
+ worldObj.spawnEntityInWorld(tEntity);
+ }
+ setCoverIDAtSide(side, 0);
+ if (mMetaTileEntity.hasSidedRedstoneOutputBehavior()) {
+ setOutputRedstoneSignal(side, (byte) 0);
+ } else {
+ setOutputRedstoneSignal(side, (byte) 15);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public String getOwnerName() {
+ if (GT_Utility.isStringInvalid(mOwnerName)) return "Player";
+ return mOwnerName;
+ }
+
+ public String setOwnerName(String aName) {
+ if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player";
+ return mOwnerName = aName;
+ }
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return canAccessData() ? mMetaTileEntity.getComparatorValue(side) : 0;
+ }
+
+ @Override
+ public byte getStrongOutputRedstoneSignal(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ return side != ForgeDirection.UNKNOWN && (mStrongRedstone & (1 << ordinalSide)) != 0
+ ? (byte) (mSidedRedstone[ordinalSide] & 15)
+ : 0;
+ }
+
+ @Override
+ public void setStrongOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ mStrongRedstone |= (1 << side.ordinal());
+ setOutputRedstoneSignal(side, aStrength);
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !inputEnergyFrom(side)
+ || aAmperage <= 0
+ || aVoltage <= 0
+ || getStoredEU() >= getEUCapacity()
+ || mMetaTileEntity.maxAmperesIn() <= mAcceptedAmperes) return 0;
+ if (aVoltage > getInputVoltage()) {
+ doExplosion(aVoltage);
+ return 0;
+ }
+ if (increaseStoredEnergyUnits(
+ aVoltage * (aAmperage = Math.min(
+ aAmperage,
+ Math.min(
+ mMetaTileEntity.maxAmperesIn() - mAcceptedAmperes,
+ 1 + ((getEUCapacity() - getStoredEU()) / aVoltage)))),
+ true)) {
+ mAverageEUInput[mAverageEUInputIndex] += aVoltage * aAmperage;
+ mAcceptedAmperes += aAmperage;
+ return aAmperage;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !outputsEnergyTo(side)
+ || getStoredEU() - (aVoltage * aAmperage) < mMetaTileEntity.getMinimumStoredEU()) return false;
+ if (decreaseStoredEU(aVoltage * aAmperage, false)) {
+ mAverageEUOutput[mAverageEUOutputIndex] += aVoltage * aAmperage;
+ return true;
+ }
+ return false;
+ }
+
+ public double getOutputEnergyUnitsPerTick() {
+ return oOutput;
+ }
+
+ public boolean isTeleporterCompatible(ForgeDirection side) {
+ return false;
+ }
+
+ public double demandedEnergyUnits() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getEUCapacity() - getStoredEU();
+ }
+
+ public double injectEnergyUnits(ForgeDirection aDirection, double aAmount) {
+ return injectEnergyUnits(aDirection, (int) aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity aEmitter, ForgeDirection aDirection) {
+ return inputEnergyFrom(aDirection);
+ }
+
+ public boolean emitsEnergyTo(TileEntity aReceiver, ForgeDirection aDirection) {
+ return outputsEnergyTo(aDirection);
+ }
+
+ public double getOfferedEnergy() {
+ return (canAccessData() && getStoredEU() - mMetaTileEntity.getMinimumStoredEU() >= oOutput)
+ ? Math.max(0, oOutput)
+ : 0;
+ }
+
+ public void drawEnergy(double amount) {
+ mAverageEUOutput[mAverageEUOutputIndex] += amount;
+ decreaseStoredEU((int) amount, true);
+ }
+
+ public int injectEnergy(ForgeDirection aForgeDirection, int aAmount) {
+ return injectEnergyUnits(aForgeDirection, aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public int addEnergy(int aEnergy) {
+ if (!canAccessData()) return 0;
+ if (aEnergy > 0) increaseStoredEnergyUnits(aEnergy, true);
+ else decreaseStoredEU(-aEnergy, true);
+ return (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getEUVar());
+ }
+
+ public boolean isAddedToEnergyNet() {
+ return false;
+ }
+
+ public int demandsEnergy() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getCapacity() - getStored();
+ }
+
+ public int getCapacity() {
+ return (int) Math.min(Integer.MAX_VALUE, getEUCapacity());
+ }
+
+ public int getStored() {
+ return (int) Math.min(Integer.MAX_VALUE, Math.min(getStoredEU(), getCapacity()));
+ }
+
+ public void setStored(int aEU) {
+ if (canAccessData()) setStoredEU(aEU);
+ }
+
+ public int getMaxSafeInput() {
+ return (int) Math.min(Integer.MAX_VALUE, getInputVoltage());
+ }
+
+ public int getMaxEnergyOutput() {
+ if (mReleaseEnergy) return Integer.MAX_VALUE;
+ return getOutput();
+ }
+
+ public int getOutput() {
+ return (int) Math.min(Integer.MAX_VALUE, oOutput);
+ }
+
+ public int injectEnergy(Direction aDirection, int aAmount) {
+ return injectEnergyUnits(aDirection.toForgeDirection(), aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity aReceiver, Direction aDirection) {
+ return inputEnergyFrom(aDirection.toForgeDirection());
+ }
+
+ public boolean emitsEnergyTo(TileEntity aReceiver, Direction aDirection) {
+ return outputsEnergyTo(aDirection.toForgeDirection());
+ }
+
+ @Override
+ public boolean isInvalidTileEntity() {
+ return isInvalid();
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return true;
+ if (aIndex < 0 || aIndex >= getSizeInventory()) return false;
+ ItemStack tStack = getStackInSlot(aIndex);
+ if (GT_Utility.isStackInvalid(tStack)) {
+ setInventorySlotContents(aIndex, aStack);
+ return true;
+ }
+ aStack = GT_OreDictUnificator.get(aStack);
+ if (GT_Utility.areStacksEqual(tStack, aStack)
+ && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
+ tStack.stackSize += aStack.stackSize;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
+ return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack));
+ }
+
+ @Override
+ public void markDirty() {
+ super.markDirty();
+ mInventoryChanged = true;
+ }
+
+ /**
+ * To Do
+ */
+ public boolean isElectric() {
+ return true;
+ }
+
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ public long maxEUStore() {
+ return 0L;
+ }
+
+ public long maxEUInput() {
+ return 0L;
+ }
+
+ public long maxEUOutput() {
+ return 0L;
+ }
+
+ public long maxAmperesOut() {
+ return 1L;
+ }
+
+ public long maxAmperesIn() {
+ return 1L;
+ }
+
+ public void doEnergyExplosion() {
+ if (this.getUniversalEnergyCapacity() > 0L
+ && this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() / 5L) {
+ this.doExplosion(
+ this.oOutput * (long) (this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() ? 4
+ : (this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() / 2L ? 2 : 1)));
+ GT_Mod arg9999 = GT_Mod.instance;
+ GT_Mod.achievements.issueAchievement(
+ this.getWorldObj()
+ .getPlayerEntityByName(this.mOwnerName),
+ "electricproblems");
+ }
+ }
+
+ public void doExplosion(long aAmount) {
+ if (this.canAccessData()) {
+ if (GregTech_API.sMachineWireFire && this.mMetaTileEntity.isElectric()) {
+ try {
+ this.mReleaseEnergy = true;
+ Util.emitEnergyToNetwork(GT_Values.V[5], Math.max(1L, this.getStoredEU() / GT_Values.V[5]), this);
+ } catch (Exception arg4) {}
+ }
+ this.mReleaseEnergy = false;
+ this.onExplosion();
+ PollutionUtils.addPollution(this, 100000);
+ this.mMetaTileEntity.doExplosion(aAmount);
+ }
+ }
+
+ public void onExplosion() {}
+
+ @Override
+ public String[] getDescription() {
+ return this.canAccessData() ? this.mMetaTileEntity.getDescription() : new String[0];
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return null;
+ }
+
+ public long getEUVar() {
+ return this.mStoredEnergy;
+ }
+
+ public void setEUVar(long aEnergy) {
+ this.mStoredEnergy = aEnergy;
+ }
+
+ @Override
+ public long getStoredEU() {
+ return this.canAccessData() ? Math.min(this.mMetaTileEntity.getEUVar(), this.getEUCapacity()) : 0L;
+ }
+
+ @Override
+ public long getEUCapacity() {
+ return this.canAccessData() ? this.mMetaTileEntity.maxEUStore() : 0L;
+ }
+
+ public long getMinimumStoredEU() {
+ return 512L;
+ }
+
+ public boolean setStoredEU(long aEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else {
+ if (aEnergy < 0L) {
+ aEnergy = 0L;
+ }
+
+ this.mMetaTileEntity.setEUVar(aEnergy);
+ return true;
+ }
+ }
+
+ public boolean decreaseStoredEU(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else if (this.mMetaTileEntity.getEUVar() - aEnergy < 0L && !aIgnoreTooLessEnergy) {
+ return false;
+ } else {
+ this.setStoredEU(this.mMetaTileEntity.getEUVar() - aEnergy);
+ if (this.mMetaTileEntity.getEUVar() < 0L) {
+ this.setStoredEU(0L);
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ // Required as of 5.09.32-pre5
+ public boolean energyStateReady() {
+ return false;
+ }
+
+ private boolean firstTicked = false;
+
+ public boolean onFirstTick() {
+ if (!firstTicked) {
+ firstTicked = true;
+ if (this.mInventory != null) {
+ this.mInventory.purgeNulls();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Adds support for the newer function added by
+ * https://github.com/Blood-Asp/GT5-Unofficial/commit/73ee102b63efd92c0f164a7ed7a79ebcd2619617#diff-3051838621d8ae87aa5ccd1345e1f07d
+ */
+ public boolean inputEnergyFrom(byte arg0, boolean arg1) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * Adds support for the newer function added by
+ * https://github.com/Blood-Asp/GT5-Unofficial/commit/73ee102b63efd92c0f164a7ed7a79ebcd2619617#diff-3051838621d8ae87aa5ccd1345e1f07d
+ */
+ public boolean outputsEnergyTo(byte arg0, boolean arg1) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java
new file mode 100644
index 0000000000..0be6959b8f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java
@@ -0,0 +1,313 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.inventories.InventoryCircuitProgrammer;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.slots.SlotIntegratedCircuit;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class TileEntityCircuitProgrammer extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final InventoryCircuitProgrammer inventoryContents;
+ private String customName;
+ public int locationX;
+ public int locationY;
+ public int locationZ;
+ private int aCurrentMode = 0;
+
+ public TileEntityCircuitProgrammer() {
+ this.inventoryContents = new InventoryCircuitProgrammer();
+ this.setTileLocation();
+ }
+
+ public boolean setTileLocation() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ this.locationX = this.xCoord;
+ this.locationY = this.yCoord;
+ this.locationZ = this.zCoord;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Rename to hasCircuitToConfigure
+ public final boolean hasCircuitToConfigure() {
+ for (ItemStack i : this.getInventory()
+ .getInventory()) {
+ if (i == null) {
+ continue;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public InventoryCircuitProgrammer getInventory() {
+ return this.inventoryContents;
+ }
+
+ public boolean addOutput() {
+ ItemStack[] aInputs = this.getInventory()
+ .getInventory()
+ .clone();
+ // Check if there is output in slot.
+ Boolean hasOutput = false;
+ if (aInputs[25] != null) {
+ hasOutput = true;
+ }
+ AutoMap<Integer> aValidSlots = new AutoMap<>();
+ int aSlotCount = 0;
+ for (ItemStack i : aInputs) {
+ if (i != null) {
+ aValidSlots.put(aSlotCount);
+ }
+ aSlotCount++;
+ }
+ for (int e : aValidSlots) {
+ boolean doAdd = false;
+ ItemStack g = this.getStackInSlot(e);
+ int aSize = 0;
+ ItemStack aInputStack = null;
+ int aTypeInSlot = SlotIntegratedCircuit.isRegularProgrammableCircuit(g);
+ if (aTypeInSlot >= 0 && g != null) {
+ // No Existing Output
+ if (!hasOutput) {
+ aSize = g.stackSize;
+ doAdd = true;
+ }
+ // Existing Output
+ else {
+ ItemStack f = this.getStackInSlot(25);
+ int aTypeInCheckedSlot = SlotIntegratedCircuit.isRegularProgrammableCircuit(f);
+ // Check that the Circuit in the Output slot is not null and the same type as the circuit input.
+ if (aTypeInCheckedSlot >= 0 && (aTypeInSlot == aTypeInCheckedSlot) && f != null) {
+ if (g.getItem() == f.getItem() && f.getItemDamage() == e) {
+ aSize = f.stackSize + g.stackSize;
+ if (aSize > 64) {
+ aInputStack = g.copy();
+ aInputStack.stackSize = (aSize - 64);
+ }
+ doAdd = true;
+ }
+ }
+ }
+ if (doAdd) {
+ // Check Circuit Type
+ ItemStack aOutput;
+ if (aTypeInSlot == 0) {
+ aOutput = CI.getNumberedCircuit(e);
+ } else if (aTypeInSlot == 1) {
+ aOutput = CI.getNumberedBioCircuit(e);
+ } else if (aTypeInSlot == 2) {
+ aOutput = CI.getNumberedAdvancedCircuit(e);
+ } else {
+ aOutput = null;
+ }
+
+ if (aOutput != null) {
+ aOutput.stackSize = aSize;
+ this.setInventorySlotContents(e, aInputStack);
+ this.setInventorySlotContents(25, aOutput);
+ return true;
+ }
+ }
+ }
+ continue;
+ }
+ return false;
+ }
+
+ @Override
+ public void updateEntity() {
+ try {
+ if (!this.worldObj.isRemote) {
+ if (tickCount % 10 == 0) {
+ if (hasCircuitToConfigure()) {
+ this.addOutput();
+ this.markDirty();
+ }
+ }
+ this.tickCount++;
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setInteger("aCurrentMode", aCurrentMode);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ aCurrentMode = nbt.getInteger("aCurrentMode");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return p_102007_1_ >= 0 && p_102007_1_ <= 24;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return p_102008_1_ == 25;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.circuitprogrammer";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ final NBTTagCompound tag = new NBTTagCompound();
+ this.writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(final NetworkManager net, final S35PacketUpdateTileEntity pkt) {
+ final NBTTagCompound tag = pkt.func_148857_g();
+ this.readFromNBT(tag);
+ }
+
+ public boolean onScrewdriverRightClick(byte side, EntityPlayer player, int x, int y, int z) {
+ try {
+ if (aCurrentMode == 24) {
+ aCurrentMode = 0;
+ } else {
+ aCurrentMode++;
+ }
+ PlayerUtils.messagePlayer(player, "Now configuring units for type " + aCurrentMode + ".");
+ return true;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java
new file mode 100644
index 0000000000..b641f2e99e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java
@@ -0,0 +1,378 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.inventories.Inventory_DecayablesChest;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityDecayablesChest extends TileEntity implements ISidedInventory {
+
+ private final Inventory_DecayablesChest inventoryContents;
+
+ /** Determines if the check for adjacent chests has taken place. */
+ public boolean adjacentChestChecked;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestZNeg;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestXPos;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestXNeg;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestZPos;
+ /** The current angle of the lid (between 0 and 1) */
+ public float lidAngle;
+ /** The angle of the lid last tick */
+ public float prevLidAngle;
+ /** The number of players currently using this chest */
+ public int numPlayersUsing;
+
+ private String customName;
+
+ private int cachedChestType;
+ private int tickCount = 0;
+
+ public TileEntityDecayablesChest() {
+ this.inventoryContents = new Inventory_DecayablesChest();
+ }
+
+ public Inventory_DecayablesChest getInventory() {
+ return this.inventoryContents;
+ }
+
+ @Override
+ public void updateEntity() {
+
+ // Try do chesty stuff
+ try {
+ this.updateEntityChest();
+ } catch (Throwable t) {
+
+ }
+
+ try {
+ if (!this.worldObj.isRemote) {
+ this.tickCount++;
+ if ((this.tickCount % 10) == 0) {
+ cachedChestType = 1;
+ }
+
+ if ((this.tickCount % 20) == 0) {
+ for (ItemStack inv : this.getInventory()
+ .getInventory()) {
+ if (inv == null) {
+ continue;
+ }
+ if (inv.getItem() instanceof DustDecayable D) {
+ tryUpdateDecayable(D, inv, this.worldObj);
+ }
+ }
+ }
+ updateSlots();
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public void tryUpdateDecayable(final DustDecayable b, ItemStack iStack, final World world) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ boolean a1, a2;
+ int u = 0;
+ a1 = b.isTicking(world, iStack);
+ a2 = false;
+ int SECONDS_TO_PROCESS = 1;
+ while (u < (20 * SECONDS_TO_PROCESS)) {
+ if (!a1) {
+ break;
+ }
+ a1 = b.isTicking(world, iStack);
+ a2 = b.tickItemTag(world, iStack);
+ u++;
+ }
+ Logger.MACHINE_INFO("| " + b.getUnlocalizedName() + " | " + a1 + "/" + a2);
+
+ if (!a1 && !a2) {
+ ItemStack replacement = ItemUtils.getSimpleStack(b.getDecayResult());
+ replacement.stackSize = 1;
+ // iStack = replacement.copy();
+ for (int fff = 0; fff < this.inventoryContents.getSizeInventory(); fff++) {
+ if (this.inventoryContents.getStackInSlot(fff) == iStack) {
+ this.inventoryContents.setInventorySlotContents(fff, replacement.copy());
+ }
+ }
+
+ updateSlots();
+ this.inventoryContents.markDirty();
+ }
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ if (this.numPlayersUsing < 0) {
+ this.numPlayersUsing = 0;
+ }
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing++;
+ cachedChestType = 1;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing--;
+ cachedChestType = 1;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return this.getInventory()
+ .isItemValidForSlot(0, p_102007_2_);
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return this.getInventory()
+ .isItemValidForSlot(0, p_102008_2_);
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.DecayablesChest";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ /**
+ * Causes the TileEntity to reset all it's cached values for it's container Block, metadata and in the case of
+ * chests, the adjacent chest check
+ */
+ @Override
+ public void updateContainingBlockInfo() {
+ super.updateContainingBlockInfo();
+ this.adjacentChestChecked = false;
+ }
+
+ /**
+ * Performs the check for adjacent chests to determine if this chest is double or not.
+ */
+ public void checkForAdjacentChests() {
+ if (!this.adjacentChestChecked) {
+ this.adjacentChestChecked = true;
+ this.adjacentChestZNeg = null;
+ this.adjacentChestXPos = null;
+ this.adjacentChestXNeg = null;
+ this.adjacentChestZPos = null;
+ }
+ }
+
+ public void updateEntityChest() {
+ float f;
+ this.prevLidAngle = this.lidAngle;
+ f = 0.04F;
+ double d2;
+ if (this.numPlayersUsing > 0 && this.lidAngle == 0.0F
+ && this.adjacentChestZNeg == null
+ && this.adjacentChestXNeg == null) {
+ double d1 = (double) this.xCoord + 0.5D;
+ d2 = (double) this.zCoord + 0.5D;
+ this.worldObj.playSoundEffect(
+ d1,
+ (double) this.yCoord + 0.5D,
+ d2,
+ "random.chestopen",
+ 0.5F,
+ this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ if (this.numPlayersUsing == 0 && this.lidAngle > 0.0F || this.numPlayersUsing > 0 && this.lidAngle < 1.0F) {
+ float f1 = this.lidAngle;
+ if (this.numPlayersUsing > 0) {
+ // this.lidAngle += f;
+ this.lidAngle += (float) (f * (1 + 0.10 * 0.01));
+ } else {
+ // this.lidAngle -= f;
+ this.lidAngle -= (float) (f * (1 + 0.10 * 0.01));
+ }
+ if (this.lidAngle > 1.0F) {
+ this.lidAngle = 1.0F;
+ }
+ float f2 = 0.5F;
+ if (this.lidAngle < f2 && f1 >= f2 && this.adjacentChestZNeg == null && this.adjacentChestXNeg == null) {
+ d2 = (double) this.xCoord + 0.5D;
+ double d0 = (double) this.zCoord + 0.5D;
+ this.worldObj.playSoundEffect(
+ d2,
+ (double) this.yCoord + 0.5D,
+ d0,
+ "random.chestclosed",
+ 0.5F,
+ this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ if (this.lidAngle < 0.0F) {
+ this.lidAngle = 0.0F;
+ }
+ }
+ }
+
+ /**
+ * Called when a client event is received with the event number and argument, see World.sendClientEvent
+ */
+ @Override
+ public boolean receiveClientEvent(int p_145842_1_, int p_145842_2_) {
+ if (p_145842_1_ == 1) {
+ this.numPlayersUsing = p_145842_2_;
+ return true;
+ } else {
+ return super.receiveClientEvent(p_145842_1_, p_145842_2_);
+ }
+ }
+
+ /**
+ * invalidates a tile entity
+ */
+ @Override
+ public final void invalidate() {
+ super.invalidate();
+ cachedChestType = 1;
+ this.updateContainingBlockInfo();
+ this.checkForAdjacentChests();
+ }
+
+ private int updateSlots() {
+ // Have slots changed?
+ if (cachedChestType == 0) {
+ return 0;
+ }
+ ItemUtils.organiseInventory(getInventory());
+ cachedChestType = 0;
+ return cachedChestType;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java
new file mode 100644
index 0000000000..1a09b6b423
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java
@@ -0,0 +1,294 @@
+package gtPlusPlus.core.tileentities.general;
+
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+
+import java.util.Random;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.FishingHooks;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryFishTrap;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityFishTrap extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final InventoryFishTrap inventoryContents;
+ private String customName;
+ // The number of water blocks is used as an index to get the tick rate.
+ private final static short[] waterBlocksToTickRate = new short[] { 0, 0, 5600, 4400, 3200, 2000, 1750 };
+ private int surroundingWaterBlocks = 0;
+
+ public TileEntityFishTrap() {
+ this.inventoryContents = new InventoryFishTrap();
+ }
+
+ private int getNumberOfSurroundingWater() {
+ if (!this.hasWorldObj() || this.getWorldObj().isRemote) {
+ return 0;
+ }
+ final Block[] surroundingBlocks = new Block[6];
+ surroundingBlocks[0] = this.worldObj.getBlock(this.xCoord, this.yCoord + 1, this.zCoord); // Above
+ surroundingBlocks[1] = this.worldObj.getBlock(this.xCoord, this.yCoord - 1, this.zCoord); // Below
+ surroundingBlocks[2] = this.worldObj.getBlock(this.xCoord + 1, this.yCoord, this.zCoord);
+ surroundingBlocks[3] = this.worldObj.getBlock(this.xCoord - 1, this.yCoord, this.zCoord);
+ surroundingBlocks[4] = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord + 1);
+ surroundingBlocks[5] = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 1);
+ int waterCount = 0;
+ int trapCount = 0;
+ for (final Block checkBlock : surroundingBlocks) {
+ if (checkBlock == ModBlocks.blockFishTrap) {
+ trapCount++;
+ } else if ((checkBlock == Blocks.water) || (checkBlock == Blocks.flowing_water)) {
+ waterCount++;
+ }
+ }
+ // Explicitly check for at least 2 water blocks.
+ if (waterCount < 2) {
+ return 0;
+ }
+ // Only allow the first four traps to count towards valid neighbor blocks.
+ return waterCount + Math.min(trapCount, 4);
+ }
+
+ public InventoryFishTrap getInventory() {
+ return this.inventoryContents;
+ }
+
+ private void tryAddLoot() {
+ ItemUtils.organiseInventory(getInventory());
+ final ItemStack loot = this.generateLootForFishTrap();
+ if (loot == null) {
+ return;
+ }
+ for (final ItemStack contents : this.getInventory()
+ .getInventory()) {
+ if (GT_Utility.areStacksEqual(loot, contents)) {
+ if (contents.stackSize < contents.getMaxStackSize()) {
+ contents.stackSize++;
+ this.markDirty();
+ return;
+ }
+ }
+ }
+ int checkingSlot = 0;
+ for (final ItemStack contents : this.getInventory()
+ .getInventory()) {
+ if (contents == null) {
+ this.getInventory()
+ .setInventorySlotContents(checkingSlot, loot);
+ this.markDirty();
+ return;
+ }
+ checkingSlot++;
+ }
+ }
+
+ @Nullable
+ private ItemStack generateLootForFishTrap() {
+ final int lootWeight = MathUtils.randInt(0, 100);
+ ItemStack loot = null;
+ if (lootWeight <= 5) {
+ loot = ItemUtils.getSimpleStack(Items.slime_ball);
+ } else if (lootWeight <= 10) {
+ loot = ItemUtils.getSimpleStack(Items.bone);
+ } else if (lootWeight <= 15) {
+ loot = ItemUtils.getSimpleStack(Blocks.sand);
+ } else if (lootWeight <= 20) {
+ loot = ItemUtils.simpleMetaStack(Items.dye, 0, 1);
+ }
+ // Junk Loot
+ else if (lootWeight <= 23) {
+ if (PamsHarvestCraft.isModLoaded()) {
+ loot = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cropSeaweed", 1);
+ } else {
+ loot = ItemUtils.getSimpleStack(Blocks.dirt);
+ }
+ }
+ // Pam Fish
+ else if (lootWeight <= 99) {
+ final Random xstr = new Random();
+ loot = FishingHooks.getRandomFishable(xstr, 100);
+ } else if (lootWeight == 100) {
+ final int rareLoot = MathUtils.randInt(1, 10);
+ if (rareLoot <= 4) {
+ loot = Materials.Iron.getNuggets(1);
+ } else if (rareLoot <= 7) {
+ loot = ItemUtils.getSimpleStack(Items.gold_nugget);
+ } else if (rareLoot <= 9) {
+ loot = ItemUtils.getSimpleStack(Items.emerald);
+ } else {
+ loot = ItemUtils.getSimpleStack(Items.diamond);
+ }
+ }
+ if (loot != null) {
+ loot.stackSize = 1;
+ }
+ return loot;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (this.worldObj.isRemote) {
+ return;
+ }
+
+ this.tickCount++;
+ // Only recalculate the amount of neighboring water/trap blocks every 20 ticks.
+ if ((this.tickCount % 20) == 0) {
+ this.surroundingWaterBlocks = getNumberOfSurroundingWater();
+ }
+
+ if ((waterBlocksToTickRate[this.surroundingWaterBlocks] != 0)
+ && this.tickCount > waterBlocksToTickRate[this.surroundingWaterBlocks]) {
+ int aExtraLootChance = MathUtils.randInt(1, 1000);
+ if (aExtraLootChance >= 999) {
+ this.tryAddLoot();
+ this.tryAddLoot();
+ this.tryAddLoot();
+ } else {
+ this.tryAddLoot();
+ }
+ this.markDirty();
+
+ this.tickCount = 0;
+ }
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return true;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.fishtrap";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.isEmpty();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java
new file mode 100644
index 0000000000..fd528c589d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java
@@ -0,0 +1,148 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+public class TileEntityInfiniteFluid extends TileEntity implements IFluidHandler {
+
+ public FluidTank tank = new FluidTank(Integer.MAX_VALUE);
+ private boolean needsUpdate = false;
+ private int updateTimer = 0;
+
+ public TileEntityInfiniteFluid() {}
+
+ @Override
+ public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ needsUpdate = true;
+ return this.tank.fill(resource, doFill);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ needsUpdate = true;
+ return this.tank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ needsUpdate = true;
+ FluidStack fluid = this.tank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.tank,
+ 0));
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.tank.getInfo() };
+ }
+
+ public float getAdjustedVolume() {
+ needsUpdate = true;
+ float amount = tank.getFluidAmount();
+ float capacity = tank.getCapacity();
+ float volume = (amount / capacity) * 0.8F;
+ return volume;
+ }
+
+ @Override
+ public void updateEntity() {
+
+ if (this.tank.getFluid() != null) {
+ FluidStack bigStorage = this.tank.getFluid();
+ bigStorage.amount = this.tank.getCapacity();
+ this.tank.setFluid(bigStorage);
+ }
+
+ if (needsUpdate) {
+
+ if (this.tank.getFluid() != null) {
+ FluidStack bigStorage = this.tank.getFluid();
+ bigStorage.amount = this.tank.getCapacity();
+ this.tank.setFluid(bigStorage);
+ }
+
+ if (updateTimer == 0) {
+ updateTimer = 10; // every 10 ticks it will send an update
+ } else {
+ --updateTimer;
+ if (updateTimer == 0) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound tag) {
+ tank.readFromNBT(tag);
+ super.readFromNBT(tag);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound tag) {
+ tank.writeToNBT(tag);
+ super.writeToNBT(tag);
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java
new file mode 100644
index 0000000000..a9bc2b0049
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java
@@ -0,0 +1,418 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.inventories.Inventory_VolumetricFlaskSetter;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class TileEntityVolumetricFlaskSetter extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final Inventory_VolumetricFlaskSetter inventoryContents;
+ private String customName;
+ public int locationX;
+ public int locationY;
+ public int locationZ;
+ private int aCurrentMode = 0;
+ private int aCustomValue = 1000;
+
+ public TileEntityVolumetricFlaskSetter() {
+ this.inventoryContents = new Inventory_VolumetricFlaskSetter();
+ this.setTileLocation();
+ }
+
+ public int getCustomValue() {
+ // Logger.INFO("Value: "+this.aCustomValue);
+ return this.aCustomValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ log("Old Value: " + this.aCustomValue);
+ this.aCustomValue = (short) MathUtils.balance(aVal, 0, Short.MAX_VALUE);
+ log("New Value: " + this.aCustomValue);
+ markDirty();
+ }
+
+ public boolean setTileLocation() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ this.locationX = this.xCoord;
+ this.locationY = this.yCoord;
+ this.locationZ = this.zCoord;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Rename to hasCircuitToConfigure
+ public final boolean hasFlask() {
+ for (int i = 0; i < this.getInventory()
+ .getInventory().length - 1; i++) {
+ if (i == Container_VolumetricFlaskSetter.SLOT_OUTPUT) {
+ continue;
+ }
+ if (this.getInventory()
+ .getInventory()[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Inventory_VolumetricFlaskSetter getInventory() {
+ return this.inventoryContents;
+ }
+
+ private int getFlaskType(ItemStack aStack) {
+ if (VolumetricFlaskHelper.isNormalVolumetricFlask(aStack)) {
+ return 1;
+ } else if (VolumetricFlaskHelper.isLargeVolumetricFlask(aStack)) {
+ return 2;
+ } else if (VolumetricFlaskHelper.isGiganticVolumetricFlask(aStack)) {
+ return 3;
+ }
+ return 0;
+ }
+
+ private int getCapacityForSlot(int aSlot) {
+ return switch (aSlot) {
+ case 0 -> // 16
+ 16;
+ case 1 -> // 36
+ 36;
+ case 2 -> // 144
+ 144;
+ case 3 -> // 432
+ 432;
+ case 4 -> // 576
+ 576;
+ case 5 -> // 720
+ 720;
+ case 6 -> // 864
+ 864;
+ case 7 -> // Custom
+ getCustomValue();
+ default -> 1000;
+ };
+ }
+
+ public boolean addOutput() {
+
+ // Don't do anything unless we have items
+ if (!hasFlask()) {
+ Logger.INFO("No Flasks.");
+ return false;
+ }
+
+ ItemStack[] aInputs = this.getInventory()
+ .getInventory()
+ .clone();
+
+ // Check if there is output in slot.
+ Boolean hasOutput = false;
+ if (aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT] != null) {
+ hasOutput = true;
+ if (aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT].stackSize >= 16) {
+ return false;
+ }
+ }
+ AutoMap<Integer> aValidSlots = new AutoMap<>();
+ int aSlotCount = 0;
+ for (ItemStack i : aInputs) {
+ if (i != null) {
+ aValidSlots.put(aSlotCount);
+ }
+ aSlotCount++;
+ }
+ for (int e : aValidSlots) {
+
+ // Skip slot 7 (Custom) unless it has a value > 0
+ if (e == 7 && getCustomValue() <= 0) {
+ log("Skipping Custom slot as value <= 0");
+ continue;
+ }
+ if (e == Container_VolumetricFlaskSetter.SLOT_OUTPUT) {
+ continue;
+ }
+
+ boolean doAdd = false;
+ ItemStack g = this.getStackInSlot(e);
+ FluidStack aInputFluidStack = VolumetricFlaskHelper.getFlaskFluid(g);
+ int aSize = 0;
+ ItemStack aInputStack = null;
+ int aTypeInSlot = getFlaskType(g);
+ if (aTypeInSlot > 0 && g != null) {
+ // No Existing Output
+ if (!hasOutput) {
+ aSize = g.stackSize;
+ doAdd = true;
+ }
+ // Existing Output
+ else {
+ ItemStack f = aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT];
+ FluidStack aFluidInCheckedSlot = VolumetricFlaskHelper.getFlaskFluid(f);
+ int aTypeInCheckedSlot = getFlaskType(f);
+ // Check that the Circuit in the Output slot is not null and the same type as the circuit input.
+ if (aTypeInCheckedSlot > 0 && (aTypeInSlot == aTypeInCheckedSlot) && f != null) {
+ if (g.getItem() == f.getItem()
+ && VolumetricFlaskHelper.getFlaskCapacity(f) == getCapacityForSlot(e)
+ && ((aInputFluidStack == null && aFluidInCheckedSlot == null)
+ || aInputFluidStack.isFluidEqual(aFluidInCheckedSlot))) {
+ log(
+ "Input Slot Flask Contains: "
+ + (aInputFluidStack != null ? aInputFluidStack.getLocalizedName() : "Empty"));
+ log(
+ "Output Slot Flask Contains: "
+ + (aFluidInCheckedSlot != null ? aFluidInCheckedSlot.getLocalizedName() : "Empty"));
+ aSize = f.stackSize + g.stackSize;
+ if (aSize > 16) {
+ aInputStack = g.copy();
+ aInputStack.stackSize = (aSize - 16);
+ }
+ doAdd = true;
+ }
+ }
+ }
+ if (doAdd) {
+ // Check Circuit Type
+ ItemStack aOutput;
+ FluidStack aOutputFluid = null;
+ if (!VolumetricFlaskHelper.isFlaskEmpty(g)) {
+ aOutputFluid = aInputFluidStack.copy();
+ }
+ if (aTypeInSlot == 1) {
+ aOutput = VolumetricFlaskHelper.getVolumetricFlask(1);
+ } else if (aTypeInSlot == 2) {
+ aOutput = VolumetricFlaskHelper.getLargeVolumetricFlask(1);
+ } else if (aTypeInSlot == 3) {
+ aOutput = VolumetricFlaskHelper.getGiganticVolumetricFlask(1);
+ } else {
+ aOutput = null;
+ }
+ if (aOutput != null) {
+ aOutput.stackSize = aSize;
+ int aCapacity = getCapacityForSlot(e);
+ VolumetricFlaskHelper.setNewFlaskCapacity(aOutput, aCapacity);
+ if (aOutputFluid != null) {
+ if (aOutputFluid.amount > aCapacity) {
+ aOutputFluid.amount = aCapacity;
+ }
+ VolumetricFlaskHelper.setFluid(aOutput, aOutputFluid);
+ }
+ this.setInventorySlotContents(e, aInputStack);
+ this.setInventorySlotContents(Container_VolumetricFlaskSetter.SLOT_OUTPUT, aOutput);
+ return true;
+ }
+ }
+ }
+ continue;
+ }
+ return false;
+ }
+
+ @Override
+ public void updateEntity() {
+ try {
+ if (!this.worldObj.isRemote) {
+ if (tickCount % 10 == 0) {
+ if (hasFlask()) {
+ this.addOutput();
+ this.markDirty();
+ }
+ }
+ this.tickCount++;
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ nbt.setInteger("aCustomValue", aCustomValue);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setInteger("aCurrentMode", aCurrentMode);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ this.aCustomValue = nbt.getInteger("aCustomValue");
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ aCurrentMode = nbt.getInteger("aCurrentMode");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aSlot, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return aSlot == aCurrentMode;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aSlot, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return aSlot == Container_VolumetricFlaskSetter.SLOT_OUTPUT;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.VolumetricFlaskSetter";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ final NBTTagCompound tag = new NBTTagCompound();
+ this.writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(final NetworkManager net, final S35PacketUpdateTileEntity pkt) {
+ final NBTTagCompound tag = pkt.func_148857_g();
+ this.readFromNBT(tag);
+ }
+
+ public boolean onScrewdriverRightClick(byte side, EntityPlayer player, int x, int y, int z) {
+
+ if (player.isSneaking()) {
+ PlayerUtils.messagePlayer(player, "Value: " + this.getCustomValue());
+ }
+
+ try {
+ if (aCurrentMode == 7) {
+ aCurrentMode = 0;
+ } else {
+ aCurrentMode++;
+ }
+ PlayerUtils.messagePlayer(player, "Slot " + aCurrentMode + " is now default.");
+ return true;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-Tile] " + aString);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java
new file mode 100644
index 0000000000..5e0aaf8370
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java
@@ -0,0 +1,140 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.passive.EntityAnimal;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.passive.IAnimals;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityAdvPooCollector extends TileEntityBaseFluidCollector {
+
+ public TileEntityAdvPooCollector() {
+ super(18, 128000);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public void onPreLogicTick() {}
+
+ @Override
+ public <V> boolean addDrop(V aPooMaker) {
+ int aChance = MathUtils.randInt(0, 50000);
+ if (aChance > 0) {
+ ItemStack aPoop;
+ if (aChance <= 200) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (aChance <= 1000) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (aChance <= 2000) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ } else {
+ return false;
+ }
+
+ // Add to inventory if not full, else espawn in world
+ if (!this.mInventory.addItemStack(aPoop)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aPoop);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+
+ return false;
+ }
+
+ private static AutoMap<Class> aEntityToDrain = new AutoMap<>();
+
+ @Override
+ public AutoMap<Class> aThingsToLookFor() {
+ if (aEntityToDrain.isEmpty()) {
+ aEntityToDrain.add(EntityAnimal.class);
+ aEntityToDrain.add(IAnimals.class);
+ aEntityToDrain.add(EntityVillager.class);
+ aEntityToDrain.add(EntityPlayer.class);
+ }
+ return aEntityToDrain;
+ }
+
+ @Override
+ public <V> int onPostTick(V aPooMaker) {
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aPooAmount = 0;
+ // Vanilla Animals
+ if (aPooMaker instanceof EntityChicken) {
+ aPooAmount = MathUtils.randInt(1, 40);
+ } else if (aPooMaker instanceof EntityHorse) {
+ aPooAmount = MathUtils.randInt(20, 40);
+ } else if (aPooMaker instanceof EntityCow) {
+ aPooAmount = MathUtils.randInt(18, 45);
+ } else if (aPooMaker instanceof EntityMooshroom) {
+ aPooAmount = 17;
+ } else if (aPooMaker instanceof EntitySheep) {
+ aPooAmount = MathUtils.randInt(8, 30);
+ } else {
+ if (aPooMaker instanceof EntityAnimal || aPooMaker instanceof IAnimals) {
+ aPooAmount = MathUtils.randInt(5, 35);
+ } else if (aPooMaker instanceof EntityVillager) {
+ aPooAmount = MathUtils.randInt(25, 30);
+ } else if (aPooMaker instanceof EntityPlayer) {
+ aPooAmount = MathUtils.randInt(1, 3);
+ } else {
+ aPooAmount = MathUtils.randInt(1, 10);
+ }
+ }
+ aPooAmount = Math.max(Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aPooAmount), 1);
+ return Math.max(
+ 1,
+ (aPooAmount
+ * MathUtils
+ .getRandomFromArray(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4 })
+ / 10));
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Fluid fluidToProvide() {
+ return AgriculturalChem.PoopJuice;
+ }
+
+ @Override
+ public ItemStack itemToSpawnInWorldIfTankIsFull() {
+ int a = MathUtils.randInt(0, 75);
+ ItemStack aItem = null;
+ if (a <= 30) {
+ aItem = ItemUtils.getSimpleStack(AgriculturalChem.dustDirt);
+ } else if (a <= 40) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (a <= 55) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ }
+ return aItem;
+ }
+
+ @Override
+ public int getBaseTickRate() {
+ return MathUtils.randInt(50, 200);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java
new file mode 100644
index 0000000000..6340415e82
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import java.util.List;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BTF_FluidTank;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.tileentities.base.TileEntityBase;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class TileEntityBaseFluidCollector extends TileEntityBase implements IFluidHandler {
+
+ public final FluidTank tank;
+ private boolean needsUpdate = false;
+ private int updateTimer = 0;
+ private long internalTickCounter = 0;
+ private BlockPos internalBlockLocation;
+
+ public TileEntityBaseFluidCollector(int aInvSlotCount, int aTankCapcity) {
+ super(aInvSlotCount);
+ tank = new BTF_FluidTank(aTankCapcity);
+ }
+
+ @Override
+ public final int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ needsUpdate = true;
+ return this.tank.fill(resource, doFill);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ needsUpdate = true;
+ return this.tank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ needsUpdate = true;
+ FluidStack fluid = this.tank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.tank,
+ 0));
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public final FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.tank.getInfo() };
+ }
+
+ @Override
+ public final void updateEntity() {
+ super.updateEntity();
+ onPreLogicTick();
+ logicTick();
+ if (needsUpdate) {
+ if (updateTimer == 0) {
+ updateTimer = 10; // every 10 ticks it will send an update
+ } else {
+ --updateTimer;
+ if (updateTimer == 0) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound tag) {
+ tank.readFromNBT(tag);
+ super.readFromNBT(tag);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound tag) {
+ tank.writeToNBT(tag);
+ super.writeToNBT(tag);
+ }
+
+ @Override
+ public final Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public final void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+
+ public int getBaseTickRate() {
+ return MathUtils.randInt(200, 300);
+ }
+
+ public abstract AutoMap<Class> aThingsToLookFor();
+
+ public abstract void onPreLogicTick();
+
+ public final void logicTick() {
+
+ if (this.worldObj == null || this.worldObj.isRemote) {
+ return;
+ }
+ if (internalTickCounter % getBaseTickRate() == 0) {
+ if (internalBlockLocation == null) {
+ internalBlockLocation = new BlockPos(this);
+ }
+ BlockPos p = internalBlockLocation;
+ if (p != null) {
+ if (p.world != null) {
+ World w = this.worldObj;
+ if (w == null) {
+ return;
+ }
+ Chunk c = w.getChunkFromBlockCoords(p.xPos, p.zPos);
+ if (c != null) {
+ if (c.isChunkLoaded) {
+ int startX = p.xPos - 2;
+ int startY = p.yPos;
+ int startZ = p.zPos - 2;
+ int endX = p.xPos + 3;
+ int endY = p.yPos + 5;
+ int endZ = p.zPos + 3;
+ AxisAlignedBB box = AxisAlignedBB.getBoundingBox(startX, startY, startZ, endX, endY, endZ);
+ if (box != null) {
+ for (Class c2 : aThingsToLookFor()) {
+ tickEntityType(w, box, c2);
+ }
+ } else {
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ internalTickCounter++;
+ }
+
+ @SuppressWarnings("unchecked")
+ public final void tickEntityType(World w, AxisAlignedBB box, Class aClassToFind) {
+ List<?> entities = w.getEntitiesWithinAABB(aClassToFind, box);
+ if (entities != null && !entities.isEmpty()) {
+ interactWithEntities(entities);
+ }
+ }
+
+ public final <V> void interactWithEntities(List<V> entities) {
+ for (V aEntity : entities) {
+ addDrop(aEntity);
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aFluidAmount = onPostTick(aEntity);
+ aFluidAmount = Math
+ .max(Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aFluidAmount), 1);
+ this.tank.fill(FluidUtils.getFluidStack(fluidToProvide(), aFluidAmount), true);
+ } else {
+ ItemStack aDirtStack = ItemUtils.getSimpleStack(itemToSpawnInWorldIfTankIsFull(), 1);
+ if (!ItemUtils.checkForInvalidItems(aDirtStack)) {
+ return;
+ }
+ if (!this.mInventory.addItemStack(aDirtStack)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aDirtStack);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the amount of fluid for this entity type
+ *
+ * @param aEntity
+ * @return
+ */
+ public abstract <V> int onPostTick(V aEntity);
+
+ public abstract <V> boolean addDrop(V aPooMaker);
+
+ public abstract Fluid fluidToProvide();
+
+ public abstract ItemStack itemToSpawnInWorldIfTankIsFull();
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java
new file mode 100644
index 0000000000..dfdb7104b0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java
@@ -0,0 +1,532 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.passive.EntityBat;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.DamageSource;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BTF_FluidTank;
+import gtPlusPlus.core.inventories.InventoryPestKiller;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TileEntityPestKiller extends TileEntity implements ISidedInventory, IFluidHandler {
+
+ private final int mBaseTickRate = 20 * 30;
+ private final InventoryPestKiller mInventory;
+ private final FluidTank mTank;
+ private int mChunkX;
+ private int mChunkZ;
+ private boolean mSet = false;
+
+ private int mTickCounter = 0;
+ private int mUpdateTick = 0;
+ private boolean mNeedsUpdate = false;
+ private String mCustomName;
+
+ private static final AutoMap<Class<?>> mEntityMap = new AutoMap<>();
+
+ static {
+ mEntityMap.put(EntityBat.class);
+ if (Forestry.isModLoaded()) {
+ mEntityMap.put(ReflectionUtils.getClass("forestry.lepidopterology.entities.EntityButterfly"));
+ }
+ }
+
+ public TileEntityPestKiller() {
+ this.mInventory = new InventoryPestKiller();
+ mTank = new BTF_FluidTank(2000);
+ }
+
+ public InventoryPestKiller getInventory() {
+ return this.mInventory;
+ }
+
+ public FluidTank getTank() {
+ return mTank;
+ }
+
+ private void setup() {
+ World w = this.worldObj;
+ if (w != null) {
+ Chunk c = w.getChunkFromBlockCoords(this.xCoord, this.zCoord);
+ if (c != null) {
+ mChunkX = c.xPosition;
+ mChunkZ = c.zPosition;
+ mSet = true;
+ }
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ public boolean tryKillPests() {
+ int min = 0;
+ int max = 0;
+ switch (getTier()) {
+ case 1 -> {
+ min = -2;
+ max = 3;
+ }
+ case 2 -> {
+ min = -4;
+ max = 5;
+ }
+ default -> {}
+ // code block
+ }
+ int aChunkCount = 0;
+ AutoMap<Entity> entities = new AutoMap<>();
+ if (min != 0 && max != 0) {
+ for (int x = min; x < max; x++) {
+ for (int z = min; z < max; z++) {
+ Chunk c = getChunkFromOffsetIfLoaded(x, z);
+ if (c != null) {
+ if (c.hasEntities) {
+ aChunkCount++;
+ List[] lists = c.entityLists;
+ for (List o : lists) {
+ for (Object e : o) {
+ if (e instanceof Entity) {
+ for (Class<?> C : mEntityMap) {
+ if (e.getClass()
+ .equals(C) || C.isAssignableFrom(e.getClass())) {
+ entities.put((Entity) e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ Chunk c = getChunkFromOffsetIfLoaded(0, 0);
+ if (c != null) {
+ if (c.hasEntities) {
+ List[] lists = c.entityLists;
+ for (List o : lists) {
+ for (Object e : o) {
+ if (e instanceof Entity) {
+ for (Class<?> C : mEntityMap) {
+ if (e.getClass()
+ .equals(C) || C.isAssignableFrom(e.getClass())) {
+ entities.put((Entity) e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ boolean killed = false;
+ if (!entities.isEmpty()) {
+ for (Entity e : entities) {
+ if (e != null) {
+ if (e.isEntityAlive()) {
+ if (this.mTank.getFluidAmount() >= 1 || getTier() == 0) {
+ if (getTier() > 0) {
+ int aChanceToUse = MathUtils.randInt(1, (100 * getTier()));
+ if (aChanceToUse == 1) {
+ this.mTank.drain(1, true);
+ }
+ }
+ EntityUtils.doDamage(e, DamageSource.generic, Short.MAX_VALUE);
+ e.setDead();
+ killed = true;
+ }
+ }
+ }
+ }
+ }
+ updateTileEntity();
+ return killed;
+ }
+
+ public Chunk getChunkFromOffsetIfLoaded(int x, int y) {
+ Chunk c = this.worldObj.getChunkFromChunkCoords(mChunkX + x, mChunkZ + y);
+ if (c.isChunkLoaded) {
+ return c;
+ }
+ return null;
+ }
+
+ public int getTier() {
+ if (this.mTank != null) {
+ FluidStack f = mTank.getFluid();
+ if (f != null) {
+ if (f.isFluidEqual(FluidUtils.getWildcardFluidStack("formaldehyde", 1))) {
+ return 1;
+ } else if (f.isFluidEqual(MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1))) {
+ return 2;
+ }
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (worldObj.isRemote) {
+ return;
+ }
+ if (!mSet) {
+ setup();
+ }
+ this.mTickCounter++;
+ if (this.mTank != null) {
+ if (this.hasFluidSpace()) {
+ handleInventory();
+ }
+ }
+ if (this.mTickCounter % this.mBaseTickRate == 0) {
+ tryKillPests();
+ }
+ updateTick();
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ mTank.writeToNBT(nbt);
+ super.writeToNBT(nbt);
+ // Utils.LOG_MACHINE_INFO("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.mInventory.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ mTank.readFromNBT(nbt);
+ super.readFromNBT(nbt);
+ // Utils.LOG_MACHINE_INFO("Trying to read NBT data from TE.");
+ this.mInventory.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aSlot, final ItemStack aStack, final int p_102007_3_) {
+ if (this.getInventory()
+ .getInventory()[0] == null) {
+ return true;
+ } else if (GT_Utility.areStacksEqual(
+ aStack,
+ this.getInventory()
+ .getInventory()[0])) {
+ if (this.getInventory()
+ .getInventory()[0].stackSize < 64) {
+ int diff = 64 - this.getInventory()
+ .getInventory()[0].stackSize;
+ if (aStack.stackSize <= diff) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aSlot, final ItemStack aStack, final int p_102008_3_) {
+ if (this.getInventory()
+ .getInventory()[1] == null) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public String getCustomName() {
+ return this.mCustomName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.mCustomName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.mCustomName : "container.pestkiller";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.mCustomName != null) && !this.mCustomName.equals("");
+ }
+
+ @Override
+ public final int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ updateTileEntity();
+ return this.mTank.fill(resource, doFill);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ updateTileEntity();
+ return this.mTank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ FluidStack fluid = this.mTank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.mTank,
+ 0));
+ }
+ }
+ updateTileEntity();
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return mTank.getFluid() == null || mTank.getFluid()
+ .getFluid()
+ .equals(fluid);
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public final FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.mTank.getInfo() };
+ }
+
+ @Override
+ public final Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public final void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+
+ public boolean hasFluidSpace() {
+ if (this.mTank.getFluidAmount() <= 1000) {
+ return true;
+ }
+ return false;
+ }
+
+ public boolean drainCell() {
+ boolean didFill = false;
+ ItemStack aInput = this.getStackInSlot(0);
+ if (aInput == null) {
+ return false;
+ }
+ aInput = aInput.copy();
+ if (aInput != null && (this.getStackInSlot(1) == null || this.getStackInSlot(1).stackSize < 64)) {
+ ArrayList<ItemStack> t1Cells = OreDictionary.getOres("cellFormaldehyde");
+ ArrayList<ItemStack> t2Cells = OreDictionary.getOres("cellHydrogenCyanide");
+ didFill = addFluid(t1Cells, aInput, FluidUtils.getWildcardFluidStack("formaldehyde", 1000));
+ if (!didFill) {
+ didFill = addFluid(t2Cells, aInput, MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000));
+ }
+ }
+
+ return didFill;
+ }
+
+ public boolean handleInventory() {
+ if (this.getInventory() != null && drainCell()) {
+ this.decrStackSize(0, 1);
+ if (this.getStackInSlot(1) == null) {
+ this.setInventorySlotContents(1, CI.emptyCells(1));
+ } else {
+ this.getStackInSlot(1).stackSize++;
+ }
+ this.updateTileEntity();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean addFluid(ArrayList<ItemStack> inputs, ItemStack aInput, FluidStack aFluidForInput) {
+ for (ItemStack a : inputs) {
+ if (GT_Utility.areStacksEqual(a, aInput)) {
+ if (mTank.getFluid() == null || mTank.getFluid()
+ .isFluidEqual(aFluidForInput)) {
+ boolean didFill = fill(ForgeDirection.UNKNOWN, aFluidForInput, true) > 0;
+ return didFill;
+ }
+ } else {
+ continue;
+ }
+ }
+ return false;
+ }
+
+ public void updateTileEntity() {
+ this.getInventory()
+ .markDirty();
+ this.markDirty();
+ this.mNeedsUpdate = true;
+ }
+
+ private void updateTick() {
+ if (mNeedsUpdate) {
+ if (mUpdateTick == 0) {
+ mUpdateTick = 4; // every 4 ticks it will send an update
+ } else {
+ --mUpdateTick;
+ if (mUpdateTick == 0) {
+ markDirty();
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ mNeedsUpdate = false;
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java
new file mode 100644
index 0000000000..d0d4ee3661
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java
@@ -0,0 +1,128 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.passive.EntityAnimal;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.IAnimals;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityPooCollector extends TileEntityBaseFluidCollector {
+
+ public TileEntityPooCollector() {
+ super(9, 8000);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public void onPreLogicTick() {}
+
+ @Override
+ public <V> boolean addDrop(V aPooMaker) {
+ int aChance = MathUtils.randInt(0, 50000);
+ if (aChance > 0) {
+ ItemStack aPoop;
+ if (aChance <= 100) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (aChance <= 500) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (aChance <= 1250) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ } else {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aPoop)) {
+ return false;
+ }
+
+ // Add poop to world
+ // Logger.INFO("Adding animal waste for "+aPooMaker.getCommandSenderName());
+
+ // Add to inventory if not full, else espawn in world
+ if (!this.mInventory.addItemStack(aPoop)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aPoop);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+
+ return false;
+ }
+
+ private static AutoMap<Class> aEntityToDrain = new AutoMap<>();
+
+ @Override
+ public AutoMap<Class> aThingsToLookFor() {
+ if (aEntityToDrain.isEmpty()) {
+ aEntityToDrain.add(EntityAnimal.class);
+ aEntityToDrain.add(IAnimals.class);
+ }
+ return aEntityToDrain;
+ }
+
+ @Override
+ public <V> int onPostTick(V aPooMaker) {
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aPooAmount = 0;
+ // Vanilla Animals
+ if (aPooMaker instanceof EntityChicken) {
+ aPooAmount = MathUtils.randInt(1, 40);
+ } else if (aPooMaker instanceof EntityHorse) {
+ aPooAmount = MathUtils.randInt(20, 40);
+ } else if (aPooMaker instanceof EntityCow) {
+ aPooAmount = MathUtils.randInt(18, 45);
+ } else if (aPooMaker instanceof EntityMooshroom) {
+ aPooAmount = 17;
+ } else if (aPooMaker instanceof EntitySheep) {
+ aPooAmount = MathUtils.randInt(8, 30);
+ } else {
+ if (aPooMaker instanceof EntityAnimal || aPooMaker instanceof IAnimals) {
+ aPooAmount = MathUtils.randInt(5, 35);
+ } else {
+ aPooAmount = MathUtils.randInt(1, 10);
+ }
+ }
+ aPooAmount = Math.max((Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aPooAmount) / 10), 1);
+ return aPooAmount;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Fluid fluidToProvide() {
+ return AgriculturalChem.PoopJuice;
+ }
+
+ @Override
+ public ItemStack itemToSpawnInWorldIfTankIsFull() {
+ int a = MathUtils.randInt(0, 100);
+ ItemStack aItem = null;
+ if (a <= 30) {
+ aItem = ItemUtils.getSimpleStack(AgriculturalChem.dustDirt);
+ } else if (a <= 40) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (a <= 55) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ }
+ return aItem;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java
new file mode 100644
index 0000000000..7c90ddc1c2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import java.util.List;
+import java.util.Vector;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectMain;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectOutput;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechItems;
+import ic2.api.network.INetworkDataProvider;
+import ic2.api.network.INetworkUpdateListener;
+import ic2.api.tile.IWrenchable;
+import ic2.core.IC2;
+
+public class TileEntityProjectTable extends TileEntity
+ implements INetworkDataProvider, INetworkUpdateListener, IWrenchable {
+
+ public InventoryProjectMain inventoryGrid;
+ public InventoryProjectOutput inventoryOutputs;
+
+ private Container_ProjectTable container;
+
+ public TileEntityProjectTable() {
+ this.inventoryGrid = new InventoryProjectMain(); // number of slots - without product slot
+ this.inventoryOutputs = new InventoryProjectOutput(); // number of slots - without product slot
+ this.canUpdate();
+ }
+
+ public void setContainer(Container_ProjectTable container) {
+ this.container = container;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ nbt.setShort("facing", this.facing);
+ this.inventoryGrid.writeToNBT(this.getTag(nbt, "ContentsGrid"));
+ this.inventoryOutputs.writeToNBT(this.getTag(nbt, "ContentsOutput"));
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ this.prevFacing = (this.facing = nbt.getShort("facing"));
+ this.inventoryGrid.readFromNBT(nbt.getCompoundTag("ContentsGrid"));
+ this.inventoryOutputs.readFromNBT(nbt.getCompoundTag("ContentsOutput"));
+ }
+
+ @Override
+ public List<String> getNetworkedFields() {
+ final List<String> ret = new Vector(2);
+ ret.add("facing");
+ return ret;
+ }
+
+ @Override
+ public boolean wrenchCanSetFacing(final EntityPlayer entityPlayer, final int side) {
+ return false;
+ }
+
+ private short facing = 0;
+ public short prevFacing = 0;
+
+ @Override
+ public void setFacing(final short facing1) {
+ this.facing = facing1;
+ if (this.prevFacing != facing1) {
+ IC2.network.get()
+ .updateTileEntityField(this, "facing");
+ }
+ this.prevFacing = facing1;
+ }
+
+ @Override
+ public short getFacing() {
+ return this.facing;
+ }
+
+ @Override
+ public boolean wrenchCanRemove(final EntityPlayer entityPlayer) {
+ return true;
+ }
+
+ @Override
+ public float getWrenchDropRate() {
+ return 1.0F;
+ }
+
+ @Override
+ public ItemStack getWrenchDrop(final EntityPlayer entityPlayer) {
+ return new ItemStack(
+ this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord),
+ 1,
+ this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord));
+ }
+
+ @Override
+ public void onNetworkUpdate(final String field) {
+ this.prevFacing = this.facing;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (!this.worldObj.isRemote) {
+ // Data stick
+ ItemStack dataStick = this.inventoryOutputs.getStackInSlot(0);
+ if (dataStick != null && this.container != null && container.getOutputContent() != null) {
+ if ((dataStick.getItem() instanceof GT_MetaGenerated_Item_01 && dataStick.getItemDamage() == 32708)
+ || (dataStick == ItemList.Tool_DataStick.get(1))
+ || (dataStick == GregtechItemList.Old_Tool_DataStick.get(1))
+ || (dataStick.getItem() instanceof MetaGeneratedGregtechItems
+ && dataStick.getItemDamage() == 32208)) {
+
+ Logger.INFO("Found Data Stick and valid container.");
+
+ ItemStack outputComponent = container.getOutputContent();
+ ItemStack[] craftInputComponent = container.getInputComponents();
+
+ ItemStack newStick = NBTUtils
+ .writeItemsToNBT(dataStick, new ItemStack[] { outputComponent }, "Output");
+ newStick = NBTUtils.writeItemsToNBT(newStick, craftInputComponent);
+ NBTUtils.setBookTitle(newStick, "Encrypted Project Data");
+ NBTUtils.setBoolean(newStick, "mEncrypted", true);
+ int slotm = 0;
+ Logger.WARNING("Uploading to Data Stick.");
+ for (ItemStack is : NBTUtils.readItemsFromNBT(newStick)) {
+ if (is != null) {
+ Logger.WARNING("Uploaded " + is.getDisplayName() + " into memory slot " + slotm + ".");
+ } else {
+ Logger.WARNING("Left memory slot " + slotm + " blank.");
+ }
+ slotm++;
+ }
+ Logger.WARNING("Encrypting Data Stick.");
+ this.inventoryOutputs.setInventorySlotContents(1, newStick);
+ this.inventoryOutputs.setInventorySlotContents(0, null);
+ }
+ }
+
+ }
+ super.updateEntity();
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java b/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java
new file mode 100644
index 0000000000..7111fbd5e1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.core.util;
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+public class MovingAverageLong {
+
+ private final long[] storage;
+ private int ptr;
+
+ public MovingAverageLong(int sampleSize) {
+ storage = new long[sampleSize];
+ }
+
+ public void set(long average) {
+ Arrays.fill(storage, average);
+ }
+
+ public void sample(long data) {
+ storage[ptr] = data;
+ ptr = (ptr + 1) % storage.length;
+ }
+
+ public long get() {
+ BigInteger result = BigInteger.ZERO;
+ for (long l : storage) {
+ result = result.add(BigInteger.valueOf(l));
+ }
+ return result.divide(BigInteger.valueOf(storage.length))
+ .longValue();
+ }
+
+ public void write(NBTTagCompound tagCompound, String key) {
+ ByteBuffer buf = ByteBuffer.allocate(storage.length * Long.BYTES)
+ .order(ByteOrder.nativeOrder());
+ buf.asLongBuffer()
+ .put(storage);
+ tagCompound.setByteArray(key, buf.array());
+ }
+
+ /**
+ * if read failed, the internal states would not be changed.
+ *
+ * @return true if successful, false otherwise.
+ */
+ public boolean read(NBTTagCompound tagCompound, String key) {
+ ByteBuffer buf = ByteBuffer.wrap(tagCompound.getByteArray(key));
+ if (buf.remaining() != storage.length * Long.BYTES)
+ // not very good...
+ return false;
+ buf.asLongBuffer()
+ .get(storage);
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/Utils.java b/src/main/java/gtPlusPlus/core/util/Utils.java
new file mode 100644
index 0000000000..610cc4f8fa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/Utils.java
@@ -0,0 +1,436 @@
+package gtPlusPlus.core.util;
+
+import java.awt.Color;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.EnumHelper;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.EnumUtils;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import ic2.core.Ic2Items;
+import ic2.core.init.InternalName;
+import ic2.core.item.resources.ItemCell;
+
+public class Utils {
+
+ public static boolean isServer() {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer();
+ }
+
+ public static boolean isClient() {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isClient();
+ }
+
+ public static TC_AspectStack getTcAspectStack(final TC_Aspects aspect, final long size) {
+ return getTcAspectStack(aspect.name(), (int) size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final String aspect, final long size) {
+ return getTcAspectStack(aspect, (int) size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final TC_Aspects aspect, final int size) {
+ return getTcAspectStack(aspect.name(), size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final String aspect, final int size) {
+
+ TC_AspectStack returnValue = null;
+
+ if (aspect.equalsIgnoreCase("COGNITIO")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "COGNITIO")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("COGNITIO"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("COGNITO"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+ } else if (aspect.equalsIgnoreCase("EXANIMUS")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "EXANIMUS")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("EXANIMUS"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("EXAMINIS"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+
+ } else if (aspect.equalsIgnoreCase("PRAECANTATIO")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "PRAECANTATIO")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("PRAECANTATIO"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("PRAECANTIO"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+ } else {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf(aspect), size);
+ }
+
+ return returnValue;
+ }
+
+ // Register an event to both busses.
+ public static void registerEvent(Object o) {
+ MinecraftForge.EVENT_BUS.register(o);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(o);
+ }
+
+ // Send a message to all players on the server
+ public static void sendServerMessage(final String translationKey) {
+ sendServerMessage(new ChatComponentText(translationKey));
+ }
+
+ // Send a message to all players on the server
+ public static void sendServerMessage(final IChatComponent chatComponent) {
+ MinecraftServer.getServer()
+ .getConfigurationManager()
+ .sendChatMsg(chatComponent);
+ }
+
+ /**
+ * Returns if that Liquid is IC2Steam.
+ */
+ public static boolean isIC2Steam(final FluidStack aFluid) {
+ if (aFluid == null) {
+ return false;
+ }
+ return aFluid.isFluidEqual(getIC2Steam(1));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of IC2Steam.
+ */
+ public static FluidStack getIC2Steam(final long aAmount) {
+ return FluidRegistry.getFluidStack("ic2steam", (int) aAmount);
+ }
+
+ public static int rgbtoHexValue(final int r, final int g, final int b) {
+ if ((r > 255) || (g > 255) || (b > 255) || (r < 0) || (g < 0) || (b < 0)) {
+ return 0;
+ }
+ final Color c = new Color(r, g, b);
+ String temp = Integer.toHexString(c.getRGB() & 0xFFFFFF)
+ .toUpperCase();
+ temp = Utils.appenedHexNotationToString(temp);
+ return Integer.decode(temp);
+ }
+
+ /*
+ * http://javadevnotes.com/java-left-pad-string-with-zeros-examples
+ */
+ public static String padWithZerosLefts(final String originalString, final int length) {
+ final StringBuilder sb = new StringBuilder();
+ while ((sb.length() + originalString.length()) < length) {
+ sb.append('0');
+ }
+ sb.append(originalString);
+ return sb.toString();
+ }
+
+ /*
+ * Original Code by Chandana Napagoda - https://cnapagoda.blogspot.com.au/2011/03/java-hex-color-code-generator.
+ * html
+ */
+ public static Map<Integer, String> hexColourGeneratorRandom(final int colorCount) {
+ final HashMap<Integer, String> hexColorMap = new HashMap<>();
+ for (int a = 0; a < colorCount; a++) {
+ String code = "" + (int) (Math.random() * 256);
+ code = code + code + code;
+ final int i = Integer.parseInt(code);
+ hexColorMap.put(
+ a,
+ Integer.toHexString(0x1000000 | i)
+ .substring(1)
+ .toUpperCase());
+ Logger.WARNING(
+ "" + Integer.toHexString(0x1000000 | i)
+ .substring(1)
+ .toUpperCase());
+ }
+ return hexColorMap;
+ }
+
+ public static String appenedHexNotationToString(final Object hexAsStringOrInt) {
+ final String hexChar = "0x";
+ String result;
+ if (hexAsStringOrInt.getClass() == String.class) {
+
+ if (((String) hexAsStringOrInt).length() != 6) {
+ final String temp = padWithZerosLefts((String) hexAsStringOrInt, 6);
+ }
+ result = hexChar + hexAsStringOrInt;
+ return result;
+ } else if (hexAsStringOrInt.getClass() == Integer.class) {
+ String aa = String.valueOf(hexAsStringOrInt);
+ if (aa.length() != 6) {
+ result = padWithZerosLefts(aa, 6);
+ } else {
+ result = hexChar + hexAsStringOrInt;
+ }
+ return result;
+ } else {
+ return null;
+ }
+ }
+
+ public static File getMcDir() {
+ if (Utils.isClient()) {
+ if (Minecraft.getMinecraft() != null) {
+ return Minecraft.getMinecraft().mcDataDir;
+ }
+ }
+ return new File(".");
+ }
+
+ private static short cellID = 15;
+
+ public static ItemStack createInternalNameAndFluidCell(final String s) {
+ Logger.WARNING("1");
+ final InternalName yourName = EnumHelper.addEnum(InternalName.class, s, new Class[0], new Object[0]);
+ Logger.WARNING("2 " + yourName.name());
+ final ItemCell item = (ItemCell) Ic2Items.cell.getItem();
+ Logger.WARNING("3 " + item.getUnlocalizedName());
+ try {
+ Logger.WARNING("4");
+ final Class<? extends ItemCell> clz = item.getClass();
+ Logger.WARNING("5 " + clz.getSimpleName());
+ final Method methode = clz.getDeclaredMethod("addCell", int.class, InternalName.class, Block[].class);
+ Logger.WARNING("6 " + methode.getName());
+ methode.setAccessible(true);
+ Logger.WARNING("7 " + methode.isAccessible());
+ final ItemStack temp = (ItemStack) methode.invoke(item, cellID++, yourName, new Block[0]);
+ Logger.WARNING("Successfully created " + temp.getDisplayName() + "s.");
+ FluidContainerRegistry.registerFluidContainer(
+ FluidUtils.getFluidStack(s.toLowerCase(), 1000),
+ temp.copy(),
+ Ic2Items.cell.copy());
+ ItemUtils.addItemToOreDictionary(temp.copy(), "cell" + s);
+ return temp;
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String sanitizeString(final String input, final char[] dontRemove) {
+
+ // List of characters to remove
+ final HashSet<Character> toRemoveSet = new HashSet<>();
+ Collections.addAll(
+ toRemoveSet,
+ ' ',
+ '-',
+ '_',
+ '~',
+ '?',
+ '!',
+ '@',
+ '#',
+ '$',
+ '%',
+ '^',
+ '&',
+ '*',
+ '(',
+ ')',
+ '{',
+ '}',
+ '[',
+ ']');
+
+ // Remove characters from the toRemoveSet if they are in dontRemove
+ for (char e : dontRemove) {
+ toRemoveSet.remove(e);
+ }
+
+ // Construct a sanitized string
+ StringBuilder sanitized = new StringBuilder();
+ for (char c : input.toCharArray()) {
+ if (!toRemoveSet.contains(c)) {
+ sanitized.append(c);
+ }
+ }
+
+ return sanitized.toString();
+ }
+
+ public static String sanitizeString(final String input) {
+ String temp;
+ String output;
+
+ temp = input.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("?", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace("(", "");
+ temp = temp.replace(")", "");
+ temp = temp.replace("{", "");
+ temp = temp.replace("}", "");
+ temp = temp.replace("[", "");
+ temp = temp.replace("]", "");
+ temp = temp.replace(" ", "");
+ output = temp;
+ return output;
+ }
+
+ public static String sanitizeStringKeepBrackets(final String input) {
+ String temp;
+ String output;
+
+ temp = input.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("?", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ output = temp;
+ return output;
+ }
+
+ public static String addBookTitleLocalization(final String aTitle) {
+ return GT_LanguageManager
+ .addStringLocalization("Book." + aTitle + ".Name", aTitle, !GregTech_API.sPostloadFinished);
+ }
+
+ public static String[] addBookPagesLocalization(final String aTitle, final String[] aPages) {
+ String[] aLocalizationPages = new String[aPages.length];
+ for (byte i = 0; i < aPages.length; i = (byte) (i + 1)) {
+ aLocalizationPages[i] = GT_LanguageManager.addStringLocalization(
+ "Book." + aTitle + ".Page" + ((i < 10) ? "0" + i : Byte.valueOf(i)),
+ aPages[i],
+ !GregTech_API.sPostloadFinished);
+ }
+ return aLocalizationPages;
+ }
+
+ public static ItemStack getWrittenBook(ItemStack book, int ID, String mapping, String title, String author,
+ String[] pages) {
+
+ if (GT_Utility.isStringInvalid(mapping)) {
+ return null;
+ }
+
+ ItemStack stack = CORE.sBookList.get(mapping);
+ if (stack != null) {
+ return GT_Utility.copyAmount(1L, stack);
+ }
+
+ if (GT_Utility.isStringInvalid(title) || GT_Utility.isStringInvalid(author) || pages.length <= 0) {
+ return null;
+ }
+
+ stack = (book == null) ? new ItemStack(ModItems.itemCustomBook, 1, ID) : book;
+
+ NBTTagCompound NBT = new NBTTagCompound();
+ String localizationTitle = addBookTitleLocalization(title);
+ NBT.setString("title", localizationTitle);
+ NBT.setString("author", author);
+
+ NBTTagList NBTList = new NBTTagList();
+ String[] localizationPages = addBookPagesLocalization(title, pages);
+
+ for (byte i = 0; i < pages.length; i++) {
+ pages[i] = localizationPages[i].replaceAll("<BR>", "\n");
+ if (i < 48) {
+ if (pages[i].length() < 256) {
+ NBTList.appendTag(new NBTTagString(pages[i]));
+ } else {
+ Logger.INFO("WARNING: String for written Book too long! -> " + pages[i]);
+ GT_Log.err.println("WARNING: String for written Book too long! -> " + pages[i]);
+ }
+ } else {
+ Logger.INFO("WARNING: Too much Pages for written Book! -> " + title);
+ GT_Log.err.println("WARNING: Too much Pages for written Book! -> " + title);
+ break;
+ }
+ }
+
+ String credits = String.format(
+ "Credits to %s for writing this Book. This was Book Nr. %d at its creation. Gotta get 'em all!",
+ author,
+ ID);
+ NBTList.appendTag(new NBTTagString(credits));
+ NBT.setTag("pages", NBTList);
+
+ stack.setTagCompound(NBT);
+
+ String logMessage = String.format(
+ "GT++_Mod: Added Book to Book++ List - Mapping: '%s' - Name: '%s' - Author: '%s'",
+ mapping,
+ title,
+ author);
+ GT_Log.out.println(logMessage);
+
+ NBTUtils.createIntegerTagCompound(stack, "stats", "mMeta", ID);
+ CORE.sBookList.put(mapping, stack);
+
+ Logger.INFO(String.format("Creating book: %s by %s. Using Meta %d.", title, author, ID));
+
+ return GT_Utility.copy(stack);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/util/data/AES.java b/src/main/java/gtPlusPlus/core/util/data/AES.java
new file mode 100644
index 0000000000..85f20a3367
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/data/AES.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.util.data;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AES {
+
+ private final String secret;
+
+ private final SecretKeySpec secretKey;
+
+ private final byte[] key;
+
+ public AES() {
+
+ this("Darkness In Their Hearts");
+ }
+
+ public AES(String aSecret) {
+
+ secret = aSecret;
+
+ key = getBytes(getHashedString(secret));
+
+ secretKey = generateKey(key);
+ }
+
+ private static String getHashedString(String aString) {
+
+ return toHexString(getSHA(aString));
+ }
+
+ private static byte[] getSHA(String input) {
+
+ MessageDigest md;
+
+ try {
+
+ md = MessageDigest.getInstance("SHA-256");
+
+ return md.digest(input.getBytes(StandardCharsets.UTF_8));
+
+ } catch (NoSuchAlgorithmException e) {
+
+ e.printStackTrace();
+ }
+
+ return new byte[] {};
+ }
+
+ private static String toHexString(byte[] hash) {
+
+ BigInteger number = new BigInteger(1, hash);
+
+ StringBuilder hexString = new StringBuilder(number.toString(16));
+
+ while (hexString.length() < 32) {
+
+ hexString.insert(0, '0');
+ }
+
+ return hexString.toString();
+ }
+
+ private byte[] getBytes(String aKey) {
+
+ byte[] aKeyData;
+
+ MessageDigest sha;
+
+ try {
+
+ sha = MessageDigest.getInstance("SHA-256");
+
+ return sha.digest(aKey.getBytes(StandardCharsets.UTF_8));
+
+ } catch (NoSuchAlgorithmException e1) {
+
+ e1.printStackTrace();
+
+ try {
+
+ aKeyData = aKey.getBytes("UTF-8");
+
+ sha = MessageDigest.getInstance("SHA-1");
+
+ aKeyData = sha.digest(key);
+
+ aKeyData = Arrays.copyOf(key, 16);
+
+ return aKeyData;
+
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+
+ e.printStackTrace();
+
+ }
+ }
+
+ return new byte[] {};
+ }
+
+ private SecretKeySpec generateKey(byte[] aKey) {
+
+ return new SecretKeySpec(aKey, "AES");
+ }
+
+ public String decode(String strToDecrypt) {
+
+ try {
+
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
+
+ cipher.init(Cipher.DECRYPT_MODE, secretKey);
+
+ return new String(
+ cipher.doFinal(
+ Base64.getDecoder()
+ .decode(strToDecrypt)));
+
+ } catch (Exception ignored) {
+
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java b/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java
new file mode 100644
index 0000000000..d5ab990917
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.core.util.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+public class ArrayUtils {
+
+ public static <V> V[] insertElementAtIndex(V[] aArray, int aIndex, V aObjectToInsert) {
+ V[] newArray = Arrays.copyOf(aArray, aArray.length + 1);
+ for (int i = 0; i < aIndex; i++) {
+ newArray[i] = aArray[i];
+ }
+ newArray[aIndex] = aObjectToInsert;
+ for (int i = (aIndex + 1); i < newArray.length; i++) {
+ newArray[i] = aArray[i - 1];
+ }
+ return newArray;
+ }
+
+ public static Object[] removeNulls(final Object[] v) {
+ List<Object> list = new ArrayList<>(Arrays.asList(v));
+ list.removeAll(Collections.singleton((Object) null));
+ return list.toArray(new Object[list.size()]);
+ }
+
+ public static ItemStack[] removeNulls(final ItemStack[] v) {
+ List<ItemStack> list = new ArrayList<>(Arrays.asList(v));
+ list.removeAll(Collections.singleton((ItemStack) null));
+ return list.toArray(new ItemStack[list.size()]);
+ }
+
+ public static String toString(Object[] aArray, String string) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray, string);
+ }
+
+ public static String toString(Object[] aArray) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/util/data/FileUtils.java b/src/main/java/gtPlusPlus/core/util/data/FileUtils.java
new file mode 100644
index 0000000000..b2e5d04375
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/data/FileUtils.java
@@ -0,0 +1,112 @@
+package gtPlusPlus.core.util.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.List;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+
+public class FileUtils {
+
+ private static final Charset utf8 = StandardCharsets.UTF_8;
+
+ public static boolean doesFileExist(File f) {
+ if (f != null && f.exists() && !f.isDirectory()) {
+ return true;
+ }
+ return false;
+ }
+
+ public static File createFile(String path, String filename, String extension) {
+ File file = new File(Utils.getMcDir(), path + filename + extension);
+ return createFile(file);
+ }
+
+ public static File createFile(File aFile) {
+ boolean blnCreated = false;
+ Logger.INFO("Trying to use path " + aFile.getPath());
+ try {
+ Logger.INFO("Trying to use path " + aFile.getCanonicalPath());
+ Logger.INFO("Trying to use absolute path " + aFile.getAbsolutePath());
+ blnCreated = aFile.createNewFile();
+ } catch (IOException ioe) {
+ Logger.INFO("Error while creating a new empty file :" + ioe);
+ return null;
+ }
+ return blnCreated ? aFile : null;
+ }
+
+ public static File getFile(String filename, String extension) {
+ return getFile("", filename, extension);
+ }
+
+ public static File getFile(String path, String filename, String extension) {
+ if (path == null || path.length() <= 0) {
+ path = "";
+ } else {
+ path = path + "/";
+ }
+ if (filename == null || filename.length() <= 0) {
+ return null;
+ }
+ if (extension == null || extension.length() <= 0) {
+ extension = ".txt";
+ } else {
+ extension = "." + extension;
+ }
+ File file = new File(Utils.getMcDir(), path + filename + extension);
+ boolean doesExist = doesFileExist(file);
+
+ if (doesExist) {
+ Logger.INFO("Found File: " + file.getAbsolutePath());
+ return file;
+ } else {
+ Logger.INFO("Creating file, as it was not found.");
+ return createFile(path, filename, extension);
+ }
+ }
+
+ public static void appendListToFile(File file, List<String> content) {
+ try {
+ long oldSize;
+ long newSize;
+ if (doesFileExist(file)) {
+ Path p = Paths.get(file.getPath());
+ if (p != null && Files.isWritable(p)) {
+ oldSize = Files.size(p);
+ try {
+ Files.write(p, content, utf8, StandardOpenOption.APPEND);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ newSize = Files.size(p);
+ }
+ }
+ } catch (IOException ignored) {}
+ }
+
+ /**
+ * Reads the contents of a file line by line to a List of Strings using the default encoding for the VM. The file is
+ * always closed.
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the list of Strings representing each line in the file, never {@code null}
+ * @throws IOException in case of an I/O error
+ * @since 1.3
+ */
+ public static List<String> readLines(File file) {
+ try {
+ return org.apache.commons.io.FileUtils.readLines(file, utf8);
+ } catch (IOException e) {
+ return new ArrayList<>();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java b/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java
new file mode 100644
index 0000000000..f72e5c6a51
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java
@@ -0,0 +1,86 @@
+package gtPlusPlus.core.util.data;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GTPlusPlusEverglades;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import cpw.mods.fml.common.registry.GameData;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LocaleUtils {
+
+ public static void generateFakeLocaleFile() {
+ for (ModContainer modcontainer : Loader.instance()
+ .getModList()) {
+ if (modcontainer.getModId()
+ .toLowerCase()
+ .equals(GTPlusPlus.ID)) {
+ String S = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+ writeToFile(S);
+ dumpItemsAndBlocksForModContainer(modcontainer);
+ }
+ }
+ }
+
+ public static void dumpItemsAndBlocksForModContainer(ModContainer mod) {
+ writeToFile("Dumping Items from " + mod.getModId() + ".");
+ for (Object C : GameData.getItemRegistry()) {
+
+ try {
+
+ if (C != null) {
+ if (C instanceof Item R) {
+ ItemStack IS = ItemUtils.getSimpleStack(R);
+ String modid = ItemUtils.getModId(IS);
+ if (modid.equals(GTPlusPlus.ID) || modid.equals(GTPlusPlusEverglades.ID)) {
+ String S = "[" + modid + "] " + IS.getUnlocalizedName() + ".name=";
+ writeToFile(S);
+ }
+ }
+ }
+
+ } catch (Throwable ignored) {}
+ }
+ writeToFile("Dumping Blocks from " + mod.getModId() + ".");
+ for (Object B : GameData.getBlockRegistry()) {
+
+ try {
+
+ if (B != null) {
+ if (B instanceof Block R) {
+ ItemStack IS = ItemUtils.getSimpleStack(R);
+ String modid = ItemUtils.getModId(IS);
+ if (modid.equals(GTPlusPlus.ID) || modid.equals(GTPlusPlusEverglades.ID)) {
+ String S = "[" + modid + "] " + IS.getUnlocalizedName() + ".name=";
+ writeToFile(S);
+ }
+ }
+ }
+
+ } catch (Throwable ignored) {}
+ }
+
+ }
+
+ public static void writeToFile(String S) {
+ try {
+ File F = new File(Utils.getMcDir(), "config/GTplusplus/en_US.lang");
+ BufferedWriter writer;
+ writer = new BufferedWriter(new FileWriter(F, true));
+ writer.write(S);
+ writer.newLine();
+ writer.close();
+ } catch (IOException ignored) {}
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/data/StringUtils.java b/src/main/java/gtPlusPlus/core/util/data/StringUtils.java
new file mode 100644
index 0000000000..77efadbc9a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/data/StringUtils.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.core.util.data;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.Utils;
+
+public class StringUtils {
+
+ public static String superscript(String str) {
+ str = str.replaceAll("0", "\u2070");
+ str = str.replaceAll("1", "\u00B9");
+ str = str.replaceAll("2", "\u00B2");
+ str = str.replaceAll("3", "\u00B3");
+ str = str.replaceAll("4", "\u2074");
+ str = str.replaceAll("5", "\u2075");
+ str = str.replaceAll("6", "\u2076");
+ str = str.replaceAll("7", "\u2077");
+ str = str.replaceAll("8", "\u2078");
+ str = str.replaceAll("9", "\u2079");
+ return str;
+ }
+
+ public static String subscript(String str) {
+ str = str.replaceAll("0", "\u2080");
+ str = str.replaceAll("1", "\u2081");
+ str = str.replaceAll("2", "\u2082");
+ str = str.replaceAll("3", "\u2083");
+ str = str.replaceAll("4", "\u2084");
+ str = str.replaceAll("5", "\u2085");
+ str = str.replaceAll("6", "\u2086");
+ str = str.replaceAll("7", "\u2087");
+ str = str.replaceAll("8", "\u2088");
+ str = str.replaceAll("9", "\u2089");
+ return str;
+ }
+
+ public static boolean containsSuperOrSubScript(final String s) {
+ if (s.contains(StringUtils.superscript("0"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("1"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("2"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("3"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("4"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("5"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("6"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("7"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("8"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("9"))) {
+ return true;
+ }
+ if (s.contains(StringUtils.subscript("0"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("1"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("2"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("3"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("4"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("5"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("6"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("7"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("8"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("9"))) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String firstLetterCaps(String data) {
+ String firstLetter = data.substring(0, 1)
+ .toUpperCase();
+ String restLetters = data.substring(1)
+ .toLowerCase();
+ return firstLetter + restLetters;
+ }
+
+ public static <V> String getDataStringFromArray(V[] parameterTypes) {
+ if (parameterTypes == null || parameterTypes.length == 0) {
+ return "empty/null";
+ } else {
+ StringBuilder aData = new StringBuilder();
+ for (V y : parameterTypes) {
+ if (y != null) {
+ aData.append(", ")
+ .append(y);
+ }
+ }
+ return aData.toString();
+ }
+ }
+
+ /**
+ * Is this a special regex character for delimination? (.$|()[]{}^?*+\\)
+ *
+ * @param aChar - The char to test
+ * @return - Is this a special character?
+ */
+ public static boolean isSpecialCharacter(char aChar) {
+ return aChar == '"' || aChar == '.'
+ || aChar == '$'
+ || aChar == '|'
+ || aChar == '('
+ || aChar == ')'
+ || aChar == '['
+ || aChar == ']'
+ || aChar == '{'
+ || aChar == '}'
+ || aChar == '^'
+ || aChar == '?'
+ || aChar == '*'
+ || aChar == '+'
+ || aChar == '\\';
+ }
+
+ public static boolean isEscaped(String aString) {
+ return aString.charAt(0) == '\\';
+ }
+
+ public static String splitAndUppercase(String aInput, String aDelim) {
+
+ if (!isEscaped(aDelim)) {
+ boolean isSpecial = false;
+ for (int o = 0; o < aInput.length(); o++) {
+ if (isSpecialCharacter(aInput.charAt(o))) {
+ isSpecial = true;
+ }
+ }
+ if (isSpecial) {
+ aDelim = "\\" + aDelim;
+ }
+ }
+
+ Logger.INFO("Splitting " + aInput);
+ String[] aSplit = aInput.split(aDelim);
+ Logger.INFO("Split into " + aSplit == null ? "" + 0 : aSplit.length + " parts.");
+ if (aSplit == null || aSplit.length == 0) {
+ return aInput;
+ } else {
+ AutoMap<String> aTemp = new AutoMap<>();
+ for (String s : aSplit) {
+ Logger.INFO("Found: " + s);
+ s = s.replace(".", "");
+ s = Utils.sanitizeString(s);
+ s = firstLetterCaps(s);
+ Logger.INFO("Formatted & Captilized: " + s);
+ aTemp.put(s);
+ }
+ Logger.INFO("Rebuilding");
+ StringBuilder aReturn = new StringBuilder();
+ for (String s : aTemp) {
+ aReturn.append(s);
+ Logger.INFO("Step: " + aReturn);
+ }
+ return aReturn.toString();
+ }
+ }
+
+ public static long uppercaseCount(String aString) {
+ return aString.chars()
+ .filter(Character::isUpperCase)
+ .count();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/math/MathUtils.java b/src/main/java/gtPlusPlus/core/util/math/MathUtils.java
new file mode 100644
index 0000000000..ac3ef2e947
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/math/MathUtils.java
@@ -0,0 +1,528 @@
+package gtPlusPlus.core.util.math;
+
+import java.text.NumberFormat;
+import java.util.Map;
+import java.util.Random;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+
+public class MathUtils {
+
+ static final Random rand = CORE.RANDOM;
+
+ /** Formats a number with group separator and at most 2 fraction digits. */
+ private static final NumberFormat sNumberFormat = NumberFormat.getInstance();
+
+ static {
+ sNumberFormat.setMaximumFractionDigits(2);
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Integer.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Integer between min and max, inclusive.
+ * @see java.util.Random#nextInt(int)
+ */
+ public static int randInt(final int min, final int max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return rand.nextInt((max - min) + 1) + min;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Long.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Long between min and max, inclusive.
+ * @see java.util.Random#nextLong(long)
+ */
+ public static long randLong(final long min, final long max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextLong(rand, (max - min) + 1) + min;
+ }
+
+ private static long nextLong(final Random rng, final long n) {
+ // error checking and 2^x checking removed for simplicity.
+ long bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Double.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Double between min and max, inclusive.
+ * @see java.util.Random#nextDouble(double)
+ */
+ public static double randDouble(final double min, final double max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextDouble(rand, (max - min) + 1) + min;
+ }
+
+ private static double nextDouble(final Random rng, final double n) {
+ // error checking and 2^x checking removed for simplicity.
+ double bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Float.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Float between min and max, inclusive.
+ * @see java.util.Random#nextFloat(float)
+ */
+ public static float randFloat(final float min, final float max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextFloat(rand, (max - min) + 1) + min;
+ }
+
+ private static float nextFloat(final Random rng, final float n) {
+ // error checking and 2^x checking removed for simplicity.
+ float bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a percentage. The returned number is the % of X in Y. Supports Doubles.
+ *
+ * @param current Current value.
+ * @param max Maximim value. Must be greater than min.
+ * @return double between min and max, inclusive.
+ */
+ public static double findPercentage(final double current, final double max) {
+ return Math.round(((current / max) * 100) * 100.00) / 100.00;
+ }
+
+ /**
+ * Returns a percentage. The returned number is the % of X in Y. Supports Floats.
+ *
+ * @param current Current value.
+ * @param max Maximim value. Must be greater than min.
+ * @return double between min and max, inclusive.
+ */
+ public static float findPercentage(final float current, final float max) {
+ return (float) (Math.round(((current / max) * 100) * 100.00) / 100.00);
+ }
+
+ public static int findPercentageOfInt(long input, float percentage) {
+ return (int) (input * (percentage / 100.0f));
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a double. The returned number is d rounded to the nearest d.01. Supports Doubles.
+ *
+ * @return double Rounded value.
+ */
+ public static double decimalRounding(final double d) {
+ return Math.round(d * 2) / 2.0;
+ }
+
+ // Smooth Rounding Function (Nearest 5)
+ /**
+ * Returns a double. The returned number is d rounded to the nearest d.5. Supports Doubles.
+ *
+ * @return double Rounded value.
+ */
+ public static double decimalRoundingToWholes(final double d) {
+ return 5 * (Math.round(d / 5));
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a integer. The returned number is d rounded to the nearest flat integer. Supports Doubles as input.
+ *
+ * @return integer Rounded value.
+ */
+ public static int roundToClosestInt(final double d) {
+ return (int) (Math.round(d * 2) / 2.0);
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a long. The returned number is d rounded to the nearest flat long. Supports Doubles as input.
+ *
+ * @return long Rounded value.
+ */
+ public static long roundToClosestLong(final double d) {
+ return (long) (Math.round(d * 2) / 2.0);
+ }
+
+ /**
+ * Returns a boolean. The returned boolean is based on the odd/eveness of the input. Supports ints.
+ *
+ * @param x Value A.
+ * @return boolean Whether or not it divides evenly.
+ */
+ public static boolean isNumberEven(final long x) {
+ if ((x % 2) == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns an int. The returned number is the value on i + 273.15F. Supports ints.
+ *
+ * @param i Temp in Celcius.
+ * @return int The celcius temp returned as Kelvin, rounded to the readest whole.
+ */
+ public static float celsiusToKelvin(final int i) {
+ final double f = i + 273.15F;
+ return (int) decimalRoundingToWholes(f);
+ }
+
+ /**
+ * Returns a random hex value. The returned value is between 000000-ffffff.
+ *
+ * @return hexInteger between min and max, inclusive.
+ */
+ public static int generateSingularRandomHexValue() {
+ String temp;
+ final int randomInt = randInt(1, 5);
+ final Map<Integer, String> colours = Utils.hexColourGeneratorRandom(5);
+
+ if ((colours.get(randomInt) != null) && (colours.size() > 0)) {
+ temp = colours.get(randomInt);
+ } else {
+ temp = "0F0F0F";
+ }
+
+ Logger.WARNING("Operating with " + temp);
+ temp = Utils.appenedHexNotationToString(String.valueOf(temp));
+ return Integer.decode(temp);
+ }
+
+ public static long[] simplifyNumbersToSmallestForm(final long[] inputArray) {
+ final long GCD = gcd(inputArray);
+ final long[] outputArray = new long[inputArray.length];
+ for (int i = 0; i < inputArray.length; i++) {
+ if (GCD != 0) {
+ outputArray[i] = (inputArray[i] / GCD);
+ } else {
+ outputArray[i] = inputArray[i];
+ }
+ }
+ if (outputArray.length > 0) {
+ return outputArray;
+ }
+ return new long[] {};
+ }
+
+ private static long gcd(long a, long b) {
+ while (b > 0) {
+ final long temp = b;
+ b = a % b; // % is remainder
+ a = temp;
+ }
+ return a;
+ }
+
+ private static long gcd(final long[] input) {
+ long result = input[0];
+ for (int i = 1; i < input.length; i++) {
+ result = gcd(result, input[i]);
+ }
+ return result;
+ }
+
+ public static int getRgbAsHex(final short[] RGBA) {
+ final int returnValue = Utils.rgbtoHexValue(RGBA[0], RGBA[1], RGBA[2]);
+ return (returnValue == 0) ? 0 : returnValue;
+ }
+
+ public static byte safeByte(long number) {
+ return number > Byte.MAX_VALUE ? Byte.MAX_VALUE : (byte) number;
+ }
+
+ public static short safeShort(long number) {
+ return number > Short.MAX_VALUE ? Short.MAX_VALUE : (short) number;
+ }
+
+ public static int safeInt(long number, int margin) {
+ return number > Integer.MAX_VALUE - margin ? Integer.MAX_VALUE - margin : (int) number;
+ }
+
+ public static int safeInt(long number) {
+ return number > GT_Values.V[GT_Values.V.length - 1] ? safeInt(GT_Values.V[GT_Values.V.length - 1], 1)
+ : number < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) number;
+ }
+
+ public static int getRandomFromArray(int[] mValues) {
+ int[] mLargeChanceArray = new int[(mValues.length - 1) * 1000];
+ int mValueSelection;
+ for (int g = 0; g < mLargeChanceArray.length; g++) {
+ mValueSelection = randInt(0, mValues.length - 1);
+ mLargeChanceArray[g] = mValues[mValueSelection];
+ }
+ return mLargeChanceArray[randInt(0, mLargeChanceArray.length - 1)];
+ }
+
+ /*
+ * Averages
+ */
+
+ public static byte getByteAverage(AutoMap<Byte> aDataSet) {
+ byte[] aNewSet = new byte[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ byte b = getSafeByte(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getByteAverage(aNewSet);
+ }
+
+ public static short getShortAverage(AutoMap<Short> aDataSet) {
+ short[] aNewSet = new short[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ short b = getSafeShort(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getShortAverage(aNewSet);
+ }
+
+ public static int getIntAverage(AutoMap<Integer> aDataSet) {
+ int[] aNewSet = new int[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ int b = getSafeInt(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getIntAverage(aNewSet);
+ }
+
+ public static long getLongAverage(AutoMap<Long> aDataSet) {
+ long[] aNewSet = new long[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ long b = getSafeLong(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getLongAverage(aNewSet);
+ }
+
+ public static byte getByteAverage(byte[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ byte total = 0;
+ for (byte i : aDataSet) {
+ total += i;
+ }
+ byte result = safeByte(total / divisor);
+ return result;
+ }
+
+ public static short getShortAverage(short[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ Logger.WARNING("Calculating Average Short. Divisor: " + divisor);
+ short total = 0;
+ for (short i : aDataSet) {
+ Logger.WARNING("Adding " + i);
+ total += i;
+ }
+ short result = safeShort((total / divisor));
+ Logger.WARNING("Average: " + result);
+ return result;
+ }
+
+ public static int getIntAverage(int[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ int total = 0;
+ for (int i : aDataSet) {
+ total += i;
+ }
+ int result = safeInt(total / divisor);
+ return result;
+ }
+
+ public static long getLongAverage(long[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ long total = 0;
+ for (long i : aDataSet) {
+ total += i;
+ }
+ return (total / divisor);
+ }
+
+ public static int howManyPlaces(int aValueForGen) {
+ if (aValueForGen < 0) {
+ aValueForGen = makeNegative(aValueForGen);
+ }
+ String a = String.valueOf(aValueForGen);
+ return a.length();
+ }
+
+ /**
+ * Inverts the value, making Positives into Negatives and vice versa.
+ *
+ * @param aPositive - An int value, either positive or negative.
+ * @return - Inverted int Value.
+ */
+ public static int makeNegative(int aPositive) {
+ if (aPositive > 0) {
+ return -aPositive;
+ } else if (aPositive < 0) {
+ return +aPositive;
+ } else {
+ return 0;
+ }
+ }
+
+ public static <V> V safeCast(Object aNumberType) {
+ long a1;
+ double a2;
+ a1 = Long.parseLong(aNumberType.toString());
+ a2 = Double.parseDouble(aNumberType.toString());
+
+ if ((aNumberType.getClass() == byte.class) || (aNumberType instanceof Byte)) {
+ if (a1 >= Byte.MIN_VALUE && a1 <= Byte.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Byte s1 = Byte.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == short.class) || (aNumberType instanceof Short)) {
+ if (a1 >= Short.MIN_VALUE && a1 <= Short.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Short s1 = Short.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == int.class) || (aNumberType instanceof Integer)) {
+ if (a1 >= Integer.MIN_VALUE && a1 <= Integer.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Integer s1 = Integer.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == long.class) || (aNumberType instanceof Long)) {
+ if (a1 >= Long.MIN_VALUE && a1 <= Long.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Long s1 = Long.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == float.class) || (aNumberType instanceof Float)) {
+ if (a2 >= Float.MIN_VALUE && a2 <= Float.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Float s1 = Float.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == double.class) || (aNumberType instanceof Double)) {
+ if (a2 >= Double.MIN_VALUE && a2 <= Double.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Double s1 = Double.valueOf(s);
+ return (V) s1;
+ }
+ }
+
+ Integer o = 0;
+ return (V) o;
+ }
+
+ public static byte getSafeByte(Byte b) {
+ Byte a = safeCast(b);
+ return a;
+ }
+
+ public static short getSafeShort(Short b) {
+ Short a = safeCast(b);
+ return a;
+ }
+
+ public static int getSafeInt(Integer b) {
+ Integer a = safeCast(b);
+ return a;
+ }
+
+ public static long getSafeLong(Long b) {
+ Long a = safeCast(b);
+ return a;
+ }
+
+ public static int safeCast_LongToInt(long o) {
+ if (o > Integer.MAX_VALUE) {
+ return Integer.MAX_VALUE;
+ } else {
+ int i = (int) o;
+ return i;
+ }
+ }
+
+ /**
+ * Balances a number within a range.
+ *
+ * @param aInput - The number to balance
+ * @param aMin - The minimum bounds
+ * @param aMax - The maximum bounds
+ * @return - An Integer which will be between the bounds, or a boundary value.
+ */
+ public static int balance(int aInput, int aMin, int aMax) {
+ return Math.max(Math.min(aInput, aMax), aMin);
+ }
+
+ /**
+ * Returns the smaller of two {@code Number}s. That is, the result the argument closer to the value of
+ * {@link Long#MIN_VALUE}. If the arguments have the same value, the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the smaller of {@code a} and {@code b}.
+ */
+ public static Number min(Number a, Number b) {
+ return (a.longValue() <= b.longValue()) ? a : b;
+ }
+
+ /**
+ * Returns the greater of two {@code Number}s. That is, the result is the argument closer to the value of
+ * {@link Long#MAX_VALUE}. If the arguments have the same value, the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the larger of {@code a} and {@code b}.
+ */
+ public static Number max(Number a, Number b) {
+ return (a.longValue() >= b.longValue()) ? a : b;
+ }
+
+ public static String formatNumbers(long aNumber) {
+ return sNumberFormat.format(aNumber);
+ }
+
+ public static String formatNumbers(double aNumber) {
+ return sNumberFormat.format(aNumber);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java
new file mode 100644
index 0000000000..87bd0e60c6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java
@@ -0,0 +1,146 @@
+package gtPlusPlus.core.util.minecraft;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureAttribute;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.handler.events.EntityDeathHandler;
+import ic2.core.IC2Potion;
+import ic2.core.item.armor.ItemArmorHazmat;
+
+public class EntityUtils {
+
+ public static void setEntityOnFire(final Entity aEntity, final int length) {
+ if (!isEntityImmuneToFire(aEntity)) {
+ aEntity.setFire(length);
+ }
+ }
+
+ public static boolean isEntityImmuneToFire(Entity aEntity) {
+ return aEntity.isImmuneToFire();
+ }
+
+ public static BlockPos findBlockPosUnderEntity(final Entity parEntity) {
+ final int blockX = MathHelper.floor_double(parEntity.posX);
+ final int blockY = MathHelper.floor_double(parEntity.boundingBox.minY) - 1;
+ final int blockZ = MathHelper.floor_double(parEntity.posZ);
+ return new BlockPos(blockX, blockY, blockZ, parEntity.worldObj);
+ }
+
+ public static BlockPos findBlockPosOfEntity(final Entity parEntity) {
+ final int blockX = MathHelper.floor_double(parEntity.posX);
+ final int blockY = MathHelper.floor_double(parEntity.boundingBox.minY);
+ final int blockZ = MathHelper.floor_double(parEntity.posZ);
+ return new BlockPos(blockX, blockY, blockZ, parEntity.worldObj);
+ }
+
+ public static void applyRadiationDamageToEntity(final int stackSize, final int radiationLevel, final World world,
+ final Entity entityHolding) {
+ if (!world.isRemote) {
+ if ((radiationLevel > 0) && (entityHolding instanceof final EntityLivingBase entityLiving)) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ if (!ItemArmorHazmat.hasCompleteHazmat(entityLiving)
+ && !GT_Utility.isWearingFullRadioHazmat(entityLiving)) {
+ if (entityLiving.getActivePotionEffect(IC2Potion.radiation) != null) {
+ entityLiving.getActivePotionEffect(IC2Potion.radiation);
+ }
+ applyRadioactivity(entityLiving, radiationLevel, stackSize);
+ }
+ }
+ }
+ }
+ }
+
+ public static void applyRadioactivity(EntityLivingBase aEntity, int aLevel, int aAmountOfItems) {
+ if (aLevel > 0 && aEntity != null
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.ARTHROPOD
+ && !ItemArmorHazmat.hasCompleteHazmat(aEntity)) {
+ PotionEffect tEffect;
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.moveSlowdown.id,
+ aLevel * 140 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.moveSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.digSlowdown.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.digSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.confusion.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.confusion)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.weakness.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.weakness)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.hunger.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.hunger)) == null ? 0 : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ IC2Potion.radiation.id,
+ aLevel * 180 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.potionTypes[24])) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ }
+ }
+
+ public static void applyHeatDamageToEntity(final int heatLevel, final World world, final Entity entityHolding) {
+ if (!world.isRemote) {
+ if ((heatLevel > 0) && (entityHolding instanceof final EntityLivingBase entityLiving)) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ if (!GT_Utility.isWearingFullHeatHazmat(entityLiving)) {
+ GT_Utility.applyHeatDamage(entityLiving, heatLevel);
+ }
+ }
+ }
+ }
+ }
+
+ public static void doDamage(Entity entity, DamageSource dmg, int i) {
+ entity.attackEntityFrom(dmg, i);
+ }
+
+ /**
+ * Provides the ability to provide custom drops upon the death of EntityLivingBase objects.
+ *
+ * @param aMobClass - The Base Class you want to drop this item.
+ * @param aStack - The ItemStack, stack size is not respected.
+ * @param aMaxAmount - The maximum size of the ItemStack which drops.
+ * @param aChance - Chance out of 10000, where 100 is 1%. (1 = 0.01% - this is ok)
+ */
+ public static void registerDropsForMob(Class<?> aMobClass, ItemStack aStack, int aMaxAmount, int aChance) {
+ EntityDeathHandler.registerDropsForMob(aMobClass, aStack, aMaxAmount, aChance);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java
new file mode 100644
index 0000000000..2b6e96541d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java
@@ -0,0 +1,667 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.HashMap;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.FluidGT6;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.cell.BaseItemPlasmaCell;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class FluidUtils {
+
+ private static HashMap<String, Fluid> sFluidCache = new HashMap<>();
+
+ public static FluidStack getWater(final int amount) {
+ return FluidUtils.getFluidStack("water", amount);
+ }
+
+ public static FluidStack getDistilledWater(final int amount) {
+ return FluidUtils.getFluidStack("ic2distilledwater", amount);
+ }
+
+ public static FluidStack getHotWater(final int amount) {
+ return FluidUtils.getFluidStack("ic2hotwater", amount);
+ }
+
+ public static FluidStack getLava(final int amount) {
+ return FluidUtils.getFluidStack("lava", amount);
+ }
+
+ public static FluidStack getPahoehoeLava(final int amount) {
+ return FluidUtils.getFluidStack("ic2pahoehoelava", amount);
+ }
+
+ public static FluidStack getSteam(final int amount) {
+ return FluidUtils.getFluidStack("steam", amount);
+ }
+
+ public static FluidStack getSuperHeatedSteam(final int amount) {
+ return FluidUtils.getFluidStack("ic2superheatedsteam", amount);
+ }
+
+ public static FluidStack getHydrofluoricAcid(int amount) {
+ return FluidUtils.getFluidStack("hydrofluoricacid", amount);
+ }
+
+ public static Fluid sGregtechHydrofluoricAcid = null;
+
+ public static FluidStack getHydrofluoricAcidGT(int amount) {
+ if (sGregtechHydrofluoricAcid == null) {
+ FluidStack aGTHF = FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 1);
+ sGregtechHydrofluoricAcid = aGTHF != null ? aGTHF.getFluid() : getHydrofluoricAcid(1).getFluid();
+ }
+ return FluidUtils.getFluidStack(sGregtechHydrofluoricAcid, amount);
+ }
+
+ public static boolean doesHydrofluoricAcidGtExist() {
+ if (sGregtechHydrofluoricAcid == null) {
+ getHydrofluoricAcidGT(1);
+ }
+ return sGregtechHydrofluoricAcid != null && sGregtechHydrofluoricAcid != getHydrofluoricAcid(1).getFluid();
+ }
+
+ private static FluidStack createFluidStack(Fluid aFluid, int aAmount) {
+ if (aFluid != null) {
+ return new FluidStack(aFluid, aAmount);
+ }
+ return null;
+ }
+
+ public static FluidStack getFluidStack(final String aFluidName, final int aAmount) {
+ Fluid aFluid = sFluidCache.get(aFluidName);
+ if (aFluid != null) {
+ return createFluidStack(aFluid, aAmount);
+ } else {
+ Fluid aLookupFluid = FluidRegistry.getFluid(aFluidName);
+ if (aLookupFluid != null) {
+ sFluidCache.put(aFluidName, aLookupFluid);
+ return createFluidStack(aLookupFluid, aAmount);
+ }
+ }
+ return null;
+ }
+
+ public static FluidStack getFluidStack(final FluidStack aFluidStack, final int aAmount) {
+ if (aFluidStack == null) {
+ return null;
+ }
+ return new FluidStack(aFluidStack, aAmount);
+ }
+
+ public static FluidStack getFluidStack(final Fluid aFluid, final int aAmount) {
+ if (aFluid == null) {
+ return null;
+ }
+ return new FluidStack(aFluid, aAmount);
+ }
+
+ public static Fluid addGtFluid(final String aName, final String aLocalized, final GT_Materials aMaterial,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount) {
+ return addGtFluid(
+ aName,
+ aLocalized,
+ aMaterial,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ true);
+ }
+
+ public static Fluid addGtFluid(final String aName, final String aLocalized, final GT_Materials aMaterial,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ Fluid g = addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aMaterial != null ? aMaterial.mRGBa : new short[] { 255, 255, 255, 0 },
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ if (aMaterial != null) {
+ switch (aState) {
+ case 1 -> {
+ aMaterial.mFluid = (g);
+ }
+ case 2 -> {
+ aMaterial.mGas = (g);
+ }
+ case 3 -> {
+ aMaterial.mPlasma = (g);
+ }
+ }
+ }
+ return g;
+ }
+
+ public static Fluid addGTFluid(final String aName, final String aLocalized, final short[] aRGBa, final int aState,
+ final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ "molten." + aName,
+ "molten.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTFluidNonMolten(final String aName, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ "fluid." + aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTFluidNoPrefix(final String aName, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ // Gas
+ public static Fluid addGtGas(final String aName, final String aLocalized, final short[] aRGBa, final int aState,
+ final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTPlasma(final Material aMaterial) {
+ if (aMaterial.getLocalizedName()
+ .toLowerCase()
+ .contains("clay")
+ || (aMaterial.getComposites()
+ .size() > 1)
+ || aMaterial.getLocalizedName()
+ .toLowerCase()
+ .contains("wrought")) {
+ return null;
+ }
+ Logger.INFO("Generating a " + aMaterial.getLocalizedName() + " Plasma Cell");
+ if (aMaterial.vComponentCount != 1) {
+ Logger.INFO("Compound made from: ");
+ for (final MaterialStack x : aMaterial.getComposites()) {
+ Logger.INFO(
+ x.getStackMaterial()
+ .getLocalizedName());
+ }
+ Logger.INFO("Material is a composite, not generating plasma.");
+ return null;
+ }
+
+ ItemStack temp = null;
+ // Generate a Cell if we need to
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellPlasma" + aMaterial.getUnlocalizedName(), 1)
+ == null) {
+ new BaseItemPlasmaCell(aMaterial);
+ temp = aMaterial.getPlasmaCell(1);
+ } else {
+ temp = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellPlasma" + aMaterial.getUnlocalizedName(), 1);
+ }
+ if (temp != null) {
+ return addGTFluid(
+ "plasma." + Utils.sanitizeString(
+ aMaterial.getLocalizedName()
+ .toLowerCase()),
+ "plasma.autogenerated",
+ aMaterial.getLocalizedName() + " Plasma",
+ aMaterial.getRGBA(),
+ 3,
+ 10000,
+ temp,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ }
+ return null;
+ }
+
+ public static Fluid addGTFluid(String aName, final String aTexture, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateFilledCell) {
+
+ String aNameOriginal = aName;
+ Logger.INFO("Generating Fluid for " + aName);
+
+ aName = Utils.sanitizeString(aName.toLowerCase());
+
+ String aLocalName = (aLocalized == null) ? aName : aLocalized;
+
+ Fluid rFluid;
+ Fluid gFluid = FluidRegistry.getFluid(aName);
+ FluidStack aCheck = FluidUtils.getWildcardFluidStack(aName.toLowerCase(), 1000);
+ boolean register = false;
+ if (aCheck != null) {
+ rFluid = aCheck.getFluid();
+ } else if (gFluid != null) {
+ rFluid = gFluid;
+ } else {
+ rFluid = new FluidGT6(aName, aTexture, (aRGBa != null) ? aRGBa : Dyes._NULL.getRGBA());
+ register = true;
+ }
+
+ if (register) {
+ GT_LanguageManager.addStringLocalization(rFluid.getUnlocalizedName(), aLocalName);
+ if (FluidRegistry.registerFluid(rFluid)) {
+ switch (aState) {
+ case 0 -> {
+ rFluid.setGaseous(false);
+ rFluid.setViscosity(10000);
+ }
+ case 1, 4 -> {
+ rFluid.setGaseous(false);
+ rFluid.setViscosity(1000);
+ }
+ case 2 -> {
+ rFluid.setGaseous(true);
+ rFluid.setDensity(-100);
+ rFluid.setViscosity(200);
+ }
+ case 3 -> {
+ rFluid.setGaseous(true);
+ rFluid.setDensity(-10000);
+ rFluid.setViscosity(10);
+ rFluid.setLuminosity(15);
+ }
+ }
+ }
+ }
+
+ String aNameNonMolten = aLocalName.contains("Molten") ? aLocalName.replace("Molten", "") : aLocalName;
+
+ if (aFullContainer == null) {
+ ItemStack oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aLocalName, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer == null) {
+ oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aNameOriginal, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer == null) {
+ oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aNameNonMolten, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer != null) {
+ Logger.INFO("Found cell for " + aNameNonMolten);
+ }
+ } else {
+ Logger.INFO("Found cell for " + aNameOriginal);
+ }
+ } else {
+ Logger.INFO("Found cell for " + aLocalName);
+ }
+ }
+
+ Item tempCell = null;
+ // Generate a Cell if we need to
+ if (aGenerateFilledCell && aFullContainer == null) {
+ String aMatName = aNameOriginal;
+ if (aMatName.contains("molten.")) {
+ aMatName = aMatName.replace("molten.", "");
+ aMatName = aMatName.substring(0, 1)
+ .toUpperCase() + aMatName.substring(1);
+ }
+ if (aMatName.contains("fluid.")) {
+ aMatName = aMatName.replace("fluid.", "");
+ aMatName = aMatName.substring(0, 1)
+ .toUpperCase() + aMatName.substring(1);
+ }
+ Logger.INFO("Generating cell for " + aMatName + ", " + aLocalName);
+ tempCell = new BaseItemComponent(aMatName, aLocalName, aRGBa);
+ aFullContainer = ItemUtils.getSimpleStack(tempCell);
+ }
+
+ if ((rFluid.getTemperature() == new Fluid("test").getTemperature()) || (rFluid.getTemperature() <= 0)) {
+ rFluid.setTemperature((int) (aTemperatureK));
+ }
+ if ((aFullContainer != null) && (aEmptyContainer != null)
+ && !FluidContainerRegistry
+ .registerFluidContainer(new FluidStack(rFluid, aFluidAmount), aFullContainer, aEmptyContainer)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1L))
+ .itemOutputs(aFullContainer)
+ .fluidInputs(new FluidStack(rFluid, aFluidAmount))
+ .duration(4)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ }
+ return rFluid;
+ }
+
+ public static boolean valid(final Object aStack) {
+ return (aStack instanceof ItemStack) && (((ItemStack) aStack).getItem() != null)
+ && (((ItemStack) aStack).stackSize >= 0);
+ }
+
+ public static boolean invalid(final Object aStack) {
+ return !(aStack instanceof ItemStack) || (((ItemStack) aStack).getItem() == null)
+ || (((ItemStack) aStack).stackSize < 0);
+ }
+
+ public static boolean equal(final ItemStack aStack1, final ItemStack aStack2) {
+ return equal(aStack1, aStack2, false);
+ }
+
+ public static boolean equal(final ItemStack aStack1, final ItemStack aStack2, final boolean aIgnoreNBT) {
+ return (aStack1 != null) && (aStack2 != null) && equal_(aStack1, aStack2, aIgnoreNBT);
+ }
+
+ public static boolean equal_(final ItemStack aStack1, final ItemStack aStack2, final boolean aIgnoreNBT) {
+ return (aStack1.getItem() == aStack2.getItem())
+ && (aIgnoreNBT || ((aStack1.getTagCompound() == null == (aStack2.getTagCompound() == null))
+ && ((aStack1.getTagCompound() == null) || aStack1.getTagCompound()
+ .equals(aStack2.getTagCompound()))))
+ && ((meta(aStack1) == meta(aStack2)) || (meta(aStack1) == 32767) || (meta(aStack2) == 32767));
+ }
+
+ public static ItemStack copy(final Object... aStacks) {
+ for (final Object tStack : aStacks) {
+ if (valid(tStack)) {
+ return ((ItemStack) tStack).copy();
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack copyMeta(final long aMetaData, final Object... aStacks) {
+ final ItemStack rStack = copy(aStacks);
+ if (invalid(rStack)) {
+ return null;
+ }
+ return meta(rStack, aMetaData);
+ }
+
+ public static short meta(final ItemStack aStack) {
+ return (short) Items.feather.getDamage(aStack);
+ }
+
+ public static ItemStack meta(final ItemStack aStack, final long aMeta) {
+ Items.feather.setDamage(aStack, (short) aMeta);
+ return aStack;
+ }
+
+ public static ItemStack amount(final long aAmount, final Object... aStacks) {
+ final ItemStack rStack = copy(aStacks);
+ if (invalid(rStack)) {
+ return null;
+ }
+ rStack.stackSize = (int) aAmount;
+ return rStack;
+ }
+
+ public static ItemStack container(final ItemStack aStack, final boolean aCheckIFluidContainerItems) {
+ if (invalid(aStack)) {
+ return null;
+ }
+ if (aStack.getItem()
+ .hasContainerItem(aStack)) {
+ return aStack.getItem()
+ .getContainerItem(aStack);
+ }
+ if (equal(aStack, ItemUtils.getEmptyCell(), true)) {
+ return null;
+ }
+ if (aCheckIFluidContainerItems && (aStack.getItem() instanceof IFluidContainerItem)
+ && (((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0)) {
+ final ItemStack tStack = amount(1L, aStack);
+ ((IFluidContainerItem) aStack.getItem()).drain(tStack, Integer.MAX_VALUE, true);
+ if (!equal(aStack, tStack)) {
+ return tStack;
+ }
+ return null;
+ }
+ if (equal(aStack, ItemList.IC2_ForgeHammer.get(1)) || equal(aStack, ItemList.IC2_WireCutter.get(1))) {
+ return copyMeta(meta(aStack) + 1, aStack);
+ }
+ return null;
+ }
+
+ public static ItemStack container(final ItemStack aStack, final boolean aCheckIFluidContainerItems,
+ final int aStacksize) {
+ return amount(aStacksize, container(aStack, aCheckIFluidContainerItems));
+ }
+
+ public static Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final ItemStack dustStack, final ItemStack dustStack2) {
+ return generateFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ MeltingPoint,
+ RGBA,
+ dustStack,
+ dustStack2,
+ 144,
+ true);
+ }
+
+ public static Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final ItemStack dustStack, final ItemStack dustStack2,
+ final boolean aGenerateCell) {
+ return generateFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ MeltingPoint,
+ RGBA,
+ dustStack,
+ dustStack2,
+ 144,
+ aGenerateCell);
+ }
+
+ public static final Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, ItemStack dustStack, final ItemStack dustStack2,
+ final int amountPerItem, final boolean aGenerateCell) {
+ if (dustStack == null) {
+ dustStack = ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken("dust" + Utils.sanitizeString(localizedName), 1);
+ }
+ FluidStack aFStack = (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1));
+ if (aFStack == null) {
+ Logger.WARNING("Generating our own fluid.");
+
+ final Fluid gtFluid = FluidUtils.addGTFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 4,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+
+ if (dustStack != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dustStack)
+ .fluidOutputs(FluidUtils.getFluidStack(gtFluid, amountPerItem))
+ .duration(1 * SECONDS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+ if (dustStack2 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dustStack2)
+ .fluidOutputs(FluidUtils.getFluidStack(gtFluid, amountPerItem))
+ .duration(1 * SECONDS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ return gtFluid;
+ } else {
+ Logger.INFO("FLUID GENERATION FAILED FOR " + localizedName + ", ALREADY EXISTS");
+ return aFStack.getFluid();
+ }
+ }
+
+ public static Fluid generateFluidNoPrefix(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA) {
+ return generateFluidNoPrefix(unlocalizedName, localizedName, MeltingPoint, RGBA, true);
+ }
+
+ public static Fluid generateFluidNoPrefix(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final boolean aGenerateCell) {
+ Fluid gtFluid;
+ if (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1) == null) {
+ Logger.WARNING("Generating our own fluid.");
+ gtFluid = FluidUtils.addGTFluidNoPrefix(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 4,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+ } else {
+ gtFluid = FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1)
+ .getFluid();
+ }
+ return gtFluid;
+ }
+
+ public static Fluid generateGas(final String unlocalizedName, final String localizedName, final int MeltingPoint,
+ final short[] RGBA, final boolean aGenerateCell) {
+ Fluid gtFluid;
+ if (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1) == null) {
+ Logger.WARNING("Generating our own gas.");
+ gtFluid = FluidUtils.addGtGas(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 3,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+ } else {
+ gtFluid = FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1)
+ .getFluid();
+ }
+ return gtFluid;
+ }
+
+ public static boolean doesFluidExist(String aFluidName) {
+ FluidStack aFStack1 = (FluidUtils.getFluidStack("molten" + "." + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack2 = (FluidUtils.getFluidStack("fluid" + "." + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack3 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), 1));
+ FluidStack aFStack4 = (FluidUtils.getFluidStack(aFluidName, 1));
+ FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_" + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid" + "." + aFluidName.toLowerCase(), 1));
+ return aFStack1 != null || aFStack2 != null
+ || aFStack3 != null
+ || aFStack4 != null
+ || aFStack5 != null
+ || aFStack6 != null;
+ }
+
+ public static FluidStack getWildcardFluidStack(String aFluidName, int amount) {
+ FluidStack aFStack1 = (FluidUtils.getFluidStack(aFluidName, amount));
+ FluidStack aFStack2 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), amount));
+ FluidStack aFStack3 = (FluidUtils.getFluidStack("molten" + "." + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack4 = (FluidUtils.getFluidStack("fluid" + "." + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_" + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid" + "." + aFluidName.toLowerCase(), amount));
+ if (aFStack1 != null) {
+ return aFStack1;
+ }
+ if (aFStack2 != null) {
+ return aFStack2;
+ }
+ if (aFStack3 != null) {
+ return aFStack3;
+ }
+ if (aFStack4 != null) {
+ return aFStack4;
+ }
+ if (aFStack5 != null) {
+ return aFStack5;
+ }
+ if (aFStack6 != null) {
+ return aFStack6;
+ }
+ return null;
+ }
+
+ public static FluidStack getWildcardFluidStack(Materials aMaterial, int amount) {
+ FluidStack aFStack1 = aMaterial.getFluid(amount);
+ FluidStack aFStack2 = aMaterial.getGas(amount);
+ FluidStack aFStack3 = aMaterial.getMolten(amount);
+ FluidStack aFStack4 = aMaterial.getSolid(amount);
+ if (aFStack1 != null) {
+ return aFStack1;
+ } else if (aFStack2 != null) {
+ return aFStack2;
+ } else if (aFStack3 != null) {
+ return aFStack3;
+ } else if (aFStack4 != null) {
+ return aFStack4;
+ } else {
+ return null;
+ }
+ }
+
+ public static FluidStack getAir(int aAmount) {
+ return FluidUtils.getFluidStack("air", aAmount);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java
new file mode 100644
index 0000000000..c8a7ed26da
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class InventoryUtils {
+
+ private static final Random mRandom = new Random();
+
+ public static void dropInventoryItems(World world, int x, int y, int z, Block block) {
+ TileEntity tileentity = world.getTileEntity(x, y, z);
+
+ if (tileentity != null && tileentity instanceof IInventory aTileInv
+ && ((IInventory) tileentity).getSizeInventory() > 0) {
+
+ int aMinSlot = 0;
+ int aMaxSlot = aTileInv.getSizeInventory() - 1;
+
+ for (int i1 = aMinSlot; i1 < aMaxSlot; ++i1) {
+ ItemStack itemstack = aTileInv.getStackInSlot(i1);
+
+ if (itemstack != null) {
+ float f = mRandom.nextFloat() * 0.8F + 0.1F;
+ float f1 = mRandom.nextFloat() * 0.8F + 0.1F;
+ EntityItem entityitem;
+
+ for (float f2 = mRandom.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; world
+ .spawnEntityInWorld(entityitem)) {
+ int j1 = mRandom.nextInt(21) + 10;
+
+ if (j1 > itemstack.stackSize) {
+ j1 = itemstack.stackSize;
+ }
+
+ itemstack.stackSize -= j1;
+ entityitem = new EntityItem(
+ world,
+ x + f,
+ y + f1,
+ z + f2,
+ new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
+ float f3 = 0.05F;
+ entityitem.motionX = (float) mRandom.nextGaussian() * f3;
+ entityitem.motionY = (float) mRandom.nextGaussian() * f3 + 0.2F;
+ entityitem.motionZ = (float) mRandom.nextGaussian() * f3;
+
+ if (itemstack.hasTagCompound()) {
+ entityitem.getEntityItem()
+ .setTagCompound(
+ (NBTTagCompound) itemstack.getTagCompound()
+ .copy());
+ }
+ }
+ }
+ }
+
+ world.func_147453_f(x, y, z, block);
+ }
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java
new file mode 100644
index 0000000000..16a71133c6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java
@@ -0,0 +1,1012 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.Minecraft;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.dusts.BaseItemDustUnique;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaTool;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_DustGeneration;
+
+public class ItemUtils {
+
+ public static ItemStack getSimpleStack(final Item x) {
+ return getSimpleStack(x, 1);
+ }
+
+ public static ItemStack getSimpleStack(final Block x) {
+ return simpleMetaStack(Item.getItemFromBlock(x), 0, 1);
+ }
+
+ public static ItemStack getSimpleStack(final Block x, int i) {
+ if (i == 0) {
+ return getSimpleStack(x, i, 1);
+ }
+
+ return getSimpleStack(x, 0, i);
+ }
+
+ public static ItemStack getSimpleStack(final Block x, int meta, int i) {
+ return simpleMetaStack(Item.getItemFromBlock(x), meta, i);
+ }
+
+ public static ItemStack getSimpleStack(final Item x, final int i) {
+ return new ItemStack(x, i);
+ }
+
+ public static ItemStack getSimpleStack(final ItemStack x, final int i) {
+ if (x == null) {
+ return null;
+ }
+ final ItemStack r = x.copy();
+ r.stackSize = i;
+ return r;
+ }
+
+ public static final int WILDCARD_VALUE = Short.MAX_VALUE;
+
+ public static ItemStack getWildcardStack(final ItemStack x) {
+ return ItemUtils.simpleMetaStack(x, WILDCARD_VALUE, 1);
+ }
+
+ public static ItemStack getIC2Cell(final int meta) {
+ return GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCellEmpty", 1L, meta);
+ }
+
+ public static ItemStack getEmptyCell() {
+ return getEmptyCell(1);
+ }
+
+ public static ItemStack getEmptyCell(int i) {
+ if (ItemList.Cell_Empty.hasBeenSet()) {
+ return ItemList.Cell_Empty.get(i);
+ }
+ final ItemStack temp = GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCellEmpty", i, 0);
+ return temp != null ? temp : null;
+ }
+
+ public static void getItemForOreDict(final String FQRN, final String oreDictName, final String itemName,
+ final int meta) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+
+ if (em1 != null) {
+ em = em1;
+ }
+
+ if (em != null) {
+
+ final ItemStack metaStack = new ItemStack(em, 1, meta);
+ GT_OreDictUnificator.registerOre(oreDictName, metaStack);
+
+ }
+ } catch (final NullPointerException e) {
+ Logger.ERROR(itemName + " not found. [NULL]");
+ }
+ }
+
+ public static void addItemToOreDictionary(ItemStack stack, final String oreDictName, boolean useWildcardMeta) {
+ if (useWildcardMeta) {
+ stack = ItemUtils.getWildcardStack(stack);
+ }
+ try {
+ OreDictionary.registerOre(oreDictName, stack);
+ } catch (final NullPointerException e) {
+ Logger.ERROR(ItemUtils.getItemName(stack) + " not registered. [NULL]");
+ }
+ }
+
+ public static void addItemToOreDictionary(final ItemStack stack, final String oreDictName) {
+ addItemToOreDictionary(stack, oreDictName, false);
+ }
+
+ public static ItemStack getItemStackWithMeta(final boolean MOD, final String FQRN, final String itemName,
+ final int meta, final int itemstackSize) {
+ if (MOD) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+
+ if (em1 != null) {
+ if (null == em) {
+ em = em1;
+ }
+ if (em != null) {
+ final ItemStack metaStack = new ItemStack(em, itemstackSize, meta);
+ return metaStack;
+ }
+ }
+ return null;
+ } catch (final NullPointerException e) {
+ Logger.ERROR(itemName + " not found. [NULL]");
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack simpleMetaStack(final String FQRN, final int meta, final int itemstackSize) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+ // Utils.LOG_WARNING("Found: "+em1.getUnlocalizedName()+":"+meta);
+ if (em1 != null) {
+ if (null == em) {
+ em = em1;
+ }
+ if (em != null) {
+ final ItemStack metaStack = new ItemStack(em, itemstackSize, meta);
+ return metaStack;
+ }
+ }
+ return null;
+ } catch (final NullPointerException e) {
+ Logger.ERROR(FQRN + " not found. [NULL]");
+ return null;
+ }
+ }
+
+ public static ItemStack simpleMetaStack(ItemStack simpleStack, int meta, int size) {
+ return simpleMetaStack(simpleStack.getItem(), meta, size);
+ }
+
+ public static ItemStack simpleMetaStack(final Item item, int meta, int size) {
+ if (item == null) {
+ return null;
+ }
+ if (meta < 0 || meta > Short.MAX_VALUE) {
+ meta = 0;
+ }
+ if (size < 0 || size > 64) {
+ size = 1;
+ }
+ return new ItemStack(item, size, meta);
+ }
+
+ public static ItemStack simpleMetaStack(final Block block, final int meta, final int size) {
+ return simpleMetaStack(Item.getItemFromBlock(block), meta, size);
+ }
+
+ public static ItemStack getCorrectStacktype(final String fqrn, final int stackSize) {
+ final String oreDict = "ore:";
+ ItemStack temp;
+ if (fqrn.toLowerCase()
+ .contains(oreDict.toLowerCase())) {
+ final String sanitizedName = fqrn.replace(oreDict, "");
+ temp = ItemUtils.getItemStackFromFQRN(sanitizedName, stackSize);
+ return temp;
+ }
+ final String[] fqrnSplit = fqrn.split(":");
+ String temp1;
+ String temp2;
+ temp1 = fqrnSplit[1];
+ if (fqrnSplit.length < 3) {
+ temp2 = "0";
+ } else {
+ temp2 = fqrnSplit[2];
+ }
+ temp = ItemUtils.getItemStackWithMeta(true, fqrn, temp1, Integer.parseInt(temp2), stackSize);
+ return temp;
+ }
+
+ public static Item getItemFromFQRN(final String fqrn) // fqrn = fully qualified resource name
+ {
+ final String[] fqrnSplit = fqrn.split(":");
+ return GameRegistry.findItem(fqrnSplit[0], fqrnSplit[1]);
+ }
+
+ public static ItemStack getItemStackFromFQRN(final String fqrn, final int Size) // fqrn = fully qualified resource
+ // name
+ {
+ Logger.INFO("Trying to split string '" + fqrn + "'.");
+ final String[] fqrnSplit = fqrn.split(":");
+ if (fqrnSplit.length < 2) {
+ return null;
+ } else {
+ if (fqrnSplit.length == 2) {
+ Logger.INFO("Mod: " + fqrnSplit[0] + ", Item: " + fqrnSplit[1]);
+ return GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
+ } else if (fqrnSplit.length == 3 && fqrnSplit[2] != null && fqrnSplit[2].length() > 0) {
+ Logger.INFO("Mod: " + fqrnSplit[0] + ", Item: " + fqrnSplit[1] + ", Meta: " + fqrnSplit[2]);
+ ItemStack aStack = GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
+ int aMeta = Integer.parseInt(fqrnSplit[2]);
+ if (aStack != null && (aMeta >= 0 && aMeta <= Short.MAX_VALUE)) {
+ return ItemUtils.simpleMetaStack(aStack, aMeta, Size);
+ } else {
+ Logger.INFO("Could not find instance of Item: " + fqrnSplit[1]);
+ }
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack[] validItemsForOreDict(final String oredictName) {
+ final List<?> validNames = MaterialUtils.oreDictValuesForEntry(oredictName);
+ final ItemStack[] inputs = new ItemStack[validNames.size()];
+ for (int i = 0; i < validNames.size(); i++) {
+ inputs[i] = (ItemStack) validNames.get(i);
+ }
+ return inputs;
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDict(String oredictName, final int amount) {
+ String mTemp = oredictName;
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ mTemp = Utils.sanitizeString(mTemp, new char[] { '-', '_' });
+ } else {
+ mTemp = Utils.sanitizeString(mTemp);
+ }
+
+ if (oredictName.contains("rod")) {
+ String s = "stick" + oredictName.substring(3);
+ oredictName = s;
+ }
+
+ // Banned Materials and replacements for GT5.8 compat.
+
+ if (oredictName.toLowerCase()
+ .contains("ingotclay")) {
+ return getSimpleStack(Items.clay_ball, amount);
+ }
+
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(mTemp);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack returnValue = oreDictList.get(0)
+ .copy();
+ returnValue.stackSize = amount;
+ return returnValue;
+ }
+ Logger.INFO("Failed to find `" + oredictName + "` in OD.");
+ return getErrorStack(amount, oredictName + " x" + amount);
+ // return getItemStackOfAmountFromOreDictNoBroken(mTemp, amount);
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDictNoBroken(String oredictName, final int amount) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(4));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(5));
+ }
+
+ try {
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ oredictName = Utils.sanitizeString(oredictName, new char[] { '-', '_' });
+ } else {
+ oredictName = Utils.sanitizeString(oredictName);
+ }
+
+ // Adds a check to grab dusts using GT methodology if possible.
+ ItemStack returnValue = null;
+ if (oredictName.toLowerCase()
+ .contains("dust")) {
+ final String MaterialName = oredictName.toLowerCase()
+ .replace("dust", "");
+ final Materials m = Materials.get(MaterialName);
+ if (m != null && m != Materials._NULL) {
+ returnValue = getGregtechDust(m, amount);
+ if (checkForInvalidItems(returnValue)) {
+ return returnValue;
+ }
+ }
+ }
+ if (returnValue == null) {
+ returnValue = getItemStackOfAmountFromOreDict(oredictName, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+
+ Logger.RECIPE(oredictName + " was not valid.");
+ return null;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public static ItemStack getGregtechDust(final Materials material, final int amount) {
+ final ItemStack returnValue = GT_OreDictUnificator.get(OrePrefixes.dust, material, 1L);
+ if (returnValue != null) {
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+ Logger.WARNING(material + " was not valid.");
+ return null;
+ }
+
+ // NullFormula
+ public static Item[] generateSpecialUseDusts(final String unlocalizedName, final String materialName,
+ final int Colour) {
+ return generateSpecialUseDusts(unlocalizedName, materialName, "NullFormula", Colour);
+ }
+
+ public static Item[] generateSpecialUseDusts(final String unlocalizedName, final String materialName,
+ String mChemForm, final int Colour) {
+ GT_LanguageManager.addStringLocalization("gtplusplus.material." + materialName, materialName);
+ final Item[] output = {
+ new BaseItemDustUnique("itemDust" + unlocalizedName, materialName, mChemForm, Colour, "Dust"),
+ new BaseItemDustUnique("itemDustSmall" + unlocalizedName, materialName, mChemForm, Colour, "Small"),
+ new BaseItemDustUnique("itemDustTiny" + unlocalizedName, materialName, mChemForm, Colour, "Tiny") };
+
+ // Generate Shaped/Shapeless Recipes
+
+ final ItemStack normalDust = ItemUtils.getSimpleStack(output[0]);
+ final ItemStack smallDust = ItemUtils.getSimpleStack(output[1]);
+ final ItemStack tinyDust = ItemUtils.getSimpleStack(output[2]);
+
+ CORE.RA.addpackagerRecipe(ItemList.Schematic_Dust.get(0), smallDust, tinyDust, normalDust);
+
+ if (ItemUtils.checkForInvalidItems(tinyDust) && ItemUtils.checkForInvalidItems(normalDust)) {
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + materialName + " - Failed");
+ }
+
+ if (RecipeUtils.addShapedRecipe(
+ normalDust,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(tinyDust, 9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + materialName + " - Failed");
+ }
+ }
+
+ if (ItemUtils.checkForInvalidItems(smallDust) && ItemUtils.checkForInvalidItems(normalDust)) {
+ if (RecipeUtils.addShapedRecipe(
+ smallDust,
+ smallDust,
+ null,
+ smallDust,
+ smallDust,
+ null,
+ null,
+ null,
+ null,
+ normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + materialName + " - Failed");
+ }
+ if (RecipeUtils.addShapedRecipe(
+ null,
+ normalDust,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(smallDust, 4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + materialName + " - Failed");
+ }
+ }
+
+ return output;
+ }
+
+ public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust) {
+ return generateSpecialUseDusts(material, onlyLargeDust, false);
+ }
+
+ public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust,
+ final boolean disableExtraRecipes) {
+ final String materialName = material.getUnlocalizedName();
+ final String unlocalizedName = Utils.sanitizeString(materialName);
+ final int Colour = material.getRgbAsHex();
+ final String aChemForm = material.vChemicalFormula;
+ final boolean isChemFormvalid = (aChemForm != null && aChemForm.length() > 0);
+ Item[] output = null;
+ if (onlyLargeDust == false) {
+ output = new Item[] {
+ new BaseItemDustUnique(
+ "itemDust" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Dust"),
+ new BaseItemDustUnique(
+ "itemDustSmall" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Small"),
+ new BaseItemDustUnique(
+ "itemDustTiny" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Tiny") };
+ } else {
+ output = new Item[] { new BaseItemDustUnique("itemDust" + unlocalizedName, materialName, Colour, "Dust") };
+ }
+
+ new RecipeGen_DustGeneration(material, disableExtraRecipes);
+
+ return output;
+ }
+
+ public static boolean isRadioactive(final String materialName) {
+ int sRadiation = 0;
+ if (materialName.toLowerCase()
+ .contains("uranium")) {
+ sRadiation = 2;
+ } else if (materialName.toLowerCase()
+ .contains("plutonium")) {
+ sRadiation = 4;
+ } else if (materialName.toLowerCase()
+ .contains("thorium")) {
+ sRadiation = 1;
+ }
+ if (sRadiation >= 1) {
+ return true;
+ }
+ return false;
+ }
+
+ public static int getRadioactivityLevel(final String materialName) {
+ int sRadiation = 0;
+ if (materialName.toLowerCase()
+ .contains("uranium")) {
+ sRadiation = 2;
+ } else if (materialName.toLowerCase()
+ .contains("plutonium")) {
+ sRadiation = 4;
+ } else if (materialName.toLowerCase()
+ .contains("thorium")) {
+ sRadiation = 1;
+ }
+ return sRadiation;
+ }
+
+ public static String getArrayStackNames(final FluidStack[] aStack) {
+ String itemNames = "Fluid Array: ";
+ for (final FluidStack alph : aStack) {
+ if (alph != null) {
+ final String temp = itemNames;
+ itemNames = temp + ", " + alph.getLocalizedName() + " x" + alph.amount;
+ } else {
+ final String temp = itemNames;
+ itemNames = temp + ", " + "null" + " x" + "0";
+ }
+ }
+ return itemNames;
+ }
+
+ public static String getArrayStackNames(final ItemStack[] aStack) {
+ String itemNames = "";
+ int aPos = 0;
+ for (final ItemStack alph : aStack) {
+ if (alph == null) {
+ continue;
+ }
+ if (alph != null) {
+ final String temp = itemNames;
+ itemNames = temp + (aPos > 0 ? ", " : "") + alph.getDisplayName() + " x" + alph.stackSize;
+ aPos++;
+ }
+ }
+ return itemNames;
+ }
+
+ public static ItemStack getGregtechCircuit(final int Meta) {
+ return ItemUtils.getItemStackWithMeta(true, "gregtech:gt.integrated_circuit", "Gregtech Circuit", Meta, 0);
+ }
+
+ private static final Map<Item, String> mModidCache = new HashMap<>();
+
+ private static String getModId(final Item item) {
+ if (mModidCache.containsKey(item)) {
+ return mModidCache.get(item);
+ }
+ String value = "";
+ try {
+ final GameRegistry.UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor(item);
+ if (id != null) {
+ final String modname = (id.modId == null ? id.name : id.modId);
+ value = ((id == null) || id.modId.equals("")) ? Minecraft.ID : modname;
+ }
+ } catch (final Throwable t) {
+ try {
+ final UniqueIdentifier t2 = GameRegistry.findUniqueIdentifierFor(Block.getBlockFromItem(item));
+ if (t2 != null) {
+ final String modname = (t2.modId == null ? t2.name : t2.modId);
+ value = ((t2 == null) || t2.modId.equals("")) ? Minecraft.ID : modname;
+ }
+ } catch (final Throwable t3) {
+ t3.printStackTrace();
+ value = "bad modid";
+ }
+ }
+ if (!mModidCache.containsKey(item)) {
+ return mModidCache.put(item, value);
+ }
+ return value;
+ }
+
+ public static String getModId(final ItemStack key) {
+ return getModId(key.getItem());
+ }
+
+ // Take 2 - GT/GT++ Dusts
+ public static ItemStack getGregtechDust(final String oredictName, final int amount) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictName);
+ if (!oreDictList.isEmpty()) {
+ ItemStack returnvalue;
+ for (ItemStack itemStack : oreDictList) {
+ final String modid = getModId(itemStack.getItem());
+ if (modid != null && (modid.equals(GregTech.ID) || modid.equals(GTPlusPlus.ID))) {
+ returnvalue = itemStack.copy();
+ returnvalue.stackSize = amount;
+ return returnvalue;
+ }
+ }
+ }
+ return getNonTinkersDust(oredictName, amount);
+ }
+
+ // Anything But Tinkers Dust
+ public static ItemStack getNonTinkersDust(final String oredictName, final int amount) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictName);
+ if (!oreDictList.isEmpty()) {
+ ItemStack returnvalue;
+ for (ItemStack itemStack : oreDictList) {
+ final String modid = getModId(itemStack.getItem());
+ if (modid != null && !modid.equals("tconstruct")) {
+ returnvalue = itemStack.copy();
+ returnvalue.stackSize = amount;
+ return returnvalue;
+ }
+ }
+ }
+ // If only Tinkers dust exists, bow down and just use it.
+ return getItemStackOfAmountFromOreDictNoBroken(oredictName, amount);
+ }
+
+ public static ItemStack getOrePrefixStack(OrePrefixes mPrefix, Material mMat, int mAmount) {
+
+ String mName = Utils.sanitizeString(mMat.getLocalizedName());
+
+ String mItemName = mPrefix.name() + mName;
+ ItemStack gregstack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(mItemName, mAmount);
+ if (gregstack == null) {
+ return null;
+ }
+ return (gregstack);
+ }
+
+ public static ItemStack getOrePrefixStack(OrePrefixes mPrefix, Materials mMat, int mAmount) {
+ if (mPrefix == OrePrefixes.rod) {
+ mPrefix = OrePrefixes.stick;
+ }
+ ItemStack aGtStack = GT_OreDictUnificator.get(mPrefix, mMat, mAmount);
+ if (aGtStack == null) {
+ Logger
+ .INFO("Failed to find `" + mPrefix + MaterialUtils.getMaterialName(mMat) + "` in OD. [Prefix Search]");
+ return getErrorStack(mAmount, (mPrefix.toString() + MaterialUtils.getMaterialName(mMat) + " x" + mAmount));
+ } else {
+ return aGtStack;
+ }
+ }
+
+ public static ItemStack getErrorStack(int mAmount) {
+ return getErrorStack(mAmount, null);
+ }
+
+ public static ItemStack getErrorStack(int mAmount, String aName) {
+ ItemStack g = getSimpleStack(ModItems.AAA_Broken, 1);
+ if (aName != null) {
+ NBTUtils.setBookTitle(g, EnumChatFormatting.RED + aName);
+ }
+ return g;
+ }
+
+ public static ItemStack[] getStackOfAllOreDictGroup(String oredictname) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictname);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack[] returnValues = new ItemStack[oreDictList.size()];
+ for (int i = 0; i < oreDictList.size(); i++) {
+ if (oreDictList.get(i) != null) {
+ returnValues[i] = oreDictList.get(i);
+ }
+ }
+ return returnValues.length > 0 ? returnValues : null;
+ } else {
+ return null;
+ }
+ }
+
+ public static boolean registerFuel(ItemStack aBurnable, int burn) {
+ return CORE.burnables.add(new Pair<>(burn, aBurnable));
+ }
+
+ public static boolean checkForInvalidItems(ItemStack mInput) {
+ return checkForInvalidItems(new ItemStack[] { mInput });
+ }
+
+ public static boolean checkForInvalidItems(ItemStack[] mInput) {
+ return checkForInvalidItems(mInput, new ItemStack[] {});
+ }
+
+ /**
+ *
+ * @param mInputs
+ * @return {@link Boolean} - True if {@link ItemStack}[] only contains valid items.
+ */
+ public static boolean checkForInvalidItems(ItemStack[] mInputs, ItemStack[] mOutputs) {
+ if (mInputs == null || mOutputs == null) {
+ return false;
+ }
+
+ if (mInputs.length > 0) {
+ for (ItemStack stack : mInputs) {
+ if (stack != null) {
+ if (stack.getItem() != null) {
+ if (stack.getItem() == ModItems.AAA_Broken || stack.getItem()
+ .getClass() == ModItems.AAA_Broken.getClass()) {
+ return false;
+ } else if (stack.getItem() == ModItems.ZZZ_Empty || stack.getItem()
+ .getClass() == ModItems.ZZZ_Empty.getClass()) {
+ return false;
+ } else {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ if (mOutputs.length > 0) {
+ for (ItemStack stack : mOutputs) {
+ if (stack != null) {
+ if (stack.getItem() != null) {
+ if (stack.getItem() == ModItems.AAA_Broken || stack.getItem()
+ .getClass() == ModItems.AAA_Broken.getClass()) {
+ return false;
+ } else if (stack.getItem() == ModItems.ZZZ_Empty || stack.getItem()
+ .getClass() == ModItems.ZZZ_Empty.getClass()) {
+ return false;
+ } else {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public static IInventory organiseInventory(IInventory aInputInventory) {
+ ItemStack[] p = new ItemStack[aInputInventory.getSizeInventory()];
+ for (int o = 0; o < aInputInventory.getSizeInventory(); o++) {
+ p[o] = aInputInventory.getStackInSlot(o);
+ }
+ // ItemStack[] g = organiseInventory(p);
+
+ IInventory aTemp = aInputInventory;
+ for (int i = 0; i < p.length; ++i) {
+ for (int j = i + 1; j < p.length; ++j) {
+ if (p[j] != null && (p[i] == null || GT_Utility.areStacksEqual(p[i], p[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(aTemp, aTemp, j, i, (byte) 64, (byte) 1, (byte) 64, (byte) 1);
+ }
+ }
+ }
+
+ return aTemp;
+ }
+
+ public static String getFluidName(FluidStack aFluid) {
+ return aFluid != null ? aFluid.getFluid()
+ .getLocalizedName(aFluid) : "NULL";
+ }
+
+ public static String getItemName(ItemStack aStack) {
+ if (aStack == null) {
+ return "ERROR - Empty Stack";
+ }
+ String aDisplay = null;
+ try {
+ aDisplay = ("" + StatCollector.translateToLocal(
+ aStack.getItem()
+ .getUnlocalizedNameInefficiently(aStack) + ".name")).trim();
+ if (aStack.hasTagCompound()) {
+ if (aStack.stackTagCompound != null && aStack.stackTagCompound.hasKey("display", 10)) {
+ NBTTagCompound nbttagcompound = aStack.stackTagCompound.getCompoundTag("display");
+
+ if (nbttagcompound.hasKey("Name", 8)) {
+ aDisplay = nbttagcompound.getString("Name");
+ }
+ }
+ }
+ } catch (Throwable ignored) {
+
+ }
+ if (aDisplay == null || aDisplay.length() <= 0) {
+ aDisplay = aStack.getUnlocalizedName() + ":" + aStack.getItemDamage();
+ } else {
+ aDisplay += " | Meta: " + aStack.getItemDamage();
+ }
+ return aDisplay;
+ }
+
+ public static String getUnlocalizedItemName(ItemStack aStack) {
+ if (aStack == null) {
+ return "ERROR.Empty.Stack";
+ }
+ String aDisplay = null;
+ try {
+ aDisplay = (aStack.getUnlocalizedName()).trim();
+ } catch (Throwable t) {
+ aDisplay = aStack.getItem()
+ .getUnlocalizedName();
+ }
+ if (aDisplay == null || aDisplay.length() <= 0) {
+ aDisplay = aStack.getItem()
+ .getUnlocalizedNameInefficiently(aStack);
+ }
+ return aDisplay;
+ }
+
+ public static boolean isItemGregtechTool(ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ final Item mItem = aStack.getItem();
+ final Item aSkookum = ItemUtils.getItemFromFQRN("miscutils:gt.plusplus.metatool.01");
+ final Class aSkookClass = aSkookum.getClass();
+ if (aSkookClass.isInstance(mItem) || mItem instanceof GT_MetaGenerated_Tool_01
+ || mItem instanceof MetaGeneratedGregtechTools
+ || mItem instanceof Gregtech_MetaTool
+ || mItem == aSkookum) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isToolScrewdriver(ItemStack aScrewdriver) {
+ if (isItemGregtechTool(aScrewdriver)
+ && (aScrewdriver.getItemDamage() == 22 || aScrewdriver.getItemDamage() == 150)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static ItemStack[] cleanItemStackArray(ItemStack[] input) {
+ int aArraySize = input.length;
+ ItemStack[] aOutput = new ItemStack[aArraySize];
+ AutoMap<ItemStack> aCleanedItems = new AutoMap<>();
+ for (ItemStack checkStack : input) {
+ if (ItemUtils.checkForInvalidItems(checkStack)) {
+ aCleanedItems.put(checkStack);
+ }
+ }
+ for (int i = 0; i < aArraySize; i++) {
+ ItemStack aMappedStack = aCleanedItems.get(i);
+ if (aMappedStack != null) {
+ aOutput[i] = aMappedStack;
+ }
+ }
+ return aOutput;
+ }
+
+ public static boolean doesOreDictHaveEntryFor(String string) {
+ return OreDictUtils.containsValidEntries(string);
+ }
+
+ public static void hideItemFromNEI(ItemStack aItemToHide) {
+ codechicken.nei.api.API.hideItem(aItemToHide);
+ }
+
+ public static ItemStack getNullStack() {
+ return GT_Values.NI;
+ }
+
+ public static ItemStack depleteStack(ItemStack aStack) {
+ return depleteStack(aStack, 1);
+ }
+
+ public static ItemStack depleteStack(ItemStack aStack, int aAmount) {
+ final int cap = aStack.stackSize;
+ if (cap >= 1 && cap >= aAmount) {
+ ItemStack aDepStack = aStack.copy();
+ aDepStack.stackSize = (MathUtils.balance((aDepStack.stackSize - 1), 0, 64));
+ if (aDepStack.stackSize > 0) {
+ return aDepStack;
+ }
+ }
+ return getNullStack();
+ }
+
+ public static boolean isControlCircuit(ItemStack aStack) {
+ if (aStack != null) {
+ Item aItem = aStack.getItem();
+ if (aItem == CI.getNumberedBioCircuit(0)
+ .getItem() || aItem
+ == CI.getNumberedCircuit(0)
+ .getItem()
+ || aItem == CI.getNumberedAdvancedCircuit(0)
+ .getItem()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isCatalyst(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBlueCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBrownCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mOrangeCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPurpleCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRedCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mYellowCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPinkCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mFormaldehydeCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSolidAcidCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mInfiniteMutationCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, AgriculturalChem.mGreenCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPlatinumGroupCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPlasticPolymerCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRubberPolymerCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAdhesionPromoterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mTitaTungstenIndiumCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRadioactivityCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRareEarthGroupCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSimpleNaquadahCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAdvancedNaquadahCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRawIntelligenceCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mUltimatePlasticCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBiologicalIntelligenceCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.TemporalHarmonyCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mLimpidWaterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mFlawlessWaterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mParticleAccelerationCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSynchrotronCapableCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAlgagenicGrowthPromoterCatalyst, true)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public static boolean isMillingBall(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallAlumina, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallSoapstone, true)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java
new file mode 100644
index 0000000000..28d017d749
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.Properties;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class LangUtils {
+
+ @SuppressWarnings("unchecked")
+ public static void rewriteEntryForLanguageRegistry(String aLang, String aKey, String aNewValue) {
+ LanguageRegistry aInstance = LanguageRegistry.instance();
+ Field aModLanguageData = ReflectionUtils.getField(LanguageRegistry.class, "modLanguageData");
+ if (aModLanguageData != null) {
+ Map<String, Properties> aProps;
+ Object aInstanceProps;
+ try {
+ aInstanceProps = aModLanguageData.get(aInstance);
+ if (aInstanceProps != null) {
+ aProps = (Map<String, Properties>) aInstanceProps;
+ Properties aLangProps = aProps.get(aLang);
+ if (aLangProps != null) {
+ if (aLangProps.containsKey(aKey)) {
+ aLangProps.remove(aKey);
+ aLangProps.put(aKey, aNewValue);
+ } else {
+ aLangProps.put(aKey, aNewValue);
+ }
+ aProps.remove(aLang);
+ aProps.put(aLang, aLangProps);
+ ReflectionUtils.setField(aInstance, aModLanguageData, aProps);
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {
+
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
new file mode 100644
index 0000000000..881ccb3c41
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
@@ -0,0 +1,372 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.Element;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.TypeCounter;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.foil.BaseItemFoil;
+import gtPlusPlus.core.item.base.wire.BaseItemFineWire;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class MaterialUtils {
+
+ public static List<?> oreDictValuesForEntry(final String oredictName) {
+ List<?> oredictItemNames;
+ if (OreDictionary.doesOreNameExist(oredictName)) {
+ oredictItemNames = OreDictionary.getOres(oredictName);
+ return oredictItemNames;
+ }
+ return null;
+ }
+
+ private static final Map<String, Material> mGeneratedMaterialMap = new HashMap<>();
+
+ public static Material generateMaterialFromGtENUM(final Materials material) {
+ return generateMaterialFromGtENUM(material, null, null);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, TextureSet aCustomTextures) {
+ return generateMaterialFromGtENUM(material, null, aCustomTextures);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, short[] customRGB) {
+ return generateMaterialFromGtENUM(material, customRGB, null);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, short[] customRGB,
+ TextureSet aCustomTextures) {
+ String aMaterialKey = getMaterialName(material).toLowerCase();
+ if (mGeneratedMaterialMap.containsKey(aMaterialKey)) {
+ return mGeneratedMaterialMap.get(aMaterialKey);
+ }
+
+ try {
+ String name = material.mName;
+ final short[] rgba = (customRGB == null ? material.mRGBa : customRGB);
+ final int melting = material.mMeltingPoint;
+ final int boiling = material.mBlastFurnaceTemp;
+ final long protons = material.getProtons();
+ final long neutrons = material.getNeutrons();
+ final boolean blastFurnace = material.mBlastFurnaceRequired;
+ int radioactivity = 0;
+ if (material.isRadioactive()) {
+ ItemStack aDustStack = ItemUtils.getOrePrefixStack(OrePrefixes.dust, material, 1);
+ radioactivity = aDustStack != null ? GT_Utility.getRadioactivityLevel(aDustStack) : 0;
+ if (radioactivity == 0) {
+ long aProtons = material.getProtons();
+ radioactivity = (int) Math.min(Math.max((aProtons / 30), 1), 9);
+ }
+ }
+ Logger.MATERIALS("[Debug] Calculated Radiation level to be " + radioactivity + ".");
+ TextureSet iconSet = null;
+ if (aCustomTextures == null) {
+ if (material.isRadioactive()) {
+ iconSet = TextureSets.NUCLEAR.get();
+ } else {
+ iconSet = material.mIconSet;
+ }
+ } else {
+ iconSet = aCustomTextures;
+ }
+ if (iconSet == null || iconSet.mSetName.toLowerCase()
+ .contains("fluid")) {
+ iconSet = TextureSet.SET_METALLIC;
+ }
+ Logger.MATERIALS("[Debug] Calculated Texture Set to be " + iconSet.mSetName + ".");
+
+ final int durability = material.mDurability;
+ boolean mGenerateCell = false;
+ boolean mGenerateFluid = true;
+ MaterialState materialState;
+ String chemicalFormula = StringUtils.subscript(Utils.sanitizeString(material.mChemicalFormula));
+ final Element element = material.mElement;
+
+ // Weird Blacklist of Bad Chemical Strings
+ if (material.mElement == Element.Pb || material.mElement == Element.Na || material.mElement == Element.Ar) {
+ chemicalFormula = StringUtils.subscript(Utils.sanitizeString(material.mElement.name()));
+ }
+
+ // Determine default state
+ Logger.MATERIALS("[Debug] Setting State of GT generated material. " + material.mDefaultLocalName);
+ if (material.getMolten(1) != null || material.getSolid(1) != null) {
+ materialState = MaterialState.SOLID;
+ Logger.MATERIALS("[Debug] Molten or Solid was not null.");
+ if (material.getMolten(1) == null && material.getSolid(1) != null) {
+ Logger.MATERIALS("[Debug] Molten is Null, Solid is not. Enabling cell generation.");
+ mGenerateCell = true;
+ } else if (material.getMolten(1) != null && material.getSolid(1) == null) {
+ Logger.MATERIALS("[Debug] Molten is not Null, Solid is null. Not enabling cell generation.");
+ // mGenerateCell = true;
+ }
+ Logger.MATERIALS("[Debug] State set as solid.");
+ } else if (material.getFluid(1) != null) {
+ Logger.MATERIALS("[Debug] State set as liquid.");
+ materialState = MaterialState.LIQUID;
+ } else if (material.getGas(1) != null) {
+ Logger.MATERIALS("[Debug] State set as gas.");
+ materialState = MaterialState.GAS;
+ } else {
+ Logger.MATERIALS(
+ "[Debug] State set as solid. This material has no alternative states, so for safety we wont generate anything.");
+ materialState = MaterialState.SOLID;
+ mGenerateFluid = false;
+ }
+
+ if (name.toLowerCase()
+ .contains("infused")) {
+ final String tempname = name.substring(7);
+ name = "Infused " + tempname;
+ }
+ if (hasValidRGBA(rgba) || (element == Element.H)
+ || ((material == Materials.InfusedAir) || (material == Materials.InfusedFire)
+ || (material == Materials.InfusedEarth)
+ || (material == Materials.InfusedWater))) {
+ Material M = new Material(
+ name,
+ materialState,
+ iconSet,
+ durability,
+ rgba,
+ melting,
+ boiling,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalFormula,
+ radioactivity,
+ mGenerateCell,
+ mGenerateFluid);
+ mGeneratedMaterialMap.put(aMaterialKey, M);
+ return M;
+ } else {
+ Logger.DEBUG_MATERIALS(
+ "Failed to generate GT++ material instance for " + material.mName
+ + " | Valid RGB? "
+ + (hasValidRGBA(rgba)));
+ }
+ } catch (Throwable t) {
+ Logger.DEBUG_MATERIALS("Failed to generate GT++ material instance for " + material.mName);
+ t.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Material generateQuickMaterial(final String materialName, final MaterialState defaultState,
+ final short[] colour, final int sRadioactivity) {
+ String aMaterialKey = materialName.toLowerCase();
+ if (mGeneratedMaterialMap.containsKey(aMaterialKey)) {
+ return mGeneratedMaterialMap.get(aMaterialKey);
+ }
+
+ final Material temp = new Material(
+ materialName,
+ defaultState,
+ colour,
+ 1000, // melting
+ 3000, // boiling
+ 50, // Protons
+ 50, // Neutrons
+ false,
+ "",
+ sRadioactivity);
+ mGeneratedMaterialMap.put(aMaterialKey, temp);
+ return temp;
+ }
+
+ public static boolean hasValidRGBA(final short[] rgba) {
+ if (rgba == null || rgba.length < 3 || rgba.length > 4) {
+ return false;
+ }
+ return true;
+ }
+
+ public static int getTierOfMaterial(final double aMeltingPoint) {
+ return aMeltingPoint < 1000 ? 0 : (MathUtils.roundToClosestInt(aMeltingPoint / 1000f));
+ }
+
+ public static int getVoltageForTier(int aTier) {
+ // aTier += 1; - Probably some logic to this, idk.
+
+ return switch (aTier) {
+ case 0 -> 16;
+ case 1 -> 30;
+ case 2 -> 120;
+ case 3 -> 480;
+ case 4 -> 1920;
+ case 5 -> 7680;
+ case 6 -> 30720;
+ case 7 -> 122880;
+ case 8 -> 491520;
+ case 9 -> 1966080;
+ case 10 -> 7864320;
+ case 11 -> 31457280;
+ case 12 -> 125829120;
+ case 13 -> 503316480;
+ case 14 -> 2013265920;
+ default -> Integer.MAX_VALUE;
+ };
+
+ }
+
+ private static Materials getMaterialByName(String materialName) {
+ for (Materials m : Materials.values()) {
+ if (MaterialUtils.getMaterialName(m)
+ .toLowerCase()
+ .equals(materialName.toLowerCase())) {
+ return m;
+ }
+ }
+ return null;
+ }
+
+ public static String getMaterialName(Materials mat) {
+ String mName = mat.mDefaultLocalName;
+ if (mName == null || mName.equals("")) {
+ mName = mat.mName;
+ }
+ return mName;
+ }
+
+ public static TextureSet getMostCommonTextureSet(List<Material> list) {
+ TypeCounter<TextureSet> aCounter = new TypeCounter<>(TextureSet.class);
+ for (Material m : list) {
+ TextureSet t = m.getTextureSet();
+ if (t == null) {
+ t = Materials.Gold.mIconSet;
+ }
+ if (t != null) {
+ aCounter.add(t, t.mSetName);
+ }
+ }
+ return aCounter.getResults();
+ }
+
+ public static Materials getMaterial(String aMaterialName, String aFallbackMaterialName) {
+ Materials g = getMaterial(aMaterialName);
+ if (g == null) {
+ g = getMaterial(aFallbackMaterialName);
+ }
+ if (g == null) {
+ Logger.INFO(
+ "Failed finding material '" + aMaterialName
+ + "' & fallback '"
+ + aFallbackMaterialName
+ + "', returning _NULL.");
+ CORE.crash();
+ }
+ return g;
+ }
+
+ public static Materials getMaterial(String aMaterialName) {
+ Materials m = Materials.get(aMaterialName);
+ if (m == Materials._NULL) {
+ m = getMaterialByName(aMaterialName);
+ }
+ if (m == null) {
+ Logger.INFO("Failed finding material '" + aMaterialName + "', returning _NULL.");
+ m = Materials._NULL;
+ }
+ return m;
+ }
+
+ public static AutoMap<Material> getCompoundMaterialsRecursively(Material aMat) {
+ return getCompoundMaterialsRecursively_Speiger(aMat);
+ }
+
+ public static AutoMap<Material> getCompoundMaterialsRecursively_Speiger(Material toSearch) {
+ AutoMap<Material> resultList = new AutoMap<>();
+ if (toSearch.getComposites()
+ .isEmpty()) {
+ resultList.put(toSearch);
+ return resultList;
+ }
+ final int HARD_LIMIT = 1000;
+
+ // Could be a Deque but i dont use the interface
+ // enough to use it as default.
+ LinkedList<Material> toCheck = new LinkedList<>();
+
+ toCheck.add(toSearch);
+ int processed = 0;
+ while (!toCheck.isEmpty() && processed < HARD_LIMIT) {
+ Material current = toCheck.remove();
+ if (current.getComposites()
+ .isEmpty()) {
+ resultList.put(current);
+ } else {
+ for (MaterialStack entry : current.getComposites()) {
+ toCheck.add(entry.getStackMaterial());
+ }
+ }
+ processed++;
+ }
+ return resultList;
+ }
+
+ public static void generateComponentAndAssignToAMaterial(ComponentTypes aType, Material aMaterial) {
+ generateComponentAndAssignToAMaterial(aType, aMaterial, true);
+ }
+
+ public static void generateComponentAndAssignToAMaterial(ComponentTypes aType, Material aMaterial,
+ boolean generateRecipes) {
+ Item aGC;
+ if (aType == ComponentTypes.FINEWIRE) {
+ aGC = new BaseItemFineWire(aMaterial);
+ } else if (aType == ComponentTypes.FOIL) {
+ aGC = new BaseItemFoil(aMaterial);
+ } else {
+ aGC = new BaseItemComponent(aMaterial, aType);
+ }
+ String aFormattedLangName = aType.getName();
+
+ if (!aFormattedLangName.startsWith(" ")) {
+ if (aFormattedLangName.contains("@")) {
+ String[] aSplit = aFormattedLangName.split("@");
+ aFormattedLangName = aSplit[0] + " " + aMaterial.getLocalizedName() + " " + aSplit[1];
+ }
+ }
+
+ if (aFormattedLangName.equals(aType.getName())) {
+ aFormattedLangName = aMaterial.getLocalizedName() + aFormattedLangName;
+ }
+
+ Logger.MATERIALS("[Lang] " + aGC.getUnlocalizedName() + ".name=" + aFormattedLangName);
+ aMaterial.registerComponentForMaterial(aType, ItemUtils.getSimpleStack(aGC));
+ }
+
+ public static void generateSpecialDustAndAssignToAMaterial(Material aMaterial, boolean generateMixerRecipes) {
+ Item[] aDusts = ItemUtils.generateSpecialUseDusts(aMaterial, false, !generateMixerRecipes);
+ if (aDusts.length > 0) {
+ aMaterial.registerComponentForMaterial(OrePrefixes.dust, ItemUtils.getSimpleStack(aDusts[0]));
+ aMaterial.registerComponentForMaterial(OrePrefixes.dustSmall, ItemUtils.getSimpleStack(aDusts[1]));
+ aMaterial.registerComponentForMaterial(OrePrefixes.dustTiny, ItemUtils.getSimpleStack(aDusts[2]));
+ }
+ }
+
+ public static boolean isNullGregtechMaterial(Materials aGregtechMaterial) {
+ return aGregtechMaterial == Materials._NULL || aGregtechMaterial.equals(Materials._NULL)
+ || aGregtechMaterial.mName.equals(Materials._NULL.mName);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java
new file mode 100644
index 0000000000..3abc92b69e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.HashMap;
+
+import gregtech.common.GT_Worldgen_GT_Ore_Layer;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class MiningUtils {
+
+ public static int mMoonID = -99;
+ public static int mMarsID = -99;
+ public static int mCometsID = -99;
+
+ public static void iterateAllOreTypes() {
+ HashMap<String, Integer> M = new HashMap<>();
+ String aTextWorldGen;
+ if (MiningUtils.findAndMapOreTypesFromGT()) {
+ int mapKey = 0;
+ for (AutoMap<GT_Worldgen_GT_Ore_Layer> g : MiningUtils.mOreMaps) {
+ for (GT_Worldgen_GT_Ore_Layer h : g) {
+
+ try {
+ aTextWorldGen = (String) ReflectionUtils
+ .getField(GT_Worldgen_GT_Ore_Layer.class, "aTextWorldgen")
+ .get(h);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ aTextWorldGen = h.mWorldGenName;
+ }
+
+ M.put(aTextWorldGen + h.mWorldGenName, mapKey);
+ Logger.INFO("Found Vein type: " + aTextWorldGen + h.mWorldGenName + " in map with key: " + mapKey);
+ }
+ mapKey++;
+ }
+ }
+ }
+
+ public static AutoMap<GT_Worldgen_GT_Ore_Layer>[] mOreMaps = new AutoMap[7];
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Overworld = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Nether = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_End = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Moon = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Mars = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Comets = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Misc = new AutoMap<>();
+
+ public static boolean findAndMapOreTypesFromGT() {
+ // Gets Moon ID
+
+ boolean aEndAsteroids;
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.core.util.ConfigManagerCore") != null
+ && mMoonID == -99) {
+ mMoonID = ReflectionUtils
+ .getField(
+ ReflectionUtils.getClass("micdoodle8.mods.galacticraft.core.util.ConfigManagerCore"),
+ "idDimensionMoon")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Gets Mars ID
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.mars.ConfigManagerMars") != null
+ && mMarsID == -99) {
+ mMarsID = ReflectionUtils
+ .getField(
+ ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.mars.ConfigManagerMars"),
+ "dimensionIDMars")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Get Comets ID
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.asteroids.ConfigManagerAsteroids")
+ != null && mCometsID == -99) {
+ mCometsID = ReflectionUtils
+ .getField(
+ ReflectionUtils
+ .getClass("micdoodle8.mods.galacticraft.planets.asteroids.ConfigManagerAsteroids"),
+ "dimensionIDAsteroids")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Clear Cache
+ Ores_Overworld.clear();
+ Ores_Nether.clear();
+ Ores_End.clear();
+ Ores_Misc.clear();
+
+ for (GT_Worldgen_GT_Ore_Layer x : GT_Worldgen_GT_Ore_Layer.sList) {
+ if (x.mEnabled) {
+
+ try {
+ aEndAsteroids = ReflectionUtils.getField(GT_Worldgen_GT_Ore_Layer.class, "mEndAsteroid")
+ .getBoolean(x);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ aEndAsteroids = false;
+ }
+
+ if (x.mOverworld) {
+ Ores_Overworld.put(x);
+ }
+ if (x.mNether) {
+ Ores_Nether.put(x);
+ }
+ if (x.mEnd || aEndAsteroids) {
+ Ores_End.put(x);
+ }
+ if (x.mOverworld || x.mNether || (x.mEnd || aEndAsteroids)) {
+ continue;
+ }
+
+ Ores_Misc.put(x);
+ } else {
+ Ores_Comets.put(x);
+ }
+ }
+
+ mOreMaps[0] = Ores_Overworld;
+ mOreMaps[1] = Ores_Nether;
+ mOreMaps[2] = Ores_End;
+ mOreMaps[3] = Ores_Moon;
+ mOreMaps[4] = Ores_Mars;
+ mOreMaps[5] = Ores_Comets;
+ mOreMaps[6] = Ores_Misc;
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java
new file mode 100644
index 0000000000..4b0f15b81e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java
@@ -0,0 +1,164 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gtPlusPlus.core.item.ModItems.ZZZ_Empty;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gregtech.api.util.GT_Utility;
+
+public class NBTUtils {
+
+ public static NBTTagCompound getNBT(ItemStack aStack) {
+ NBTTagCompound rNBT = aStack.getTagCompound();
+ return ((rNBT == null) ? new NBTTagCompound() : rNBT);
+ }
+
+ public static void setBookTitle(ItemStack aStack, String aTitle) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString("title", aTitle);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static ItemStack[] readItemsFromNBT(ItemStack itemstack) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = tNBT.getTagList("Items", 10);
+ ItemStack inventory[] = new ItemStack[list.tagCount()];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < list.tagCount())) {
+ if (ItemStack.loadItemStackFromNBT(data) == ItemUtils.getSimpleStack(ZZZ_Empty)) {
+ inventory[slot] = null;
+ } else {
+ inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+ return inventory;
+ }
+
+ public static ItemStack writeItemsToNBT(ItemStack itemstack, ItemStack[] stored) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < stored.length; i++) {
+ final ItemStack stack = stored[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ } else {
+ final NBTTagCompound data = new NBTTagCompound();
+ ItemStack nullstack = ItemUtils.getSimpleStack(ZZZ_Empty);
+ nullstack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ tNBT.setTag("Items", list);
+ itemstack.setTagCompound(tNBT);
+ return itemstack;
+ }
+
+ public static ItemStack writeItemsToNBT(ItemStack itemstack, ItemStack[] stored, String customkey) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < stored.length; i++) {
+ final ItemStack stack = stored[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ tNBT.setTag(customkey, list);
+ itemstack.setTagCompound(tNBT);
+ return itemstack;
+ }
+
+ public static void setBoolean(ItemStack aStack, String aTag, boolean aBoolean) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setBoolean(aTag, aBoolean);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static boolean getBoolean(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getBoolean(aTag);
+ }
+
+ public static void setInteger(ItemStack aStack, String aTag, int aInt) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setInteger(aTag, aInt);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static int getInteger(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getInteger(aTag);
+ }
+
+ public static void setLong(ItemStack aStack, String aTag, long aInt) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setLong(aTag, aInt);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static long getLong(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getLong(aTag);
+ }
+
+ public static void setString(ItemStack aStack, String aTag, String aString) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString(aTag, aString);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static String getString(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getString(aTag);
+ }
+
+ public static boolean hasKey(ItemStack stack, String key) {
+ final NBTTagCompound itemData = getNBT(stack);
+ if (itemData.hasKey(key)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean createIntegerTagCompound(ItemStack rStack, String tagName, String keyName, int keyValue) {
+ final NBTTagCompound tagMain = getNBT(rStack);
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setInteger(keyName, keyValue);
+ tagMain.setTag(tagName, tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static NBTTagCompound getTagCompound(ItemStack aStack, String tagName) {
+ NBTTagCompound aNBT = getNBT(aStack);
+ if (aNBT != null && hasKey(aStack, tagName)) {
+ aNBT = aNBT.getCompoundTag(tagName);
+ if (aNBT != null) {
+ return aNBT;
+ }
+ }
+ return null;
+ }
+
+ public static boolean hasTagCompound(ItemStack aStack) {
+ return aStack.hasTagCompound();
+ }
+
+ public static void createEmptyTagCompound(ItemStack aStack) {
+ if (!hasTagCompound(aStack)) {
+ NBTTagCompound aTag = new NBTTagCompound();
+ aStack.setTagCompound(aTag);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
new file mode 100644
index 0000000000..0c8e971443
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+public class OreDictUtils {
+
+ public static boolean containsValidEntries(String aOreName) {
+ boolean a = OreDictionary.doesOreNameExist(aOreName);
+ List<ItemStack> b = OreDictionary.getOres(aOreName, false);
+
+ if (!a) {
+ return false;
+ } else {
+ return b != null && !b.isEmpty();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java
new file mode 100644
index 0000000000..ba7353cba6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java
@@ -0,0 +1,206 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.WeakHashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class PlayerUtils {
+
+ public static final Map<String, EntityPlayer> mCachedFakePlayers = new WeakHashMap<>();
+ private static final Class mThaumcraftFakePlayer;
+
+ static {
+ if (ReflectionUtils.doesClassExist("thaumcraft.common.lib.FakeThaumcraftPlayer")) {
+ mThaumcraftFakePlayer = ReflectionUtils.getClass("thaumcraft.common.lib.FakeThaumcraftPlayer");
+ } else {
+ mThaumcraftFakePlayer = null;
+ }
+ }
+
+ public static List<EntityPlayerMP> getOnlinePlayers() {
+ final List<EntityPlayerMP> onlinePlayers = MinecraftServer.getServer()
+ .getConfigurationManager().playerEntityList;
+ return onlinePlayers;
+ }
+
+ public static void messagePlayer(final EntityPlayer P, final String S) {
+ gregtech.api.util.GT_Utility.sendChatToPlayer(P, S);
+ }
+
+ public static void messagePlayer(final EntityPlayer P, final IChatComponent S) {
+ P.addChatComponentMessage(S);
+ }
+
+ public static EntityPlayer getPlayer(final String name) {
+ try {
+ for (final EntityPlayer temp : getOnlinePlayers()) {
+ if (temp.getDisplayName()
+ .equalsIgnoreCase(name)) {
+ return temp;
+ }
+ }
+ } catch (final Throwable ignored) {}
+ return null;
+ }
+
+ public static EntityPlayer getPlayerOnServerFromUUID(final UUID parUUID) {
+ if (parUUID == null) {
+ return null;
+ }
+ for (final EntityPlayerMP player : getOnlinePlayers()) {
+ if (player.getUniqueID()
+ .equals(parUUID)) {
+ return player;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isPlayerOP(final EntityPlayer player) {
+ if (player.canCommandSenderUseCommand(2, "")) {
+ return true;
+ }
+ return false;
+ }
+
+ // Not Clientside
+ public static ItemStack getItemStackInPlayersHand(final World world, final String Name) {
+ final EntityPlayer thePlayer = getPlayer(Name);
+ ItemStack heldItem = null;
+ try {
+ heldItem = thePlayer.getHeldItem();
+ } catch (final NullPointerException e) {
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ }
+ return null;
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static ItemStack getItemStackInPlayersHand() {
+ final Minecraft mc = Minecraft.getMinecraft();
+ ItemStack heldItem;
+ try {
+ heldItem = mc.thePlayer.getHeldItem();
+ } catch (final NullPointerException e) {
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ }
+ return null;
+ }
+
+ public static ItemStack getItemStackInPlayersHand(final EntityPlayer player) {
+ ItemStack heldItem;
+ try {
+ heldItem = player.getHeldItem();
+ } catch (final NullPointerException e) {
+ e.printStackTrace();
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ } else {
+ if (Utils.isClient()) {
+ heldItem = player.getItemInUse();
+ } else {
+ heldItem = player.getCurrentEquippedItem();
+ }
+ }
+ return heldItem;
+ }
+
+ public static final UUID getPlayersUUIDByName(final String aPlayerName) {
+ final EntityPlayer player = PlayerUtils.getPlayer(aPlayerName);
+ if (player != null) {
+ return player.getUniqueID();
+ }
+ return null;
+ }
+
+ public static void messageAllPlayers(String string) {
+ Utils.sendServerMessage(string);
+ }
+
+ public static boolean isCreative(EntityPlayer aPlayer) {
+ return aPlayer.capabilities.isCreativeMode;
+ }
+
+ public static boolean canTakeDamage(EntityPlayer aPlayer) {
+ return !aPlayer.capabilities.disableDamage;
+ }
+
+ public static void cacheFakePlayer(EntityPlayer aPlayer) {
+ ChunkCoordinates aChunkLocation = aPlayer.getPlayerCoordinates();
+ // Cache Fake Player
+ if (aPlayer instanceof FakePlayer
+ || (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(aPlayer))
+ || (aPlayer.getCommandSenderName() == null || aPlayer.getCommandSenderName()
+ .length() <= 0)
+ || (aPlayer.isEntityInvulnerable() && !aPlayer.canCommandSenderUseCommand(0, "") && (aChunkLocation == null)
+ || (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0))) {
+ mCachedFakePlayers.put(
+ aPlayer.getUniqueID()
+ .toString(),
+ aPlayer);
+ }
+ }
+
+ public static boolean isCachedFakePlayer(String aUUID) {
+ return mCachedFakePlayers.containsKey(aUUID);
+ }
+
+ public static boolean isRealPlayer(EntityLivingBase aEntity) {
+ if (aEntity instanceof EntityPlayer p) {
+ ChunkCoordinates aChunkLocation = p.getPlayerCoordinates();
+ if (p instanceof FakePlayer) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(p)) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.getCommandSenderName() == null) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.getCommandSenderName()
+ .length() <= 0) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.isEntityInvulnerable() && !p.canCommandSenderUseCommand(0, "")
+ && (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0)) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (!isCachedFakePlayer(
+ p.getUniqueID()
+ .toString())) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java
new file mode 100644
index 0000000000..ed2da4d7f7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java
@@ -0,0 +1,465 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.ShapedRecipe;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.handler.Recipes.LateRegistrationHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.data.ArrayUtils;
+
+public class RecipeUtils {
+
+ public static int mInvalidID = 1;
+
+ public static void recipeBuilder(final Object slot_1, final Object slot_2, final Object slot_3, final Object slot_4,
+ final Object slot_5, final Object slot_6, final Object slot_7, final Object slot_8, final Object slot_9,
+ ItemStack resultItem) {
+
+ if (resultItem == null) {
+ Logger.RECIPE(
+ "[Fix] Found a recipe with an invalid output, yet had a valid inputs. Using Dummy output so recipe can be found..");
+ resultItem = ItemUtils.getItemStackOfAmountFromOreDict("givemeabrokenitem", 1);
+ resultItem.setItemDamage(mInvalidID++);
+ RegistrationHandler.recipesFailed++;
+
+ } else if ((slot_1 == null) && (slot_2 == null)
+ && (slot_3 == null)
+ && (slot_4 == null)
+ && (slot_5 == null)
+ && (slot_6 == null)
+ && (slot_7 == null)
+ && (slot_8 == null)
+ && (slot_9 == null)) {
+ Logger.RECIPE("[Fix] Found a recipe with 0 inputs, yet had a valid output.");
+ Logger.RECIPE(
+ "[Fix] Error found while adding a recipe for: " + resultItem != null ? resultItem.getDisplayName()
+ : "Bad Output Item" + " | Please report this issue on Github.");
+ RegistrationHandler.recipesFailed++;
+ return;
+ }
+
+ Object[] o = new Object[] { slot_1, slot_2, slot_3, slot_4, slot_5, slot_6, slot_7, slot_8, slot_9 };
+
+ try {
+ int size = COMPAT_HANDLER.mRecipesToGenerate.size();
+ COMPAT_HANDLER.mRecipesToGenerate.put(new InternalRecipeObject(o, resultItem, false));
+ // Utils.LOG_WARNING("Success! Added a recipe for "+resultItem.getDisplayName());
+ if (COMPAT_HANDLER.mRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ }
+ } catch (RuntimeException k) {
+ Logger.RECIPE(
+ "[Fix] Invalid Recipe detected for: " + resultItem != null ? resultItem.getUnlocalizedName()
+ : "INVALID OUTPUT ITEM");
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesFailed++;
+ } else {
+ LateRegistrationHandler.recipesFailed++;
+ }
+ }
+ }
+
+ public static void removeCraftingRecipe(Object x) {
+ if (null == x) {
+ return;
+ }
+ if (x instanceof String) {
+ final Item R = ItemUtils.getItemFromFQRN((String) x);
+ if (R != null) {
+ x = R;
+ } else {
+ return;
+ }
+ }
+ if ((x instanceof Item) || (x instanceof ItemStack)) {
+ if (x instanceof Item) {
+ final ItemStack r = new ItemStack((Item) x);
+ Logger.RECIPE("Removing Recipe for " + r.getUnlocalizedName());
+ } else {
+ Logger.RECIPE("Removing Recipe for " + ((ItemStack) x).getUnlocalizedName());
+ }
+ if (x instanceof ItemStack) {
+ final Item r = ((ItemStack) x).getItem();
+ if (null != r) {
+ x = r;
+ } else {
+ Logger.RECIPE("Recipe removal failed - Tell Alkalus.");
+ return;
+ }
+ }
+ if (RecipeUtils.attemptRecipeRemoval((Item) x)) {
+ Logger.RECIPE("Recipe removal successful");
+ return;
+ }
+ Logger.RECIPE("Recipe removal failed - Tell Alkalus.");
+ }
+ }
+
+ private static boolean attemptRecipeRemoval(final Item I) {
+ Logger.RECIPE("Create list of recipes.");
+ final List<IRecipe> recipes = CraftingManager.getInstance()
+ .getRecipeList();
+ final Iterator<IRecipe> items = recipes.iterator();
+ Logger.RECIPE("Begin list iteration.");
+ while (items.hasNext()) {
+ final ItemStack is = items.next()
+ .getRecipeOutput();
+ if ((is != null) && (is.getItem() == I)) {
+ items.remove();
+ Logger.RECIPE("Remove a recipe with " + I.getUnlocalizedName() + " as output.");
+ continue;
+ }
+ }
+ Logger.RECIPE("All recipes should be gone?");
+ if (!items.hasNext()) {
+ Logger.RECIPE("We iterated once, let's try again to double check.");
+ for (IRecipe recipe : recipes) {
+ final ItemStack is = recipe.getRecipeOutput();
+ if ((is != null) && (is.getItem() == I)) {
+ items.remove();
+ Logger.RECIPE("REMOVING MISSED RECIPE - RECHECK CONSTRUCTORS");
+ return true;
+ }
+ }
+ Logger.RECIPE("Should be all gone now after double checking, so return true.");
+ return true;
+ }
+ Logger.RECIPE("Return false, because something went wrong.");
+ return false;
+ }
+
+ public static boolean addShapedGregtechRecipe(final Object InputItem1, final Object InputItem2,
+ final Object InputItem3, final Object InputItem4, final Object InputItem5, final Object InputItem6,
+ final Object InputItem7, final Object InputItem8, final Object InputItem9, final ItemStack OutputItem) {
+
+ Object[] o = { InputItem1, InputItem2, InputItem3, InputItem4, InputItem5, InputItem6, InputItem7, InputItem8,
+ InputItem9 };
+
+ if (gtPlusPlus.GTplusplus.CURRENT_LOAD_PHASE != GTplusplus.INIT_PHASE.POST_INIT) {
+ CORE.crash(
+ "Load Phase " + gtPlusPlus.GTplusplus.CURRENT_LOAD_PHASE
+ + " should be "
+ + GTplusplus.INIT_PHASE.POST_INIT
+ + ". Unable to register recipe.");
+ }
+
+ int size = COMPAT_HANDLER.mGtRecipesToGenerate.size();
+ COMPAT_HANDLER.mGtRecipesToGenerate.put(new InternalRecipeObject(o, OutputItem, true));
+
+ if (COMPAT_HANDLER.mGtRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean addShapelessGregtechRecipe(final Object[] inputItems, final ItemStack OutputItem) {
+ // Catch Invalid Recipes
+ if (inputItems.length > 9 || inputItems.length < 1) {
+ if (OutputItem != null) {
+ Logger.RECIPE(
+ "[Fix] Invalid input array for shapeless recipe, which should output "
+ + OutputItem.getDisplayName());
+ }
+ return false;
+ }
+ // let gregtech handle shapeless recipes.
+ if (GT_ModHandler.addShapelessCraftingRecipe(OutputItem, inputItems)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean generateMortarRecipe(ItemStack aStack, ItemStack aOutput) {
+ return RecipeUtils
+ .addShapedGregtechRecipe(aStack, null, null, CI.craftingToolMortar, null, null, null, null, null, aOutput);
+ }
+
+ public static class InternalRecipeObject implements RunnableWithInfo<String> {
+
+ final ItemStack mOutput;
+ final ShapedOreRecipe mRecipe;
+ public final boolean isValid;
+
+ public InternalRecipeObject(Object[] aInputs, ItemStack aOutput, boolean gtRecipe) {
+ Logger.RECIPE("===================================");
+ mOutput = aOutput != null ? aOutput.copy() : null;
+ Object[] aFiltered = new Object[9];
+ int aValid = 0;
+ for (Object o : aInputs) {
+ if (o instanceof ItemStack) {
+ aFiltered[aValid++] = o;
+ } else if (o instanceof Item) {
+ aFiltered[aValid++] = ItemUtils.getSimpleStack((Item) o);
+ } else if (o instanceof Block) {
+ aFiltered[aValid++] = ItemUtils.getSimpleStack((Block) o);
+ } else if (o instanceof String) {
+ aFiltered[aValid++] = o;
+ } else if (o == null) {
+ aFiltered[aValid++] = null;
+ } else {
+ Logger.RECIPE(
+ "Cleaned a " + o.getClass()
+ .getSimpleName() + " from recipe input.");
+ }
+ }
+
+ int validCounter = 0, invalidCounter = 0;
+ for (Object p : aFiltered) {
+ if (p instanceof ItemStack) {
+ validCounter++;
+ } else if (p instanceof Item) {
+ validCounter++;
+ } else if (p instanceof Block) {
+ validCounter++;
+ } else if (p instanceof String) {
+ validCounter++;
+ } else if (p == null) {
+ validCounter++;
+ } else {
+ invalidCounter++;
+ }
+ }
+
+ Logger.RECIPE("Using " + validCounter + " valid inputs and " + invalidCounter + " invalid inputs.");
+ ShapedRecipe r = new ShapedRecipe(aFiltered, mOutput);
+ if (r != null && r.mRecipe != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ mRecipe = r != null ? r.mRecipe : null;
+ }
+
+ @Override
+ public void run() {
+ if (this.isValid) {
+ GameRegistry.addRecipe(mRecipe);
+ } else {
+ Logger.RECIPE(
+ "[Fix] Invalid shapped recipe outputting "
+ + (mOutput != null ? mOutput.getDisplayName() : "Bad Output Item"));
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ if (mOutput != null && mOutput instanceof ItemStack) {
+ return mOutput.getDisplayName();
+ }
+ return "";
+ }
+ }
+
+ public static boolean removeRecipeByOutput(ItemStack aOutput) {
+ return removeRecipeByOutput(aOutput, true, false, false);
+ }
+
+ public static boolean removeRecipeByOutput(ItemStack aOutput, boolean aIgnoreNBT,
+ boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) {
+ if (aOutput == null) {
+ return false;
+ } else {
+ boolean rReturn = false;
+ ArrayList<IRecipe> tList = (ArrayList) CraftingManager.getInstance()
+ .getRecipeList();
+ aOutput = GT_OreDictUnificator.get(aOutput);
+ int tList_sS = tList.size();
+
+ for (int i = 0; i < tList_sS; ++i) {
+ IRecipe tRecipe = (IRecipe) tList.get(i);
+ if (!aNotRemoveShapelessRecipes
+ || !(tRecipe instanceof ShapelessRecipes) && !(tRecipe instanceof ShapelessOreRecipe)) {
+ if (aOnlyRemoveNativeHandlers) {
+ if (!gregtech.api.util.GT_ModHandler.sNativeRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName())) {
+ continue;
+ }
+ } else if (gregtech.api.util.GT_ModHandler.sSpecialRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName())) {
+ continue;
+ }
+
+ ItemStack tStack = tRecipe.getRecipeOutput();
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tStack), aOutput, aIgnoreNBT)) {
+ tList.remove(i--);
+ tList_sS = tList.size();
+ rReturn = true;
+ }
+ }
+ }
+
+ return rReturn;
+ }
+ }
+
+ public static void addSmeltingRecipe(ItemStack aStackInput, ItemStack aStackOutput, float aXpGained) {
+
+ GameRegistry.addSmelting(aStackInput, aStackOutput, aXpGained);
+ }
+
+ public static boolean addShapedRecipe(Object Input_1, Object Input_2, Object Input_3, Object Input_4,
+ Object Input_5, Object Input_6, Object Input_7, Object Input_8, Object Input_9, ItemStack aOutputStack) {
+ return addShapedRecipe(
+ new Object[] { Input_1, Input_2, Input_3, Input_4, Input_5, Input_6, Input_7, Input_8, Input_9 },
+ aOutputStack);
+ }
+
+ private static boolean addShapedRecipe(Object[] Inputs, ItemStack aOutputStack) {
+ Object[] Slots = new Object[9];
+
+ String aFullString = "";
+ String aFullStringExpanded = "abcdefghi";
+
+ for (int i = 0; i < 9; i++) {
+ Object o = Inputs[i];
+
+ if (o instanceof ItemStack) {
+ Slots[i] = ItemUtils.getSimpleStack((ItemStack) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof Item) {
+ Slots[i] = ItemUtils.getSimpleStack((Item) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof Block) {
+ Slots[i] = ItemUtils.getSimpleStack((Block) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof String) {
+ Slots[i] = o;
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof ItemData aData) {
+ ItemStack aStackFromGT = ItemUtils.getOrePrefixStack(aData.mPrefix, aData.mMaterial.mMaterial, 1);
+ Slots[i] = aStackFromGT;
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o == null) {
+ Slots[i] = null;
+ aFullString += " ";
+ } else {
+ Slots[i] = null;
+ Logger.INFO(
+ "Cleaned a " + o.getClass()
+ .getSimpleName() + " from recipe input.");
+ Logger.INFO("ERROR");
+ CORE.crash("Bad Shaped Recipe.");
+ }
+ }
+ Logger.RECIPE("Using String: " + aFullString);
+
+ String aRow1 = aFullString.substring(0, 3);
+ String aRow2 = aFullString.substring(3, 6);
+ String aRow3 = aFullString.substring(6, 9);
+ Logger.RECIPE("" + aRow1);
+ Logger.RECIPE("" + aRow2);
+ Logger.RECIPE("" + aRow3);
+
+ String[] aStringData = new String[] { aRow1, aRow2, aRow3 };
+ Object[] aDataObject = new Object[19];
+ aDataObject[0] = aStringData;
+ int aIndex = 0;
+
+ for (int u = 1; u < 20; u += 2) {
+ if (aIndex == 9) {
+ break;
+ }
+ if (aFullString.charAt(aIndex) != (' ')) {
+ aDataObject[u] = aFullString.charAt(aIndex);
+ aDataObject[u + 1] = Slots[aIndex];
+ Logger.INFO(
+ "(" + aIndex
+ + ") "
+ + aFullString.charAt(aIndex)
+ + " | "
+ + (Slots[aIndex] instanceof ItemStack ? ItemUtils.getItemName((ItemStack) Slots[aIndex])
+ : Slots[aIndex] instanceof String ? (String) Slots[aIndex] : "Unknown"));
+ }
+ aIndex++;
+ }
+
+ Logger.RECIPE("Data Size: " + aDataObject.length);
+ aDataObject = ArrayUtils.removeNulls(aDataObject);
+ Logger.RECIPE("Clean Size: " + aDataObject.length);
+ Logger.RECIPE("ArrayData: " + Arrays.toString(aDataObject));
+
+ ShapedOreRecipe aRecipe = new ShapedOreRecipe(aOutputStack, aDataObject);
+
+ int size = COMPAT_HANDLER.mRecipesToGenerate.size();
+ COMPAT_HANDLER.mRecipesToGenerate.put(new InternalRecipeObject2(aRecipe));
+ if (COMPAT_HANDLER.mRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public static class InternalRecipeObject2 implements RunnableWithInfo<String> {
+
+ final ItemStack mOutput;
+ final ShapedOreRecipe mRecipe;
+ final boolean isValid;
+
+ public InternalRecipeObject2(ShapedOreRecipe aRecipe) {
+ mRecipe = aRecipe;
+ mOutput = aRecipe.getRecipeOutput();
+ if (mOutput != null) {
+ this.isValid = true;
+ } else {
+ this.isValid = false;
+ }
+ }
+
+ @Override
+ public void run() {
+ if (this.isValid) {
+ GameRegistry.addRecipe(mRecipe);
+ } else {
+ Logger.INFO(
+ "[Fix] Invalid shapped recipe outputting " + mOutput != null ? mOutput.getDisplayName()
+ : "Bad Output Item");
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ if (mOutput != null) {
+ return mOutput.getDisplayName();
+ }
+ return "";
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
new file mode 100644
index 0000000000..4e6e508c15
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.core.util.minecraft.gregtech;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.common.GT_Pollution;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.cell.BaseItemCell;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class PollutionUtils {
+
+ public static AutoMap<FluidStack> mPollutionFluidStacks = new AutoMap<>();
+
+ public static boolean isPollutionEnabled() {
+ return GT_Mod.gregtechproxy.mPollution;
+ }
+
+ public static boolean addPollution(IGregTechTileEntity te, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ GT_Pollution.addPollution(te, pollutionValue);
+ return true;
+ }
+ return false;
+ }
+
+ public static void addPollution(IHasWorldObjectAndCoords aTileOfSomeSort, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ Chunk c = aTileOfSomeSort.getWorld()
+ .getChunkFromBlockCoords(aTileOfSomeSort.getXCoord(), aTileOfSomeSort.getZCoord());
+ addPollution(c, pollutionValue);
+ }
+ }
+
+ public static void addPollution(Chunk aChunk, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ GT_Pollution.addPollution(aChunk, pollutionValue);
+ }
+ }
+
+ public static void removePollution(IGregTechTileEntity te, int pollutionValue) {
+ addPollution(te, -pollutionValue);
+ }
+
+ public static void removePollution(Chunk aChunk, int pollutionValue) {
+ addPollution(aChunk, -pollutionValue);
+ }
+
+ public static void nullifyPollution(IGregTechTileEntity te) {
+ if (te == null) {
+ return;
+ }
+ nullifyPollution((IHasWorldObjectAndCoords) te);
+ }
+
+ public static void nullifyPollution(IHasWorldObjectAndCoords aTileOfSomeSort) {
+ if (aTileOfSomeSort == null) {
+ return;
+ }
+ Chunk c = aTileOfSomeSort.getWorld()
+ .getChunkFromBlockCoords(aTileOfSomeSort.getXCoord(), aTileOfSomeSort.getZCoord());
+ nullifyPollution(c);
+ }
+
+ public static void nullifyPollution(Chunk aChunk) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ if (aChunk == null) {
+ return;
+ }
+ int getCurrentPollution = getPollution(aChunk);
+ if (getCurrentPollution > 0) {
+ removePollution(aChunk, getCurrentPollution);
+ }
+ }
+ }
+
+ public static int getPollution(IGregTechTileEntity te) {
+ return GT_Pollution.getPollution(te);
+ }
+
+ public static int getPollution(Chunk te) {
+ return GT_Pollution.getPollution(te);
+ }
+
+ public static void setPollutionFluids() {
+ if (mPollutionFluidStacks.isEmpty()) {
+ FluidStack CD, CM, SD;
+ CD = FluidUtils.getFluidStack("carbondioxide", 1000);
+ CM = FluidUtils.getFluidStack("carbonmonoxide", 1000);
+ SD = FluidUtils.getFluidStack("sulfurdioxide", 1000);
+ if (PollutionUtils.mPollutionFluidStacks.size() == 0) {
+ if (CD != null) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CD);
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(CD);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonDioxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide cell, registering component.");
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ } else {
+ Logger.INFO("[PollutionCompat] Did not find carbon dioxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_DIOXIDE);
+ }
+ } else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_DIOXIDE, false, false);
+ }
+
+ if (CM != null) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CM);
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(CM);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonMonoxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide cell, registering component.");
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ } else {
+ Logger.INFO("[PollutionCompat] Did not find carbon monoxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_MONOXIDE);
+ }
+ } else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_MONOXIDE, false, false);
+ }
+
+ if (SD != null) {
+ Logger.INFO("[PollutionCompat] Found sulfur dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(SD);
+ }
+ }
+ } else {
+ if (mPollutionFluidStacks.size() != 3) {
+ Logger.INFO("Unable to detect all 3 pollution fluids. Found: ");
+ Logger.INFO(ArrayUtils.toString(mPollutionFluidStacks));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java b/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java
new file mode 100644
index 0000000000..c5498e4f59
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java
@@ -0,0 +1,95 @@
+package gtPlusPlus.core.util.recipe;
+
+import static gtPlusPlus.core.slots.SlotIntegratedCircuit.isRegularProgrammableCircuit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gnu.trove.map.hash.TCustomHashMap;
+import gnu.trove.set.hash.TCustomHashSet;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+
+public class GT_RecipeUtils {
+
+ public static List<GT_Recipe> removeDuplicates(List<GT_Recipe> inputRecipes, String recipeMapName) {
+ TCustomHashSet<GT_Recipe> recipesHashSet = new TCustomHashSet<>(RecipeHashStrat.RecipeHashingStrategy);
+ ArrayList<GT_Recipe> recipeOutput = new ArrayList<>();
+ TCustomHashMap<GT_Recipe, ItemStack> circuitMap = new TCustomHashMap<>(RecipeHashStrat.RecipeHashingStrategy);
+ int removedRecipeCount = 0;
+
+ for (GT_Recipe recipeInput : inputRecipes) {
+ ItemStack savedCircuit = null;
+ // create a new input ItemStack array that does not contain programmable circuits if they were in the recipe
+ ArrayList<ItemStack> itemInputsWithoutProgrammableCircuit = new ArrayList<>();
+ // iterate over the recipe input items and add them all to a new array without any programmable circuits
+ for (ItemStack itemStack : recipeInput.mInputs) {
+ if (itemStack == null) {
+ continue;
+ }
+ if (isRegularProgrammableCircuit(itemStack) == -1) {
+ itemInputsWithoutProgrammableCircuit.add(itemStack);
+ } else {
+ savedCircuit = itemStack;
+ }
+ }
+ GT_Recipe newRecipe = new GT_Recipe(
+ false,
+ itemInputsWithoutProgrammableCircuit.toArray(new ItemStack[0]),
+ recipeInput.mOutputs,
+ recipeInput.mSpecialItems,
+ recipeInput.mChances,
+ recipeInput.mFluidInputs,
+ recipeInput.mFluidOutputs,
+ recipeInput.mDuration,
+ recipeInput.mEUt,
+ recipeInput.mSpecialValue);
+ if (!recipesHashSet.contains(newRecipe)) {
+ // if the recipes customHashSet does not contain the new recipe then add it
+ recipesHashSet.add(newRecipe);
+ } else {
+ removedRecipeCount++;
+ }
+ if (savedCircuit != null) {
+ // if the current recipe has a circuit and the recipe (without circuits) is already in the
+ // circuit map then check make sure the circuit map saves the recipe with the smallest circuit
+ // damage value. This is to prevent a case where recipe load order would affect which duplicate
+ // recipes with multiple circuit values gets removed.
+ if (circuitMap.containsKey(newRecipe)) {
+ if (circuitMap.get(newRecipe)
+ .getItemDamage() > savedCircuit.getItemDamage()) {
+ circuitMap.put(newRecipe, savedCircuit);
+ }
+ } else {
+ // If the circuit map does not have the recipe in it yet then add it
+ circuitMap.put(newRecipe, savedCircuit);
+ }
+ }
+ }
+ // iterate over all recipes without duplicates and add them to the output. If the recipe had a programmable
+ // circuit in it then add it back with its damage value coming from the circuit map.
+ for (GT_Recipe filteredRecipe : recipesHashSet) {
+ // check to see if the recipe is in the circuit map
+ if (circuitMap.contains(filteredRecipe)) {
+ // add the circuit back
+ // update the item input array with the new input from
+ // ItemInputsWithoutProgrammableCircuit + circuit map circuit
+ filteredRecipe.mInputs = ArrayUtils.add(filteredRecipe.mInputs, circuitMap.get(filteredRecipe));
+ }
+ // if the recipe was not in the circuit map then just add it the output as no updates to the item input
+ // needs to be made
+ recipeOutput.add(filteredRecipe);
+ }
+ // print results to log
+ Logger.INFO(
+ "Recipe Array duplication removal process completed for '" + recipeMapName
+ + "': '"
+ + removedRecipeCount
+ + "' removed.");
+ return recipeOutput;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java b/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java
new file mode 100644
index 0000000000..18323a4c8b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java
@@ -0,0 +1,116 @@
+package gtPlusPlus.core.util.recipe;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Objects;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gnu.trove.strategy.HashingStrategy;
+import gregtech.api.util.GT_Recipe;
+
+public class RecipeHashStrat {
+
+ public static final HashingStrategy<GT_Recipe> RecipeHashingStrategy = new HashingStrategy<>() {
+
+ @Override
+ public int computeHashCode(GT_Recipe recipe) {
+ return com.google.common.base.Objects.hashCode(recipe.mDuration, recipe.mEUt);
+ }
+
+ @Override
+ public boolean equals(GT_Recipe recipe1, GT_Recipe recipe2) {
+ return areRecipesEqual(recipe1, recipe2);
+ }
+ };
+
+ public static boolean areRecipesEqual(GT_Recipe recipe1, GT_Recipe recipe2) {
+ // both item outputs use a copy to prevent interfering with chance based output orders
+ // sort all the arrays for recipe1
+ RecipeHashStrat.sortItemStackArray(recipe1.mInputs);
+ ItemStack[] recipe1OutputCopy = recipe1.mOutputs.clone();
+ RecipeHashStrat.sortItemStackArray(recipe1OutputCopy);
+ RecipeHashStrat.sortFluidStackArray(recipe1.mFluidInputs);
+ RecipeHashStrat.sortFluidStackArray(recipe1.mFluidOutputs);
+ // sort all the arrays for recipe2
+
+ RecipeHashStrat.sortItemStackArray(recipe2.mInputs);
+ ItemStack[] recipe2OutputCopy = recipe2.mOutputs.clone();
+ RecipeHashStrat.sortItemStackArray(recipe2OutputCopy);
+ RecipeHashStrat.sortFluidStackArray(recipe2.mFluidInputs);
+ RecipeHashStrat.sortFluidStackArray(recipe2.mFluidOutputs);
+
+ // checks if the recipe EUt, Duration, inputs and outputs for both items and fluids are equal
+ if (recipe1.mEUt != recipe2.mEUt) {
+ return false;
+ }
+ if (recipe1.mDuration != recipe2.mDuration) {
+ return false;
+ }
+ if (!areItemsStackArraysEqual(recipe1.mInputs, recipe2.mInputs)) {
+ return false;
+ }
+ if (!areItemsStackArraysEqual(recipe1OutputCopy, recipe2OutputCopy)) {
+ return false;
+ }
+ if (!areFluidStackArraysEqual(recipe1.mFluidInputs, recipe2.mFluidInputs)) {
+ return false;
+ }
+ if (!areFluidStackArraysEqual(recipe1.mFluidOutputs, recipe2.mFluidOutputs)) {
+ return false;
+ }
+ return true;
+
+ }
+
+ public static void sortItemStackArray(ItemStack[] itemStackArray) {
+ Arrays.sort(
+ itemStackArray,
+ Comparator.<ItemStack, Integer>comparing(itemStack -> Item.getIdFromItem(itemStack.getItem()))
+ .thenComparing(ItemStack::getItemDamage)
+ .thenComparing(itemStack -> itemStack.stackSize));
+ }
+
+ public static void sortFluidStackArray(FluidStack[] fluidStackArray) {
+ Arrays.sort(
+ fluidStackArray,
+ Comparator.comparing(FluidStack::getFluidID)
+ .thenComparing(fluidStack -> fluidStack.amount));
+ }
+
+ public static boolean areItemsStackArraysEqual(ItemStack[] array1, ItemStack[] array2) {
+ if (array1.length != array2.length) {
+ return false;
+ }
+ for (int i = 0; i < array1.length; i++) {
+ if (!Objects.equals(array1[i].getItem(), array2[i].getItem())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].getItemDamage(), array2[i].getItemDamage())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].stackSize, array2[i].stackSize)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean areFluidStackArraysEqual(FluidStack[] array1, FluidStack[] array2) {
+ if (array1.length != array2.length) {
+ return false;
+ }
+ for (int i = 0; i < array1.length; i++) {
+ // check if the string representation of both FluidStacks are not equal
+ if (!Objects.equals(array1[i].getFluid(), array2[i].getFluid())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].amount, array2[i].amount)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java b/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
new file mode 100644
index 0000000000..807fba9238
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.core.util.reflect;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+
+public final class AddGregtechRecipe {
+
+ public static boolean importPyroRecipe(GT_Recipe aRecipe) {
+
+ int aModifiedTime = (int) (aRecipe.mDuration * 0.8);
+
+ if (aRecipe.mInputs == null || aRecipe.mFluidInputs == null
+ || aRecipe.mFluidOutputs == null
+ || aRecipe.mOutputs == null) {
+ return false;
+ }
+ if (aRecipe.mInputs.length > 2 || aRecipe.mFluidInputs.length > 1
+ || aRecipe.mFluidOutputs.length > 1
+ || aRecipe.mOutputs.length > 9) {
+ return false;
+ } else if (aRecipe.mInputs.length <= 0) {
+ return false;
+ }
+
+ int aCircuitNumber = -1;
+ Item aCircuit = CI.getNumberedCircuit(1)
+ .getItem();
+ boolean hasCircuit = false;
+
+ for (ItemStack a : aRecipe.mInputs) {
+ if (a != null && a.getItem() == aCircuit) {
+ hasCircuit = true;
+ aCircuitNumber = a.getItemDamage();
+ break;
+ }
+ }
+
+ ItemStack aInputItem = null;
+ if (!hasCircuit || aCircuitNumber < 1) {
+ return false;
+ }
+
+ for (ItemStack a : aRecipe.mInputs) {
+ if (a != null && a.getItem() != aCircuit) {
+ aInputItem = a;
+ break;
+ }
+ }
+
+ return CORE.RA.addCokeOvenRecipe(
+ aCircuitNumber,
+ aInputItem,
+ aRecipe.mFluidInputs,
+ aRecipe.mFluidOutputs,
+ aRecipe.mOutputs,
+ aModifiedTime,
+ aRecipe.mEUt);
+ }
+
+ @Deprecated
+ public static boolean addCokeAndPyrolyseRecipes(ItemStack input1, int circuitNumber, FluidStack inputFluid1,
+ ItemStack output1, FluidStack outputFluid1, int timeInSeconds, int euTick) {
+ // Seconds Conversion
+ int TIME = timeInSeconds * 20;
+ int TIMEPYRO = TIME + (TIME / 5);
+ // Even though it says coke and pyrolyse, ICO recipes are imported from pyrolyse by #importPyroRecipe
+ GT_Values.RA.addPyrolyseRecipe(input1, inputFluid1, circuitNumber, output1, outputFluid1, TIMEPYRO, euTick);
+
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
new file mode 100644
index 0000000000..078cef6ea8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
@@ -0,0 +1,727 @@
+package gtPlusPlus.core.util.reflect;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.google.common.reflect.ClassPath;
+import com.gtnewhorizon.gtnhlib.reflect.Fields;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.data.StringUtils;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public class ReflectionUtils {
+
+ public static Map<String, Class<?>> mCachedClasses = new LinkedHashMap<>();
+ public static Map<String, CachedMethod> mCachedMethods = new LinkedHashMap<>();
+ public static Map<String, CachedField> mCachedFields = new LinkedHashMap<>();
+ public static Map<String, CachedConstructor> mCachedConstructors = new LinkedHashMap<>();
+ public static Map<Field, Fields.ClassFields.Field> mCachedFieldAccessors = new LinkedHashMap<>();
+
+ private static class CachedConstructor {
+
+ private final Constructor<?> METHOD;
+
+ public CachedConstructor(Constructor<?> aCons) {
+ METHOD = aCons;
+ }
+
+ public Constructor<?> get() {
+ return METHOD;
+ }
+ }
+
+ private static class CachedMethod {
+
+ private final Method METHOD;
+
+ public CachedMethod(Method aMethod, boolean isStatic) {
+ METHOD = aMethod;
+ }
+
+ public Method get() {
+ return METHOD;
+ }
+
+ }
+
+ private static class CachedField {
+
+ private final Field FIELD;
+
+ public CachedField(Field aField, boolean isStatic) {
+ FIELD = aField;
+ }
+
+ public Field get() {
+ return FIELD;
+ }
+
+ }
+
+ private static Fields.ClassFields.Field cacheAccessor(Field f) {
+ return mCachedFieldAccessors.computeIfAbsent(
+ f,
+ (field) -> Fields.ofClass(field.getDeclaringClass())
+ .getUntypedField(Fields.LookupType.DECLARED_IN_HIERARCHY, field.getName()));
+ }
+
+ private static boolean cacheClass(Class<?> aClass) {
+ if (aClass == null) {
+ return false;
+ }
+ Class<?> y = mCachedClasses.get(aClass.getCanonicalName());
+ if (y == null) {
+ mCachedClasses.put(aClass.getCanonicalName(), aClass);
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean cacheMethod(Class<?> aClass, Method aMethod) {
+ if (aMethod == null) {
+ return false;
+ }
+ boolean isStatic = Modifier.isStatic(aMethod.getModifiers());
+ CachedMethod y = mCachedMethods
+ .get(aClass.getName() + "." + aMethod.getName() + "." + ArrayUtils.toString(aMethod.getParameterTypes()));
+ if (y == null) {
+ mCachedMethods.put(
+ aClass.getName() + "." + aMethod.getName() + "." + ArrayUtils.toString(aMethod.getParameterTypes()),
+ new CachedMethod(aMethod, isStatic));
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean cacheField(Class<?> aClass, Field aField) {
+ if (aField == null) {
+ return false;
+ }
+ boolean isStatic = Modifier.isStatic(aField.getModifiers());
+ CachedField y = mCachedFields.get(aClass.getName() + "." + aField.getName());
+ if (y == null) {
+ mCachedFields.put(aClass.getName() + "." + aField.getName(), new CachedField(aField, isStatic));
+ return true;
+ }
+ return false;
+ }
+
+ private static void cacheConstructor(Class<?> aClass, Constructor<?> aConstructor) {
+ if (aConstructor == null) {
+ return;
+ }
+ mCachedConstructors.computeIfAbsent(
+ aClass.getName() + "." + ArrayUtils.toString(aConstructor.getParameterTypes()),
+ k -> new CachedConstructor(aConstructor));
+ }
+
+ /**
+ * Returns a cached {@link Constructor} object.
+ *
+ * @param aClass - Class containing the Constructor.
+ * @param aTypes - Varags Class Types for objects constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Constructor<?> getConstructor(Class<?> aClass, Class<?>... aTypes) {
+ if (aClass == null || aTypes == null) {
+ return null;
+ }
+
+ String aMethodKey = ArrayUtils.toString(aTypes);
+ // Logger.REFLECTION("Looking up method in cache: "+(aClass.getName()+"."+aMethodName + "." + aMethodKey));
+ CachedConstructor y = mCachedConstructors.get(aClass.getName() + "." + aMethodKey);
+ if (y == null) {
+ Constructor<?> u = getConstructor_Internal(aClass, aTypes);
+ if (u != null) {
+ Logger.REFLECTION("Caching Constructor: " + aClass.getName() + "." + aMethodKey);
+ cacheConstructor(aClass, u);
+ return u;
+ } else {
+ return null;
+ }
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Class} object.
+ *
+ * @param aClassCanonicalName - The canonical name of the underlying class.
+ * @return - Valid, {@link Class} object, or {@link null}.
+ */
+ public static Class<?> getClass(String aClassCanonicalName) {
+ if (aClassCanonicalName == null || aClassCanonicalName.length() <= 0) {
+ return null;
+ }
+ Class<?> y = mCachedClasses.get(aClassCanonicalName);
+ if (y == null) {
+ y = getClass_Internal(aClassCanonicalName);
+ if (y != null) {
+ Logger.REFLECTION("Caching Class: " + aClassCanonicalName);
+ cacheClass(y);
+ }
+ }
+ return y;
+ }
+
+ /**
+ * Returns a cached {@link Method} object. Wraps {@link #getMethod(Class, String, Class...)}.
+ *
+ * @param aObject - Object containing the Method.
+ * @param aMethodName - Method's name in {@link String} form.
+ * @param aTypes - Class Array of Types for {@link Method}'s constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Method getMethod(Object aObject, String aMethodName, Class[] aTypes) {
+ return getMethod(aObject.getClass(), aMethodName, aTypes);
+ }
+
+ /**
+ * Returns a cached {@link Method} object.
+ *
+ * @param aClass - Class containing the Method.
+ * @param aMethodName - Method's name in {@link String} form.
+ * @param aTypes - Varags Class Types for {@link Method}'s constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Method getMethod(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
+ if (aClass == null || aMethodName == null || aMethodName.length() <= 0) {
+ return null;
+ }
+ String aMethodKey = ArrayUtils.toString(aTypes);
+ // Logger.REFLECTION("Looking up method in cache: "+(aClass.getName()+"."+aMethodName + "." + aMethodKey));
+ CachedMethod y = mCachedMethods.get(aClass.getName() + "." + aMethodName + "." + aMethodKey);
+ if (y == null) {
+ Method u = getMethod_Internal(aClass, aMethodName, aTypes);
+ if (u != null) {
+ Logger.REFLECTION("Caching Method: " + aMethodName + "." + aMethodKey);
+ cacheMethod(aClass, u);
+ return u;
+ } else {
+ return null;
+ }
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Field} object.
+ *
+ * @param aClass - Class containing the Method.
+ * @param aFieldName - Field name in {@link String} form.
+ * @return - Valid, non-final, {@link Field} object, or {@link null}.
+ */
+ public static Field getField(final Class<?> aClass, final String aFieldName) {
+ if (aClass == null || aFieldName == null || aFieldName.length() <= 0) {
+ return null;
+ }
+ CachedField y = mCachedFields.get(aClass.getName() + "." + aFieldName);
+ if (y == null) {
+ Field u;
+ try {
+ u = getField_Internal(aClass, aFieldName);
+ if (u != null) {
+ Logger.REFLECTION("Caching Field '" + aFieldName + "' from " + aClass.getName());
+ cacheField(aClass, u);
+ return u;
+ }
+ } catch (NoSuchFieldException e) {}
+ return null;
+
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Field} object.
+ *
+ * @param aInstance - {@link Object} to get the field instance from.
+ * @param aFieldName - Field name in {@link String} form.
+ * @return - Valid, non-final, {@link Field} object, or {@link null}.
+ */
+ public static <T> T getField(final Object aInstance, final String aFieldName) {
+ try {
+ return (T) getField(aInstance.getClass(), aFieldName).get(aInstance);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ return null;
+ }
+ }
+
+ /*
+ * Utility Functions
+ */
+
+ public static boolean doesClassExist(final String classname) {
+ return isClassPresent(classname);
+ }
+
+ public static void makeFieldAccessible(final Field field) {
+ if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(
+ field.getDeclaringClass()
+ .getModifiers())) {
+ field.setAccessible(true);
+ }
+ }
+
+ public static void makeMethodAccessible(final Method field) {
+ if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(
+ field.getDeclaringClass()
+ .getModifiers())) {
+ field.setAccessible(true);
+ }
+ }
+
+ /**
+ * Get the method name for a depth in call stack. <br />
+ * Utility function
+ *
+ * @param depth depth in the call stack (0 means current method, 1 means call method, ...)
+ * @return Method name
+ */
+ public static String getMethodName(final int depth) {
+ final StackTraceElement[] ste = new Throwable().getStackTrace();
+ // System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
+ if (ste.length < depth) {
+ return "No valid stack.";
+ }
+ return ste[depth + 1].getMethodName();
+ }
+
+ /**
+ *
+ * @param aPackageName - The full {@link Package} name in {@link String} form.
+ * @return - {@link Boolean} object. True if loaded > 0 classes.
+ */
+ public static boolean dynamicallyLoadClassesInPackage(String aPackageName) {
+ ClassLoader classLoader = ReflectionUtils.class.getClassLoader();
+ int loaded = 0;
+ try {
+ ClassPath path = ClassPath.from(classLoader);
+ for (ClassPath.ClassInfo info : path.getTopLevelClassesRecursive(aPackageName)) {
+ Class<?> clazz = Class.forName(info.getName(), true, classLoader);
+ if (clazz != null) {
+ loaded++;
+ Logger.INFO("Found " + clazz.getCanonicalName() + ". [" + loaded + "]");
+ }
+ }
+ } catch (ClassNotFoundException | IOException e) {
+
+ }
+
+ return loaded > 0;
+ }
+
+ public static void loadClass(String aClassName) {
+ try {
+ Class.forName(aClassName, true, ReflectionUtils.class.getClassLoader());
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static boolean setField(final Object object, final String fieldName, final Object fieldValue) {
+ Class<?> clazz;
+ if (object instanceof Class) {
+ clazz = (Class<?>) object;
+ } else {
+ clazz = object.getClass();
+ }
+ while (clazz != null) {
+ try {
+ final Field field = getField(clazz, fieldName);
+ if (field != null) {
+ setFieldValue_Internal(object, field, fieldValue);
+ return true;
+ }
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("setField(" + object + ", " + fieldName + ") failed.");
+ clazz = clazz.getSuperclass();
+ } catch (final Exception e) {
+ Logger.REFLECTION("setField(" + object + ", " + fieldName + ") failed.");
+ throw new IllegalStateException(e);
+ }
+ }
+ return false;
+ }
+
+ public static boolean setField(final Object object, final Field field, final Object fieldValue) {
+ if (field == null) return false;
+ Class<?> clazz;
+ if (object instanceof Class) {
+ clazz = (Class<?>) object;
+ } else {
+ clazz = object.getClass();
+ }
+ while (clazz != null) {
+ try {
+ final Field field2 = getField(clazz, field.getName());
+ if (field2 != null) {
+ setFieldValue_Internal(object, field, fieldValue);
+ return true;
+ }
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("setField(" + object + ", " + field.getName() + ") failed.");
+ clazz = clazz.getSuperclass();
+ } catch (final Exception e) {
+ Logger.REFLECTION("setField(" + object + ", " + field.getName() + ") failed.");
+ throw new IllegalStateException(e);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Allows to change the state of an immutable instance. Huh?!?
+ */
+ public static void setFinalFieldValue(Class<?> clazz, String fieldName, Object newValue) {
+ Field nameField = getField(clazz, fieldName);
+ try {
+ setFieldValue_Internal(clazz, nameField, newValue);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ public static void setByte(Object clazz, String fieldName, byte newValue) {
+ Field nameField = getField(clazz.getClass(), fieldName);
+ cacheAccessor(nameField).setValue(null, newValue);
+ }
+
+ public static boolean invokeVoid(Object objectInstance, String methodName, Class[] parameters, Object[] values) {
+ if (objectInstance == null || methodName == null || parameters == null || values == null) {
+ return false;
+ }
+ Class<?> mLocalClass = (objectInstance instanceof Class ? (Class<?>) objectInstance
+ : objectInstance.getClass());
+ Logger.REFLECTION(
+ "Trying to invoke " + methodName + " on an instance of " + mLocalClass.getCanonicalName() + ".");
+ try {
+ Method mInvokingMethod = mLocalClass.getDeclaredMethod(methodName, parameters);
+ if (mInvokingMethod != null) {
+ Logger.REFLECTION(methodName + " was not null.");
+ mInvokingMethod.invoke(objectInstance, values);
+ Logger.REFLECTION("Successfully invoked " + methodName + ".");
+ return true;
+ } else {
+ Logger.REFLECTION(methodName + " is null.");
+ }
+ } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ Logger.REFLECTION(
+ "Failed to Dynamically invoke " + methodName + " on an object of type: " + mLocalClass.getName());
+ }
+
+ Logger.REFLECTION("Invoke failed or did something wrong.");
+ return false;
+ }
+
+ /*
+ * Below Code block is used for determining generic types associated with type<E>
+ */
+
+ /*
+ * End of Generics Block
+ */
+
+ private static Field getField_Internal(final Class<?> clazz, final String fieldName) throws NoSuchFieldException {
+ try {
+ Logger.REFLECTION("Field: Internal Lookup: " + fieldName);
+ Field k = clazz.getDeclaredField(fieldName);
+ makeFieldAccessible(k);
+ return k;
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("Field: Internal Lookup Failed: " + fieldName);
+ final Class<?> superClass = clazz.getSuperclass();
+ if (superClass == null) {
+ Logger.REFLECTION("Unable to find field '" + fieldName + "'");
+ throw e;
+ }
+ Logger.REFLECTION("Method: Recursion Lookup: " + fieldName + " - Checking in " + superClass.getName());
+ return getField_Internal(superClass, fieldName);
+ }
+ }
+
+ /**
+ * if (isPresent("com.optionaldependency.DependencyClass")) || This block will never execute when the dependency is
+ * not present. There is therefore no more risk of code throwing NoClassDefFoundException.
+ */
+ private static boolean isClassPresent(final String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (final Throwable ex) {
+ // Class or one of its dependencies is not present...
+ return false;
+ }
+ }
+
+ private static Method getMethod_Internal(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
+ Method m = null;
+ try {
+ Logger.REFLECTION("Method: Internal Lookup: " + aMethodName);
+ m = aClass.getDeclaredMethod(aMethodName, aTypes);
+ if (m != null) {
+ m.setAccessible(true);
+ }
+ } catch (Throwable t) {
+ Logger.REFLECTION("Method: Internal Lookup Failed: " + aMethodName);
+ try {
+ m = getMethodRecursively(aClass, aMethodName);
+ } catch (NoSuchMethodException e) {
+ Logger.REFLECTION("Unable to find method '" + aMethodName + "'");
+ e.printStackTrace();
+ dumpClassInfo(aClass);
+ }
+ }
+ return m;
+ }
+
+ private static Constructor<?> getConstructor_Internal(Class<?> aClass, Class<?>... aTypes) {
+ Constructor<?> c = null;
+ try {
+ Logger.REFLECTION("Constructor: Internal Lookup: " + aClass.getName());
+ c = aClass.getDeclaredConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ }
+ } catch (Throwable t) {
+ Logger.REFLECTION("Constructor: Internal Lookup Failed: " + aClass.getName());
+ try {
+ c = getConstructorRecursively(aClass, aTypes);
+ } catch (Exception e) {
+ Logger.REFLECTION("Unable to find method '" + aClass.getName() + "'");
+ e.printStackTrace();
+ dumpClassInfo(aClass);
+ }
+ }
+ return c;
+ }
+
+ private static Constructor<?> getConstructorRecursively(Class<?> aClass, Class<?>... aTypes) throws Exception {
+ try {
+ Logger.REFLECTION("Constructor: Recursion Lookup: " + aClass.getName());
+ Constructor<?> c = aClass.getConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ }
+ return c;
+ } catch (final NoSuchMethodException | IllegalArgumentException e) {
+ final Class<?> superClass = aClass.getSuperclass();
+ if (superClass == null || superClass == Object.class) {
+ throw e;
+ }
+ return getConstructor_Internal(superClass, aTypes);
+ }
+ }
+
+ private static Method getMethodRecursively(final Class<?> clazz, final String aMethodName)
+ throws NoSuchMethodException {
+ try {
+ Logger.REFLECTION("Method: Recursion Lookup: " + aMethodName);
+ Method k = clazz.getDeclaredMethod(aMethodName);
+ makeMethodAccessible(k);
+ return k;
+ } catch (final NoSuchMethodException e) {
+ final Class<?> superClass = clazz.getSuperclass();
+ if (superClass == null || superClass == Object.class) {
+ throw e;
+ }
+ return getMethod_Internal(superClass, aMethodName);
+ }
+ }
+
+ private static void dumpClassInfo(Class<?> aClass) {
+ Logger.INFO(
+ "We ran into an error processing reflection in " + aClass.getName() + ", dumping all data for debugging.");
+ // Get the methods
+ Method[] methods = aClass.getDeclaredMethods();
+ Field[] fields = aClass.getDeclaredFields();
+ Constructor[] consts = aClass.getDeclaredConstructors();
+
+ Logger.INFO("Dumping all Methods.");
+ for (Method method : methods) {
+ System.out
+ .println(method.getName() + " | " + StringUtils.getDataStringFromArray(method.getParameterTypes()));
+ }
+ Logger.INFO("Dumping all Fields.");
+ for (Field f : fields) {
+ System.out.println(f.getName());
+ }
+ Logger.INFO("Dumping all Constructors.");
+ for (Constructor<?> c : consts) {
+ System.out.println(
+ c.getName() + " | "
+ + c.getParameterCount()
+ + " | "
+ + StringUtils.getDataStringFromArray(c.getParameterTypes()));
+ }
+ }
+
+ private static Class<?> getNonPublicClass(final String className) {
+ Class<?> c = null;
+ try {
+ c = Class.forName(className);
+ } catch (final ClassNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // full package name --------^^^^^^^^^^
+ // or simpler without Class.forName:
+ // Class<package1.A> c = package1.A.class;
+
+ if (null != c) {
+ // In our case we need to use
+ Constructor<?> constructor = null;
+ try {
+ constructor = c.getDeclaredConstructor();
+ } catch (NoSuchMethodException | SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // note: getConstructor() can return only public constructors
+ // so we needed to search for any Declared constructor
+
+ // now we need to make this constructor accessible
+ if (null != constructor) {
+ constructor.setAccessible(true); // ABRACADABRA!
+
+ try {
+ final Object o = constructor.newInstance();
+ return (Class<?>) o;
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Class<?> getClass_Internal(String string) {
+ Class<?> aClass = null;
+ if (ReflectionUtils.doesClassExist(string)) {
+ try {
+ aClass = Class.forName(string);
+ } catch (ClassNotFoundException e) {
+ aClass = getNonPublicClass(string);
+ }
+ }
+
+ if (aClass == null) {
+ String aClassName = "";
+ Logger.REFLECTION("Splitting " + string + " to try look for hidden classes.");
+ String[] aData = string.split("\\.");
+ Logger.REFLECTION("Obtained " + aData.length + " pieces.");
+ for (int i = 0; i < (aData.length - 1); i++) {
+ aClassName += (i > 0) ? "." + aData[i] : "" + aData[i];
+ Logger.REFLECTION("Building: " + aClassName);
+ }
+ if (aClassName != null && aClassName.length() > 0) {
+ Logger.REFLECTION("Trying to search '" + aClassName + "' for inner classes.");
+ Class<?> clazz = ReflectionUtils.getClass(aClassName);
+ if (clazz != null) {
+ Class[] y = clazz.getDeclaredClasses();
+ if (y == null || y.length <= 0) {
+ Logger.REFLECTION("No hidden inner classes found.");
+ return null;
+ } else {
+ boolean found = false;
+ for (Class<?> h : y) {
+ Logger.REFLECTION("Found hidden inner class: " + h.getCanonicalName());
+ if (h.getSimpleName()
+ .toLowerCase()
+ .equals(aData[aData.length - 1].toLowerCase())) {
+ Logger.REFLECTION(
+ "Found correct class. [" + aData[aData.length - 1]
+ + "] Caching at correct location: "
+ + string);
+ Logger.REFLECTION("Found at location: " + h.getCanonicalName());
+ ReflectionUtils.mCachedClasses.put(string, h);
+ aClass = h;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return null;
+ }
+ }
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+ return aClass;
+ }
+
+ /**
+ *
+ * Set the value of a field reflectively.
+ */
+ private static void setFieldValue_Internal(Object owner, Field field, Object value) throws Exception {
+ cacheAccessor(field).setValue(owner, value);
+ }
+
+ public static boolean doesFieldExist(Class<?> clazz, String string) {
+ if (clazz != null) {
+ if (ReflectionUtils.getField(clazz, string) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static <T> T getFieldValue(Field field) {
+ return getFieldValue(field, null);
+ }
+
+ public static <T> T getFieldValue(Field field, Object instance) {
+ try {
+ return (T) field.get(instance);
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ return null;
+ }
+
+ public static <T> T createNewInstanceFromConstructor(Constructor aConstructor, Object[] aArgs) {
+ T aInstance;
+ try {
+ aInstance = (T) aConstructor.newInstance(aArgs);
+ if (aInstance != null) {
+ return aInstance;
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Enum getEnum(Class<Enum> sgtbees, String name) {
+ if (sgtbees.isEnum()) {
+ Object[] aValues = sgtbees.getEnumConstants();
+ for (Object o : aValues) {
+ if (o.toString()
+ .toLowerCase()
+ .equals(name.toLowerCase())) {
+ return (Enum) o;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java b/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java
new file mode 100644
index 0000000000..9c8b471ff6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.core.util.sys;
+
+import net.minecraft.client.Minecraft;
+
+import org.lwjgl.input.Keyboard;
+
+public class KeyboardUtils {
+
+ public static boolean isCtrlKeyDown() {
+ try {
+ if (!Keyboard.isCreated()) {
+ return false;
+ }
+ // prioritize CONTROL, but allow OPTION as well on Mac (note: GuiScreen's isCtrlKeyDown only checks for the
+ // OPTION key on Mac)
+ boolean isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)
+ || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
+ if (!isCtrlKeyDown && Minecraft.isRunningOnMac)
+ isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LMETA) || Keyboard.isKeyDown(Keyboard.KEY_RMETA);
+
+ return isCtrlKeyDown;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ public static boolean isShiftKeyDown() {
+ try {
+ if (!Keyboard.isCreated()) {
+ return false;
+ }
+ return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java b/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java
new file mode 100644
index 0000000000..fdad398f6f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.core.world.explosions;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.world.World;
+
+public class ExplosionHandler {
+
+ /**
+ * Creates an explosion. Args: entity, x, y, z, strength
+ */
+ public MiningExplosion createExplosion(final World world, final Entity entityObj, final double x, final double y,
+ final double z, final float size, final boolean makesFlames, final boolean makesSmoke) {
+ return this.newExplosion(world, entityObj, x, y, z, size, makesFlames, makesSmoke);
+ }
+
+ /**
+ * returns a new explosion.
+ */
+ public MiningExplosion newExplosion(final World world, final Entity entityObj, final double x, final double y,
+ final double z, final float size, final boolean makesFlames, final boolean makesSmoke) {
+ final MiningExplosion explosion = new MiningExplosion(world, entityObj, x, y, z, size);
+ explosion.isFlaming = makesFlames;
+ explosion.isSmoking = makesSmoke;
+ if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(world, explosion)) {
+ return explosion;
+ }
+ explosion.doExplosionA();
+ explosion.doExplosionB(true);
+ return explosion;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java b/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java
new file mode 100644
index 0000000000..4d5473d349
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java
@@ -0,0 +1,442 @@
+package gtPlusPlus.core.world.explosions;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.enchantment.EnchantmentProtection;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class MiningExplosion extends Explosion {
+
+ private final int field_77289_h = 16;
+ private final Random explosionRNG = new XSTR();
+ private final World worldObj;
+
+ private final Map<Entity, Vec3> field_77288_k = new HashMap<>();
+
+ public MiningExplosion(final World worldObj, final Entity entityObj, final double x, final double y, final double z,
+ final float size) {
+ super(worldObj, entityObj, x, y, z, size);
+ this.worldObj = worldObj;
+ this.exploder = entityObj;
+ this.explosionSize = size;
+ this.explosionX = x;
+ this.explosionY = y;
+ this.explosionZ = z;
+ }
+
+ /**
+ * Does the first part of the explosion (destroy blocks)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void doExplosionA() {
+ final float f = this.explosionSize;
+ final HashSet<ChunkPosition> hashset = new HashSet<>();
+ int i;
+ int j;
+ int k;
+ double d5;
+ double d6;
+ double d7;
+
+ for (i = 0; i < this.field_77289_h; ++i) {
+ for (j = 0; j < this.field_77289_h; ++j) {
+ for (k = 0; k < this.field_77289_h; ++k) {
+ if ((i == 0) || (i == (this.field_77289_h - 1))
+ || (j == 0)
+ || (j == (this.field_77289_h - 1))
+ || (k == 0)
+ || (k == (this.field_77289_h - 1))) {
+ double d0 = ((i / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ double d1 = ((j / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ double d2 = ((k / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ final double d3 = Math.sqrt((d0 * d0) + (d1 * d1) + (d2 * d2));
+ d0 /= d3;
+ d1 /= d3;
+ d2 /= d3;
+ float f1 = this.explosionSize * (0.7F + (this.worldObj.rand.nextFloat() * 0.6F));
+ d5 = this.explosionX;
+ d6 = this.explosionY;
+ d7 = this.explosionZ;
+
+ for (final float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) {
+ final int j1 = MathHelper.floor_double(d5);
+ final int k1 = MathHelper.floor_double(d6);
+ final int l1 = MathHelper.floor_double(d7);
+ final Block block = this.worldObj.getBlock(j1, k1, l1);
+
+ if (block.getMaterial() != Material.air) {
+ final float f3 = this.exploder != null
+ ? this.exploder.func_145772_a(this, this.worldObj, j1, k1, l1, block)
+ : block.getExplosionResistance(
+ this.exploder,
+ this.worldObj,
+ j1,
+ k1,
+ l1,
+ this.explosionX,
+ this.explosionY,
+ this.explosionZ);
+ f1 -= (f3 + 0.3F) * f2;
+ }
+
+ if ((f1 > 0.0F) && ((this.exploder == null)
+ || this.exploder.func_145774_a(this, this.worldObj, j1, k1, l1, block, f1))) {
+ hashset.add(new ChunkPosition(j1, k1, l1));
+ }
+
+ d5 += d0 * f2;
+ d6 += d1 * f2;
+ d7 += d2 * f2;
+ }
+ }
+ }
+ }
+ }
+
+ this.affectedBlockPositions.addAll(hashset);
+ this.explosionSize *= 2.0F;
+ i = MathHelper.floor_double(this.explosionX - this.explosionSize - 1.0D);
+ j = MathHelper.floor_double(this.explosionX + this.explosionSize + 1.0D);
+ k = MathHelper.floor_double(this.explosionY - this.explosionSize - 1.0D);
+ final int i2 = MathHelper.floor_double(this.explosionY + this.explosionSize + 1.0D);
+ final int l = MathHelper.floor_double(this.explosionZ - this.explosionSize - 1.0D);
+ final int j2 = MathHelper.floor_double(this.explosionZ + this.explosionSize + 1.0D);
+ final List<Entity> list = this.worldObj
+ .getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBox(i, k, l, j, i2, j2));
+ net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.worldObj, this, list, this.explosionSize);
+ final Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ);
+
+ for (final Entity entity : list) {
+ final double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ)
+ / this.explosionSize;
+
+ if (d4 <= 1.0D) {
+ d5 = entity.posX - this.explosionX;
+ d6 = (entity.posY + entity.getEyeHeight()) - this.explosionY;
+ d7 = entity.posZ - this.explosionZ;
+ final double d9 = MathHelper.sqrt_double((d5 * d5) + (d6 * d6) + (d7 * d7));
+
+ if (d9 != 0.0D) {
+ d5 /= d9;
+ d6 /= d9;
+ d7 /= d9;
+ final double d10 = this.worldObj.getBlockDensity(vec3, entity.boundingBox);
+ final double d11 = (1.0D - d4) * d10;
+ entity.attackEntityFrom(
+ DamageSource.setExplosionSource(this),
+ ((int) (((((d11 * d11) + d11) / 2.0D) * 8.0D * this.explosionSize) + 1.0D)));
+ final double d8 = EnchantmentProtection.func_92092_a(entity, d11);
+ entity.motionX += d5 * d8;
+ entity.motionY += d6 * d8;
+ entity.motionZ += d7 * d8;
+
+ if (entity instanceof EntityPlayer) {
+ this.field_77288_k.put(entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11));
+ }
+ }
+ }
+ }
+
+ this.explosionSize = f;
+ }
+
+ /**
+ * Does the second part of the explosion (sound, particles, drop spawn)
+ */
+ @Override
+ public void doExplosionB(final boolean p_77279_1_) {
+ this.worldObj.playSoundEffect(
+ this.explosionX,
+ this.explosionY,
+ this.explosionZ,
+ "random.explode",
+ 4.0F,
+ (1.0F + ((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F)) * 0.7F);
+
+ if ((this.explosionSize >= 2.0F) && this.isSmoking) {
+ this.worldObj
+ .spawnParticle("hugeexplosion", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else {
+ this.worldObj
+ .spawnParticle("largeexplode", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ Iterator<ChunkPosition> iterator;
+ ChunkPosition chunkposition;
+ int i;
+ int j;
+ int k;
+ Block block;
+
+ if (this.isSmoking) {
+ iterator = this.affectedBlockPositions.iterator();
+
+ while (iterator.hasNext()) {
+ chunkposition = iterator.next();
+ i = chunkposition.chunkPosX;
+ j = chunkposition.chunkPosY;
+ k = chunkposition.chunkPosZ;
+ block = this.worldObj.getBlock(i, j, k);
+
+ if (p_77279_1_) {
+ final double d0 = i + this.worldObj.rand.nextFloat();
+ final double d1 = j + this.worldObj.rand.nextFloat();
+ final double d2 = k + this.worldObj.rand.nextFloat();
+ double d3 = d0 - this.explosionX;
+ double d4 = d1 - this.explosionY;
+ double d5 = d2 - this.explosionZ;
+ final double d6 = MathHelper.sqrt_double((d3 * d3) + (d4 * d4) + (d5 * d5));
+ d3 /= d6;
+ d4 /= d6;
+ d5 /= d6;
+ double d7 = 0.5D / ((d6 / this.explosionSize) + 0.1D);
+ d7 *= (this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat()) + 0.3F;
+ d3 *= d7;
+ d4 *= d7;
+ d5 *= d7;
+ this.worldObj.spawnParticle(
+ "explode",
+ (d0 + (this.explosionX * 1.0D)) / 2.0D,
+ (d1 + (this.explosionY * 1.0D)) / 2.0D,
+ (d2 + (this.explosionZ * 1.0D)) / 2.0D,
+ d3,
+ d4,
+ d5);
+ this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ if (block.getMaterial() != Material.air) {
+ if (block.canDropFromExplosion(this)) {
+ // world, x, y, z, world.getBlockMetadata(x, y, z), dropProb, 0
+ block.dropBlockAsItemWithChance(
+ this.worldObj,
+ i,
+ j,
+ k,
+ this.worldObj.getBlockMetadata(i, j, k),
+ 1F,
+ 0);
+ }
+
+ block.onBlockExploded(this.worldObj, i, j, k, this);
+ }
+ }
+ }
+
+ if (this.isFlaming) {
+ iterator = this.affectedBlockPositions.iterator();
+
+ while (iterator.hasNext()) {
+ chunkposition = iterator.next();
+ i = chunkposition.chunkPosX;
+ j = chunkposition.chunkPosY;
+ k = chunkposition.chunkPosZ;
+ block = this.worldObj.getBlock(i, j, k);
+ final Block block1 = this.worldObj.getBlock(i, j - 1, k);
+
+ if ((block.getMaterial() == Material.air) && block1.func_149730_j()
+ && (this.explosionRNG.nextInt(3) == 0)) {
+ this.worldObj.setBlock(i, j, k, Blocks.fire);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Map<Entity, Vec3> func_77277_b() {
+ return this.field_77288_k;
+ }
+
+ /**
+ * Returns either the entity that placed the explosive block, the entity that caused the explosion or null.
+ */
+ @Override
+ public EntityLivingBase getExplosivePlacedBy() {
+ return this.exploder == null ? null
+ : (this.exploder instanceof EntityPrimedMiningExplosive
+ ? ((EntityPrimedMiningExplosive) this.exploder).getTntPlacedBy()
+ : (this.exploder instanceof EntityLivingBase ? (EntityLivingBase) this.exploder : null));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java b/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java
new file mode 100644
index 0000000000..34c6b01648
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.everglades;
+
+import static gregtech.api.enums.Mods.GTPlusPlusEverglades;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.config.Configuration;
+
+import com.github.bartimaeusnek.crossmod.galacticgreg.GT_TileEntity_VoidMiner_Base;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.Everglades;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.everglades.biome.Biome_Everglades;
+import gtPlusPlus.everglades.block.DarkWorldContentLoader;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Base;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Ore_Layer;
+import gtPlusPlus.everglades.gen.gt.WorldGen_Ores;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;
+
+@Mod(
+ modid = Mods.Names.G_T_PLUS_PLUS_EVERGLADES,
+ name = Everglades.NAME,
+ version = Everglades.VERSION,
+ dependencies = "required-after:Forge; after:dreamcraft; after:IC2; required-after:gregtech; required-after:miscutils;")
+public class GTplusplus_Everglades implements ActionListener {
+
+ // Mod Instance
+ @Mod.Instance(Mods.Names.G_T_PLUS_PLUS_EVERGLADES)
+ public static GTplusplus_Everglades instance;
+
+ // Dark World Handler
+ protected static volatile Biome_Everglades Everglades_Biome;
+ protected static volatile Dimension_Everglades Everglades_Dimension;
+
+ // Pre-Init
+ @Mod.EventHandler
+ public void preInit(final FMLPreInitializationEvent event) {
+ Logger.INFO("Loading " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);
+
+ // Setup
+ setVars(event);
+
+ setEvergladesBiome(new Biome_Everglades());
+ Everglades_Dimension = new Dimension_Everglades();
+
+ // Load Dark World
+ getEvergladesBiome().instance = instance;
+ Everglades_Dimension.instance = instance;
+ getEvergladesBiome().preInit(event);
+
+ // Load/Set Custom Ore Gen
+ HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
+ new Configuration(
+ new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));
+ }
+
+ @EventHandler
+ public void load(final FMLInitializationEvent e) {
+ Logger.INFO("Begin resource allocation for " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);
+
+ // Load World and Biome
+ GameRegistry.registerWorldGenerator(new WorldGen_GT_Base(), Short.MAX_VALUE);
+ getEvergladesBiome().load();
+ Everglades_Dimension.load();
+ addToVoidMinerDrops();
+ }
+
+ public static synchronized void GenerateOreMaterials() {
+ MaterialGenerator.generateOreMaterial(ORES.CROCROITE);
+ MaterialGenerator.generateOreMaterial(ORES.GEIKIELITE);
+ MaterialGenerator.generateOreMaterial(ORES.NICHROMITE);
+ MaterialGenerator.generateOreMaterial(ORES.TITANITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIMBABWEITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCONILITE);
+ MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_CE);
+ MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.LEPERSONNITE);
+ MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_YB);
+ MaterialGenerator.generateOreMaterial(ORES.XENOTIME);
+ MaterialGenerator.generateOreMaterial(ORES.YTTRIAITE);
+ MaterialGenerator.generateOreMaterial(ORES.YTTRIALITE);
+ MaterialGenerator.generateOreMaterial(ORES.YTTROCERITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCON);
+ MaterialGenerator.generateOreMaterial(ORES.POLYCRASE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCOPHYLLITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRKELITE);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_LA);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_CE);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_ND);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_CD);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_LA);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_ND);
+ MaterialGenerator.generateOreMaterial(ORES.HIBONITE);
+ MaterialGenerator.generateOreMaterial(ORES.CERITE);
+ MaterialGenerator.generateOreMaterial(ORES.FLUORCAPHITE);
+ MaterialGenerator.generateOreMaterial(ORES.FLORENCITE);
+ MaterialGenerator.generateOreMaterial(ORES.CRYOLITE);
+
+ MaterialGenerator.generateOreMaterial(ORES.LAUTARITE);
+ MaterialGenerator.generateOreMaterial(ORES.LAFOSSAITE);
+ MaterialGenerator.generateOreMaterial(ORES.DEMICHELEITE_BR);
+ MaterialGenerator.generateOreMaterial(ORES.COMANCHEITE);
+ MaterialGenerator.generateOreMaterial(ORES.PERROUDITE);
+ MaterialGenerator.generateOreMaterial(ORES.HONEAITE);
+ MaterialGenerator.generateOreMaterial(ORES.ALBURNITE);
+ MaterialGenerator.generateOreMaterial(ORES.MIESSIITE);
+ MaterialGenerator.generateOreMaterial(ORES.KASHINITE);
+ MaterialGenerator.generateOreMaterial(ORES.IRARSITE);
+ MaterialGenerator.generateOreMaterial(ORES.GREENOCKITE);
+ MaterialGenerator.generateOreMaterial(ORES.RADIOBARITE);
+ MaterialGenerator.generateOreMaterial(ORES.DEEP_EARTH_REACTOR_FUEL_DEPOSIT);
+
+ }
+
+ protected synchronized void setVars(FMLPreInitializationEvent event) {
+ // Init WorldGen config.
+ HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
+ new Configuration(
+ new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));
+
+ if (DimensionManager.isDimensionRegistered(Dimension_Everglades.DIMID)) {
+ Dimension_Everglades.DIMID = DimensionManager.getNextFreeDimId();
+ }
+
+ /*
+ * Set World Generation Values
+ */
+ WorldGen_Ores.generateValidOreVeins();
+ WorldGen_GT_Base.oreveinPercentage = 64;
+ WorldGen_GT_Base.oreveinAttempts = 16;
+ WorldGen_GT_Base.oreveinMaxPlacementAttempts = 4;
+ if (CORE_Preloader.DEBUG_MODE || CORE.DEVENV) {
+ WorldGen_GT_Base.debugWorldGen = true;
+ }
+ DarkWorldContentLoader.run();
+ }
+
+ public void addToVoidMinerDrops() {
+ for (WorldGen_GT_Ore_Layer t : WorldGen_Ores.validOreveins.values()) {
+ addVMDrop(t.mPrimaryMeta, 0, t.mWeight);
+ addVMDrop(t.mSecondaryMeta, 0, t.mWeight);
+ addVMDrop(t.mBetweenMeta, 0, t.mWeight);
+ addVMDrop(t.mSporadicMeta, 0, t.mWeight);
+ }
+ }
+
+ public void addVMDrop(Block block, int meta, float weight) {
+ GT_TileEntity_VoidMiner_Base.addBlockToDimensionList(CORE.EVERGLADES_ID, block, meta, weight);
+ }
+
+ @EventHandler
+ public void serverLoad(FMLServerStartingEvent event) {
+ getEvergladesBiome().serverLoad(event);
+ }
+
+ @EventHandler
+ public static void postInit(final FMLPostInitializationEvent e) {
+ Logger.INFO("Finished loading Everglades plugin for GT++.");
+ }
+
+ public static synchronized Biome_Everglades getEvergladesBiome() {
+ return Everglades_Biome;
+ }
+
+ public static synchronized void setEvergladesBiome(Biome_Everglades darkWorld_Biome) {
+ Everglades_Biome = darkWorld_Biome;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java b/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java
new file mode 100644
index 0000000000..fce5efca36
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java
@@ -0,0 +1,361 @@
+package gtPlusPlus.everglades.biome;
+
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.BIG_SHROOM;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.CACTUS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.CLAY;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.DEAD_BUSH;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.FLOWERS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.GRASS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.LAKE;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.LILYPAD;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.PUMPKIN;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.REED;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SAND;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SAND_PASS2;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SHROOM;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.TREE;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.COAL;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.DIAMOND;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.DIRT;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.GOLD;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.GRAVEL;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.IRON;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.LAPIS;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.REDSTONE;
+
+import java.util.Random;
+
+import net.minecraft.block.BlockFlower;
+import net.minecraft.block.material.Material;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeDecorator;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraft.world.gen.feature.WorldGenBigMushroom;
+import net.minecraft.world.gen.feature.WorldGenCactus;
+import net.minecraft.world.gen.feature.WorldGenDeadBush;
+import net.minecraft.world.gen.feature.WorldGenFlowers;
+import net.minecraft.world.gen.feature.WorldGenLiquids;
+import net.minecraft.world.gen.feature.WorldGenPumpkin;
+import net.minecraft.world.gen.feature.WorldGenReed;
+import net.minecraft.world.gen.feature.WorldGenerator;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent;
+import net.minecraftforge.event.terraingen.OreGenEvent;
+import net.minecraftforge.event.terraingen.TerrainGen;
+
+import gtPlusPlus.everglades.gen.WorldGenDeadLilly;
+import gtPlusPlus.everglades.gen.WorldGenMinable_Custom;
+
+public class BiomeGenerator_Custom extends BiomeDecorator {
+
+ public WorldGenerator fluoriteGen;
+
+ public BiomeGenerator_Custom() {
+ // Basic Blocks
+ this.sandGen = new WorldGenMinable_Custom(Blocks.sand, 12);
+ this.gravelAsSandGen = new WorldGenMinable_Custom(Blocks.gravel, 8);
+ this.dirtGen = new WorldGenMinable_Custom(Blocks.dirt, 32);
+ this.gravelGen = new WorldGenMinable_Custom(Blocks.gravel, 12);
+
+ // Oregen
+ this.coalGen = new WorldGenMinable_Custom(Blocks.coal_ore, 16);
+ this.ironGen = new WorldGenMinable_Custom(Blocks.iron_ore, 12);
+ this.goldGen = new WorldGenMinable_Custom(Blocks.gold_ore, 12);
+ this.redstoneGen = new WorldGenMinable_Custom(Blocks.redstone_ore, 10);
+ this.diamondGen = new WorldGenMinable_Custom(Blocks.diamond_ore, 12);
+ this.lapisGen = new WorldGenMinable_Custom(Blocks.lapis_ore, 8);
+
+ // Nature
+ this.yellowFlowerGen = new WorldGenFlowers(Blocks.yellow_flower);
+ this.mushroomBrownGen = new WorldGenFlowers(Blocks.brown_mushroom);
+ this.mushroomRedGen = new WorldGenFlowers(Blocks.red_mushroom);
+ this.bigMushroomGen = new WorldGenBigMushroom();
+ this.reedGen = new WorldGenReed();
+ this.cactusGen = new WorldGenCactus();
+ this.waterlilyGen = new WorldGenDeadLilly();
+
+ this.flowersPerChunk = 1;
+ this.grassPerChunk = 5;
+ this.sandPerChunk = 3;
+ this.sandPerChunk2 = 5;
+ this.clayPerChunk = 7;
+
+ this.generateLakes = true;
+ }
+
+ @Override
+ public void decorateChunk(World p_150512_1_, Random p_150512_2_, BiomeGenBase p_150512_3_, int p_150512_4_,
+ int p_150512_5_) {
+ if (this.currentWorld != null) {
+ throw new RuntimeException("Already decorating!!");
+ } else {
+ this.currentWorld = p_150512_1_;
+ this.randomGenerator = p_150512_2_;
+ this.chunk_X = p_150512_4_;
+ this.chunk_Z = p_150512_5_;
+ this.genDecorations(p_150512_3_);
+ this.currentWorld = null;
+ this.randomGenerator = null;
+ }
+ }
+
+ @Override
+ protected void genDecorations(BiomeGenBase p_150513_1_) {
+ MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Pre(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ this.generateOres();
+ int i;
+ int j;
+ int k;
+
+ boolean doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SAND);
+ for (i = 0; doGen && i < this.sandPerChunk2; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.sandGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, CLAY);
+ for (i = 0; doGen && i < this.clayPerChunk; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.clayGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SAND_PASS2);
+ for (i = 0; doGen && i < this.sandPerChunk; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.gravelAsSandGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ i = this.treesPerChunk;
+
+ if (this.randomGenerator.nextInt(10) == 0) {
+ ++i;
+ }
+
+ int l;
+ int i1;
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, TREE);
+ for (j = 0; doGen && j < i; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = this.currentWorld.getHeightValue(k, l);
+ WorldGenAbstractTree worldgenabstracttree = p_150513_1_.func_150567_a(this.randomGenerator);
+ worldgenabstracttree.setScale(1.0D, 1.0D, 1.0D);
+
+ if (worldgenabstracttree.generate(this.currentWorld, this.randomGenerator, k, i1, l)) {
+ worldgenabstracttree.func_150524_b(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, BIG_SHROOM);
+ for (j = 0; doGen && j < this.bigMushroomsPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.bigMushroomGen
+ .generate(this.currentWorld, this.randomGenerator, k, this.currentWorld.getHeightValue(k, l), l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, FLOWERS);
+ for (j = 0; doGen && j < this.flowersPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) + 32);
+ String s = p_150513_1_.func_150572_a(this.randomGenerator, k, i1, l);
+ BlockFlower blockflower = BlockFlower.func_149857_e(s);
+
+ if (blockflower.getMaterial() != Material.air) {
+ this.yellowFlowerGen.func_150550_a(blockflower, BlockFlower.func_149856_f(s));
+ this.yellowFlowerGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, GRASS);
+ for (j = 0; doGen && j < this.grassPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ WorldGenerator worldgenerator = p_150513_1_.getRandomWorldGenForGrass(this.randomGenerator);
+ worldgenerator.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, DEAD_BUSH);
+ for (j = 0; doGen && j < this.deadBushPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ (new WorldGenDeadBush(Blocks.deadbush)).generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, LILYPAD);
+ for (j = 0; doGen && j < this.waterlilyPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+
+ for (i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2); i1 > 0
+ && this.currentWorld.isAirBlock(k, i1 - 1, l); --i1) {
+ ;
+ }
+
+ this.waterlilyGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SHROOM);
+ for (j = 0; doGen && j < this.mushroomsPerChunk; ++j) {
+ if (this.randomGenerator.nextInt(4) == 0) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = this.currentWorld.getHeightValue(k, l);
+ this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ if (this.randomGenerator.nextInt(8) == 0) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ if (doGen && this.randomGenerator.nextInt(4) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ if (doGen && this.randomGenerator.nextInt(8) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, REED);
+ for (j = 0; doGen && j < this.reedsPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.reedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ for (j = 0; doGen && j < 10; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.reedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, PUMPKIN);
+ if (doGen && this.randomGenerator.nextInt(32) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ (new WorldGenPumpkin()).generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, CACTUS);
+ for (j = 0; doGen && j < this.cactiPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.cactusGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, LAKE);
+ if (doGen && this.generateLakes) {
+ for (j = 0; j < 50; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.randomGenerator.nextInt(this.randomGenerator.nextInt(248) + 8);
+ i1 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ (new WorldGenLiquids(Blocks.flowing_water)).generate(this.currentWorld, this.randomGenerator, k, l, i1);
+ }
+
+ for (j = 0; j < 20; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.randomGenerator
+ .nextInt(this.randomGenerator.nextInt(this.randomGenerator.nextInt(240) + 8) + 8);
+ i1 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ (new WorldGenLiquids(Blocks.flowing_lava)).generate(this.currentWorld, this.randomGenerator, k, l, i1);
+ }
+ }
+
+ MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Post(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ }
+
+ /**
+ * Standard ore generation helper. Generates most ores.
+ */
+ @Override
+ protected void genStandardOre1(int p_76795_1_, WorldGenerator p_76795_2_, int p_76795_3_, int p_76795_4_) {
+ for (int l = 0; l < p_76795_1_; ++l) {
+ int i1 = this.chunk_X + this.randomGenerator.nextInt(16);
+ int j1 = this.randomGenerator.nextInt(p_76795_4_ - p_76795_3_) + p_76795_3_;
+ int k1 = this.chunk_Z + this.randomGenerator.nextInt(16);
+ p_76795_2_.generate(this.currentWorld, this.randomGenerator, i1, j1, k1);
+ }
+ }
+
+ /**
+ * Standard ore generation helper. Generates Lapis Lazuli.
+ */
+ @Override
+ protected void genStandardOre2(int p_76793_1_, WorldGenerator p_76793_2_, int p_76793_3_, int p_76793_4_) {
+ for (int l = 0; l < p_76793_1_; ++l) {
+ int i1 = this.chunk_X + this.randomGenerator.nextInt(16);
+ int j1 = this.randomGenerator.nextInt(p_76793_4_) + this.randomGenerator.nextInt(p_76793_4_)
+ + (p_76793_3_ - p_76793_4_);
+ int k1 = this.chunk_Z + this.randomGenerator.nextInt(16);
+ p_76793_2_.generate(this.currentWorld, this.randomGenerator, i1, j1, k1);
+ }
+ }
+
+ /**
+ * Generates ores in the current chunk
+ */
+ @Override
+ protected void generateOres() {
+ MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Pre(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, dirtGen, chunk_X, chunk_Z, DIRT))
+ this.genStandardOre1(20, this.dirtGen, 0, 256);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, gravelGen, chunk_X, chunk_Z, GRAVEL))
+ this.genStandardOre1(10, this.gravelGen, 0, 256);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, coalGen, chunk_X, chunk_Z, COAL))
+ this.genStandardOre1(20, this.coalGen, 0, 128);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, ironGen, chunk_X, chunk_Z, IRON))
+ this.genStandardOre1(20, this.ironGen, 0, 64);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, goldGen, chunk_X, chunk_Z, GOLD))
+ this.genStandardOre1(2, this.goldGen, 0, 32);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, redstoneGen, chunk_X, chunk_Z, REDSTONE))
+ this.genStandardOre1(8, this.redstoneGen, 0, 16);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, diamondGen, chunk_X, chunk_Z, DIAMOND))
+ this.genStandardOre1(1, this.diamondGen, 0, 16);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, lapisGen, chunk_X, chunk_Z, LAPIS))
+ this.genStandardOre2(1, this.lapisGen, 16, 16);
+ MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Post(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ }
+
+ private int nextInt(int i) {
+ if (i <= 1) return 0;
+ return this.randomGenerator.nextInt(i);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java b/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java
new file mode 100644
index 0000000000..61c8ab5c26
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java
@@ -0,0 +1,83 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.entity.monster.EntityPigZombie;
+import net.minecraft.entity.passive.EntityBat;
+import net.minecraft.entity.passive.EntitySquid;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.BiomeDictionary;
+import net.minecraftforge.common.BiomeManager;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class Biome_Everglades {
+
+ public static BiomeGenEverglades biome = new BiomeGenEverglades();
+
+ public Object instance;
+
+ public Biome_Everglades() {}
+
+ public void load() {
+ BiomeDictionary.registerBiomeType(biome, BiomeDictionary.Type.DEAD);
+ BiomeManager.addSpawnBiome(biome);
+ }
+
+ public void serverLoad(FMLServerStartingEvent event) {}
+
+ public void preInit(FMLPreInitializationEvent event) {}
+
+ static class BiomeGenEverglades extends BiomeGenBase {
+
+ @SuppressWarnings("unchecked")
+ public BiomeGenEverglades() {
+ super(CORE.EVERGLADESBIOME_ID);
+ // this.setBiomeID();
+ this.theBiomeDecorator = new BiomeGenerator_Custom();
+ this.theBiomeDecorator.treesPerChunk = 10;
+ // Logger.INFO("Dark World Temperature Category: "+getTempCategory());
+ this.setBiomeName("Toxic Everglades");
+ this.topBlock = Dimension_Everglades.blockTopLayer;
+ this.fillerBlock = Dimension_Everglades.blockSecondLayer;
+ this.enableRain = true;
+ this.enableSnow = false;
+ this.rainfall = 0.7F;
+ this.setHeight(new BiomeGenBase.Height(0.3F, 0.5F));
+ this.heightVariation = 0.4F;
+ this.waterColorMultiplier = 0x17290A;
+ this.rootHeight = -0.25f; // Ground level
+
+ this.spawnableMonsterList.clear();
+ this.spawnableCreatureList.clear();
+ this.spawnableWaterCreatureList.clear();
+ this.spawnableCaveCreatureList.clear();
+
+ // Enemies
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntitySickBlaze.class, 100, 2, 6));
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntityPigZombie.class, 75, 4, 16));
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntityStaballoyConstruct.class, 20, 1, 2));
+
+ // Animals
+ this.spawnableWaterCreatureList.add(new BiomeGenBase.SpawnListEntry(EntitySquid.class, 1, 1, 6));
+ this.spawnableCaveCreatureList.add(new BiomeGenBase.SpawnListEntry(EntityBat.class, 10, 8, 8));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getSkyColorByTemp(float par1) {
+ return 0xF67A14;
+ }
+
+ @SuppressWarnings({ "unchecked", "unused" })
+ private boolean addToMonsterSpawnLists(Class<?> EntityClass, int a, int b, int c) {
+ this.spawnableCaveCreatureList.add(new SpawnListEntry(EntityClass, a, b, c));
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java b/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java
new file mode 100644
index 0000000000..fe799fbe42
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.IntCache;
+
+public class GenLayerBiomes extends GenLayer {
+
+ protected BiomeGenBase[] allowedBiomes = { Biome_Everglades.biome, };
+
+ public GenLayerBiomes(long seed) {
+ super(seed);
+ }
+
+ @Override
+ public int[] getInts(int x, int z, int width, int depth) {
+ int[] dest = IntCache.getIntCache(width * depth);
+ for (int dz = 0; dz < depth; dz++) {
+ for (int dx = 0; dx < width; dx++) {
+ this.initChunkSeed(dx + x, dz + z);
+ dest[(dx + dz * width)] = this.allowedBiomes[nextInt(this.allowedBiomes.length)].biomeID;
+ }
+ }
+ return dest;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java b/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java
new file mode 100644
index 0000000000..dec0ed1429
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java
@@ -0,0 +1,32 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.world.WorldType;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.GenLayerVoronoiZoom;
+import net.minecraft.world.gen.layer.GenLayerZoom;
+
+public class GenLayerEverglades extends GenLayer {
+
+ public GenLayerEverglades(long seed) {
+ super(seed);
+ }
+
+ public static GenLayer[] makeTheWorld(long seed, WorldType type) {
+ GenLayer biomes = new GenLayerBiomes(1L);
+ biomes = new GenLayerZoom(1000L, biomes);
+ biomes = new GenLayerZoom(1001L, biomes);
+ biomes = new GenLayerZoom(1002L, biomes);
+ biomes = new GenLayerZoom(1003L, biomes);
+ biomes = new GenLayerZoom(1004L, biomes);
+ biomes = new GenLayerZoom(1005L, biomes);
+ GenLayer genlayervoronoizoom = new GenLayerVoronoiZoom(10L, biomes);
+ biomes.initWorldGenSeed(seed);
+ genlayervoronoizoom.initWorldGenSeed(seed);
+ return new GenLayer[] { biomes, genlayervoronoizoom };
+ }
+
+ @Override
+ public int[] getInts(int p_75904_1_, int p_75904_2_, int p_75904_3_, int p_75904_4_) {
+ return new int[] {};
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java
new file mode 100644
index 0000000000..a91ed0cd84
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.Minecraft;
+
+import net.minecraft.block.BlockGrass;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldGround extends BlockGrass implements ITileTooltip {
+
+ public BlockDarkWorldGround() {
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldGround");
+ this.setHardness(1.0F);
+ this.setBlockTextureName(Minecraft.ID + ":" + "grass");
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 2;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java
new file mode 100644
index 0000000000..a99b852a5a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.Minecraft;
+
+import net.minecraft.block.BlockDirt;
+import net.minecraft.world.ColorizerGrass;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldPollutedDirt extends BlockDirt implements ITileTooltip {
+
+ public BlockDarkWorldPollutedDirt() {
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldGround2");
+ this.setHardness(0.5F);
+ this.setBlockTextureName(Minecraft.ID + ":" + "dirt");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBlockColor() {
+ double d0 = 0.5D;
+ double d1 = 1.0D;
+ return ColorizerGrass.getGrassColor(d0, d1);
+ }
+
+ /**
+ * Returns the color this block should be rendered. Used by leaves.
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderColor(int p_149741_1_) {
+ return this.getBlockColor();
+ }
+
+ /**
+ * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called
+ * when first determining what to render.
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int colorMultiplier(IBlockAccess p_149720_1_, int p_149720_2_, int p_149720_3_, int p_149720_4_) {
+ int l = 0;
+ int i1 = 0;
+ int j1 = 0;
+
+ for (int k1 = -1; k1 <= 1; ++k1) {
+ for (int l1 = -1; l1 <= 1; ++l1) {
+ int i2 = p_149720_1_.getBiomeGenForCoords(p_149720_2_ + l1, p_149720_4_ + k1)
+ .getBiomeGrassColor(p_149720_2_ + l1, p_149720_3_, p_149720_4_ + k1);
+ l += (i2 & 16711680) >> 16;
+ i1 += (i2 & 65280) >> 8;
+ j1 += i2 & 255;
+ }
+ }
+
+ return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255;
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 3;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java
new file mode 100644
index 0000000000..1f8b82e9ca
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldPortalFrame extends Block implements ITileTooltip {
+
+ public BlockDarkWorldPortalFrame() {
+ super(Material.iron);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldPortalFrame");
+ this.setHardness(3.0F);
+ this.setLightLevel(0.5F);
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + "metro/TEXTURE_TECH_PANEL_A");
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java
new file mode 100644
index 0000000000..b4943d1886
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.everglades.block;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraftforge.fluids.Fluid;
+
+public class BlockDarkWorldSludgeFluid extends Fluid {
+
+ public static final Material SLUDGE = new MaterialLiquid(MapColor.dirtColor);
+
+ protected static int mapColor = 0xFFFFFFFF;
+ protected static float overlayAlpha = 0.2F;
+ protected static Material material = SLUDGE;
+
+ public BlockDarkWorldSludgeFluid(String fluidName, int rgbColour) {
+ this(fluidName, rgbColour, null);
+ }
+
+ public BlockDarkWorldSludgeFluid(String fluidName, int rgbColour, Float overlayAlpha) {
+ super(fluidName);
+ setColor(rgbColour);
+ if (overlayAlpha != null) {
+ setAlpha(overlayAlpha);
+ } else {
+ setAlpha(0);
+ }
+ }
+
+ @Override
+ public int getColor() {
+ return mapColor;
+ }
+
+ public BlockDarkWorldSludgeFluid setColor(int parColor) {
+ mapColor = parColor;
+ return this;
+ }
+
+ public float getAlpha() {
+ return overlayAlpha;
+ }
+
+ public BlockDarkWorldSludgeFluid setAlpha(float parOverlayAlpha) {
+ overlayAlpha = parOverlayAlpha;
+ return this;
+ }
+
+ /*
+ * public blockDarkWorldSludgeFluid setEmptySound(SoundEvent parSound) { emptySound = parSound; return this; }
+ * public SoundEvent getEmptySound() { return emptySound; }
+ * @Override public blockDarkWorldSludgeFluid setFillSound(SoundEvent parSound) { fillSound = parSound; return this;
+ * }
+ * @Override public SoundEvent getFillSound() { return fillSound; }
+ */
+
+ public BlockDarkWorldSludgeFluid setMaterial(Material parMaterial) {
+ material = parMaterial;
+ return this;
+ }
+
+ public Material getMaterial() {
+ return material;
+ }
+
+ /*
+ * @Override public boolean doesVaporize(FluidStack fluidStack) { if (block == null) return false; return
+ * block.getDefaultState().getMaterial() == getMaterial(); }
+ */
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java b/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java
new file mode 100644
index 0000000000..eafa67980d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java
@@ -0,0 +1,393 @@
+package gtPlusPlus.everglades.block;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockBreakable;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.everglades.world.TeleporterDimensionMod;
+
+public class BlockEvergladesPortal extends BlockBreakable implements ITileTooltip {
+
+ IIcon gor = null, dol = null, st1 = null, st2 = null, st3 = null, st4 = null;
+
+ public BlockEvergladesPortal() {
+ super("portal", Material.portal, false);
+ this.setTickRandomly(true);
+ this.setHardness(-1.0F);
+ this.setLightLevel(0.75F);
+ this.setCreativeTab(CreativeTabs.tabBlock);
+ this.setBlockName("blockDarkWorldPortal");
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(int ordinalSide, int meta) {
+
+ if (ordinalSide == 0) return gor;
+ else if (ordinalSide == 1) return dol;
+ else if (ordinalSide == 2) return st1;
+ else if (ordinalSide == 3) return st2;
+ else if (ordinalSide == 4) return st4;
+ else if (ordinalSide == 5) return st3;
+ else return gor;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(IIconRegister reg) {
+ this.gor = reg.registerIcon("portal");
+ this.dol = reg.registerIcon("portal");
+ this.st1 = reg.registerIcon("portal");
+ this.st2 = reg.registerIcon("portal");
+ this.st3 = reg.registerIcon("portal");
+ this.st4 = reg.registerIcon("portal");
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(World par1World, int x, int y, int z, Random par5Random) {
+ super.updateTick(par1World, x, y, z, par5Random);
+
+ int blockCount = 0;
+ BlockPos portal = new BlockPos(x, y, z, par1World.provider.dimensionId);
+
+ for (BlockPos side : portal.getSurroundingBlocks()) {
+ Block b = side.getBlockAtPos();
+ if (b == Dimension_Everglades.blockPortalFrame || b == Dimension_Everglades.portalBlock) {
+ blockCount++;
+ }
+ }
+ if (blockCount < 4) {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
+ * cleared to be reused)
+ */
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) {
+ return null;
+ }
+
+ /**
+ * Updates the blocks bounds based on its current state. Args: world, x, y, z
+ */
+ @Override
+ public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) {
+ float f;
+ float f1;
+ if (par1IBlockAccess.getBlock(par2 - 1, par3, par4) != this
+ && par1IBlockAccess.getBlock(par2 + 1, par3, par4) != this) {
+ f = 0.125F;
+ f1 = 0.5F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
+ } else {
+ f = 0.5F;
+ f1 = 0.125F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
+ }
+ }
+
+ /**
+ * Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
+ * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
+ */
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * Checks to see if this location is valid to create a portal and will return True if it does. Args: world, x, y, z
+ */
+ public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4) {
+ byte b0 = 0;
+ byte b1 = 0;
+ if (par1World.getBlock(par2 - 1, par3, par4) == Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(par2 + 1, par3, par4) == Dimension_Everglades.blockPortalFrame) {
+ b0 = 1;
+ }
+ if (par1World.getBlock(par2, par3, par4 - 1) == Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(par2, par3, par4 + 1) == Dimension_Everglades.blockPortalFrame) {
+ b1 = 1;
+ }
+ if (b0 == b1) {
+ return false;
+ } else {
+ if (par1World.getBlock(par2 - b0, par3, par4 - b1) == Blocks.air) {
+ par2 -= b0;
+ par4 -= b1;
+ }
+ int l;
+ int i1;
+ for (l = -1; l <= 2; ++l) {
+ for (i1 = -1; i1 <= 3; ++i1) {
+ boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3;
+ if (l != -1 && l != 2 || i1 != -1 && i1 != 3) {
+ Block j1 = par1World.getBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l);
+ if (flag) {
+ if (j1 != Dimension_Everglades.blockPortalFrame) {
+ return false;
+ }
+ }
+ /*
+ * else if (j1 != 0 && j1 != Main.TutorialFire.blockID) { return false; }
+ */
+ }
+ }
+ }
+ for (l = 0; l < 2; ++l) {
+ for (i1 = 0; i1 < 3; ++i1) {
+ par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, this, 0, 2);
+ }
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor blockID
+ */
+ public void onNeighborBlockChange(BlockPos pos) {
+ int x = pos.xPos, y = pos.yPos, z = pos.zPos;
+ Logger.INFO("Trigger");
+ int blockCount = 0;
+ BlockPos portal = pos;
+ World par1World = portal.world;
+ for (BlockPos side : portal.getSurroundingBlocks()) {
+ Block b = side.getBlockAtPos();
+ if (b == Dimension_Everglades.blockPortalFrame || b == Dimension_Everglades.portalBlock) {
+ blockCount++;
+ }
+ }
+ if (blockCount < 4) {
+ par1World.setBlockToAir(x, y, z);
+ par1World.scheduleBlockUpdate(x, y, z, portal.getBlockAtPos(), 0);
+ }
+
+ byte b0 = 0;
+ byte b1 = 1;
+ if (par1World.getBlock(x - 1, y, z) == this || par1World.getBlock(x + 1, y, z) == this) {
+ b0 = 1;
+ b1 = 0;
+ }
+ int i1;
+ for (i1 = y; par1World.getBlock(x, i1 - 1, z) == this; --i1) {
+ ;
+ }
+ if (par1World.getBlock(x, i1 - 1, z) != Dimension_Everglades.blockPortalFrame) {
+ par1World.setBlockToAir(x, y, z);
+ } else {
+ int j1;
+ for (j1 = 1; j1 < 4 && par1World.getBlock(x, i1 + j1, z) == this; ++j1) {
+ ;
+ }
+ if (j1 == 3 && par1World.getBlock(x, i1 + j1, z) == Dimension_Everglades.blockPortalFrame) {
+ boolean flag = par1World.getBlock(x - 1, y, z) == this || par1World.getBlock(x + 1, y, z) == this;
+ boolean flag1 = par1World.getBlock(x, y, z - 1) == this || par1World.getBlock(x, y, z + 1) == this;
+ if (flag && flag1) {
+ par1World.setBlockToAir(x, y, z);
+ } else {
+ if ((par1World.getBlock(x + b0, y, z + b1) != Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(x - b0, y, z - b1) != this)
+ && (par1World.getBlock(x - b0, y, z - b1) != Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(x + b0, y, z + b1) != this)) {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+ } else {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
+ onNeighborBlockChange(new BlockPos(x, y, z, world.provider.dimensionId));
+ super.onNeighborBlockChange(world, x, y, z, block);
+ }
+
+ /*
+ * @Override public void onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ)
+ * { onNeighborBlockChange(new BlockPos(x, y, z, world.)); super.onNeighborChange(world, x, y, z, tileX, tileY,
+ * tileZ); }
+ */
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
+ * coordinates. Args: blockAccess, x, y, z, side
+ */
+ public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) {
+ if (par1IBlockAccess.getBlock(par2, par3, par4) == this) {
+ return false;
+ } else {
+ boolean flag = par1IBlockAccess.getBlock(par2 - 1, par3, par4) == this
+ && par1IBlockAccess.getBlock(par2 - 2, par3, par4) != this;
+ boolean flag1 = par1IBlockAccess.getBlock(par2 + 1, par3, par4) == this
+ && par1IBlockAccess.getBlock(par2 + 2, par3, par4) != this;
+ boolean flag2 = par1IBlockAccess.getBlock(par2, par3, par4 - 1) == this
+ && par1IBlockAccess.getBlock(par2, par3, par4 - 2) != this;
+ boolean flag3 = par1IBlockAccess.getBlock(par2, par3, par4 + 1) == this
+ && par1IBlockAccess.getBlock(par2, par3, par4 + 2) != this;
+ boolean flag4 = flag || flag1;
+ boolean flag5 = flag2 || flag3;
+ return flag4 && par5 == 4 ? true
+ : (flag4 && par5 == 5 ? true : (flag5 && par5 == 2 ? true : flag5 && par5 == 3));
+ }
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(Random par1Random) {
+ return 0;
+ }
+
+ /**
+ * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
+ */
+ @Override
+ public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) {
+ if ((par5Entity.ridingEntity == null) && (par5Entity.riddenByEntity == null)
+ && ((par5Entity instanceof EntityPlayerMP thePlayer))) {
+ if (thePlayer.timeUntilPortal > 0) {
+ thePlayer.timeUntilPortal = 100;
+ } else if (thePlayer.dimension != Dimension_Everglades.DIMID) {
+ thePlayer.timeUntilPortal = 100;
+ thePlayer.mcServer.getConfigurationManager()
+ .transferPlayerToDimension(
+ thePlayer,
+ Dimension_Everglades.DIMID,
+ new TeleporterDimensionMod(
+ thePlayer.mcServer.worldServerForDimension(Dimension_Everglades.DIMID)));
+ } else {
+ thePlayer.timeUntilPortal = 100;
+ thePlayer.mcServer.getConfigurationManager()
+ .transferPlayerToDimension(
+ thePlayer,
+ 0,
+ new TeleporterDimensionMod(thePlayer.mcServer.worldServerForDimension(0)));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) {
+ if (CORE.RANDOM.nextInt(100) == 0) {
+ par1World.playSound(
+ par2 + 0.5D,
+ par3 + 0.5D,
+ par4 + 0.5D,
+ "portal.portal",
+ 0.5F,
+ CORE.RANDOM.nextFloat() * 0.4F + 0.8F,
+ false);
+ }
+ for (int l = 0; l < 4; ++l) {
+ double d0 = par2 + CORE.RANDOM.nextFloat();
+ double d1 = par3 + CORE.RANDOM.nextFloat();
+ double d2 = par4 + CORE.RANDOM.nextFloat();
+ double d3 = 0.0D;
+ double d4 = 0.0D;
+ double d5 = 0.0D;
+ int i1 = CORE.RANDOM.nextInt(2) * 2 - 1;
+ d3 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ d4 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ d5 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ if (par1World.getBlock(par2 - 1, par3, par4) != this && par1World.getBlock(par2 + 1, par3, par4) != this) {
+ d0 = par2 + 0.5D + 0.25D * i1;
+ d3 = CORE.RANDOM.nextFloat() * 2.0F * i1;
+ } else {
+ d2 = par4 + 0.5D + 0.25D * i1;
+ d5 = CORE.RANDOM.nextFloat() * 2.0F * i1;
+ }
+ par1World.spawnParticle("reddust", d0 + 0.1D, d1, d2, d3, d4, d5);
+ par1World.spawnParticle("smoke", d0, d1 + 0.1D, d2, 0, 0, 0);
+
+ Random R = new Random();
+
+ if (R.nextInt(10) == 0) {
+ par1World.spawnParticle("largesmoke", d0, d1, d2, 0, 0 + 0.2D, 0);
+ } else if (R.nextInt(5) == 1) {
+ par1World.spawnParticle("flame", d0, d1, d2, 0, 0 + 0.1D, 0);
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ /**
+ * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
+ */
+ public int idPicked(World par1World, int par2, int par3, int par4) {
+ return 0;
+ }
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return Utils.rgbtoHexValue(0, 255, 0);
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return Utils.rgbtoHexValue(0, 255, 0);
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return EnumChatFormatting.OBFUSCATED + super.getLocalizedName();
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java b/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java
new file mode 100644
index 0000000000..7cbc1cb5e0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.everglades.block;
+
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockFluidLakes;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockPortalFrame;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockSecondLayer;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockTopLayer;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.portalBlock;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.portalItem;
+
+import net.minecraft.init.Blocks;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.block.base.BlockBaseFluid;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.item.ItemBlockToxicEverglades;
+import gtPlusPlus.everglades.item.ItemEvergladesPortalTrigger;
+
+public class DarkWorldContentLoader {
+
+ // Static Vars
+ public static BlockDarkWorldSludgeFluid SLUDGE;
+
+ public static synchronized void run() {
+ initMisc();
+ initItems();
+ initBlocks();
+ }
+
+ public static synchronized boolean initMisc() {
+
+ // Fluids
+ SLUDGE = (BlockDarkWorldSludgeFluid) new BlockDarkWorldSludgeFluid("sludge", Utils.rgbtoHexValue(30, 130, 30))
+ .setDensity(1800)
+ .setGaseous(false)
+ .setLuminosity(2)
+ .setViscosity(25000)
+ .setTemperature(300);
+ FluidRegistry.registerFluid(SLUDGE);
+
+ return true;
+ }
+
+ public static synchronized boolean initItems() {
+ portalItem = (ItemEvergladesPortalTrigger) (new ItemEvergladesPortalTrigger()
+ .setUnlocalizedName("everglades.trigger"));
+ GameRegistry.registerItem(portalItem, "everglades.trigger");
+ return true;
+ }
+
+ public static synchronized boolean initBlocks() {
+
+ // Create Block Instances
+ blockFluidLakes = new BlockBaseFluid("Sludge", SLUDGE, BlockDarkWorldSludgeFluid.SLUDGE).setLightLevel(2f)
+ .setLightOpacity(1)
+ .setBlockName("fluidSludge");
+ portalBlock = new BlockEvergladesPortal();
+ blockTopLayer = new BlockDarkWorldGround();
+ blockSecondLayer = new BlockDarkWorldPollutedDirt();
+ blockPortalFrame = new BlockDarkWorldPortalFrame();
+
+ // Registry
+ GameRegistry.registerBlock(portalBlock, ItemBlockToxicEverglades.class, "dimensionDarkWorld_portal");
+ GameRegistry.registerBlock(blockTopLayer, ItemBlockToxicEverglades.class, "blockDarkWorldGround");
+ GameRegistry.registerBlock(blockSecondLayer, ItemBlockToxicEverglades.class, "blockDarkWorldGround2");
+ GameRegistry.registerBlock(blockPortalFrame, ItemBlockToxicEverglades.class, "blockDarkWorldPortalFrame");
+
+ // Make Flammable
+ Blocks.fire.setFireInfo(blockTopLayer, 30, 20);
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java b/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java
new file mode 100644
index 0000000000..ad0c601092
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java
@@ -0,0 +1,560 @@
+package gtPlusPlus.everglades.chunk;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFalling;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.IProgressUpdate;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.SpawnerAnimals;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.gen.MapGenBase;
+import net.minecraft.world.gen.MapGenCaves;
+import net.minecraft.world.gen.MapGenRavine;
+import net.minecraft.world.gen.NoiseGenerator;
+import net.minecraft.world.gen.NoiseGeneratorOctaves;
+import net.minecraft.world.gen.NoiseGeneratorPerlin;
+import net.minecraft.world.gen.feature.WorldGenLakes;
+import net.minecraft.world.gen.structure.MapGenMineshaft;
+import net.minecraft.world.gen.structure.MapGenScatteredFeature;
+import net.minecraft.world.gen.structure.MapGenVillage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.terraingen.ChunkProviderEvent;
+import net.minecraftforge.event.terraingen.PopulateChunkEvent;
+import net.minecraftforge.event.terraingen.TerrainGen;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class ChunkProviderModded implements IChunkProvider {
+
+ private Random rand;
+ private NoiseGeneratorOctaves field_147431_j;
+ private NoiseGeneratorOctaves field_147432_k;
+ private NoiseGeneratorOctaves field_147429_l;
+ private NoiseGeneratorPerlin field_147430_m;
+ /**
+ * A NoiseGeneratorOctaves used in generating terrain
+ */
+ public NoiseGeneratorOctaves noiseGen5;
+ /**
+ * A NoiseGeneratorOctaves used in generating terrain
+ */
+ public NoiseGeneratorOctaves noiseGen6;
+ public NoiseGeneratorOctaves mobSpawnerNoise;
+ /**
+ * Reference to the World object.
+ */
+ private World worldObj;
+ private WorldType field_147435_p;
+ private final double[] field_147434_q;
+ private final float[] parabolicField;
+ private double[] stoneNoise = new double[256];
+ private MapGenBase caveGenerator = new MapGenCaves();
+ /**
+ * Holds Stronghold Generator
+ */
+ /**
+ * Holds Village Generator
+ */
+ private MapGenVillage villageGenerator = new MapGenVillage();
+ /**
+ * Holds Mineshaft Generator
+ */
+ private MapGenMineshaft mineshaftGenerator = new MapGenMineshaft();
+ private MapGenScatteredFeature scatteredFeatureGenerator = new MapGenScatteredFeature();
+ /**
+ * Holds ravine generator
+ */
+ private MapGenBase ravineGenerator = new MapGenRavine();
+ /**
+ * The biomes that are used to generate the chunk
+ */
+ private BiomeGenBase[] biomesForGeneration;
+ double[] field_147427_d;
+ double[] field_147428_e;
+ double[] field_147425_f;
+ double[] field_147426_g;
+ int[][] field_73219_j = new int[32][32];
+ {
+ caveGenerator = TerrainGen
+ .getModdedMapGen(caveGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.CAVE);
+ /*
+ * strongholdGenerator = (MapGenStronghold) TerrainGen.getModdedMapGen(strongholdGenerator,
+ * net.minecraftforge.event.terraingen.InitMapGenEvent.EventType. STRONGHOLD);
+ */
+ villageGenerator = (MapGenVillage) TerrainGen
+ .getModdedMapGen(villageGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.VILLAGE);
+ mineshaftGenerator = (MapGenMineshaft) TerrainGen.getModdedMapGen(
+ mineshaftGenerator,
+ net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.MINESHAFT);
+ scatteredFeatureGenerator = (MapGenScatteredFeature) TerrainGen.getModdedMapGen(
+ scatteredFeatureGenerator,
+ net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.SCATTERED_FEATURE);
+ ravineGenerator = TerrainGen
+ .getModdedMapGen(ravineGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.RAVINE);
+ }
+
+ public ChunkProviderModded(World par1World, long par2) {
+ this.worldObj = par1World;
+ this.field_147435_p = par1World.getWorldInfo()
+ .getTerrainType();
+ this.rand = new Random(par2);
+ this.field_147431_j = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_147432_k = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_147429_l = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_147430_m = new NoiseGeneratorPerlin(this.rand, 4);
+ this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 10);
+ this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 16);
+ this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_147434_q = new double[825];
+ this.parabolicField = new float[25];
+
+ for (int j = -2; j <= 2; ++j) {
+ for (int k = -2; k <= 2; ++k) {
+ float f = 10.0F / MathHelper.sqrt_float(j * j + k * k + 0.2F);
+ this.parabolicField[j + 2 + (k + 2) * 5] = f;
+ }
+ }
+
+ NoiseGenerator[] noiseGens = { field_147431_j, field_147432_k, field_147429_l, field_147430_m, noiseGen5,
+ noiseGen6, mobSpawnerNoise };
+ noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.rand, noiseGens);
+ this.field_147431_j = (NoiseGeneratorOctaves) noiseGens[0];
+ this.field_147432_k = (NoiseGeneratorOctaves) noiseGens[1];
+ this.field_147429_l = (NoiseGeneratorOctaves) noiseGens[2];
+ this.field_147430_m = (NoiseGeneratorPerlin) noiseGens[3];
+ this.noiseGen5 = (NoiseGeneratorOctaves) noiseGens[4];
+ this.noiseGen6 = (NoiseGeneratorOctaves) noiseGens[5];
+ this.mobSpawnerNoise = (NoiseGeneratorOctaves) noiseGens[6];
+ }
+
+ public void func_147424_a(int p_147424_1_, int p_147424_2_, Block[] p_147424_3_) {
+ byte b0 = 63;
+ this.biomesForGeneration = this.worldObj.getWorldChunkManager()
+ .getBiomesForGeneration(this.biomesForGeneration, p_147424_1_ * 4 - 2, p_147424_2_ * 4 - 2, 10, 10);
+ this.func_147423_a(p_147424_1_ * 4, 0, p_147424_2_ * 4);
+
+ for (int k = 0; k < 4; ++k) {
+ int l = k * 5;
+ int i1 = (k + 1) * 5;
+
+ for (int j1 = 0; j1 < 4; ++j1) {
+ int k1 = (l + j1) * 33;
+ int l1 = (l + j1 + 1) * 33;
+ int i2 = (i1 + j1) * 33;
+ int j2 = (i1 + j1 + 1) * 33;
+
+ for (int k2 = 0; k2 < 32; ++k2) {
+ double d0 = 0.125D;
+ double d1 = this.field_147434_q[k1 + k2];
+ double d2 = this.field_147434_q[l1 + k2];
+ double d3 = this.field_147434_q[i2 + k2];
+ double d4 = this.field_147434_q[j2 + k2];
+ double d5 = (this.field_147434_q[k1 + k2 + 1] - d1) * d0;
+ double d6 = (this.field_147434_q[l1 + k2 + 1] - d2) * d0;
+ double d7 = (this.field_147434_q[i2 + k2 + 1] - d3) * d0;
+ double d8 = (this.field_147434_q[j2 + k2 + 1] - d4) * d0;
+
+ for (int l2 = 0; l2 < 8; ++l2) {
+ double d9 = 0.25D;
+ double d10 = d1;
+ double d11 = d2;
+ double d12 = (d3 - d1) * d9;
+ double d13 = (d4 - d2) * d9;
+
+ for (int i3 = 0; i3 < 4; ++i3) {
+ int j3 = i3 + k * 4 << 12 | 0 + j1 * 4 << 8 | k2 * 8 + l2;
+ short short1 = 256; // TODO - wots dis do
+ j3 -= short1;
+ double d14 = 0.25D;
+ double d16 = (d11 - d10) * d14;
+ double d15 = d10 - d16;
+
+ for (int k3 = 0; k3 < 4; ++k3) {
+ if ((d15 += d16) > 0.0D) {
+ p_147424_3_[j3 += short1] = Dimension_Everglades.blockMainFiller;
+ } else if (k2 * 8 + l2 < b0) {
+ try {
+ p_147424_3_[j3 += short1] = Dimension_Everglades.blockFluidLakes; // River Fluid
+ // .
+ } catch (Throwable t) {
+ p_147424_3_[j3 += short1] = Blocks.water; // River Fluid Fallback
+ }
+ } else {
+ p_147424_3_[j3 += short1] = null;
+ }
+ }
+
+ d10 += d12;
+ d11 += d13;
+ }
+
+ d1 += d5;
+ d2 += d6;
+ d3 += d7;
+ d4 += d8;
+ }
+ }
+ }
+ }
+ }
+
+ public void replaceBlocksForBiome(int p_147422_1_, int p_147422_2_, Block[] p_147422_3_, byte[] p_147422_4_,
+ BiomeGenBase[] p_147422_5_) {
+ ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(
+ this,
+ p_147422_1_,
+ p_147422_2_,
+ p_147422_3_,
+ new byte[256],
+ p_147422_5_,
+ null);
+ MinecraftForge.EVENT_BUS.post(event);
+ if (event.getResult() == cpw.mods.fml.common.eventhandler.Event.Result.DENY) return;
+
+ double d0 = 0.03125D;
+ this.stoneNoise = this.field_147430_m
+ .func_151599_a(this.stoneNoise, p_147422_1_ * 16, p_147422_2_ * 16, 16, 16, d0 * 2.0D, d0 * 2.0D, 1.0D);
+
+ for (int k = 0; k < 16; ++k) {
+ for (int l = 0; l < 16; ++l) {
+ BiomeGenBase biomegenbase = p_147422_5_[l + k * 16];
+ biomegenbase.genTerrainBlocks(
+ this.worldObj,
+ this.rand,
+ p_147422_3_,
+ p_147422_4_,
+ p_147422_1_ * 16 + k,
+ p_147422_2_ * 16 + l,
+ this.stoneNoise[l + k * 16]);
+ }
+ }
+ }
+
+ /**
+ * loads or generates the chunk at the chunk location specified
+ */
+ @Override
+ public Chunk loadChunk(int par1, int par2) {
+ return this.provideChunk(par1, par2);
+ }
+
+ /**
+ * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the
+ * specified chunk from the map seed and chunk seed
+ */
+ @Override
+ public Chunk provideChunk(int par1, int par2) {
+ this.rand.setSeed(par1 * 341873128712L + par2 * 132897987541L);
+ Block[] ablock = new Block[65536];
+ byte[] abyte = new byte[65536];
+ this.func_147424_a(par1, par2, ablock);
+ this.biomesForGeneration = this.worldObj.getWorldChunkManager()
+ .loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16);
+ this.replaceBlocksForBiome(par1, par2, ablock, abyte, this.biomesForGeneration);
+
+ Chunk chunk = new Chunk(this.worldObj, ablock, abyte, par1, par2);
+ byte[] abyte1 = chunk.getBiomeArray();
+
+ for (int k = 0; k < abyte1.length; ++k) {
+ abyte1[k] = (byte) this.biomesForGeneration[k].biomeID;
+ }
+
+ chunk.generateSkylightMap();
+ return chunk;
+ }
+
+ private void func_147423_a(int p_147423_1_, int p_147423_2_, int p_147423_3_) {
+ this.field_147426_g = this.noiseGen6
+ .generateNoiseOctaves(this.field_147426_g, p_147423_1_, p_147423_3_, 5, 5, 200.0D, 200.0D, 0.5D);
+ this.field_147427_d = this.field_147429_l.generateNoiseOctaves(
+ this.field_147427_d,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 8.555150000000001D,
+ 4.277575000000001D,
+ 8.555150000000001D);
+ this.field_147428_e = this.field_147431_j.generateNoiseOctaves(
+ this.field_147428_e,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 684.412D,
+ 684.412D,
+ 684.412D);
+ this.field_147425_f = this.field_147432_k.generateNoiseOctaves(
+ this.field_147425_f,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 684.412D,
+ 684.412D,
+ 684.412D);
+ int l = 0;
+ int i1 = 0;
+ for (int j1 = 0; j1 < 5; ++j1) {
+ for (int k1 = 0; k1 < 5; ++k1) {
+ float f = 0.0F;
+ float f1 = 0.0F;
+ float f2 = 0.0F;
+ byte b0 = 2;
+ BiomeGenBase biomegenbase = this.biomesForGeneration[j1 + 2 + (k1 + 2) * 10];
+
+ for (int l1 = -b0; l1 <= b0; ++l1) {
+ for (int i2 = -b0; i2 <= b0; ++i2) {
+ BiomeGenBase biomegenbase1 = this.biomesForGeneration[j1 + l1 + 2 + (k1 + i2 + 2) * 10];
+ float f3 = biomegenbase1.rootHeight;
+ float f4 = biomegenbase1.heightVariation;
+
+ if (this.field_147435_p == WorldType.AMPLIFIED && f3 > 0.0F) {
+ f3 = 1.0F + f3 * 2.0F;
+ f4 = 1.0F + f4 * 4.0F;
+ }
+
+ float f5 = this.parabolicField[l1 + 2 + (i2 + 2) * 5] / (f3 + 2.0F);
+
+ if (biomegenbase1.rootHeight > biomegenbase.rootHeight) {
+ f5 /= 2.0F;
+ }
+
+ f += f4 * f5;
+ f1 += f3 * f5;
+ f2 += f5;
+ }
+ }
+
+ f /= f2;
+ f1 /= f2;
+ f = f * 0.9F + 0.1F;
+ f1 = (f1 * 4.0F - 1.0F) / 8.0F;
+ double d13 = this.field_147426_g[i1] / 8000.0D;
+
+ if (d13 < 0.0D) {
+ d13 = -d13 * 0.3D;
+ }
+
+ d13 = d13 * 3.0D - 2.0D;
+
+ if (d13 < 0.0D) {
+ d13 /= 2.0D;
+
+ if (d13 < -1.0D) {
+ d13 = -1.0D;
+ }
+
+ d13 /= 1.4D;
+ d13 /= 2.0D;
+ } else {
+ if (d13 > 1.0D) {
+ d13 = 1.0D;
+ }
+
+ d13 /= 8.0D;
+ }
+
+ ++i1;
+ double d12 = f1;
+ double d14 = f;
+ d12 += d13 * 0.2D;
+ d12 = d12 * 8.5D / 8.0D;
+ double d5 = 8.5D + d12 * 4.0D;
+
+ for (int j2 = 0; j2 < 33; ++j2) {
+ double d6 = (j2 - d5) * 12.0D * 128.0D / 256.0D / d14;
+
+ if (d6 < 0.0D) {
+ d6 *= 4.0D;
+ }
+
+ double d7 = this.field_147428_e[l] / 512.0D;
+ double d8 = this.field_147425_f[l] / 512.0D;
+ double d9 = (this.field_147427_d[l] / 10.0D + 1.0D) / 2.0D;
+ double d10 = MathHelper.denormalizeClamp(d7, d8, d9) - d6;
+
+ if (j2 > 29) {
+ double d11 = (j2 - 29) / 3.0F;
+ d10 = d10 * (1.0D - d11) + -10.0D * d11;
+ }
+
+ this.field_147434_q[l] = d10;
+ ++l;
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks to see if a chunk exists at x, y
+ */
+ @Override
+ public boolean chunkExists(int par1, int par2) {
+ return true;
+ }
+
+ /**
+ * Populates chunk with ores etc etc
+ */
+ @Override
+ public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) {
+ BlockFalling.fallInstantly = false;
+ int k = par2 * 16;
+ int l = par3 * 16;
+ BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(k + 16, l + 16);
+ this.rand.setSeed(this.worldObj.getSeed());
+ long i1 = this.rand.nextLong() / 2L * 2L + 1L;
+ long j1 = this.rand.nextLong() / 2L * 2L + 1L;
+ this.rand.setSeed(par2 * i1 + par3 * j1 ^ this.worldObj.getSeed());
+ boolean flag = false;
+
+ MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, rand, par2, par3, flag));
+
+ int k1;
+ int l1;
+ int i2;
+
+ if (biomegenbase != BiomeGenBase.desert && biomegenbase != BiomeGenBase.desertHills
+ && !flag
+ && this.rand.nextInt(4) == 0
+ && TerrainGen.populate(
+ par1IChunkProvider,
+ worldObj,
+ rand,
+ par2,
+ par3,
+ flag,
+ net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAKE)) {
+ k1 = k + this.rand.nextInt(16) + 8;
+ l1 = this.rand.nextInt(256);
+ i2 = l + this.rand.nextInt(16) + 8;
+ try {
+ (new WorldGenLakes(Dimension_Everglades.blockFluidLakes))
+ .generate(this.worldObj, this.rand, k1, l1, i2);
+ } catch (NullPointerException n) {
+ n.getStackTrace();
+ (new WorldGenLakes(Blocks.lava)).generate(this.worldObj, this.rand, k1, l1, i2);
+ Logger.INFO("Error while generating DarkWorld Lake.");
+ }
+ }
+
+ if (TerrainGen.populate(
+ par1IChunkProvider,
+ worldObj,
+ rand,
+ par2,
+ par3,
+ flag,
+ net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAVA) && !flag
+ && this.rand.nextInt(8) == 0) {
+ k1 = k + this.rand.nextInt(16) + 8;
+ l1 = this.rand.nextInt(this.rand.nextInt(248) + 8);
+ i2 = l + this.rand.nextInt(16) + 8;
+
+ if (l1 < 63 || this.rand.nextInt(10) == 0) { // Changes 63 -> 128
+ try {
+ (new WorldGenLakes(Blocks.lava)).generate(this.worldObj, this.rand, k1, l1, i2);
+ } catch (NullPointerException n) {
+ Logger.INFO("Error while generating DarkWorld Lake. [2]");
+ }
+ }
+ }
+ biomegenbase.decorate(this.worldObj, this.rand, k, l);
+ SpawnerAnimals.performWorldGenSpawning(this.worldObj, biomegenbase, k + 8, l + 8, 16, 16, this.rand);
+ k += 8;
+ l += 8;
+
+ MinecraftForge.EVENT_BUS
+ .post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, rand, par2, par3, flag));
+
+ BlockFalling.fallInstantly = false;
+ }
+
+ /**
+ * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. Return
+ * true if all chunks have been saved.
+ */
+ @Override
+ public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) {
+ return true;
+ }
+
+ /**
+ * Save extra data not associated with any Chunk. Not saved during autosave, only during world unload. Currently
+ * unimplemented.
+ */
+ @Override
+ public void saveExtraData() {}
+
+ /**
+ * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk.
+ */
+ @Override
+ public boolean unloadQueuedChunks() {
+ return false;
+ }
+
+ /**
+ * Returns if the IChunkProvider supports saving.
+ */
+ @Override
+ public boolean canSave() {
+ return true;
+ }
+
+ /**
+ * Converts the instance data to a readable string.
+ */
+ @Override
+ public String makeString() {
+ return "RandomLevelSource";
+ }
+
+ /**
+ * Returns a list of creatures of the specified type that can spawn at the given location.
+ */
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) {
+ BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(par2, par4);
+ return par1EnumCreatureType == EnumCreatureType.monster
+ && this.scatteredFeatureGenerator.func_143030_a(par2, par3, par4)
+ ? this.scatteredFeatureGenerator.getScatteredFeatureSpawnList()
+ : biomegenbase.getSpawnableList(par1EnumCreatureType);
+ }
+
+ @Override
+ public ChunkPosition func_147416_a(World p_147416_1_, String p_147416_2_, int p_147416_3_, int p_147416_4_,
+ int p_147416_5_) {
+ return "Village".equals(p_147416_2_) && this.villageGenerator != null
+ ? this.villageGenerator.func_151545_a(p_147416_1_, p_147416_3_, p_147416_4_, p_147416_5_)
+ : null;
+ }
+
+ @Override
+ public int getLoadedChunkCount() {
+ return 0;
+ }
+
+ @Override
+ public void recreateStructures(int par1, int par2) {
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java b/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java
new file mode 100644
index 0000000000..0520c5850b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java
@@ -0,0 +1,29 @@
+package gtPlusPlus.everglades.dimension;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraftforge.common.DimensionManager;
+
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.everglades.block.BlockEvergladesPortal;
+import gtPlusPlus.everglades.item.ItemEvergladesPortalTrigger;
+import gtPlusPlus.everglades.world.WorldProviderMod;
+
+public class Dimension_Everglades {
+
+ public Object instance;
+ public static int DIMID = CORE.EVERGLADES_ID;
+ public static BlockEvergladesPortal portalBlock;
+ public static ItemEvergladesPortalTrigger portalItem;
+ public static Block blockTopLayer;
+ public static Block blockSecondLayer;
+ public static Block blockMainFiller = Blocks.stone;
+ public static Block blockSecondaryFiller;
+ public static Block blockFluidLakes;
+ public static Block blockPortalFrame;
+
+ public void load() {
+ DimensionManager.registerProviderType(DIMID, WorldProviderMod.class, false);
+ DimensionManager.registerDimension(DIMID, DIMID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java b/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java
new file mode 100644
index 0000000000..37947452c5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.everglades.gen;
+
+import java.util.Random;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenWaterlily;
+
+public class WorldGenDeadLilly extends WorldGenWaterlily {
+
+ @Override
+ public boolean generate(World world, Random rand, int x, int y, int z) {
+ for (int l = 0; l < 10; ++l) {
+ int i1 = x + rand.nextInt(8) - rand.nextInt(8);
+ int j1 = y + rand.nextInt(4) - rand.nextInt(4);
+ int k1 = z + rand.nextInt(8) - rand.nextInt(8);
+
+ if (world.isAirBlock(i1, j1, k1) && Blocks.waterlily.canPlaceBlockAt(world, i1, j1, k1)) {
+ world.setBlock(i1, j1, k1, Blocks.waterlily, 0, 2);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java b/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java
new file mode 100644
index 0000000000..e3ce830f27
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java
@@ -0,0 +1,90 @@
+package gtPlusPlus.everglades.gen;
+
+import static gtPlusPlus.core.lib.CORE.PI;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenMinable;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class WorldGenMinable_Custom extends WorldGenMinable {
+
+ /** The block to generate. */
+ private Block oreToGenerate;
+ /** The number of blocks to generate. */
+ private int numberOfBlocks;
+ /** The block to replace. */
+ private Block blockToReplace;
+ /** The meta of the block. */
+ private int mineableBlockMeta;
+
+ public WorldGenMinable_Custom(final Block block, final int count) {
+ super(block, count, Blocks.stone);
+ }
+
+ public WorldGenMinable_Custom(final Block block, final int count, final Block target) {
+ super(block, count, target);
+ this.oreToGenerate = block;
+ this.numberOfBlocks = count;
+ this.blockToReplace = target;
+ }
+
+ public WorldGenMinable_Custom(final Block block, final int meta, final int number, final Block target) {
+ this(block, number, target);
+ this.mineableBlockMeta = meta;
+ }
+
+ @Override
+ public boolean generate(final World world, final Random rand, final int x, final int y, final int z) {
+ final float f = rand.nextFloat() * PI;
+ final double d0 = x + 16 + ((MathHelper.sin(f) * this.numberOfBlocks) / 4.0F);
+ final double d1 = (x + 16) - ((MathHelper.sin(f) * this.numberOfBlocks) / 4.0F);
+ final double d2 = z + 16 + ((MathHelper.cos(f) * this.numberOfBlocks) / 4.0F);
+ final double d3 = (z + 16) - ((MathHelper.cos(f) * this.numberOfBlocks) / 4.0F);
+ final double d4 = (y + rand.nextInt(8)) - 1;
+ final double d5 = (y + rand.nextInt(8)) - 1;
+
+ for (int l = 0; l <= this.numberOfBlocks; ++l) {
+ final double d6 = d0 + (((d1 - d0) * l) / this.numberOfBlocks);
+ final double d7 = d4 + (((d5 - d4) * l) / this.numberOfBlocks);
+ final double d8 = d2 + (((d3 - d2) * l) / this.numberOfBlocks);
+ final double d9 = (rand.nextDouble() * this.numberOfBlocks) / 8.0D;
+ final double d10 = ((MathHelper.sin((l * PI) / this.numberOfBlocks) + 1.0F) * d9) + 1.0D;
+ final double d11 = ((MathHelper.sin((l * PI) / this.numberOfBlocks) + 1.0F) * d9) + 1.0D;
+ final int i1 = MathHelper.floor_double(d6 - (d10 / 2.0D));
+ final int j1 = MathHelper.floor_double(d7 - (d11 / 2.0D));
+ final int k1 = MathHelper.floor_double(d8 - (d10 / 2.0D));
+ final int l1 = MathHelper.floor_double(d6 + (d10 / 2.0D));
+ final int i2 = MathHelper.floor_double(d7 + (d11 / 2.0D));
+ final int j2 = MathHelper.floor_double(d8 + (d10 / 2.0D));
+
+ for (int k2 = i1; k2 <= l1; ++k2) {
+ final double d12 = ((k2 + 0.5D) - d6) / (d10 / 2.0D);
+ if ((d12 * d12) < 1.0D) {
+ for (int l2 = j1; l2 <= i2; ++l2) {
+ final double d13 = ((l2 + 0.5D) - d7) / (d11 / 2.0D);
+ if (((d12 * d12) + (d13 * d13)) < 1.0D) {
+ for (int i3 = k1; i3 <= j2; ++i3) {
+ final double d14 = ((i3 + 0.5D) - d8) / (d10 / 2.0D);
+ if ((((d12 * d12) + (d13 * d13) + (d14 * d14)) < 1.0D) && world.getBlock(k2, l2, i3)
+ .isReplaceableOreGen(world, k2, l2, i3, this.blockToReplace)) {
+ world.setBlock(k2, l2, i3, this.oreToGenerate, this.mineableBlockMeta, 3);
+ Logger.INFO(
+ "Generated a " + this.oreToGenerate
+ .getLocalizedName() + " at x: " + k2 + " | y: " + l2 + " | z: " + i3);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java
new file mode 100644
index 0000000000..a35b528726
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public abstract class WorldGen_GT {
+
+ public final String mWorldGenName;
+ public final boolean mEnabled;
+ private final Map<String, Boolean> mDimensionMap = new ConcurrentHashMap<>();
+
+ public WorldGen_GT(String aName, List aList, boolean aDefault) {
+ this.mWorldGenName = aName;
+ this.mEnabled = HANDLER_GT.sCustomWorldgenFile.get("worldgen", this.mWorldGenName, aDefault);
+ if (this.mEnabled) {
+ aList.add(this);
+ }
+ }
+
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ public boolean executeCavegen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ public boolean isGenerationAllowed(World aWorld, int aDimensionType, int aAllowedDimensionType) {
+ String aDimName = aWorld.provider.getDimensionName();
+ Boolean tAllowed = (Boolean) this.mDimensionMap.get(aDimName);
+ if (tAllowed == null) {
+ boolean tValue = HANDLER_GT.sCustomWorldgenFile
+ .get("worldgen.dimensions." + this.mWorldGenName, aDimName, aDimensionType == aAllowedDimensionType);
+ this.mDimensionMap.put(aDimName, Boolean.valueOf(tValue));
+ return tValue;
+ } else {
+ return tAllowed;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java
new file mode 100644
index 0000000000..ac93a847fa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java
@@ -0,0 +1,580 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.gen.feature.WorldGenMinable;
+
+import cpw.mods.fml.common.IWorldGenerator;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Log;
+import gregtech.common.GT_Worldgenerator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public class WorldGen_GT_Base implements IWorldGenerator {
+
+ /**
+ * Class Variables
+ */
+
+ /**
+ * Control percentage of filled 3x3 chunks. Lower number means less oreveins spawn
+ */
+ public static int oreveinPercentage;
+ /**
+ * Control number of attempts to find a valid orevein. Generally this maximum limit isn't hit, selecting a vein is
+ * cheap
+ */
+ public static int oreveinAttempts;
+ /**
+ * Control number of attempts to place a valid orevein. If a vein wasn't placed due to height restrictions,
+ * completely in the water, etc, another attempt is tried.
+ */
+ public static int oreveinMaxPlacementAttempts;
+ /**
+ * Debug parameter for world generation. Tracks chunks added/removed from run queue.
+ */
+ public static boolean debugWorldGen = false;
+ /**
+ * Try re-implement Richard Hendrick's Chunk by Chunk Ore Generation from his GT5u fork.
+ */
+ public static List<Runnable> mList = new ArrayList<>();
+
+ public static HashSet<Long> ProcChunks = new HashSet<>();
+ // This is probably not going to work. Trying to create a fake orevein to
+ // put into hashtable when there will be no ores in a vein.
+ public static WorldGen_GT_Ore_Layer noOresInVein = new WorldGen_GT_Ore_Layer(
+ "vein0",
+ 0,
+ 255,
+ 0,
+ 0,
+ 0,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON);
+
+ public static Hashtable<Long, WorldGen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
+
+ public boolean mIsGenerating = false;
+ public static final Object listLock = new Object();
+ // private static boolean gcAsteroids = true;
+
+ public WorldGen_GT_Base() {
+ if (debugWorldGen) {
+ GT_Log.out.println("GTPP_Worldgenerator created");
+ }
+ }
+
+ @Override
+ public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator,
+ IChunkProvider chunkProvider) {
+ if (world.provider.dimensionId == Dimension_Everglades.DIMID) {
+ generateSafely(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
+ }
+ }
+
+ public synchronized void generateSafely(Random random, int chunkX, int chunkZ, World world,
+ IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
+ int xDim = Dimension_Everglades.DIMID;
+ switch (world.provider.dimensionId) {
+ case -1: // Nether
+ // generateNether(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ case 0: // Overworld
+ // generateSurface(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ case 1: // End
+ // generateEnd(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ default: // Any other dimension
+ if (world.provider.dimensionId != xDim) {
+ break;
+ } else {
+ generateEverglades(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
+ break;
+ }
+ }
+ }
+
+ private synchronized void generateEverglades(Random aRandom, int aX, int aZ, World aWorld,
+ IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ Logger.WORLD("Trying to Generate Dimension.");
+ synchronized (listLock) {
+ Logger.WORLD("Locked List addition.");
+ if (WorldGen_GT_Base.mList.add(
+ new WorldGenContainer(
+ new XSTR(Math.abs(aRandom.nextInt()) + 1),
+ aX,
+ aZ,
+ Dimension_Everglades.DIMID,
+ aWorld,
+ aChunkGenerator,
+ aChunkProvider,
+ aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName))) {
+ Logger.WORLD("Locked List addition. Success.");
+ } else {
+ Logger.WORLD("Locked List addition. Fail.");
+ }
+ if (debugWorldGen) GT_Log.out.println(
+ "ADD WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + aX
+ + " z:"
+ + aZ
+ + " SIZE: "
+ + WorldGen_GT_Base.mList.size());
+ }
+
+ if (!this.mIsGenerating) {
+ Logger.WORLD("Is not generating.");
+ this.mIsGenerating = true;
+ Logger.WORLD("Setting Generation to true.");
+ int mList_sS = WorldGen_GT_Base.mList.size();
+ mList_sS = Math.min(mList_sS, 3); // Run a maximum of 3 chunks at a
+ // time through worldgen. Extra
+ // chunks get done later.
+ for (int i = 0; i < mList_sS; i++) {
+ WorldGenContainer toRun = (WorldGenContainer) WorldGen_GT_Base.mList.get(0);
+ if (debugWorldGen) GT_Log.out.println(
+ "RUN WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + toRun.mX
+ + " z:"
+ + toRun.mZ
+ + " SIZE: "
+ + WorldGen_GT_Base.mList.size()
+ + " i: "
+ + i);
+ synchronized (listLock) {
+ Logger.WORLD("Locked List Removal.");
+ WorldGen_GT_Base.mList.remove(0);
+ }
+ toRun.run();
+ }
+ this.mIsGenerating = false;
+ Logger.WORLD("Is Generating now set to false..");
+ }
+ }
+
+ public void generateOre(Block block, World world, Random random, int chunk_x, int chunk_z, int maxX, int maxZ,
+ int maxVeinSize, int chancesToSpawn, int minY, int maxY, Block generateIn) {
+ int heightRange = maxY - minY;
+ WorldGenMinable worldgenminable = new WorldGenMinable(block, maxVeinSize, generateIn);
+ for (int k1 = 0; k1 < chancesToSpawn; ++k1) {
+ int xrand = random.nextInt(16);
+ int yrand = random.nextInt(heightRange) + minY;
+ int zrand = random.nextInt(16);
+ worldgenminable.generate(world, random, chunk_x + xrand, yrand, chunk_z + zrand);
+ }
+ }
+
+ public static class WorldGenContainer implements Runnable {
+
+ public final Random mRandom;
+ public final int mX;
+ public final int mZ;
+ public final int mDimensionType;
+ public final World mWorld;
+ public final IChunkProvider mChunkGenerator;
+ public final IChunkProvider mChunkProvider;
+ public final String mBiome;
+
+ // Local class to track which orevein seeds must be checked when doing
+ // chunkified worldgen
+ class NearbySeeds {
+
+ public int mX;
+ public int mZ;
+
+ NearbySeeds(int x, int z) {
+ this.mX = x;
+ this.mZ = z;
+ }
+ };
+
+ public static ArrayList<NearbySeeds> seedList = new ArrayList<>();
+
+ // aX and aZ are now the by-chunk X and Z for the chunk of interest
+ public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld,
+ IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) {
+ this.mRandom = aRandom;
+ this.mX = aX;
+ this.mZ = aZ;
+ this.mDimensionType = aDimensionType;
+ this.mWorld = aWorld;
+ this.mChunkGenerator = aChunkGenerator;
+ this.mChunkProvider = aChunkProvider;
+ this.mBiome = aBiome;
+ }
+
+ public void worldGenFindVein(int oreseedX, int oreseedZ) {
+ // Explanation of oreveinseed implementation.
+ // (long)this.mWorld.getSeed()<<16) Deep Dark does two oregen
+ // passes, one with getSeed set to +1 the original world seed. This
+ // pushes that +1 off the low bits of oreseedZ, so that the hashes
+ // are far apart for the two passes.
+ // ((this.mWorld.provider.dimensionId & 0xffL)<<56) Puts the
+ // dimension in the top bits of the hash, to make sure to get unique
+ // hashes per dimension
+ // ((long)oreseedX & 0x000000000fffffffL) << 28) Puts the chunk X in
+ // the bits 29-55. Cuts off the top few bits of the chunk so we have
+ // bits for dimension.
+ // ( (long)oreseedZ & 0x000000000fffffffL )) Puts the chunk Z in the
+ // bits 0-27. Cuts off the top few bits of the chunk so we have bits
+ // for dimension.
+ long oreveinSeed = (this.mWorld.getSeed() << 16)
+ ^ ((this.mWorld.provider.dimensionId & 0xffL) << 56 | ((oreseedX & 0x000000000fffffffL) << 28)
+ | (oreseedZ & 0x000000000fffffffL)); // Use
+ // an
+ // RNG
+ // that
+ // is
+ // identical
+ // every
+ // time
+ // it
+ // is
+ // called
+ // for
+ // this
+ // oreseed.
+ XSTR oreveinRNG = new XSTR(oreveinSeed);
+ int oreveinPercentageRoll = oreveinRNG.nextInt(100); // Roll the
+ // dice, see
+ // if we get
+ // an
+ // orevein
+ // here at
+ // all
+ int noOrePlacedCount = 0;
+ String tDimensionName = "";
+ if (debugWorldGen) {
+ tDimensionName = this.mWorld.provider.getDimensionName();
+ }
+
+ if (debugWorldGen) {
+ GT_Log.out.println(
+ " Finding oreveins for oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " worldSeed="
+ + this.mWorld.getSeed());
+ }
+
+ Logger
+ .INFO("[World Generation Debug] !validOreveins.containsKey(oreveinSeed) | oreveinSeed: " + oreveinSeed);
+ // Search for a valid orevein for this dimension
+ if (!validOreveins.containsKey(oreveinSeed)) {
+
+ Logger.INFO(
+ "[World Generation Debug] oreveinPercentageRoll < oreveinPercentage? "
+ + ((oreveinPercentageRoll < oreveinPercentage)));
+ Logger.INFO(
+ "[World Generation Debug] WorldGen_GT_Ore_Layer.sWeight > 0? "
+ + (WorldGen_GT_Ore_Layer.sWeight > 0));
+ Logger.INFO(
+ "[World Generation Debug] WorldGen_GT_Ore_Layer.sList.size() > 0? "
+ + (WorldGen_GT_Ore_Layer.sList.size() > 0));
+ if ((oreveinPercentageRoll < oreveinPercentage) && (WorldGen_GT_Ore_Layer.sWeight > 0)
+ && (WorldGen_GT_Ore_Layer.sList.size() > 0)) {
+ int placementAttempts = 0;
+ boolean oreveinFound = false;
+ int i;
+ for (i = 0; (i < oreveinAttempts) && (!oreveinFound)
+ && (placementAttempts < oreveinMaxPlacementAttempts); i++) {
+ Logger.INFO("[World Generation Debug] i: " + i);
+ Logger.INFO("[World Generation Debug] placementAttempts: " + placementAttempts);
+ Logger.INFO("[World Generation Debug] oreveinAttempts: " + oreveinAttempts);
+ Logger.INFO(
+ "[World Generation Debug] (placementAttempts < oreveinMaxPlacementAttempts): "
+ + (placementAttempts < oreveinMaxPlacementAttempts));
+ Logger.INFO("[World Generation Debug] oreveinFound: " + oreveinFound);
+ int tRandomWeight = oreveinRNG.nextInt(WorldGen_GT_Ore_Layer.sWeight);
+ for (WorldGen_GT_Ore_Layer tWorldGen : WorldGen_GT_Ore_Layer.sList) {
+ Logger.INFO(
+ "[World Generation Debug] Iterating sList - Size: "
+ + WorldGen_GT_Ore_Layer.sList.size());
+ tRandomWeight -= (tWorldGen).mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ // Adjust the seed so that this layer has a
+ // series of unique random numbers.
+ // Otherwise multiple attempts at this same
+ // oreseed will get the same offset and X/Z
+ // values. If an orevein failed, any orevein
+ // with the
+ // same minimum heights would fail as well.
+ // This prevents that, giving each orevein a
+ // unique height each pass through here.
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ new XSTR(oreveinSeed ^ (Block.getIdFromBlock(tWorldGen.mPrimaryMeta))),
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case WorldGen_GT_Ore_Layer.ORE_PLACED -> {
+ if (debugWorldGen) GT_Log.out.println(
+ " Added oreveinSeed=" + oreveinSeed
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ Logger.INFO("[World Generation Debug] ORE_PLACED");
+ }
+ case WorldGen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> {
+ placementAttempts++;
+ Logger.INFO(
+ "[World Generation Debug] NO_ORE_IN_BOTTOM_LAYER | Attempts: "
+ + placementAttempts);
+ }
+ // SHould do retry in this case
+ // until out of chances
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP -> {
+ // Orevein didn't reach this chunk,
+ // can't add it yet to the hash
+ Logger.INFO("[World Generation Debug] NO_OVERLAP");
+ if (debugWorldGen) GT_Log.out.println(
+ " Added far oreveinSeed=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ }
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP_AIR_BLOCK -> {
+ if (debugWorldGen) GT_Log.out.println(
+ " No overlap and air block in test spot=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ // SHould do retry in this case until out of chances
+ Logger.INFO("[World Generation Debug] NO_OVERLAP_AIR_BLOCK");
+ placementAttempts++;
+ }
+ }
+ break; // Try the next orevein
+ } catch (Throwable e) {
+ if (debugWorldGen) GT_Log.out.println(
+ "Exception occurred on oreVein" + tWorldGen
+ + " oreveinSeed="
+ + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ);
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ // Only add an empty orevein if are unable to place a vein
+ // at the oreseed chunk.
+ if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)) {
+ if (debugWorldGen) GT_Log.out.println(
+ " Empty oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else if (oreveinPercentageRoll >= oreveinPercentage) {
+ if (debugWorldGen) GT_Log.out.println(
+ " Skipped oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " RNG="
+ + oreveinPercentageRoll
+ + " %="
+ + oreveinPercentage
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else {
+ // oreseed is located in the previously processed table
+ if (debugWorldGen) GT_Log.out
+ .print(" Valid oreveinSeed=" + oreveinSeed + " validOreveins.size()=" + validOreveins.size() + " ");
+ WorldGen_GT_Ore_Layer tWorldGen = validOreveins.get(oreveinSeed);
+ oreveinRNG.setSeed(oreveinSeed ^ (Block.getIdFromBlock(tWorldGen.mPrimaryMeta))); // Reset
+ // RNG
+ // to
+ // only
+ // be
+ // based
+ // on
+ // oreseed
+ // X/Z
+ // and
+ // type
+ // of
+ // vein
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ oreveinRNG,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case WorldGen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> {
+ if (debugWorldGen) GT_Log.out.println(" No ore in bottom layer");
+ }
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP -> {
+ if (debugWorldGen) GT_Log.out.println(" No overlap");
+ }
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ long startTime = System.nanoTime();
+ int oreveinMaxSize;
+
+ // Determine bounding box on how far out to check for oreveins
+ // affecting this chunk
+ // For now, manually reducing oreveinMaxSize when not in the
+ // Underdark for performance
+ if (this.mWorld.provider.getDimensionName()
+ .equals("Underdark")) {
+ oreveinMaxSize = 24; // Leave Deep Dark/Underdark max oregen at
+ // 32, instead of 64
+ } else {
+ oreveinMaxSize = 48;
+ }
+
+ int wXbox = this.mX - (oreveinMaxSize / 16);
+ int eXbox = this.mX + (oreveinMaxSize / 16 + 1); // Need to add 1
+ // since it is
+ // compared
+ // using a <
+ int nZbox = this.mZ - (oreveinMaxSize / 16);
+ int sZbox = this.mZ + (oreveinMaxSize / 16 + 1);
+
+ // Search for orevein seeds and add to the list;
+ for (int x = wXbox; x < eXbox; x++) {
+ for (int z = nZbox; z < sZbox; z++) {
+ // Determine if this X/Z is an orevein seed
+ if (GT_Worldgenerator.isOreChunk(x, z)) {
+ if (debugWorldGen) GT_Log.out.println("Adding seed x=" + x + " z=" + z);
+ seedList.add(new NearbySeeds(x, z));
+ }
+ }
+ }
+
+ // Now process each oreseed vs this requested chunk
+ for (; seedList.size() != 0; seedList.remove(0)) {
+ if (debugWorldGen)
+ GT_Log.out.println("Processing seed x=" + seedList.get(0).mX + " z=" + seedList.get(0).mZ);
+ worldGenFindVein(seedList.get(0).mX, seedList.get(0).mZ);
+ }
+
+ long oregenTime = System.nanoTime();
+
+ // Do leftover worldgen for this chunk (GT_Stones and GT_small_ores)
+ try {
+ for (WorldGen_GT tWorldGen : HANDLER_GT.sWorldgenListEverglades) {
+ /*
+ * if (debugWorldGen) GT_Log.out.println( "tWorldGen.mWorldGenName="+tWorldGen.mWorldGenName );
+ */
+ tWorldGen.executeWorldgen(
+ this.mWorld,
+ this.mRandom,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+
+ long leftOverTime = System.nanoTime();
+
+ Chunk tChunk = this.mWorld.getChunkFromBlockCoords(this.mX, this.mZ);
+ if (tChunk != null) {
+ tChunk.isModified = true;
+ }
+ long endTime = System.nanoTime();
+ long duration = (endTime - startTime);
+ if (debugWorldGen) {
+ GT_Log.out.println(
+ " Oregen took " + (oregenTime - startTime)
+ + " Leftover gen took "
+ + (leftOverTime - oregenTime)
+ + " Worldgen took "
+ + duration
+ + " nanoseconds");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java
new file mode 100644
index 0000000000..773109a818
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java
@@ -0,0 +1,590 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import static gtPlusPlus.everglades.gen.gt.WorldGen_GT_Base.debugWorldGen;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.common.blocks.GT_Block_Ores;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public class WorldGen_GT_Ore_Layer extends WorldGen_GT {
+
+ public static ArrayList<WorldGen_GT_Ore_Layer> sList = new ArrayList<>();
+ public static int sWeight = 0;
+ public final short mMinY;
+ public final short mMaxY;
+ public final short mWeight;
+ public final short mDensity;
+ public final short mSize;
+ public Block mPrimaryMeta;
+ public Block mSecondaryMeta;
+ public Block mBetweenMeta;
+ public Block mSporadicMeta;
+ public final Material mPrimary;
+ public final Material mSecondary;
+ public final Material mBetween;
+ public final Material mSporadic;
+
+ // public final String mBiome;
+ public final String mRestrictBiome;
+ public final boolean mOverworld;
+ public final boolean mNether;
+ public final boolean mEnd;
+ public static final int WRONG_BIOME = 0;
+ public static final int WRONG_DIMENSION = 1;
+ public static final int NO_ORE_IN_BOTTOM_LAYER = 2;
+ public static final int NO_OVERLAP = 3;
+ public static final int ORE_PLACED = 4;
+ public static final int NO_OVERLAP_AIR_BLOCK = 5;
+
+ public final String aTextWorldgen = "worldgen.";
+
+ public WorldGen_GT_Ore_Layer(String aName, int aMinY, int aMaxY, int aWeight, int aDensity, int aSize,
+ Material aPrimary, Material aSecondary, Material aBetween, Material aSporadic) {
+ this(
+ aName,
+ true,
+ aMinY,
+ aMaxY,
+ aWeight,
+ aDensity,
+ aSize,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ aPrimary,
+ aSecondary,
+ aBetween,
+ aSporadic);
+ }
+
+ public WorldGen_GT_Ore_Layer(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
+ int aSize, boolean aOverworld, boolean aNether, boolean aEnd, boolean GC_UNUSED1, boolean GC_UNUSED2,
+ boolean GC_UNUSED3, Material aPrimary, Material aSecondary, Material aBetween, Material aSporadic) {
+ super(aName, sList, aDefault);
+ Logger.WORLD("Creating Ore Layer Object");
+ this.mOverworld = HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Overworld", aOverworld);
+ this.mNether = HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Nether", aNether);
+ this.mEnd = HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "TheEnd", aEnd);
+ this.mMinY = 5;
+ short mMaxY = 14;
+ if (mMaxY < (this.mMinY + 7)) {
+ GT_Log.out.println("Oremix " + this.mWorldGenName + " has invalid Min/Max heights!");
+ mMaxY = (short) (this.mMinY + 7);
+ }
+ this.mMaxY = mMaxY;
+ this.mWeight = ((short) HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RandomWeight", aWeight));
+ this.mDensity = ((short) HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Density", aDensity));
+ this.mSize = ((short) Math
+ .max(1, HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Size", aSize)));
+ this.mPrimary = aPrimary;
+ this.mSecondary = aSecondary;
+ this.mBetween = aBetween;
+ this.mSporadic = aSporadic;
+ this.mPrimaryMeta = aPrimary.getOreBlock(1);
+ this.mSecondaryMeta = aSecondary.getOreBlock(1);
+ this.mBetweenMeta = aBetween.getOreBlock(1);
+ this.mSporadicMeta = aSporadic.getOreBlock(1);
+ this.mRestrictBiome = HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RestrictToBiomeName", "None");
+
+ // if (mPrimaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mPrimaryMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mPrimaryMeta + " for " + mWorldGenName + " does
+ // not exist");
+ // if (mSecondaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mSecondaryMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mSecondaryMeta + " for " + mWorldGenName + "
+ // does not exist");
+ // if (mBetweenMeta != -1 && GregTech_API.sGeneratedMaterials[(mBetweenMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mBetweenMeta + " for " + mWorldGenName + " does
+ // not exist");
+ // if (mPrimaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mSporadicMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mSporadicMeta + " for " + mWorldGenName + " does
+ // not exist");
+
+ if (this.mEnabled) {
+ sWeight += this.mWeight;
+ }
+ }
+
+ public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+
+ // Debug Handler
+ /**
+ * This handles Variables that are null during Init
+ */
+ if (this.mPrimaryMeta == Blocks.stone || this.mSecondaryMeta == Blocks.stone
+ || this.mBetweenMeta == Blocks.stone
+ || this.mSporadicMeta == Blocks.stone) {
+ this.mPrimaryMeta = this.mPrimary.getOreBlock(1);
+ this.mSecondaryMeta = this.mSecondary.getOreBlock(1);
+ this.mBetweenMeta = this.mBetween.getOreBlock(1);
+ this.mSporadicMeta = this.mSporadic.getOreBlock(1);
+ Logger.WORLD(
+ "[Vein Generator] An Ore in a Vein had defaulted back to a default value, so they have now been reset to correct values.");
+ }
+
+ if (mWorldGenName.equals("vein0")) {
+ if (debugWorldGen) GT_Log.out.println(" NoOresInVein-vein0");
+ // This is a special empty orevein
+ Logger.WORLD("[World Generation Debug] Special Empty Vein placed.");
+ return ORE_PLACED;
+ }
+ if (aDimensionType != Dimension_Everglades.DIMID) {
+ /*
+ * // Debug code, but spams log if (debugWorldGen) { GT_Log.out.println( "Wrong dimension" ); }
+ */
+ Logger.WORLD("[World Generation Debug] Wrong dimension.");
+ return WRONG_DIMENSION;
+ }
+ if (!this.mRestrictBiome.equals("None") && !(this.mRestrictBiome.equals(aBiome))) {
+ return WRONG_BIOME;
+ }
+ int[] placeCount = new int[4];
+
+ int tMinY = mMinY + aRandom.nextInt(mMaxY - mMinY - 5);
+ // Determine West/East ends of orevein
+ int wXVein = aSeedX - aRandom.nextInt(mSize); // West side
+ int eXVein = aSeedX + 16 + aRandom.nextInt(mSize);
+ // Limit Orevein to only blocks present in current chunk
+ int wX = Math.max(wXVein, aChunkX + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int eX = Math.min(eXVein, aChunkX + 2 + 16);
+ if (wX >= eX) { // No overlap between orevein and this chunk exists in X
+ Block tBlock = aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8);
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.stone)
+ || tBlock
+ .isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Dimension_Everglades.blockSecondLayer)
+ || tBlock
+ .isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Dimension_Everglades.blockMainFiller)
+ || tBlock.isReplaceableOreGen(
+ aWorld,
+ aChunkX + 8,
+ tMinY,
+ aChunkZ + 8,
+ Dimension_Everglades.blockSecondaryFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+ // Determine North/Sound ends of orevein
+ int nZVein = aSeedZ - aRandom.nextInt(mSize);
+ int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize);
+
+ int nZ = Math.max(nZVein, aChunkZ + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int sZ = Math.min(sZVein, aChunkZ + 2 + 16);
+ if (nZ >= sZ) { // No overlap between orevein and this chunk exists in Z
+ Block tBlock = aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8);
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+
+ if (debugWorldGen) {
+ String tDimensionName = aWorld.provider.getDimensionName();
+ GT_Log.out.print(
+ "Trying Orevein:" + this.mWorldGenName
+ + " Dimension="
+ + tDimensionName
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " oreseedX="
+ + aSeedX / 16
+ + " oreseedZ="
+ + aSeedZ / 16
+ + " cY="
+ + tMinY);
+ }
+ // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed
+ // should always be max density due to truncation of Math.sqrt().
+ int localDensity = (Math.max(
+ 1,
+ this.mDensity / ((int) Math
+ .sqrt(2 + Math.pow(aChunkX / 16 - aSeedX / 16, 2) + Math.pow(aChunkZ / 16 - aSeedZ / 16, 2)))));
+
+ // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll
+ // 1 pass through the loop
+ // Now we do bottom-level-first oregen, and work our way upwards.
+ int level = tMinY - 1; // Dunno why, but the first layer is actually played one below tMinY. Go figure.
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ /*
+ * if ((placeCount[1]+placeCount[3])==0) { if (debugWorldGen) GT_Log.out.println( " No ore in bottom layer" );
+ * return NO_ORE_IN_BOTTOM_LAYER; // Exit early, didn't place anything in the bottom layer }
+ */
+ Logger.WORLD("[World Generation Debug] Trying to set Ores?");
+ for (level = tMinY; level < (tMinY - 1 + 3); level++) {
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) {
+ placeCount[1]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ }
+ // Low Middle layer is between + sporadic
+ // level should be = tMinY-1+3 from end of for loop
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta != null)) { // Between are only 1 per vertical column, reduce by 1/2 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) {
+ placeCount[2]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ // High Middle layer is between + primary + sporadic
+ level++; // Increment level to next layer
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta != null)) { // Between are only 1 per vertical column, reduce by 1/2 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) {
+ placeCount[2]++;
+ }
+ } else if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mPrimaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, false)) {
+ placeCount[0]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ // Top two layers are primary + sporadic
+ level++; // Increment level to next layer
+ for (; level < (tMinY + 6); level++) { // should do two layers
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mPrimaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, false)) {
+ placeCount[0]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ }
+ if (debugWorldGen) {
+ String tDimensionName = aWorld.provider.getDimensionName();
+ GT_Log.out.println(
+ "Generated Orevein:" + this.mWorldGenName
+ + " Dimension="
+ + tDimensionName
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " oreseedX="
+ + aSeedX / 16
+ + " oreseedZ="
+ + aSeedZ / 16
+ + " cY="
+ + tMinY
+ + " wXVein"
+ + wXVein
+ + " eXVein"
+ + eXVein
+ + " nZVein"
+ + nZVein
+ + " sZVein"
+ + sZVein
+ + " locDen="
+ + localDensity
+ + " Den="
+ + this.mDensity
+ + " Sec="
+ + placeCount[1]
+ + " Spo="
+ + placeCount[3]
+ + " Bet="
+ + placeCount[2]
+ + " Pri="
+ + placeCount[0]);
+ }
+ // Something (at least the bottom layer must have 1 block) must have been placed, return true
+ return ORE_PLACED;
+ }
+
+ private String fString = "unset", ore1String = "unset", ore2String = "unset", ore3String = "unset",
+ ore4String = "unset";
+ Map<Materials, String> gtOreMap = new HashMap<>();
+
+ public boolean setOreBlock(World aWorld, int aX, int aY, int aZ, Block aMetaData, boolean isSmallOre, boolean air) {
+ if (!air) {
+ aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1));
+ }
+
+ // Set GT ORE
+ if (aMetaData instanceof GT_Block_Ores) {
+ if (ore1String.equals("unset")) {
+ ore1String = Utils.sanitizeString(
+ this.mPrimary.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore2String.equals("unset")) {
+ ore2String = Utils.sanitizeString(
+ this.mSecondaryMeta.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore3String.equals("unset")) {
+ ore3String = Utils.sanitizeString(
+ this.mBetweenMeta.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore4String.equals("unset")) {
+ ore4String = Utils.sanitizeString(
+ this.mSporadicMeta.getLocalizedName()
+ .toLowerCase());
+ }
+
+ if (this.mPrimaryMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore1String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mSecondaryMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore2String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mBetweenMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore3String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mSporadicMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore4String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ Block tBlock = aWorld.getBlock(aX, aY, aZ);
+ Block tOreBlock = aMetaData;
+ int BlockMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ String BlockName = tBlock.getUnlocalizedName();
+ if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.sand)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.dirt)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockSecondLayer)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockMainFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockSecondaryFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.sandstone)) {
+
+ if (aWorld.setBlock(aX, aY, aZ, tOreBlock, 0, 3)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + tOreBlock
+ .getLocalizedName() + " at X: " + aX + " | Y: " + aY + " | Z: " + aZ);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int mMetaItemSubID, boolean useless) {
+
+ // Get Class and Methods
+ Method setOres = null;
+
+ try {
+ setOres = GT_TileEntity_Ores.class.getDeclaredMethod(
+ "setOreBlock",
+ World.class,
+ int.class,
+ int.class,
+ int.class,
+ int.class,
+ boolean.class);
+ } catch (NoSuchMethodException | SecurityException e) {
+
+ }
+
+ try {
+ if (setOres != null) {
+ setOres.invoke(null, aWorld, aX, aY, aZ, mMetaItemSubID, useless);
+ } else {
+ return false;
+ }
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java
new file mode 100644
index 0000000000..e45b4bcd20
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java
@@ -0,0 +1,263 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.Hashtable;
+
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+
+public class WorldGen_Ores {
+
+ public static WorldGen_GT_Ore_Layer BaseVein = new WorldGen_GT_Ore_Layer(
+ "veinA",
+ 20,
+ 40,
+ 1,
+ 1,
+ 128,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON);
+
+ /**
+ * Custom ore Veins
+ */
+ public static WorldGen_GT_Ore_Layer Vein1 = new WorldGen_GT_Ore_Layer(
+ "vein1",
+ 0,
+ 60,
+ 30,
+ 2,
+ 16,
+ ORES.AGARDITE_CD,
+ ORES.AGARDITE_LA,
+ ORES.DEMICHELEITE_BR,
+ ORES.IRARSITE);
+
+ public static WorldGen_GT_Ore_Layer Vein2 = new WorldGen_GT_Ore_Layer(
+ "vein2",
+ 0,
+ 60,
+ 30,
+ 2,
+ 16,
+ ORES.AGARDITE_ND,
+ ORES.AGARDITE_Y,
+ ORES.KASHINITE,
+ ORES.CERITE);
+
+ public static WorldGen_GT_Ore_Layer Vein3 = new WorldGen_GT_Ore_Layer(
+ "vein3",
+ 0,
+ 60,
+ 30,
+ 3,
+ 32,
+ ORES.CERITE,
+ ORES.NICHROMITE,
+ ORES.XENOTIME,
+ ORES.HIBONITE);
+
+ public static WorldGen_GT_Ore_Layer Vein4 = new WorldGen_GT_Ore_Layer(
+ "vein4",
+ 0,
+ 60,
+ 40,
+ 3,
+ 32,
+ ORES.GEIKIELITE,
+ ORES.CRYOLITE,
+ ORES.GADOLINITE_CE,
+ ORES.AGARDITE_ND);
+
+ public static WorldGen_GT_Ore_Layer Vein5 = new WorldGen_GT_Ore_Layer(
+ "vein5",
+ 30,
+ 128,
+ 20,
+ 2,
+ 48,
+ ORES.HIBONITE,
+ ORES.YTTRIALITE,
+ ORES.ZIRCONILITE,
+ ORES.CERITE);
+ public static WorldGen_GT_Ore_Layer Vein6 = new WorldGen_GT_Ore_Layer(
+ "vein6",
+ 0,
+ 40,
+ 20,
+ 2,
+ 48,
+ ORES.XENOTIME,
+ ORES.ZIRKELITE,
+ ORES.CROCROITE,
+ ORES.IRARSITE);
+ public static WorldGen_GT_Ore_Layer Vein7 = new WorldGen_GT_Ore_Layer(
+ "vein7",
+ 40,
+ 128,
+ 20,
+ 2,
+ 48,
+ ORES.HONEAITE,
+ ORES.MIESSIITE,
+ ORES.SAMARSKITE_Y,
+ ORES.SAMARSKITE_YB);
+ public static WorldGen_GT_Ore_Layer Vein8 = new WorldGen_GT_Ore_Layer(
+ "vein8",
+ 0,
+ 40,
+ 20,
+ 2,
+ 48,
+ ORES.TITANITE,
+ ORES.ZIMBABWEITE,
+ ORES.ZIRCON,
+ ORES.FLORENCITE);
+
+ public static WorldGen_GT_Ore_Layer Vein9 = new WorldGen_GT_Ore_Layer(
+ "vein9",
+ 10,
+ 30,
+ 20,
+ 1,
+ 48,
+ ORES.LANTHANITE_CE,
+ FLUORIDES.FLUORITE,
+ ORES.LAFOSSAITE,
+ ORES.FLORENCITE);
+ public static WorldGen_GT_Ore_Layer Vein10 = new WorldGen_GT_Ore_Layer(
+ "vein10",
+ 20,
+ 50,
+ 20,
+ 2,
+ 32,
+ ORES.GEIKIELITE,
+ ORES.YTTROCERITE,
+ ORES.LANTHANITE_LA,
+ ORES.RADIOBARITE);
+ public static WorldGen_GT_Ore_Layer Vein11 = new WorldGen_GT_Ore_Layer(
+ "vein11",
+ 30,
+ 70,
+ 20,
+ 1,
+ 48,
+ FLUORIDES.FLUORITE,
+ ORES.KASHINITE,
+ ORES.ZIRCON,
+ ORES.CRYOLITE);
+ public static WorldGen_GT_Ore_Layer Vein12 = new WorldGen_GT_Ore_Layer(
+ "vein12",
+ 40,
+ 80,
+ 20,
+ 3,
+ 32,
+ ORES.CERITE,
+ ORES.ALBURNITE,
+ ORES.MIESSIITE,
+ ORES.HIBONITE);
+
+ /**
+ * Best Rarest Veins 2017
+ */
+ public static WorldGen_GT_Ore_Layer Vein13 = new WorldGen_GT_Ore_Layer(
+ "vein13",
+ 5,
+ 15,
+ 5,
+ 1,
+ 16,
+ ORES.CRYOLITE,
+ ORES.RADIOBARITE,
+ ORES.HONEAITE,
+ ORES.FLORENCITE);
+
+ public static WorldGen_GT_Ore_Layer Vein14 = new WorldGen_GT_Ore_Layer(
+ "vein14",
+ 10,
+ 20,
+ 8,
+ 2,
+ 16,
+ ORES.DEMICHELEITE_BR,
+ ORES.PERROUDITE,
+ ORES.IRARSITE,
+ ORES.RADIOBARITE);
+
+ public static WorldGen_GT_Ore_Layer Vein15 = new WorldGen_GT_Ore_Layer(
+ "vein15",
+ 5,
+ 25,
+ 5,
+ 3,
+ 24,
+ ORES.FLUORCAPHITE,
+ ORES.LAFOSSAITE,
+ ORES.GADOLINITE_CE,
+ ORES.GADOLINITE_Y);
+
+ public static WorldGen_GT_Ore_Layer Vein16 = new WorldGen_GT_Ore_Layer(
+ "vein16",
+ 0,
+ 25,
+ 4,
+ 2,
+ 32,
+ ORES.YTTROCERITE,
+ ORES.LEPERSONNITE,
+ ORES.LAUTARITE,
+ FLUORIDES.FLUORITE);
+
+ public static WorldGen_GT_Ore_Layer Vein17 = new WorldGen_GT_Ore_Layer(
+ "vein17",
+ 10,
+ 35,
+ 4,
+ 1,
+ 32,
+ ORES.FLORENCITE,
+ ORES.LAUTARITE,
+ ORES.SAMARSKITE_YB,
+ ORES.POLYCRASE);
+ public static WorldGen_GT_Ore_Layer Vein18 = new WorldGen_GT_Ore_Layer(
+ "vein18",
+ 15,
+ 40,
+ 4,
+ 1,
+ 48,
+ ORES.GADOLINITE_CE,
+ ORES.GADOLINITE_Y,
+ ORES.AGARDITE_LA,
+ ORES.AGARDITE_CD);
+
+ public static Hashtable<Long, WorldGen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
+
+ static long ID = 0;
+
+ public static void generateValidOreVeins() {
+ validOreveins.put(ID++, BaseVein);
+ validOreveins.put(ID++, Vein1);
+ validOreveins.put(ID++, Vein2);
+ validOreveins.put(ID++, Vein3);
+ validOreveins.put(ID++, Vein4);
+ validOreveins.put(ID++, Vein5);
+ validOreveins.put(ID++, Vein6);
+ validOreveins.put(ID++, Vein7);
+ validOreveins.put(ID++, Vein8);
+ validOreveins.put(ID++, Vein9);
+ validOreveins.put(ID++, Vein10);
+ validOreveins.put(ID++, Vein11);
+ validOreveins.put(ID++, Vein12);
+ validOreveins.put(ID++, Vein13);
+ validOreveins.put(ID++, Vein14);
+ validOreveins.put(ID++, Vein15);
+ validOreveins.put(ID++, Vein16);
+ validOreveins.put(ID++, Vein17);
+ validOreveins.put(ID++, Vein18);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java b/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java
new file mode 100644
index 0000000000..b5c66ff8b4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.everglades.item;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+
+public class ItemBlockToxicEverglades extends ItemBlock {
+
+ protected final int mID;
+
+ public ItemBlockToxicEverglades(final Block block) {
+ super(block);
+ this.mID = ((ITileTooltip) block).getTooltipID();
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.mID == 0) { // blockDarkWorldPortalFrame
+ list.add("Use this to access the Toxic Everglades.");
+ list.add("Assembled in the same shape as the Nether Portal.");
+ } else if (this.mID == 1) { // blockDarkWorldPortal
+ list.add("Place this if you are lazy to create the portal structure, slacker.");
+ } else if (this.mID == 2) { // blockDarkWorldGround
+ list.add("Will burn very quickly if it happens to catch fire.");
+ } else if (this.mID == 3) { // blockDarkWorldPollutedDirt
+ list.add("Maybe you can do something with this?.");
+ if (stack.getItemDamage() > 0) {
+ list.add("This smells worse than a bean fart...");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java b/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java
new file mode 100644
index 0000000000..be15c2a0d2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java
@@ -0,0 +1,113 @@
+package gtPlusPlus.everglades.item;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class ItemEvergladesPortalTrigger extends Item {
+
+ public ItemEvergladesPortalTrigger() {
+ super();
+ this.maxStackSize = 1;
+ setMaxDamage(64);
+ setCreativeTab(CreativeTabs.tabTools);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemAlkalusDisk");
+ }
+
+ @Override
+ public Item setMaxStackSize(int int1) {
+ return super.setMaxStackSize(1);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack thisItem) {
+ return EnumRarity.epic;
+ }
+
+ @Override
+ public boolean hasEffect(ItemStack par1ItemStack, int pass) {
+ return true;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return EnumChatFormatting.GOLD + "Alkalus Disk ["
+ + EnumChatFormatting.RED
+ + "Activated"
+ + EnumChatFormatting.GOLD
+ + "]";
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(EnumChatFormatting.GREEN + "Shines the way, towards the far away Everglades.");
+ list.add(
+ EnumChatFormatting.GREEN + "This item produces such a temperature, that you'd hate to use it incorrectly.");
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ return Utils.rgbtoHexValue(255, 128, 0);
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4,
+ int par5, int par6, int par7, float par8, float par9, float par10) {
+ if (par7 == 0) {
+ par5--;
+ }
+ if (par7 == 1) {
+ par5++;
+ }
+ if (par7 == 2) {
+ par6--;
+ }
+ if (par7 == 3) {
+ par6++;
+ }
+ if (par7 == 4) {
+ par4--;
+ }
+ if (par7 == 5) {
+ par4++;
+ }
+ if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack)) {
+ return false;
+ }
+ Block i1 = par3World.getBlock(par4, par5, par6);
+ if (i1 == Blocks.air) {
+ par3World.playSoundEffect(
+ par4 + 0.5D,
+ par5 + 0.5D,
+ par6 + 0.5D,
+ "fire.ignite",
+ 1.0F,
+ itemRand.nextFloat() * 0.4F + 0.8F);
+ if (Dimension_Everglades.portalBlock.tryToCreatePortal(par3World, par4, par5, par6)) {
+ // Make a Portal
+ } else {
+ if (!par3World.isRemote) {
+ par3World.setBlock(par4, par5, par6, ModBlocks.blockHellfire, 0, 3);
+ }
+ }
+ }
+ par1ItemStack.damageItem(1, par2EntityPlayer);
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java b/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java
new file mode 100644
index 0000000000..51f549ad9c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java
@@ -0,0 +1,472 @@
+package gtPlusPlus.everglades.world;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.Direction;
+import net.minecraft.util.LongHashMap;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.Teleporter;
+import net.minecraft.world.WorldServer;
+
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class TeleporterDimensionMod extends Teleporter {
+
+ private final WorldServer worldServerInstance;
+ /**
+ * A private Random() function in Teleporter
+ */
+ private final Random random;
+ /**
+ * Stores successful portal placement locations for rapid lookup.
+ */
+ private final LongHashMap destinationCoordinateCache = new LongHashMap();
+ /**
+ * A list of valid keys for the destinationCoordainteCache. These are based on the X & Z of the players initial
+ * location.
+ */
+ @SuppressWarnings("rawtypes")
+ private final List destinationCoordinateKeys = new ArrayList();
+
+ public TeleporterDimensionMod(WorldServer par1WorldServer) {
+ super(par1WorldServer);
+ this.worldServerInstance = par1WorldServer;
+ this.random = new Random(par1WorldServer.getSeed());
+ }
+
+ /**
+ * Place an entity in a nearby portal, creating one if necessary.
+ */
+ @Override
+ public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) {
+ if (this.worldServerInstance.provider.dimensionId != 1) {
+ if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) {
+ this.makePortal(par1Entity);
+ this.placeInExistingPortal(par1Entity, par2, par4, par6, par8);
+ }
+ } else {
+ int i = MathHelper.floor_double(par1Entity.posX);
+ int j = MathHelper.floor_double(par1Entity.posY) - 1;
+ int k = MathHelper.floor_double(par1Entity.posZ);
+ byte b0 = 1;
+ byte b1 = 0;
+
+ for (int l = -2; l <= 2; ++l) {
+ for (int i1 = -2; i1 <= 2; ++i1) {
+ for (int j1 = -1; j1 < 3; ++j1) {
+ int k1 = i + i1 * b0 + l * b1;
+ int l1 = j + j1;
+ int i2 = k + i1 * b1 - l * b0;
+ boolean flag = j1 < 0;
+ this.worldServerInstance
+ .setBlock(k1, l1, i2, flag ? Dimension_Everglades.blockPortalFrame : Blocks.air);
+ }
+ }
+ }
+
+ par1Entity.setLocationAndAngles(i, j, k, par1Entity.rotationYaw, 0.0F);
+ par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
+ }
+ }
+
+ /**
+ * Place an entity in a nearby portal which already exists.
+ */
+ @Override
+ public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) {
+ short short1 = 128;
+ double d3 = -1.0D;
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ int l = MathHelper.floor_double(par1Entity.posX);
+ int i1 = MathHelper.floor_double(par1Entity.posZ);
+ long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1);
+ boolean flag = true;
+ double d7;
+ int l3;
+
+ if (this.destinationCoordinateCache.containsItem(j1)) {
+ Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition) this.destinationCoordinateCache
+ .getValueByKey(j1);
+ d3 = 0.0D;
+ i = portalposition.posX;
+ j = portalposition.posY;
+ k = portalposition.posZ;
+ portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime();
+ flag = false;
+ } else {
+ for (l3 = l - short1; l3 <= l + short1; ++l3) {
+ double d4 = l3 + 0.5D - par1Entity.posX;
+
+ for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) {
+ double d5 = l1 + 0.5D - par1Entity.posZ;
+
+ for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) {
+ if (this.worldServerInstance.getBlock(l3, i2, l1) == Dimension_Everglades.portalBlock) {
+ while (this.worldServerInstance.getBlock(l3, i2 - 1, l1)
+ == Dimension_Everglades.portalBlock) {
+ --i2;
+ }
+
+ d7 = i2 + 0.5D - par1Entity.posY;
+ double d8 = d4 * d4 + d7 * d7 + d5 * d5;
+
+ if (d3 < 0.0D || d8 < d3) {
+ d3 = d8;
+ i = l3;
+ j = i2;
+ k = l1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (d3 >= 0.0D) {
+ if (flag) {
+ this.destinationCoordinateCache
+ .add(j1, new Teleporter.PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime()));
+ this.destinationCoordinateKeys.add(Long.valueOf(j1));
+ }
+
+ double d11 = i + 0.5D;
+ double d6 = j + 0.5D;
+ d7 = k + 0.5D;
+ int i4 = -1;
+
+ if (this.worldServerInstance.getBlock(i - 1, j, k) == Dimension_Everglades.portalBlock) {
+ i4 = 2;
+ }
+
+ if (this.worldServerInstance.getBlock(i + 1, j, k) == Dimension_Everglades.portalBlock) {
+ i4 = 0;
+ }
+
+ if (this.worldServerInstance.getBlock(i, j, k - 1) == Dimension_Everglades.portalBlock) {
+ i4 = 3;
+ }
+
+ if (this.worldServerInstance.getBlock(i, j, k + 1) == Dimension_Everglades.portalBlock) {
+ i4 = 1;
+ }
+
+ int j2 = par1Entity.getTeleportDirection();
+
+ if (i4 > -1) {
+ int k2 = Direction.rotateLeft[i4];
+ int l2 = Direction.offsetX[i4];
+ int i3 = Direction.offsetZ[i4];
+ int j3 = Direction.offsetX[k2];
+ int k3 = Direction.offsetZ[k2];
+ boolean flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3)
+ || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3);
+ boolean flag2 = !this.worldServerInstance.isAirBlock(i + l2, j, k + i3)
+ || !this.worldServerInstance.isAirBlock(i + l2, j + 1, k + i3);
+
+ if (flag1 && flag2) {
+ i4 = Direction.rotateOpposite[i4];
+ k2 = Direction.rotateOpposite[k2];
+ l2 = Direction.offsetX[i4];
+ i3 = Direction.offsetZ[i4];
+ j3 = Direction.offsetX[k2];
+ k3 = Direction.offsetZ[k2];
+ l3 = i - j3;
+ d11 -= j3;
+ int k1 = k - k3;
+ d7 -= k3;
+ flag1 = !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j, k1 + i3 + k3)
+ || !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j + 1, k1 + i3 + k3);
+ flag2 = !this.worldServerInstance.isAirBlock(l3 + l2, j, k1 + i3)
+ || !this.worldServerInstance.isAirBlock(l3 + l2, j + 1, k1 + i3);
+ }
+
+ float f1 = 0.5F;
+ float f2 = 0.5F;
+
+ if (!flag1 && flag2) {
+ f1 = 1.0F;
+ } else if (flag1 && !flag2) {
+ f1 = 0.0F;
+ } else if (flag1 && flag2) {
+ f2 = 0.0F;
+ }
+
+ d11 += j3 * f1 + f2 * l2;
+ d7 += k3 * f1 + f2 * i3;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+
+ if (i4 == j2) {
+ f3 = 1.0F;
+ f4 = 1.0F;
+ } else if (i4 == Direction.rotateOpposite[j2]) {
+ f3 = -1.0F;
+ f4 = -1.0F;
+ } else if (i4 == Direction.rotateRight[j2]) {
+ f5 = 1.0F;
+ f6 = -1.0F;
+ } else {
+ f5 = -1.0F;
+ f6 = 1.0F;
+ }
+
+ double d9 = par1Entity.motionX;
+ double d10 = par1Entity.motionZ;
+ par1Entity.motionX = d9 * f3 + d10 * f6;
+ par1Entity.motionZ = d9 * f5 + d10 * f4;
+ par1Entity.rotationYaw = par8 - j2 * 90 + i4 * 90;
+ } else {
+ par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
+ }
+
+ par1Entity.setLocationAndAngles(d11, d6, d7, par1Entity.rotationYaw, par1Entity.rotationPitch);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean makePortal(Entity par1Entity) {
+ byte b0 = 16;
+ double d0 = -1.0D;
+ int i = MathHelper.floor_double(par1Entity.posX);
+ int j = MathHelper.floor_double(par1Entity.posY);
+ int k = MathHelper.floor_double(par1Entity.posZ);
+ int l = i;
+ int i1 = j;
+ int j1 = k;
+ int k1 = 0;
+ int l1 = this.random.nextInt(4);
+ int i2;
+ double d1;
+ double d2;
+ int k2;
+ int i3;
+ int k3;
+ int j3;
+ int i4;
+ int l3;
+ int k4;
+ int j4;
+ int i5;
+ int l4;
+ double d3;
+ double d4;
+
+ for (i2 = i - b0; i2 <= i + b0; ++i2) {
+ d1 = i2 + 0.5D - par1Entity.posX;
+
+ for (k2 = k - b0; k2 <= k + b0; ++k2) {
+ d2 = k2 + 0.5D - par1Entity.posZ;
+ label274: for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) {
+ if (this.worldServerInstance.isAirBlock(i2, i3, k2)) {
+ while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) {
+ --i3;
+ }
+
+ for (j3 = l1; j3 < l1 + 4; ++j3) {
+ k3 = j3 % 2;
+ l3 = 1 - k3;
+
+ if (j3 % 4 >= 2) {
+ k3 = -k3;
+ l3 = -l3;
+ }
+
+ for (i4 = 0; i4 < 3; ++i4) {
+ for (j4 = 0; j4 < 4; ++j4) {
+ for (k4 = -1; k4 < 4; ++k4) {
+ l4 = i2 + (j4 - 1) * k3 + i4 * l3;
+ i5 = i3 + k4;
+ int j5 = k2 + (j4 - 1) * l3 - i4 * k3;
+
+ if (k4 < 0 && !this.worldServerInstance.getBlock(l4, i5, j5)
+ .getMaterial()
+ .isSolid() || k4 >= 0 && !this.worldServerInstance.isAirBlock(l4, i5, j5)) {
+ continue label274;
+ }
+ }
+ }
+ }
+
+ d4 = i3 + 0.5D - par1Entity.posY;
+ d3 = d1 * d1 + d4 * d4 + d2 * d2;
+
+ if (d0 < 0.0D || d3 < d0) {
+ d0 = d3;
+ l = i2;
+ i1 = i3;
+ j1 = k2;
+ k1 = j3 % 4;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (d0 < 0.0D) {
+ for (i2 = i - b0; i2 <= i + b0; ++i2) {
+ d1 = i2 + 0.5D - par1Entity.posX;
+
+ for (k2 = k - b0; k2 <= k + b0; ++k2) {
+ d2 = k2 + 0.5D - par1Entity.posZ;
+ label222: for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) {
+ if (this.worldServerInstance.isAirBlock(i2, i3, k2)) {
+ while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) {
+ --i3;
+ }
+
+ for (j3 = l1; j3 < l1 + 2; ++j3) {
+ k3 = j3 % 2;
+ l3 = 1 - k3;
+
+ for (i4 = 0; i4 < 4; ++i4) {
+ for (j4 = -1; j4 < 4; ++j4) {
+ k4 = i2 + (i4 - 1) * k3;
+ l4 = i3 + j4;
+ i5 = k2 + (i4 - 1) * l3;
+
+ if (j4 < 0 && !this.worldServerInstance.getBlock(k4, l4, i5)
+ .getMaterial()
+ .isSolid() || j4 >= 0 && !this.worldServerInstance.isAirBlock(k4, l4, i5)) {
+ continue label222;
+ }
+ }
+ }
+
+ d4 = i3 + 0.5D - par1Entity.posY;
+ d3 = d1 * d1 + d4 * d4 + d2 * d2;
+
+ if (d0 < 0.0D || d3 < d0) {
+ d0 = d3;
+ l = i2;
+ i1 = i3;
+ j1 = k2;
+ k1 = j3 % 2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ int k5 = l;
+ int j2 = i1;
+ k2 = j1;
+ int l5 = k1 % 2;
+ int l2 = 1 - l5;
+
+ if (k1 % 4 >= 2) {
+ l5 = -l5;
+ l2 = -l2;
+ }
+
+ boolean flag;
+
+ if (d0 < 0.0D) {
+ if (i1 < 70) {
+ i1 = 70;
+ }
+
+ if (i1 > this.worldServerInstance.getActualHeight() - 10) {
+ i1 = this.worldServerInstance.getActualHeight() - 10;
+ }
+
+ j2 = i1;
+
+ for (i3 = -1; i3 <= 1; ++i3) {
+ for (j3 = 1; j3 < 3; ++j3) {
+ for (k3 = -1; k3 < 3; ++k3) {
+ l3 = k5 + (j3 - 1) * l5 + i3 * l2;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2 - i3 * l5;
+ flag = k3 < 0;
+ this.worldServerInstance
+ .setBlock(l3, i4, j4, flag ? Dimension_Everglades.blockPortalFrame : Blocks.air);
+ }
+ }
+ }
+ }
+
+ for (i3 = 0; i3 < 4; ++i3) {
+ for (j3 = 0; j3 < 4; ++j3) {
+ for (k3 = -1; k3 < 4; ++k3) {
+ l3 = k5 + (j3 - 1) * l5;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2;
+ flag = j3 == 0 || j3 == 3 || k3 == -1 || k3 == 3;
+ this.worldServerInstance.setBlock(
+ l3,
+ i4,
+ j4,
+ flag ? Dimension_Everglades.blockPortalFrame : Dimension_Everglades.portalBlock,
+ 0,
+ 2);
+ }
+ }
+
+ for (j3 = 0; j3 < 4; ++j3) {
+ for (k3 = -1; k3 < 4; ++k3) {
+ l3 = k5 + (j3 - 1) * l5;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2;
+ this.worldServerInstance
+ .notifyBlocksOfNeighborChange(l3, i4, j4, this.worldServerInstance.getBlock(l3, i4, j4));
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * called periodically to remove out-of-date portal locations from the cache list. Argument par1 is a
+ * WorldServer.getTotalWorldTime() value.
+ */
+ @Override
+ public void removeStalePortalLocations(long par1) {
+ if (par1 % 100L == 0L) {
+ @SuppressWarnings("rawtypes")
+ Iterator iterator = this.destinationCoordinateKeys.iterator();
+ long j = par1 - 600L;
+
+ while (iterator.hasNext()) {
+ Long olong = (Long) iterator.next();
+ Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition) this.destinationCoordinateCache
+ .getValueByKey(olong);
+
+ if (portalposition == null || portalposition.lastUpdateTime < j) {
+ iterator.remove();
+ this.destinationCoordinateCache.remove(olong);
+ }
+ }
+ }
+ }
+
+ public class PortalPosition extends ChunkCoordinates {
+
+ /**
+ * The worldtime at which this PortalPosition was last verified
+ */
+ public long lastUpdateTime;
+
+ public PortalPosition(int par2, int par3, int par4, long par5) {
+ super(par2, par3, par4);
+ this.lastUpdateTime = par5;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java b/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java
new file mode 100644
index 0000000000..d1a621addf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.everglades.world;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.crash.CrashReport;
+import net.minecraft.crash.CrashReportCategory;
+import net.minecraft.util.ReportedException;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.biome.BiomeCache;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.biome.WorldChunkManager;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.IntCache;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.everglades.biome.GenLayerEverglades;
+
+public class WorldChunkManagerCustom extends WorldChunkManager {
+
+ private GenLayer genBiomes;
+ /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
+ private GenLayer biomeIndexLayer;
+ /** The BiomeCache object for this world. */
+ private BiomeCache biomeCache;
+ /** A list of biomes that the player can spawn in. */
+ private List<BiomeGenBase> biomesToSpawnIn;
+
+ @SuppressWarnings({ "rawtypes" })
+ public WorldChunkManagerCustom() {
+ this.biomeCache = new BiomeCache(this);
+ this.biomesToSpawnIn = new ArrayList();
+ this.biomesToSpawnIn.addAll(allowedBiomes); // TODO
+ }
+
+ public WorldChunkManagerCustom(long seed, WorldType worldType) {
+ this();
+ // i changed this to my GenLayerDarkWorld
+ GenLayer[] agenlayer = GenLayerEverglades.makeTheWorld(seed, worldType);
+
+ agenlayer = getModdedBiomeGenerators(worldType, seed, agenlayer);
+ this.genBiomes = agenlayer[0];
+ this.biomeIndexLayer = agenlayer[1];
+ }
+
+ /**
+ * Gets the list of valid biomes for the player to spawn in.
+ */
+ @Override
+ public List<BiomeGenBase> getBiomesToSpawnIn() {
+ return this.biomesToSpawnIn;
+ }
+
+ /**
+ * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
+ */
+ @Override
+ public float[] getRainfall(float[] listToReuse, int x, int z, int width, int length) {
+ IntCache.resetIntCache();
+
+ if (listToReuse == null || listToReuse.length < width * length) {
+ listToReuse = new float[width * length];
+ }
+
+ int[] aint = this.biomeIndexLayer.getInts(x, z, width, length);
+
+ for (int i1 = 0; i1 < width * length; ++i1) {
+ try {
+ float f = BiomeGenBase.getBiome(aint[i1])
+ .getIntRainfall() / 65536.0F;
+
+ if (f > 1.0F) {
+ f = 1.0F;
+ }
+
+ listToReuse[i1] = f;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("DownfallBlock");
+ crashreportcategory.addCrashSection("biome id", Integer.valueOf(i1));
+ crashreportcategory.addCrashSection("downfalls[] size", Integer.valueOf(listToReuse.length));
+ crashreportcategory.addCrashSection("x", Integer.valueOf(x));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(z));
+ crashreportcategory.addCrashSection("w", Integer.valueOf(width));
+ crashreportcategory.addCrashSection("h", Integer.valueOf(length));
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ return listToReuse;
+ }
+
+ /**
+ * Return an adjusted version of a given temperature based on the y height
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public float getTemperatureAtHeight(float par1, int par2) {
+ return par1;
+ }
+
+ /**
+ * Returns an array of biomes for the location input.
+ */
+ @Override
+ public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4,
+ int par5) {
+ IntCache.resetIntCache();
+
+ if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5) {
+ par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
+ }
+
+ int[] aint = this.genBiomes.getInts(par2, par3, par4, par5);
+
+ try {
+ for (int i = 0; i < par4 * par5; ++i) {
+ par1ArrayOfBiomeGenBase[i] = BiomeGenBase.getBiome(aint[i]);
+ }
+
+ return par1ArrayOfBiomeGenBase;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("RawBiomeBlock");
+ crashreportcategory.addCrashSection("biomes[] size", Integer.valueOf(par1ArrayOfBiomeGenBase.length));
+ crashreportcategory.addCrashSection("x", Integer.valueOf(par2));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(par3));
+ crashreportcategory.addCrashSection("w", Integer.valueOf(par4));
+ crashreportcategory.addCrashSection("h", Integer.valueOf(par5));
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ /**
+ * Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
+ * WorldChunkManager Args: oldBiomeList, x, z, width, depth
+ */
+ @Override
+ public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] oldBiomeList, int x, int z, int width, int depth) {
+ return this.getBiomeGenAt(oldBiomeList, x, z, width, depth, true);
+ }
+
+ /**
+ * Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
+ * don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
+ */
+ @Override
+ public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] listToReuse, int x, int y, int width, int length,
+ boolean cacheFlag) {
+ IntCache.resetIntCache();
+
+ if (listToReuse == null || listToReuse.length < width * length) {
+ listToReuse = new BiomeGenBase[width * length];
+ }
+
+ if (cacheFlag && width == 16 && length == 16 && (x & 15) == 0 && (y & 15) == 0) {
+ BiomeGenBase[] abiomegenbase1 = this.biomeCache.getCachedBiomes(x, y);
+ System.arraycopy(abiomegenbase1, 0, listToReuse, 0, width * length);
+ return listToReuse;
+ } else {
+ int[] aint = this.biomeIndexLayer.getInts(x, y, width, length);
+
+ for (int i = 0; i < width * length; ++i) {
+ listToReuse[i] = BiomeGenBase.getBiome(aint[i]);
+ }
+ return listToReuse;
+ }
+ }
+
+ /**
+ * checks given Chunk's Biomes against List of allowed ones
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ public boolean areBiomesViable(int x, int y, int z, List par4List) {
+ IntCache.resetIntCache();
+ int l = x - z >> 2;
+ int i1 = y - z >> 2;
+ int j1 = x + z >> 2;
+ int k1 = y + z >> 2;
+ int l1 = j1 - l + 1;
+ int i2 = k1 - i1 + 1;
+ int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
+
+ try {
+ for (int j2 = 0; j2 < l1 * i2; ++j2) {
+ BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[j2]);
+
+ if (!par4List.contains(biomegenbase)) {
+ return false;
+ }
+ }
+
+ return true;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("Layer");
+ crashreportcategory.addCrashSection("Layer", this.genBiomes.toString());
+ crashreportcategory.addCrashSection("x", Integer.valueOf(x));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(y));
+ crashreportcategory.addCrashSection("radius", Integer.valueOf(z));
+ crashreportcategory.addCrashSection("allowed", par4List);
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ /**
+ * Finds a valid position within a range, that is in one of the listed biomes. Searches {par1,par2} +-par3 blocks.
+ * Strongly favors positive y positions.
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ public ChunkPosition findBiomePosition(int p_150795_1_, int p_150795_2_, int p_150795_3_, List p_150795_4_,
+ Random p_150795_5_) {
+ IntCache.resetIntCache();
+ int l = p_150795_1_ - p_150795_3_ >> 2;
+ int i1 = p_150795_2_ - p_150795_3_ >> 2;
+ int j1 = p_150795_1_ + p_150795_3_ >> 2;
+ int k1 = p_150795_2_ + p_150795_3_ >> 2;
+ int l1 = j1 - l + 1;
+ int i2 = k1 - i1 + 1;
+ int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
+ ChunkPosition chunkposition = null;
+ int j2 = 0;
+
+ for (int k2 = 0; k2 < l1 * i2; ++k2) {
+ int l2 = l + k2 % l1 << 2;
+ int i3 = i1 + k2 / l1 << 2;
+ BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[k2]);
+
+ if (p_150795_4_.contains(biomegenbase) && (chunkposition == null || p_150795_5_.nextInt(j2 + 1) == 0)) {
+ chunkposition = new ChunkPosition(l2, 0, i3);
+ ++j2;
+ }
+ }
+
+ return chunkposition;
+ }
+
+ /**
+ * Calls the WorldChunkManager's biomeCache.cleanupCache()
+ */
+ @Override
+ public void cleanupCache() {
+ this.biomeCache.cleanupCache();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java b/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java
new file mode 100644
index 0000000000..c8a69a3b0e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.everglades.world;
+
+import net.minecraft.util.Vec3;
+import net.minecraft.world.WorldProvider;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.everglades.chunk.ChunkProviderModded;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class WorldProviderMod extends WorldProvider {
+
+ @Override
+ public void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManagerCustom(this.worldObj.getSeed(), WorldType.AMPLIFIED);
+ this.isHellWorld = false;
+ this.hasNoSky = false;
+ this.dimensionId = Dimension_Everglades.DIMID;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public Vec3 getFogColor(float par1, float par2) {
+ return Vec3.createVectorHelper(0.01568627450980392D, 0.09019607843137255D, 0.0D);
+ }
+
+ @Override
+ public IChunkProvider createChunkGenerator() {
+ return new ChunkProviderModded(this.worldObj, this.worldObj.getSeed() - 1278);
+ }
+
+ @Override
+ public boolean canCoordinateBeSpawn(int par1, int par2) {
+ return false;
+ }
+
+ @Override
+ public float getSunBrightness(float par1) {
+ return (par1 * 2F);
+ }
+
+ @Override
+ public float getStarBrightness(float par1) {
+ return (par1 * 5F);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean doesXZShowFog(int par1, int par2) {
+ return true;
+ }
+
+ @Override
+ public String getDimensionName() {
+ return "dimensionDarkWorld";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java b/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java
new file mode 100644
index 0000000000..499e53c317
--- /dev/null
+++ b/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java
@@ -0,0 +1,273 @@
+package gtPlusPlus.nei;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import codechicken.lib.gui.GuiDraw;
+import codechicken.nei.PositionedStack;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.gui.machine.GUI_DecayablesChest;
+import gtPlusPlus.core.handler.Recipes.DecayableRecipe;
+import gtPlusPlus.core.item.base.dusts.BaseItemDustUnique;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.lib.VanillaColours;
+import gtPlusPlus.nei.handlers.NeiTextureHandler;
+
+public class DecayableRecipeHandler extends TemplateRecipeHandler {
+
+ public static final String mNEIName = "Decayables";
+
+ @Override
+ public String getRecipeName() {
+ return StatCollector.translateToLocal("GTPP.container.decaychest.name");
+ }
+
+ @Override
+ public String getGuiTexture() {
+ return GTPlusPlus.ID + ":textures/gui/nei/decayables.png";
+ }
+
+ @Override
+ public Class<? extends GuiContainer> getGuiClass() {
+ return GUI_DecayablesChest.class;
+ }
+
+ @Override
+ public String getOverlayIdentifier() {
+ return "GTPP_Decayables";
+ }
+
+ @Override
+ public int recipiesPerPage() {
+ return 1;
+ }
+
+ @Override
+ public void loadTransferRects() {
+ this.transferRects
+ .add(new RecipeTransferRect(new Rectangle(6, 3, 16, 16), getOverlayIdentifier(), new Object[0]));
+ }
+
+ @Override
+ public void loadCraftingRecipes(ItemStack result) {
+ if (result == null || (!DustDecayable.class.isInstance(result.getItem())
+ && !BaseItemDustUnique.class.isInstance(result.getItem()))) {
+ return;
+ }
+ if (result != null) {
+ // Logger.INFO("Looking up crafting recipes for "+ItemUtils.getItemName(result));
+ }
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ if (!GT_Utility.areStacksEqual(result, output, true)) {
+ continue;
+ }
+ // Logger.INFO("Showing Usage result for "+ItemUtils.getItemName(result));
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ }
+
+ @Override
+ public void loadCraftingRecipes(String outputId, Object... results) {
+ if (outputId.equals(getOverlayIdentifier()) && this.getClass() == DecayableRecipeHandler.class) {
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ } else {
+ super.loadCraftingRecipes(outputId, results);
+ }
+ }
+
+ @Override
+ public void loadUsageRecipes(ItemStack ingredient) {
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ if (ingredient != null) {
+ // Logger.INFO("Looking up Usage results for "+ItemUtils.getItemName(ingredient));
+ }
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ if (!GT_Utility.areStacksEqual(ingredient, input, true)) {
+ continue;
+ }
+ // Logger.INFO("Showing up Usage results for "+ItemUtils.getItemName(ingredient));
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ // rec.setIngredientPermutation((Collection) rec.input, ingredient);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ }
+
+ private void sort() {
+ List<DecayableRecipeNEI> g = new ArrayList<>();
+ for (CachedRecipe u : arecipes) {
+ g.add((DecayableRecipeNEI) u);
+ }
+ if (g != null && !g.isEmpty()) {
+ Collections.sort(g);
+ }
+ }
+
+ @Override
+ public void drawExtras(int recipeIndex) {
+ DecayableRecipeNEI recipe = (DecayableRecipeNEI) this.arecipes.get(recipeIndex);
+
+ // GuiDraw.drawStringC(I18n.format("GTPP.container.decaychest.result", new Object[]{}), 43, 10, 8421504, false);
+
+ int cost = recipe.time;
+ if (cost > 0) {
+
+ // NEI Strings
+ String s = I18n.format("GTPP.nei.info", new Object[] { cost });
+ String s0 = I18n.format("GTPP.nei.timetaken", new Object[] { cost });
+
+ // Time Strings
+ String s1 = I18n.format("GTPP.time.ticks", new Object[] { cost });
+ String s2 = I18n.format("GTPP.time.seconds", new Object[] { cost });
+ String s3 = I18n.format("GTPP.time.minutes", new Object[] { cost });
+ String s4 = I18n.format("GTPP.time.hours", new Object[] { cost });
+ String s5 = I18n.format("GTPP.time.days", new Object[] { cost });
+ String s6 = I18n.format("GTPP.time.months", new Object[] { cost });
+ int y = 20;
+
+ int secs = cost / 20;
+ int mins = secs / 60;
+ int hours = mins / 60;
+ int days = hours / 24;
+ int months = days / 30;
+
+ String suffix;
+ int formattedTime;
+ if (cost <= 20) {
+ suffix = s1;
+ formattedTime = cost;
+ } else if (cost <= (20 * 60)) {
+ suffix = s2;
+ formattedTime = secs;
+ } else if (cost <= (20 * 60 * 60)) {
+ suffix = s3;
+ formattedTime = mins;
+ } else if (cost <= (20 * 60 * 60 * 24)) {
+ suffix = s4;
+ formattedTime = hours;
+ } else if (cost < (20 * 60 * 60 * 24 * 30)) {
+ suffix = s5;
+ formattedTime = days;
+ } else if (cost <= (20 * 60 * 60 * 24 * 30)) {
+ suffix = s6;
+ formattedTime = months;
+ } else {
+ suffix = s1;
+ formattedTime = cost;
+ }
+
+ int x = 5;
+ GuiDraw.drawString(s, x, 25, VanillaColours.DYE_BLACK.getAsInt(), false);
+ GuiDraw.drawString(s0, x, 40, VanillaColours.DYE_BLACK.getAsInt(), false);
+
+ GuiDraw.drawString(suffix, x + 16, y + 30, VanillaColours.DYE_BLACK.getAsInt(), false);
+
+ // Values
+ GuiDraw.drawString(("" + formattedTime), x, y + 30, VanillaColours.DYE_GREEN.getAsInt(), false);
+
+ if (hours > 1) {
+ int aLeftoverMinutes = (cost - (hours * (20 * 60 * 60)));
+ if (aLeftoverMinutes > 0) {
+ int secs2 = aLeftoverMinutes / 20;
+ int mins2 = secs2 / 60;
+ GuiDraw.drawString(s3, x + 16, y + 42, VanillaColours.DYE_BLACK.getAsInt(), false);
+ GuiDraw.drawString(("" + mins2), x, y + 42, VanillaColours.DYE_GREEN.getAsInt(), false);
+ }
+ }
+ }
+
+ NeiTextureHandler.RECIPE_BUTTON.renderIcon(6.0D, 3.0D, 16.0D, 16.0D, 0.0D, true);
+ }
+
+ public class DecayableRecipeNEI extends TemplateRecipeHandler.CachedRecipe implements Comparable<CachedRecipe> {
+
+ private PositionedStack input;
+ private PositionedStack output;
+ public int time;
+
+ @Override
+ public PositionedStack getIngredient() {
+ return this.input;
+ }
+
+ @Override
+ public PositionedStack getResult() {
+ return this.output;
+ }
+
+ public DecayableRecipeNEI(final ItemStack input, final ItemStack result, final int time) {
+ super();
+ this.input = new PositionedStack(input, 93, 24);
+ this.output = new PositionedStack(result, 142, 42);
+ this.time = time;
+ }
+
+ @Override
+ public int compareTo(CachedRecipe o) {
+ boolean b = DecayableRecipeNEI.class.isInstance(o);
+ if (b) {
+ DecayableRecipeNEI p = (DecayableRecipeNEI) o;
+ if (p.time > this.time) {
+ return 1;
+ } else if (p.time == this.time) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (DecayableRecipeNEI.class.isInstance(obj)) {
+ DecayableRecipeNEI p = (DecayableRecipeNEI) obj;
+ if (p != null) {
+ // Time check first to keep it simple and not unbox the Recipes.
+ if (p.time == this.time) {
+ ItemStack aInput = p.input.item;
+ ItemStack aOutput = p.output.item;
+ if (GT_Utility.areStacksEqual(aInput, this.input.item, true)) {
+ if (GT_Utility.areStacksEqual(aOutput, this.output.item, true)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java b/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java
new file mode 100644
index 0000000000..c7c657f04a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java
@@ -0,0 +1,502 @@
+package gtPlusPlus.nei;
+
+import java.awt.Rectangle;
+import java.lang.ref.SoftReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import codechicken.lib.gui.GuiDraw;
+import codechicken.nei.PositionedStack;
+import codechicken.nei.recipe.GuiCraftingRecipe;
+import codechicken.nei.recipe.GuiRecipe;
+import codechicken.nei.recipe.GuiUsageRecipe;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import cpw.mods.fml.common.event.FMLInterModComms;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GasSpargingRecipe;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class GT_NEI_LFTR_Sparging extends TemplateRecipeHandler {
+
+ public static final String mNEIName = GasSpargingRecipeMap.mNEIDisplayName;
+ private SoftReference<List<GasSpargingRecipeNEI>> mCachedRecipes = null;
+
+ public GT_NEI_LFTR_Sparging() {
+ this.transferRects.add(
+ new TemplateRecipeHandler.RecipeTransferRect(
+ new Rectangle(65, 13, 36, 18),
+ this.getOverlayIdentifier(),
+ new Object[0]));
+ if (!NEI_GTPP_Config.sIsAdded) {
+ FMLInterModComms.sendRuntimeMessage(
+ GT_Values.GT,
+ "NEIPlugins",
+ "register-crafting-handler",
+ "gregtechplusplus@" + this.getRecipeName() + "@" + this.getOverlayIdentifier());
+ GuiCraftingRecipe.craftinghandlers.add(this);
+ GuiUsageRecipe.usagehandlers.add(this);
+ }
+ }
+
+ @Override
+ public String getRecipeName() {
+ return mNEIName;
+ }
+
+ @Override
+ public String getGuiTexture() {
+ return GasSpargingRecipeMap.mNEIGUIPath;
+ }
+
+ @Override
+ public String getOverlayIdentifier() {
+ return gregtech.api.util.GasSpargingRecipeMap.mUnlocalizedName;
+ }
+
+ @Override
+ public int recipiesPerPage() {
+ return 1;
+ }
+
+ @Override
+ public void drawBackground(final int recipe) {
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GuiDraw.changeTexture(this.getGuiTexture());
+ GuiDraw.drawTexturedModalRect(-4, -8, 1, 3, 174, 68);
+ }
+
+ @Override
+ public void loadTransferRects() {
+ this.transferRects
+ .add(new RecipeTransferRect(new Rectangle(72, 14, 22, 16), getOverlayIdentifier(), new Object[0]));
+ }
+
+ public List<GasSpargingRecipeNEI> getCache() {
+ List<GasSpargingRecipeNEI> cache;
+ if (mCachedRecipes == null || (cache = mCachedRecipes.get()) == null) {
+ cache = GasSpargingRecipeMap.mRecipes.stream() // do not use parallel stream. This is already parallelized
+ // by NEI
+ .sorted()
+ .map(temp -> createCachedRecipe(temp))
+ .collect(Collectors.toList());
+ // while the NEI parallelize handlers, for each individual handler it still uses sequential execution model
+ // so we do not need any synchronization here
+ mCachedRecipes = new SoftReference<>(cache);
+ }
+ return cache;
+ }
+
+ public GasSpargingRecipeNEI createCachedRecipe(GasSpargingRecipe aRecipe) {
+ return new GasSpargingRecipeNEI(aRecipe);
+ }
+
+ @Override
+ public void loadCraftingRecipes(String outputId, Object... results) {
+ if (outputId.equals(getOverlayIdentifier())) {
+ arecipes.addAll(getCache());
+ } else {
+ super.loadCraftingRecipes(outputId, results);
+ }
+ }
+
+ @Override
+ public void loadCraftingRecipes(ItemStack aResult) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aResult);
+
+ ArrayList<ItemStack> tResults = new ArrayList<>();
+ tResults.add(aResult);
+ tResults.add(GT_OreDictUnificator.get(true, aResult));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed)
+ && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tResults.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aResult, true);
+ FluidStack tFluidStack;
+ if (tFluid != null) {
+ tFluidStack = tFluid;
+ tResults.add(GT_Utility.getFluidDisplayStack(tFluid, false));
+ } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aResult);
+ if (tFluidStack != null) {
+ tResults.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
+ }
+ for (GasSpargingRecipeNEI recipe : getCache()) {
+ if (tResults.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mOutputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ @Override
+ public void loadUsageRecipes(ItemStack aInput) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aInput);
+
+ ArrayList<ItemStack> tInputs = new ArrayList<>();
+ tInputs.add(aInput);
+ tInputs.add(GT_OreDictUnificator.get(false, aInput));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tInputs.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aInput, true);
+ FluidStack tFluidStack;
+ if (tFluid != null) {
+ tFluidStack = tFluid;
+ tInputs.add(GT_Utility.getFluidDisplayStack(tFluid, false));
+ } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aInput);
+ if (tFluidStack != null) {
+ tInputs.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
+ }
+ for (GasSpargingRecipeNEI recipe : getCache()) {
+ if (tInputs.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mInputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ protected static void drawText(int aX, int aY, String aString, int aColor) {
+ Minecraft.getMinecraft().fontRenderer.drawString(aString, aX, aY, aColor);
+ }
+
+ @Override
+ public void drawExtras(int aRecipeIndex) {
+ final long tEUt = ((GasSpargingRecipeNEI) this.arecipes.get(aRecipeIndex)).mRecipe.mEUt;
+ final long tDuration = ((GasSpargingRecipeNEI) this.arecipes.get(aRecipeIndex)).mRecipe.mDuration;
+ drawText(10, 73, "Total: " + MathUtils.formatNumbers((long) (tDuration * tEUt)) + " EU", -16777216);
+ drawText(10, 83, "Usage: " + MathUtils.formatNumbers(tEUt) + " EU/t", -16777216);
+ drawText(
+ 10,
+ 93,
+ "Time: " + (tDuration < 20 ? "< 1" : MathUtils.formatNumbers(0.05d * tDuration)) + " secs",
+ -16777216);
+ drawText(10, 103, "Gas not used to sparge is", -16777216);
+ drawText(10, 113, "returned alongside outputs.", -16777216);
+ }
+
+ @Override
+ public List<String> handleItemTooltip(final GuiRecipe<?> gui, final ItemStack aStack, final List<String> currenttip,
+ final int aRecipeIndex) {
+ final TemplateRecipeHandler.CachedRecipe tObject = this.arecipes.get(aRecipeIndex);
+ if ((tObject instanceof final GasSpargingRecipeNEI tRecipe)) {
+ ItemStack aSpargeInput = tRecipe.mOutputs.get(0).item;
+ ItemStack aSpentFuel = tRecipe.mOutputs.get(1).item;
+ for (final PositionedStack tStack : tRecipe.mOutputs) {
+ if (aStack == tStack.item) {
+ if (ItemList.Display_Fluid.isStackEqual(tStack.item, true, true)) {
+ if (GT_Utility.areStacksEqual(aStack, aSpentFuel, true)) {
+ break;
+ }
+ if (GT_Utility.areStacksEqual(aStack, aSpargeInput, true)) {
+ currenttip.add("The amount returned is the remainder after all other outputs.");
+ }
+ currenttip.add(
+ "Maximum Output: " + (((FixedPositionedStack) tStack).mChance / 100)
+ + "."
+ + ((((FixedPositionedStack) tStack).mChance % 100) < 10
+ ? "0" + (((FixedPositionedStack) tStack).mChance % 100)
+ : Integer.valueOf(((FixedPositionedStack) tStack).mChance % 100))
+ + "L");
+ break;
+ }
+ break;
+ }
+ }
+ for (final PositionedStack tStack : tRecipe.mInputs) {
+ if (GT_Utility.areStacksEqual(aStack, tStack.item)) {
+ if ((gregtech.api.enums.ItemList.Display_Fluid.isStackEqual(tStack.item, true, true))
+ || (tStack.item.stackSize != 0)) {
+ break;
+ }
+ if (ItemUtils.isControlCircuit(aStack)) {
+ currenttip.add("Does not get consumed in the process");
+ }
+ break;
+ }
+ }
+ }
+ return currenttip;
+ }
+
+ public class FixedPositionedStack extends PositionedStack {
+
+ public final int mChance;
+ public boolean permutated = false;
+
+ public FixedPositionedStack(final Object object, final int x, final int y) {
+ this(object, x, y, 0);
+ }
+
+ public FixedPositionedStack(final Object object, final int x, final int y, final int aChance) {
+ super(object, x, y, true);
+ this.mChance = aChance;
+ }
+
+ @Override
+ public void generatePermutations() {
+ if (this.permutated) {
+ return;
+ }
+ final ArrayList<ItemStack> tDisplayStacks = new ArrayList<>();
+ for (final ItemStack tStack : this.items) {
+ if (GT_Utility.isStackValid(tStack)) {
+ if (tStack.getItemDamage() == 32767) {
+ final List<ItemStack> permutations = codechicken.nei.ItemList.itemMap.get(tStack.getItem());
+ if (!permutations.isEmpty()) {
+ ItemStack stack;
+ for (final Iterator<ItemStack> i$ = permutations.iterator(); i$.hasNext(); tDisplayStacks
+ .add(GT_Utility.copyAmount(tStack.stackSize, new Object[] { stack }))) {
+ stack = i$.next();
+ }
+ } else {
+ final ItemStack base = new ItemStack(tStack.getItem(), tStack.stackSize);
+ base.stackTagCompound = tStack.stackTagCompound;
+ tDisplayStacks.add(base);
+ }
+ } else {
+ tDisplayStacks.add(GT_Utility.copy(new Object[] { tStack }));
+ }
+ }
+ }
+ this.items = (tDisplayStacks.toArray(new ItemStack[0]));
+ if (this.items.length == 0) {
+ this.items = new ItemStack[] { new ItemStack(Blocks.fire) };
+ }
+ this.permutated = true;
+ this.setPermutationToRender(0);
+ }
+ }
+
+ public class GasSpargingRecipeNEI extends CachedRecipe implements Comparable<CachedRecipe> {
+
+ public final GasSpargingRecipe mRecipe;
+ public final List<PositionedStack> mOutputs = new ArrayList<>();
+ public final List<PositionedStack> mInputs = new ArrayList<>();
+
+ public GasSpargingRecipeNEI(GasSpargingRecipe tRecipe) {
+ super();
+ this.mRecipe = tRecipe;
+ int tStartIndex = 0;
+ if (tRecipe.mFluidInputs.length > 0) {
+ if ((tRecipe.mFluidInputs[0] != null) && (tRecipe.mFluidInputs[0].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[0], true),
+ 30,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 1) && (tRecipe.mFluidInputs[1] != null)
+ && (tRecipe.mFluidInputs[1].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[1], true),
+ 12,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 2) && (tRecipe.mFluidInputs[2] != null)
+ && (tRecipe.mFluidInputs[2].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[2], true),
+ 48,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 3) && (tRecipe.mFluidInputs[3] != null)
+ && (tRecipe.mFluidInputs[3].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[3], true),
+ 12,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 4) && (tRecipe.mFluidInputs[4] != null)
+ && (tRecipe.mFluidInputs[4].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[4], true),
+ 30,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 5) && (tRecipe.mFluidInputs[5] != null)
+ && (tRecipe.mFluidInputs[5].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[5], true),
+ 48,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 6) && (tRecipe.mFluidInputs[6] != null)
+ && (tRecipe.mFluidInputs[6].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[6], true),
+ 12,
+ 41));
+ }
+ if ((tRecipe.mFluidInputs.length > 7) && (tRecipe.mFluidInputs[7] != null)
+ && (tRecipe.mFluidInputs[7].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[7], true),
+ 30,
+ 41));
+ }
+ if ((tRecipe.mFluidInputs.length > 8) && (tRecipe.mFluidInputs[8] != null)
+ && (tRecipe.mFluidInputs[8].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[8], true),
+ 48,
+ 41));
+ }
+ }
+
+ tStartIndex = 0;
+ if (tRecipe.mFluidOutputs.length > 0) {
+ if ((tRecipe.mFluidOutputs[0] != null) && (tRecipe.mFluidOutputs[0].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[0], false),
+ 120,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 1) && (tRecipe.mFluidOutputs[1] != null)
+ && (tRecipe.mFluidOutputs[1].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[1], true),
+ 102,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 2) && (tRecipe.mFluidOutputs[2] != null)
+ && (tRecipe.mFluidOutputs[2].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[2], false),
+ 138,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 3) && (tRecipe.mFluidOutputs[3] != null)
+ && (tRecipe.mFluidOutputs[3].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[3], false),
+ 102,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 4) && (tRecipe.mFluidOutputs[4] != null)
+ && (tRecipe.mFluidOutputs[4].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[4], false),
+ 120,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 5) && (tRecipe.mFluidOutputs[5] != null)
+ && (tRecipe.mFluidOutputs[5].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[5], false),
+ 138,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 6) && (tRecipe.mFluidOutputs[6] != null)
+ && (tRecipe.mFluidOutputs[6].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[6], false),
+ 102,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 7) && (tRecipe.mFluidOutputs[7] != null)
+ && (tRecipe.mFluidOutputs[7].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[7], false),
+ 120,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 8) && (tRecipe.mFluidOutputs[8] != null)
+ && (tRecipe.mFluidOutputs[8].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[8], false),
+ 138,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ }
+ }
+
+ @Override
+ public int compareTo(CachedRecipe o) {
+ boolean b = GasSpargingRecipeNEI.class.isInstance(o);
+ if (b) {
+ GasSpargingRecipeNEI p = (GasSpargingRecipeNEI) o;
+ if (p.mOutputs.size() > this.mOutputs.size()) {
+ return 1;
+ } else if (p.mOutputs.size() == this.mOutputs.size()) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (GasSpargingRecipeNEI.class.isInstance(obj)) {
+ GasSpargingRecipeNEI p = (GasSpargingRecipeNEI) obj;
+ if (p != null) {
+ if (GT_Utility.areStacksEqual(p.mInputs.get(0).item, this.mInputs.get(0).item, true)) {
+ if (p.mOutputs.size() == this.mOutputs.size()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public List<PositionedStack> getIngredients() {
+ return this.getCycledIngredients(GT_NEI_LFTR_Sparging.this.cycleticks / 10, this.mInputs);
+ }
+
+ @Override
+ public PositionedStack getResult() {
+ return null;
+ }
+
+ @Override
+ public List<PositionedStack> getOtherStacks() {
+ return this.mOutputs;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java b/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java
new file mode 100644
index 0000000000..16cc1e8cbf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.nei;
+
+import java.util.Arrays;
+
+import net.minecraft.item.ItemStack;
+
+import codechicken.nei.api.API;
+import codechicken.nei.api.IConfigureNEI;
+import codechicken.nei.event.NEIRegisterHandlerInfosEvent;
+import codechicken.nei.recipe.HandlerInfo;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.Mods;
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class NEI_GTPP_Config implements IConfigureNEI {
+
+ public static boolean sIsAdded = true;
+
+ @Override
+ public synchronized void loadConfig() {
+ sIsAdded = false;
+
+ Logger.INFO("NEI Registration: Registering NEI handler for " + DecayableRecipeHandler.mNEIName);
+ API.registerRecipeHandler(new DecayableRecipeHandler());
+ API.registerUsageHandler(new DecayableRecipeHandler());
+ API.addRecipeCatalyst(new ItemStack(ModBlocks.blockDecayablesChest, 1), "GTPP_Decayables");
+
+ Logger.INFO("NEI Registration: Registering NEI handler for " + GT_NEI_LFTR_Sparging.mNEIName);
+ new GT_NEI_LFTR_Sparging();
+ API.addRecipeCatalyst(GregtechItemList.Controller_Sparge_Tower.get(1), "gtpp.recipe.lftr.sparging");
+
+ for (GregtechItemList item : Arrays.asList(
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_MV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_EV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_LuV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM,
+ GregtechItemList.GT4_Electric_Auto_Workbench_UV)) {
+ API.addRecipeCatalyst(item.get(1), "crafting", -10);
+ }
+ // Bronze workbench
+ API.removeRecipeCatalyst(ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:31081", 1), "crafting");
+ API.removeRecipeCatalyst(ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:31082", 1), "crafting");
+
+ // Moved to its own handler
+ API.removeRecipeCatalyst(
+ GregtechItemList.Controller_Vacuum_Furnace.get(1),
+ GTPPRecipeMaps.chemicalDehydratorRecipes.unlocalizedName);
+
+ // ULV simple washer
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:767", 1),
+ GTPPRecipeMaps.simpleWasherRecipes.unlocalizedName);
+
+ // ULV combustion generator
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:960", 1),
+ RecipeMaps.dieselFuels.unlocalizedName);
+
+ // ULV gas turbine
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:961", 1),
+ RecipeMaps.gasTurbineFuels.unlocalizedName);
+
+ // Hide Flasks
+ if (Utils.isClient()) {
+ API.addItemListEntry(GregtechItemList.VOLUMETRIC_FLASK_8k.get(1));
+ API.addItemListEntry(GregtechItemList.VOLUMETRIC_FLASK_32k.get(1));
+ }
+ sIsAdded = true;
+ }
+
+ @SubscribeEvent
+ public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) {
+ event.registerHandlerInfo(
+ new HandlerInfo.Builder("gtpp.recipe.lftr.sparging", CORE.name, Mods.GTPlusPlus.ID)
+ .setDisplayStack(GregtechItemList.Controller_Sparge_Tower.get(1))
+ .setShiftY(6)
+ .setHeight(135)
+ .setMaxRecipesPerPage(1)
+ .build());
+ }
+
+ @Override
+ public String getName() {
+ return "GT++ NEI Plugin";
+ }
+
+ @Override
+ public String getVersion() {
+ return "(1.12)";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java b/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java
new file mode 100644
index 0000000000..2644ffb4ff
--- /dev/null
+++ b/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.nei.handlers;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+/**
+ * Based on crazypants.enderio.gui.IconEIO
+ *
+ * @author Original EIO Author
+ *
+ * This is free and unencumbered software released into the public domain.
+ *
+ * Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source
+ * code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
+ *
+ * In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all
+ * copyright interest in the software to the public domain. We make this dedication for the benefit of the
+ * public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt
+ * act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * For more information, please refer to <http://unlicense.org/>
+ *
+ * https://github.com/SleepyTrousers/EnderIO/blob/release/1.7.10/2.2/src/main/java/crazypants/render/RenderUtil.java
+ *
+ */
+public final class NeiTextureHandler {
+
+ public static final NeiTextureHandler RECIPE_BUTTON = new NeiTextureHandler(128, 116, 24, 24);
+
+ public final double minU;
+ public final double maxU;
+ public final double minV;
+ public final double maxV;
+ public final double width;
+ public final double height;
+
+ public static final ResourceLocation TEXTURE = new ResourceLocation(
+ GTPlusPlus.ID + ":textures/gui/nei/widgets.png");
+
+ public NeiTextureHandler(int x, int y, int width, int height) {
+ this(
+ width,
+ height,
+ (float) (0.00390625D * (double) x),
+ (float) (0.00390625D * (double) (x + width)),
+ (float) (0.00390625D * (double) y),
+ (float) (0.00390625D * (double) (y + height)));
+ }
+
+ public NeiTextureHandler(double width, double height, double minU, double maxU, double minV, double maxV) {
+ this.width = width;
+ this.height = height;
+ this.minU = minU;
+ this.maxU = maxU;
+ this.minV = minV;
+ this.maxV = maxV;
+ }
+
+ public void renderIcon(double x, double y, double width, double height, double zLevel, boolean doDraw) {
+ this.renderIcon(x, y, width, height, zLevel, doDraw, false);
+ }
+
+ public void renderIcon(double x, double y, double width, double height, double zLevel, boolean doDraw,
+ boolean flipY) {
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ Tessellator tessellator = Tessellator.instance;
+ if (doDraw) {
+ bindTexture(TEXTURE);
+ tessellator.startDrawingQuads();
+ }
+
+ if (flipY) {
+ tessellator.addVertexWithUV(x, y + height, zLevel, this.minU, this.minV);
+ tessellator.addVertexWithUV(x + width, y + height, zLevel, this.maxU, this.minV);
+ tessellator.addVertexWithUV(x + width, y + 0.0D, zLevel, this.maxU, this.maxV);
+ tessellator.addVertexWithUV(x, y + 0.0D, zLevel, this.minU, this.maxV);
+ } else {
+ tessellator.addVertexWithUV(x, y + height, zLevel, this.minU, this.maxV);
+ tessellator.addVertexWithUV(x + width, y + height, zLevel, this.maxU, this.maxV);
+ tessellator.addVertexWithUV(x + width, y + 0.0D, zLevel, this.maxU, this.minV);
+ tessellator.addVertexWithUV(x, y + 0.0D, zLevel, this.minU, this.minV);
+ }
+
+ if (doDraw) {
+ tessellator.draw();
+ }
+ }
+
+ public static final ResourceLocation BLOCK_TEX;
+ public static final ResourceLocation ITEM_TEX;
+ public static final ResourceLocation GLINT_TEX;
+ public static int BRIGHTNESS_MAX;
+
+ static {
+ BLOCK_TEX = TextureMap.locationBlocksTexture;
+ ITEM_TEX = TextureMap.locationItemsTexture;
+ GLINT_TEX = new ResourceLocation("textures/misc/enchanted_item_glint.png");
+ BRIGHTNESS_MAX = 15728880;
+ }
+
+ public static TextureManager engine() {
+ return Minecraft.getMinecraft().renderEngine;
+ }
+
+ public static void bindTexture(String string) {
+ engine().bindTexture(new ResourceLocation(string));
+ }
+
+ public static void bindTexture(ResourceLocation tex) {
+ engine().bindTexture(tex);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java b/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java
new file mode 100644
index 0000000000..890a9020c9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.plugin.agrichem;
+
+public enum AlgaeDefinition {
+
+ /*
+ * In general, the productivity of freshwater algae is primarily limited by the availability of the nutrient
+ * phosphate (PO4-3), while that of marine algae is limited by nitrate (NO3-) or ammonium (NH4+). Some algal
+ * species, however, may have unusual nutrient requirements, and their productivity may be limited by certain
+ * micronutrients, such as silica, in the case of diatoms.
+ */
+
+ Euglenophyta("Euglenophyta", "Euglenoids", true, false, getRGB(147, 168, 50)),
+ Chrysophyta("Chrysophyta", "Golden-Brown Algae", true, true, getRGB(186, 146, 0)),
+ Pyrrophyta("Pyrrophyta", "Fire Algae", true, true, getRGB(250, 118, 2)),
+ Chlorophyta("Chlorophyta", "Green Algae", true, true, getRGB(99, 181, 62)),
+ Rhodophyta("Rhodophyta", "Red Algae", false, true, getRGB(153, 5, 22)),
+ Paeophyta("Paeophyta", "Brown Algae", false, true, getRGB(94, 78, 47)),
+ Xanthophyta("Xanthophyta", "Yellow-Green Algae", true, false, getRGB(118, 138, 16));
+
+ public final String mScientificName;
+ public final String mSimpleName;
+ public final boolean mSaltWater;
+ public final boolean mFreshWater;
+ public final int mColour;
+
+ AlgaeDefinition(String aScientificName, String aSimpleName, boolean aFresh, boolean aSalt, int aColour) {
+ mScientificName = aScientificName;
+ mSimpleName = aSimpleName;
+ mFreshWater = aFresh;
+ mSaltWater = aSalt;
+ mColour = aColour;
+ }
+
+ public static AlgaeDefinition getByIndex(int aIndex) {
+ return switch (aIndex) {
+ default -> Euglenophyta;
+ case 1 -> Chrysophyta;
+ case 2 -> Pyrrophyta;
+ case 3 -> Chlorophyta;
+ case 4 -> Rhodophyta;
+ case 5 -> Paeophyta;
+ case 6 -> Xanthophyta;
+ };
+ }
+
+ private static int getRGB(int r, int g, int b) {
+ return AlgaeUtils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java b/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java
new file mode 100644
index 0000000000..4906d0483f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.plugin.agrichem;
+
+import gtPlusPlus.core.util.Utils;
+
+public class AlgaeUtils {
+
+ public static int rgbtoHexValue(final int r, final int g, final int b) {
+ return Utils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java b/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java
new file mode 100644
index 0000000000..a4bbd6e03a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java
@@ -0,0 +1,1257 @@
+package gtPlusPlus.plugin.agrichem;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalPlantRecipes;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.OreDictUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.railcraft.utils.RailcraftUtils;
+import ic2.core.Ic2Items;
+
+public class BioRecipes {
+
+ private static Item mFert;
+ private static Item mDustDirt;
+
+ private static Fluid mSalineWater;
+ private static Fluid mDistilledWater;
+ private static Fluid mThermalWater;
+ private static Fluid mAir;
+ private static Fluid mSulfuricWasteWater;
+ private static Fluid mAmmonia;
+ private static Fluid mMethanol;
+ private static Fluid mAceticAcid;
+ private static Fluid mPropionicAcid;
+ private static Fluid mLiquidPlastic;
+ private static Fluid mFermentationBase;
+ private static Fluid mCarbonDioxide;
+ private static Fluid mCarbonMonoxide;
+ private static Fluid mEthylene;
+ private static Fluid mEthanol;
+ private static Fluid mChlorine;
+ private static Fluid mHydrogen;
+ private static Fluid mDilutedSulfuricAcid;
+ private static Fluid mSulfuricAcid;
+ private static Fluid mUrea;
+ public static Fluid mFormaldehyde;
+ private static Fluid mLiquidResin;
+ private static Fluid mMethane;
+ private static Fluid mBenzene;
+ private static Fluid mEthylbenzene;
+ private static Fluid mStyrene;
+ private static Fluid mButanol;
+ private static Fluid mAcetone;
+
+ private static ItemStack getGreenAlgaeRecipeChip() {
+ return getBioChip(4);
+ }
+
+ private static ItemStack getBrownAlgaeRecipeChip() {
+ return getBioChip(8);
+ }
+
+ private static ItemStack getGoldenBrownAlgaeRecipeChip() {
+ return getBioChip(12);
+ }
+
+ private static ItemStack getRedAlgaeRecipeChip() {
+ return getBioChip(16);
+ }
+
+ private static ItemStack getBioChip(int aID) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, aID, 0);
+ }
+
+ public static void init() {
+ Logger.INFO("[Bio] Setting Variables");
+ initRecipeVars();
+ Logger.INFO("[Bio] Generating Biochip Recipes");
+ recipeBioChip();
+ Logger.INFO("[Bio] Generating Recipes");
+ recipeAlgaeBiomass();
+ Logger.INFO("[Bio] Finished with recipes");
+ }
+
+ private static void initRecipeVars() {
+ mFert = AgriculturalChem.dustOrganicFertilizer;
+ mDustDirt = AgriculturalChem.dustDirt;
+
+ // 5.08 Salt Water Solution ;)
+ if (!FluidUtils.doesFluidExist("saltwater")) {
+ mSalineWater = FluidUtils
+ .generateFluidNoPrefix("saltwater", "Salt Water", 200, new short[] { 10, 30, 220, 100 });
+ } else {
+ Materials aSaltWater = MaterialUtils.getMaterial("saltwater");
+ if (aSaltWater != null) {
+ FluidStack aWaterStack = aSaltWater.getFluid(1);
+ if (aWaterStack != null) {
+ mSalineWater = aSaltWater.getFluid(1)
+ .getFluid();
+ }
+ }
+ if (mSalineWater == null) {
+ mSalineWater = FluidUtils.getWildcardFluidStack("saltwater", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellSaltWater", 1) == null) {
+ new BaseItemComponent("saltwater", "Salt Water", new short[] { 10, 30, 220 });
+ }
+ }
+
+ mDistilledWater = FluidUtils.getDistilledWater(1)
+ .getFluid();
+ mThermalWater = FluidUtils.getFluidStack("ic2hotwater", 1)
+ .getFluid();
+ mAir = FluidUtils.getFluidStack("air", 1)
+ .getFluid();
+ mSulfuricWasteWater = FluidUtils.getFluidStack("sulfuricapatite", 1)
+ .getFluid();
+ mAmmonia = MISC_MATERIALS.AMMONIA.getFluidStack(1)
+ .getFluid();
+ mEthylene = FluidUtils.getFluidStack("ethylene", 1)
+ .getFluid();
+ mEthanol = FluidUtils.getFluidStack("bioethanol", 1)
+ .getFluid();
+ mDilutedSulfuricAcid = FluidUtils.getFluidStack("dilutedsulfuricacid", 1)
+ .getFluid();
+ mSulfuricAcid = FluidUtils.getFluidStack("sulfuricacid", 1)
+ .getFluid();
+ mFormaldehyde = FluidUtils.getFluidStack("fluid.formaldehyde", 1)
+ .getFluid();
+ mMethane = FluidUtils.getFluidStack("methane", 1)
+ .getFluid();
+ mBenzene = FluidUtils.getFluidStack("benzene", 1)
+ .getFluid();
+ mEthylbenzene = FluidUtils.getFluidStack("fluid.ethylbenzene", 1)
+ .getFluid();
+ mStyrene = FluidUtils.getFluidStack("styrene", 1)
+ .getFluid();
+ mMethanol = FluidUtils.getFluidStack("methanol", 1)
+ .getFluid();
+ mLiquidPlastic = FluidUtils.getWildcardFluidStack("plastic", 1)
+ .getFluid();
+ mCarbonDioxide = MISC_MATERIALS.CARBON_DIOXIDE.getFluidStack(1)
+ .getFluid();
+ mCarbonMonoxide = MISC_MATERIALS.CARBON_MONOXIDE.getFluidStack(1)
+ .getFluid();
+ mChlorine = FluidUtils.getFluidStack("chlorine", 1)
+ .getFluid();
+ mHydrogen = FluidUtils.getFluidStack("hydrogen", 1)
+ .getFluid();
+ mAceticAcid = AgrichemFluids.mAceticAcid;
+ mPropionicAcid = AgrichemFluids.mPropionicAcid;
+ mUrea = AgrichemFluids.mUrea;
+ mLiquidResin = AgrichemFluids.mLiquidResin;
+ mFermentationBase = AgrichemFluids.mFermentationBase;
+ mButanol = AgrichemFluids.mButanol;
+ mAcetone = AgrichemFluids.mAcetone;
+ }
+
+ private static void recipeAlgaeBiomass() {
+
+ // TODO
+ // Add in recipes to get initial Biomass
+
+ recipeGreenAlgae();
+ recipeBrownAlgae();
+ recipeGoldenBrownAlgae();
+ recipeRedAlgae();
+ recipeWoodPellets();
+ recipeWoodBricks();
+ recipeCellulosePulp();
+ recipeCatalystCarrier();
+ recipeAluminiumSilverCatalyst();
+ recipeAceticAcid();
+ recipePropionicAcid();
+ recipeFermentationBase();
+ recipeEthanol();
+ recipeCelluloseFibre();
+ recipeGoldenBrownCelluloseFiber();
+ recipeRedCelluloseFiber();
+ recipeSodiumHydroxide();
+ recipeSodiumCarbonate();
+ recipePelletMold();
+ recipeAluminiumPellet();
+ recipeAlumina();
+ recipeAluminium();
+ recipeLithiumChloride();
+ recipeSulfuricAcid();
+ recipeUrea();
+ recipeRawBioResin();
+ recipeLiquidResin();
+ recipeCompost();
+ recipeMethane();
+ recipeBenzene();
+ recipeStyrene();
+ registerFuels();
+ }
+
+ private static void registerFuels() {
+
+ // Burnables
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1), 800);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 1), 4800);
+
+ // Combustion Fuels
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellButanol", 1))
+ .metadata(FUEL_VALUE, 400)
+ .metadata(FUEL_TYPE, 0)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private static void recipeGreenAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getGreenAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeBrownAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Alginic acid
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mAlginicAcid, 2))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extractorRecipes);
+
+ // Lithium Chloride
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBrownAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 20))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 5))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ // Sodium Carbonate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBrownAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 40))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 20))
+ .fluidInputs(FluidUtils.getDistilledWater(2000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ private static void recipeGoldenBrownAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 1))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getGoldenBrownAlgaeRecipeChip(),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeRedAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 1))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 2))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getRedAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCelluloseFibre() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlginicAcid, 2))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 10))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(UniversalChemical);
+
+ // Craft into Wood Pellets
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 24))
+ .duration(2 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ // Methanol Extraction
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12))
+ .fluidOutputs(Materials.Methanol.getFluid(1000L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 3))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Plastic
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(16), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 4), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAceticAcid, 500),
+ FluidUtils.getFluidStack(BioRecipes.mPropionicAcid, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidPlastic, (1000)), },
+ 10 * 20,
+ 240,
+ 2);
+ }
+
+ private static void recipeWoodPellets() {
+ // Shapeless Recipe
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1) },
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 2));
+
+ // Extruder Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12),
+ ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 0))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 3))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(extruderRecipes);
+
+ // Assembly Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 8))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 2))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ // CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1))
+ .fluidOutputs(FluidUtils.getFluidStack(mCarbonDioxide, 70))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Add Charcoal Recipe
+ if (Railcraft.isModLoaded()) {
+ RailcraftUtils.addCokeOvenRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 2),
+ true,
+ true,
+ ItemUtils.getItemStackOfAmountFromOreDict("gemCharcoal", 3),
+ GT_Values.NF,
+ 1200);
+ }
+ CORE.RA.addCokeOvenRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 2),
+ getBioChip(3),
+ null,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("gemCharcoal", 3),
+ 120,
+ 16);
+ }
+
+ private static void recipeWoodBricks() {
+
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(3), ItemUtils.getOrePrefixStack(OrePrefixes.dust, Materials.Wood, 50))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 1))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCellulosePulp() {
+
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 4))
+ .itemOutputs(ItemUtils.getSimpleStack(Items.paper, 4))
+ .duration(2 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCatalystCarrier() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(20),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Tin, 6L))
+ .itemOutputs(CI.getEmptyCatalyst(1))
+ .duration(5 * MINUTES)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeAluminiumSilverCatalyst() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(4),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4L))
+ .itemOutputs(CI.getGreenCatalyst(10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeAceticAcid() {
+
+ // CH4O + CO = C2H4O2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getGreenCatalyst(0) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethanol, 700),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonMonoxide, 700), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAceticAcid, 700), },
+ 120 * 20,
+ 60,
+ 1);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedBioCircuit(14))
+ .fluidInputs(FluidUtils.getFluidStack(mFermentationBase, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(mAceticAcid, 1000))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 2))
+ .duration(60 * SECONDS)
+ .eut(16)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ public static final HashSet<GT_ItemStack> mFruits = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mVege = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mNuts = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mSeeds = new HashSet<>();
+
+ public static final AutoMap<ItemStack> mList_Master_FruitVege = new AutoMap<>();
+ public static final AutoMap<ItemStack> mList_Master_Seeds = new AutoMap<>();
+
+ private static void processFermentationOreDict() {
+ processOreDictEntry("listAllfruit", mFruits);
+ processOreDictEntry("listAllFruit", mFruits);
+ processOreDictEntry("listAllveggie", mVege);
+ processOreDictEntry("listAllVeggie", mVege);
+ processOreDictEntry("listAllnut", mNuts);
+ processOreDictEntry("listAllNut", mNuts);
+ processOreDictEntry("listAllseed", mSeeds);
+ processOreDictEntry("listAllSeed", mSeeds);
+
+ if (!mFruits.isEmpty()) {
+ for (GT_ItemStack g : mFruits) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mVege.isEmpty()) {
+ for (GT_ItemStack g : mVege) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mNuts.isEmpty()) {
+ for (GT_ItemStack g : mNuts) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mSeeds.isEmpty()) {
+ for (GT_ItemStack g : mSeeds) {
+ mList_Master_Seeds.put(g.toStack());
+ }
+ }
+ }
+
+ // Make Fermentation
+ private static void processOreDictEntry(String aOreName, HashSet<GT_ItemStack> mfruits2) {
+ ArrayList<ItemStack> aTemp = OreDictionary.getOres(aOreName);
+ if (!aTemp.isEmpty()) {
+ for (ItemStack stack : aTemp) {
+ mfruits2.add(new GT_ItemStack(stack));
+ }
+ }
+ }
+
+ private static void recipeFermentationBase() {
+ processFermentationOreDict();
+ AutoMap<ItemStack> aFruitVege = mList_Master_FruitVege;
+ AutoMap<ItemStack> aSeeds = mList_Master_Seeds;
+ ArrayList<ItemStack> aMap = OreDictionary.getOres("cropSugarbeet");
+ for (ItemStack a : aFruitVege) {
+ if (aMap.contains(a)) {
+ continue;
+ }
+ if (ItemUtils.checkForInvalidItems(a)) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(2), ItemUtils.getSimpleStack(a, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 2,
+ 0);
+ }
+ }
+ for (ItemStack a : aSeeds) {
+ if (ItemUtils.checkForInvalidItems(a)) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(a, 20) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 2,
+ 0);
+ }
+ }
+
+ // Sugar Cane
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4), ItemUtils.getSimpleStack(Items.reeds, 32) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 30,
+ 0);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getSimpleStack(Items.reeds, 32),
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 2) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 2000), },
+ 10 * 20,
+ 30,
+ 0);
+
+ // Sugar Beet
+ if (OreDictUtils.containsValidEntries("cropSugarbeet")) {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4), ItemUtils.getItemStackOfAmountFromOreDict("cropSugarbeet", 4), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 30,
+ 0);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getItemStackOfAmountFromOreDict("cropSugarbeet", 4),
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 2) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 2000), },
+ 10 * 20,
+ 30,
+ 0);
+ }
+
+ // Produce Acetone, Butanol and Ethanol
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(5),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 16))
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 48000))
+ .fluidOutputs(
+ FluidUtils.getFluidStack(BioRecipes.mButanol, 18000),
+ FluidUtils.getFluidStack(BioRecipes.mAcetone, 9000),
+ FluidUtils.getFluidStack(BioRecipes.mEthanol, 3000))
+ .duration(100 * SECONDS)
+ .eut(32)
+ .specialValue(1)
+ .noOptimize()
+ .addTo(chemicalPlantRecipes);
+ }
+
+ private static void recipePropionicAcid() {
+ // C2H4 + CO + H2O = C3H6O2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getGreenCatalyst(0) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylene, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonMonoxide, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mPropionicAcid, 1000), },
+ 10 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeEthanol() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(BioRecipes.getBioChip(2))
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mEthanol, 100))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+
+ private static void recipeGoldenBrownCelluloseFiber() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 5))
+ .fluidOutputs(Materials.Ammonia.getGas(500))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static void recipeRedCelluloseFiber() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 3))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(extractorRecipes);
+ }
+
+ private static void recipeSodiumHydroxide() {
+ // NaCl·H2O = NaOH + Cl + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSalineWater, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 3) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mChlorine, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mHydrogen, 1000), },
+ 300 * 20,
+ 120,
+ 1);
+
+ // Na + H2O = NaOH + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getItemStackOfAmountFromOreDict("dustSodium", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 15) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mHydrogen, 5000), },
+ 60 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeSodiumCarbonate() {
+
+ if (OreDictUtils.containsValidEntries("fuelCoke")) {
+ // Na2CO3 + Al2O3 =C= 2NaAlO2 + CO2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(18), ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 5) },
+ new FluidStack[] {},
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 1000), },
+ 120 * 20,
+ 120,
+ 1);
+ }
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(18), ItemUtils.getItemStackOfAmountFromOreDict("dustCoal", 2),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 5) },
+ new FluidStack[] {},
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 1000), },
+ 180 * 20,
+ 120,
+ 1);
+ }
+
+ private static void recipePelletMold() {
+ GregtechItemList.Pellet_Mold.set(ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 1));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.TUMBAGA.getBlock(1))
+ .itemOutputs(GregtechItemList.Pellet_Mold.get(1))
+ .duration(7 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 4 * 3)
+ .addTo(latheRecipes);
+ }
+
+ private static void recipeAluminiumPellet() {
+
+ // Ore Names, no prefix
+ AutoMap<String> aOreNames = new AutoMap<>();
+
+ aOreNames.put("Lazurite");
+ aOreNames.put("Bauxite");
+ aOreNames.put("Grossular");
+ aOreNames.put("Pyrope");
+ aOreNames.put("Sodalite");
+ aOreNames.put("Spodumene");
+ aOreNames.put("Ruby");
+ aOreNames.put("Sapphire");
+ aOreNames.put("GreenSapphire");
+
+ // Voltage
+ HashMap<String, Integer> aOreData1 = new HashMap<>();
+ // Input Count
+ HashMap<String, Integer> aOreData2 = new HashMap<>();
+ // Output Count
+ HashMap<String, Integer> aOreData3 = new HashMap<>();
+
+ aOreData1.put("Lazurite", 120);
+ aOreData1.put("Bauxite", 90);
+ aOreData1.put("Grossular", 90);
+ aOreData1.put("Pyrope", 90);
+ aOreData1.put("Sodalite", 90);
+ aOreData1.put("Spodumene", 90);
+ aOreData1.put("Ruby", 60);
+ aOreData1.put("Sapphire", 30);
+ aOreData1.put("GreenSapphire", 30);
+ aOreData2.put("Lazurite", 14);
+ aOreData2.put("Bauxite", 39);
+ aOreData2.put("Grossular", 20);
+ aOreData2.put("Pyrope", 20);
+ aOreData2.put("Sodalite", 11);
+ aOreData2.put("Spodumene", 10);
+ aOreData2.put("Ruby", 6);
+ aOreData2.put("Sapphire", 5);
+ aOreData2.put("GreenSapphire", 5);
+ aOreData3.put("Lazurite", 3);
+ aOreData3.put("Bauxite", 16);
+ aOreData3.put("Grossular", 2);
+ aOreData3.put("Pyrope", 2);
+ aOreData3.put("Sodalite", 3);
+ aOreData3.put("Spodumene", 1);
+ aOreData3.put("Ruby", 2);
+ aOreData3.put("Sapphire", 2);
+ aOreData3.put("GreenSapphire", 2);
+
+ // Assemble all valid crushed ore types for making pellet mix
+ HashMap<String, ItemStack> aOreCache = new HashMap<>();
+ for (String aOreName : aOreNames) {
+ String aTemp = aOreName;
+ aOreName = "crushedPurified" + aOreName;
+ if (ItemUtils.doesOreDictHaveEntryFor(aOreName)) {
+ aOreCache.put(aTemp, ItemUtils.getItemStackOfAmountFromOreDict(aOreName, 1));
+ }
+ }
+
+ for (String aOreName : aOreNames) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14),
+ ItemUtils.getSimpleStack(aOreCache.get(aOreName), aOreData2.get(aOreName)) },
+ new FluidStack[] { FluidUtils.getSteam(2000 * aOreData2.get(aOreName)) },
+ new ItemStack[] { ItemUtils.getSimpleStack(
+ AgriculturalChem.mCleanAluminiumMix,
+ (int) (Math.ceil(aOreData3.get(aOreName) * 1.4))) },
+ new FluidStack[] { FluidUtils
+ .getFluidStack(AgriculturalChem.RedMud, 100 * (int) (Math.ceil(aOreData3.get(aOreName) * 1.4))) },
+ 20 * 60,
+ aOreData1.get(aOreName),
+ aOreName.equals("Bauxite") ? 2 : 1);
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCleanAluminiumMix, 3),
+ ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 0))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 4))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(extruderRecipes);
+ }
+
+ private static void recipeAlumina() {
+ // 2NaAlO2 + 2NaOH + 2CO2 = Al2O3 + 2Na2CO3 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 6))
+ .itemOutputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 5),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 12))
+ .fluidInputs(Materials.CarbonDioxide.getGas(2000L))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ private static void recipeAluminium() {
+ // 2Al2O3 + 3C = 4Al + 3CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 3L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(3000L))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1600)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ private static void recipeLithiumChloride() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Potassium, 5))
+ .outputChances(7500, 8000, 8500, 9000, 7500, 8500)
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mAir, 4000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mChlorine, 500))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(multiblockChemicalReactorRecipes);
+ if (OreDictUtils.containsValidEntries("dustPotash")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potash, 10),
+ ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 7),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2))
+ .outputChances(7500, 8000, 8500, 9000, 9000, 9000)
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mChlorine, 250))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+ }
+ }
+
+ private static void recipeSulfuricAcid() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(7), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 10),
+ ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 6) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSulfuricAcid, 5000), },
+ 50 * 20,
+ 60,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(7), ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 2),
+ ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSulfuricAcid, 5000), },
+ 6 * 20,
+ 180,
+ 3);
+ }
+
+ private static void recipeUrea() {
+
+ // 2NH3 + CO2 = CH4N2O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(9), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAmmonia, 600),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 300), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 300),
+ FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 300), },
+ 5 * 20,
+ 30,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(9), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200),
+ FluidUtils.getFluidStack(BioRecipes.mFormaldehyde, 200), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 200) },
+ 5 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeRawBioResin() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 5),
+ ItemUtils.getSimpleStack(Blocks.dirt, 1) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 100), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mRawBioResin, 1), },
+ new FluidStack[] {},
+ 1 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeLiquidResin() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mRawBioResin, 1) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthanol, 200), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 500), },
+ 5 * 20,
+ 30,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 144), },
+ new ItemStack[] { ItemUtils.getSimpleStack(Ic2Items.resin, 32) },
+ new FluidStack[] {},
+ 60 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeCompost() {
+ ItemStack aFert;
+ if (Forestry.isModLoaded()) {
+ aFert = ItemUtils.getSimpleStack(AgriculturalChem.aFertForestry, 32);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(11), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 16),
+ ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200), },
+ new ItemStack[] { aFert },
+ new FluidStack[] {},
+ 30 * 20,
+ 60,
+ 1);
+ }
+
+ aFert = ItemUtils.getSimpleStack(AgriculturalChem.aFertIC2, 32);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(12), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 16),
+ ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200), },
+ new ItemStack[] { aFert },
+ new FluidStack[] {},
+ 30 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeMethane() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(12), ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 500), },
+ 5 * 20,
+ 64,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(13), ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 4) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylene, 2000), },
+ 10 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeBenzene() {
+
+ // 6CH4 = C6H6 + 18H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(19), CI.getGreenCatalyst(0), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 6000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mBenzene, 1000), Materials.Hydrogen.getGas(18000) },
+ 8 * 20,
+ 120,
+ 2);
+ }
+
+ private static void recipeStyrene() {
+
+ // C8H10 = C8H8 + 2H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(20), CI.getGreenCatalyst(0), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylbenzene, 100), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mStyrene, 100), Materials.Hydrogen.getGas(200) },
+ 16 * 20,
+ 480,
+ 2);
+ }
+
+ private static void recipeBioChip() {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 0L),
+ 0,
+ new Object[] { OrePrefixes.circuit.get(Materials.Primitive) });
+
+ long bits = 0;
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 1L, new Object[0]),
+ bits,
+ new Object[] { "d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 2L, new Object[0]),
+ bits,
+ new Object[] { " d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 3L, new Object[0]),
+ bits,
+ new Object[] { " d", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 4L, new Object[0]),
+ bits,
+ new Object[] { " ", " Pd", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 5L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 6L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 7L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", "d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 8L, new Object[0]),
+ bits,
+ new Object[] { " ", "dP ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 9L, new Object[0]),
+ bits,
+ new Object[] { "P d", " ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 10L, new Object[0]),
+ bits,
+ new Object[] { "P ", " d", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 11L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 12L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 13L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 14L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 15L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", "d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 16L, new Object[0]),
+ bits,
+ new Object[] { " P", "d ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 17L, new Object[0]),
+ bits,
+ new Object[] { " ", " ", "d P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 18L, new Object[0]),
+ bits,
+ new Object[] { " ", "d ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 19L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 20L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 21L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 22L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 23L, new Object[0]),
+ bits,
+ new Object[] { " d", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 24L, new Object[0]),
+ bits,
+ new Object[] { " ", " d", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ }
+
+ public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
+ Method mAddRecipe = ReflectionUtils.getMethod(
+ GT_ModHandler.class,
+ "addCraftingRecipe",
+ new Class[] { ItemStack.class, Enchantment[].class, int[].class, boolean.class, boolean.class,
+ boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class,
+ boolean.class, boolean.class, boolean.class, boolean.class, Object[].class });
+ boolean didInvoke = false;
+ if (mAddRecipe != null) {
+ try {
+ didInvoke = (boolean) mAddRecipe.invoke(
+ null,
+ aResult,
+ new Enchantment[] {},
+ new int[] {},
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ aRecipe);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ return didInvoke;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java b/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java
new file mode 100644
index 0000000000..0c3d7d2867
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.plugin.agrichem;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.plugin.manager.Core_Manager;
+
+// Called by Core_Manager#veryEarlyInit
+@SuppressWarnings("unused")
+public class Core_Agrichem implements IPlugin {
+
+ static final Core_Agrichem mInstance;
+
+ static {
+ mInstance = new Core_Agrichem();
+ Core_Manager.registerPlugin(mInstance);
+ mInstance.log("Preparing " + mInstance.getPluginName() + " for use.");
+ }
+
+ @Override
+ public boolean preInit() {
+ AgrichemFluids.init();
+ return true;
+ }
+
+ @Override
+ public boolean init() {
+ mInstance.log("Setting Items");
+ return true;
+ }
+
+ @Override
+ public boolean postInit() {
+ mInstance.log("Generating Recipes");
+ return true;
+ }
+
+ @Override
+ public boolean serverStart() {
+ return true;
+ }
+
+ @Override
+ public boolean serverStop() {
+ return true;
+ }
+
+ @Override
+ public String getPluginName() {
+ return "GT++ Agrichemistry Module";
+ }
+
+ @Override
+ public String getPluginAbbreviation() {
+ return "FARM";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java b/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java
new file mode 100644
index 0000000000..8ce137a323
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.plugin.agrichem;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.plugin.agrichem.logic.AlgaeGeneticData;
+
+public interface IAlgalItem {
+
+ AlgaeDefinition getAlgaeType(ItemStack aStack);
+
+ AlgaeGeneticData getSpeciesData(ItemStack aStack);
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java b/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java
new file mode 100644
index 0000000000..bd72654f0a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.plugin.agrichem.block;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class AgrichemFluids {
+
+ /*
+ * Saline Water - saltwater Sulfuric Waste Water - sulfuricapatite Methanol - methanol Hot Water - ic2hotwater
+ * Acetic Acid Propionic Acid Fermentation Base Ethylene - ethylene Ethanol - bioethanol Diluted SA -
+ * filutedsulfuricacid Sulfuric Acid - sulfuricacid Urea Formaldehyde - fluid.formaldehyde Liquid Resin Methane -
+ * methane Benzene - benzene Ethylbenzene - fluid.ethylbenzene Styrene - styrene
+ */
+
+ public static Fluid mAceticAcid;
+ public static Fluid mPropionicAcid;
+ public static Fluid mFermentationBase;
+ public static Fluid mUrea;
+ public static Fluid mLiquidResin;
+ public static Fluid mAcetone;
+ public static Fluid mButanol;
+
+ public static void init() {
+ if (!FluidRegistry.isFluidRegistered("aceticacid")) {
+ mAceticAcid = FluidUtils
+ .generateFluidNoPrefix("aceticacid", "Acetic Acid", 200, new short[] { 97, 168, 96, 100 }, true);
+ } else {
+ mAceticAcid = FluidRegistry.getFluid("aceticacid");
+ }
+ if (!FluidRegistry.isFluidRegistered("propionicacid")) {
+ mPropionicAcid = FluidUtils.generateFluidNoPrefix(
+ "propionicacid",
+ "Propionic Acid",
+ 200,
+ new short[] { 198, 209, 148, 100 },
+ true);
+ } else {
+ mPropionicAcid = FluidRegistry.getFluid("propionicacid");
+ }
+ if (!FluidRegistry.isFluidRegistered("fermentation.base")) {
+ mFermentationBase = FluidUtils.generateFluidNoPrefix(
+ "fermentation.base",
+ "Fermentation Base",
+ 200,
+ new short[] { 107, 100, 63, 100 },
+ true);
+ } else {
+ mFermentationBase = FluidRegistry.getFluid("fermentation.base");
+ }
+ if (!FluidRegistry.isFluidRegistered("ureamix")) {
+ mUrea = FluidUtils.generateFluidNoPrefix("ureamix", "Urea Mix", 200, new short[] { 71, 55, 12, 100 }, true);
+ } else {
+ mUrea = FluidRegistry.getFluid("ureamix");
+ }
+ if (!FluidRegistry.isFluidRegistered("liquidresin")) {
+ mLiquidResin = FluidUtils
+ .generateFluidNoPrefix("liquidresin", "Liquid Resin", 200, new short[] { 59, 58, 56, 100 }, true);
+ } else {
+ mLiquidResin = FluidRegistry.getFluid("liquidresin");
+ }
+
+ if (!FluidRegistry.isFluidRegistered("acetone")) {
+ mAcetone = FluidUtils
+ .generateFluidNoPrefix("acetone", "Acetone", 200, new short[] { 59, 58, 56, 100 }, true);
+ } else {
+ mAcetone = FluidRegistry.getFluid("acetone");
+ }
+ if (!FluidRegistry.isFluidRegistered("butanol")) {
+ mButanol = FluidUtils
+ .generateFluidNoPrefix("butanol", "Butanol", 200, new short[] { 159, 58, 56, 100 }, true);
+ } else {
+ mButanol = FluidRegistry.getFluid("butanol");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java b/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java
new file mode 100644
index 0000000000..8a6d189898
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java
@@ -0,0 +1,268 @@
+package gtPlusPlus.plugin.agrichem.item.algae;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.OreDictUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ItemAgrichemBase extends Item {
+
+ protected final IIcon base[];
+
+ /*
+ * 0 - Algae Biomass 1 - Green Algae Biomass 2 - Brown Algae Biomass 3 - Golden-Brown Algae Biomass 4 - Red Algae
+ * Biomass 5 - Cellulose Fiber 6 - Golden-Brown Cellulose Fiber 7 - Red Cellulose Fiber 8 - Compost 9 - Wood Pellet
+ * 10 - Wood Brick 11 - Cellulose Pulp 12 - Raw Bio Resin 13 - Catalyst Carrier 14 - Green Metal Catalyst 15 -
+ * Alginic Acid 16 - Alumina 17 - Aluminium Pellet 18 - Sodium Aluminate 19 - Sodium Hydroxide // Exists in Newer GT
+ * 20 - Sodium Carbonate 21 - Lithium Chloride 22 - Pellet Mold 23 - Clean Aluminium Mix 24 - Pinecone 25 - Crushed
+ * Pine
+ */
+
+ public ItemAgrichemBase() {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ base = new IIcon[26];
+ this.setUnlocalizedName("BasicAgrichemItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ private static boolean mHasCheckedForSodiumHydroxide = false;
+ private static boolean mShowSodiumHydroxide = true;
+
+ private static boolean checkSodiumHydroxide() {
+ if (mHasCheckedForSodiumHydroxide) {
+ return mShowSodiumHydroxide;
+ } else {
+ if (OreDictUtils.containsValidEntries("dustSodiumHydroxide_GT5U")
+ || OreDictUtils.containsValidEntries("dustSodiumHydroxide")) {
+ List<ItemStack> aTest = OreDictionary.getOres("dustSodiumHydroxide", false);
+ if (aTest.isEmpty()) {
+ aTest = OreDictionary.getOres("dustSodiumHydroxide_GT5U", false);
+ if (!aTest.isEmpty()) {
+ mShowSodiumHydroxide = false;
+ }
+ } else {
+ mShowSodiumHydroxide = false;
+ }
+ }
+ }
+ mHasCheckedForSodiumHydroxide = true;
+ return mShowSodiumHydroxide;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < base.length; i++) {
+ if (i == 19) {
+ // Only show if it doesn't exist.
+ if (checkSodiumHydroxide()) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ } else {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < this.base.length; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "bioscience/MetaItem1/" + i;
+ this.base[i] = u.registerIcon(aPath);
+ }
+ }
+
+ private boolean isTextureValid(String aPath) {
+ if (aPath == null) {
+ return false;
+ } else if (aPath.indexOf(92) == -1) {
+ Constructor aTextureAtlasSprite = ReflectionUtils.getConstructor(TextureAtlasSprite.class, String.class);
+ if (aTextureAtlasSprite != null) {
+ try {
+ TextureAtlasSprite aTestAtlas = (TextureAtlasSprite) aTextureAtlasSprite.newInstance(aPath);
+ if (aTestAtlas != null) {
+ return true;
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {}
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack aStack) {
+ if (ItemUtils.isCatalyst(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ double currentDamage = getCatalystDamage(aStack);
+ return currentDamage / getCatalystMaxDamage(aStack);
+ } else {
+ return 1D;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer player, List list, boolean bool) {
+ boolean aHasSpecialTooltips = false;
+ int aMaxDamage = 0;
+ int aDamageSegment = 0;
+ int aDam = 0;
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (ItemUtils.isCatalyst(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Active Reaction Agent");
+ aMaxDamage = getCatalystMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getCatalystDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (aHasSpecialTooltips) {
+ if (aDam > aDamageSegment * 3) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (aDam > aDamageSegment * 2) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (aDam > aDamageSegment) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (aDam >= 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + (aDam) + EnumChatFormatting.GRAY + " / " + aMaxDamage);
+ }
+ super.addInformation(aStack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack aStack) {
+ if (ItemUtils.isCatalyst(aStack)) {
+ int aDam = getCatalystDamage(aStack);
+ return aDam > 0;
+ }
+ return false;
+ }
+
+ public static boolean createCatalystNBT(ItemStack rStack) {
+ return ItemGenericChemBase.createCatalystNBT(rStack);
+ }
+
+ public static int getCatalystDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystDamage(aStack);
+ }
+
+ public static int getCatalystMaxDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystMaxDamage(aStack);
+ }
+
+ public static void setCatalystDamage(ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setCatalystDamage(aStack, aAmount);
+ }
+
+ public static int getMaxCatalystDurability(ItemStack aStack) {
+ return ItemGenericChemBase.getMaxCatalystDurability(aStack);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java b/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java
new file mode 100644
index 0000000000..f34348a3af
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.plugin.agrichem.item.algae;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.agrichem.AlgaeDefinition;
+import gtPlusPlus.plugin.agrichem.IAlgalItem;
+import gtPlusPlus.plugin.agrichem.logic.AlgaeGeneticData;
+
+public class ItemAlgaeBase extends Item implements IAlgalItem {
+
+ protected IIcon base;
+ protected IIcon overlay;
+
+ public ItemAlgaeBase() {
+ this.setHasSubtypes(true);
+ this.setMaxDamage(127);
+ this.setNoRepair();
+ this.setMaxStackSize(32);
+ this.setUnlocalizedName("BasicAlgaeItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ if (!p_77663_1_.hasTagCompound() || p_77663_1_.getTagCompound()
+ .hasNoTags()) {
+ p_77663_1_ = initNBT(p_77663_1_);
+ }
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return EnumChatFormatting.UNDERLINE + super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ int aDam = aStack.getItemDamage();
+ try {
+ aList.add(AlgaeDefinition.getByIndex(aDam).mSimpleName);
+ if (!aStack.hasTagCompound() || aStack.getTagCompound()
+ .hasNoTags()) {
+ aStack = initNBT(aStack);
+ } else {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ boolean mRequiresLight = aNBT.getBoolean("mRequiresLight");
+ boolean mSaltWater = aNBT.getBoolean("mSaltWater");
+ boolean mFreshWater = aNBT.getBoolean("mFreshWater");
+ byte mTempTolerance = aNBT.getByte("mTempTolerance");
+ float mFertility = aNBT.getFloat("mFertility");
+ float mProductionSpeed = aNBT.getFloat("mProductionSpeed");
+ byte mLifespan = aNBT.getByte("mLifespan");
+ int mGeneration = aNBT.getInteger("mGeneration");
+
+ aList.add("Requires Light: " + mRequiresLight);
+ aList.add("Salt Water: " + mSaltWater);
+ aList.add("Fresh Water: " + mFreshWater);
+ aList.add("Temp Tolerance: " + mTempTolerance);
+ aList.add("Growth: " + mFertility);
+ aList.add("Production: " + mProductionSpeed);
+ aList.add("Lifespan in days: " + mLifespan);
+ aList.add("Generation: " + mGeneration);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.uncommon;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < AlgaeDefinition.values().length; i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public int getColorFromItemStack(ItemStack aStack, int aMeta) {
+ return AlgaeDefinition.getByIndex(aStack.getItemDamage()).mColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "bioscience/BasicAlgae");
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "bioscience/BasicAlgae_Overlay");
+ }
+
+ public static ItemStack initNBT(ItemStack aFreshAlgae) {
+ NBTTagCompound aNewTag = new NBTTagCompound();
+ ItemAlgaeBase aItem;
+ if (aFreshAlgae.getItem() instanceof ItemAlgaeBase) {
+ aItem = (ItemAlgaeBase) aFreshAlgae.getItem();
+ if (!aFreshAlgae.hasTagCompound()) {
+ AlgaeGeneticData y = aItem.getSpeciesData(aFreshAlgae);
+ aNewTag = y.writeToNBT();
+ aFreshAlgae.setTagCompound(aNewTag);
+ } else {
+ aNewTag = aFreshAlgae.getTagCompound();
+ }
+ }
+ return aFreshAlgae;
+ }
+
+ @Override
+ public AlgaeDefinition getAlgaeType(ItemStack aStack) {
+ return AlgaeDefinition.getByIndex(aStack != null ? aStack.getItemDamage() : 3);
+ }
+
+ @Override
+ public AlgaeGeneticData getSpeciesData(ItemStack aStack) {
+ NBTTagCompound aTag;
+ if (!aStack.hasTagCompound() || aStack.getTagCompound()
+ .hasNoTags()) {
+ aTag = new NBTTagCompound();
+ AlgaeGeneticData aGenes;
+ if (aStack.getItemDamage() < 3 || aStack.getItemDamage() > 5) {
+ aGenes = new AlgaeGeneticData();
+ aTag = aGenes.writeToNBT();
+ } else {
+ byte aTemp, aLifespan;
+ float aFert, aSpeed;
+
+ int aDam = aStack.getItemDamage();
+ aTemp = (byte) (aDam == 3 ? 0 : aDam == 4 ? 2 : 1);
+ aLifespan = (byte) (aDam == 3 ? 1 : aDam == 4 ? 3f : 2f);
+ aFert = (float) (aDam == 3 ? 2f : aDam == 4 ? 1f : 1.75f);
+ aSpeed = (float) (aDam == 3 ? 1f : aDam == 4 ? 1.5f : 2f);
+
+ aGenes = new AlgaeGeneticData(
+ true,
+ true,
+ AlgaeDefinition.getByIndex(aDam).mSaltWater,
+ AlgaeDefinition.getByIndex(aDam).mFreshWater,
+ aTemp,
+ aFert,
+ aSpeed,
+ aLifespan,
+ 0,
+ new AutoMap<>());
+ aTag = aGenes.writeToNBT();
+ }
+ } else {
+ aTag = aStack.getTagCompound();
+ }
+
+ return new AlgaeGeneticData(aTag);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java b/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java
new file mode 100644
index 0000000000..6b7b72aa71
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java
@@ -0,0 +1,129 @@
+package gtPlusPlus.plugin.agrichem.logic;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class AlgaeGeneticData {
+
+ private final int mLifespan;
+
+ private final int mGeneration;
+
+ private final boolean mIsDominant;
+
+ private final boolean mRequiresLight;
+
+ private final boolean mSaltWater;
+
+ private final boolean mFreshWater;
+
+ private final byte mTempTolerance;
+
+ private final float mFertility;
+
+ private final float mProductionSpeed;
+
+ private final AutoMap<AlgaeGrowthRequirement> mSpecialRequirements;
+
+ public AlgaeGeneticData() {
+ this(true, true, true, true, (byte) 0, 1f, 1f, (byte) 30, 0, new AutoMap<>());
+ }
+
+ public AlgaeGeneticData(boolean isDominant, boolean requiresLight, boolean isSalt, boolean isFresh,
+ byte aTempTolerance, float aFertility, float aSpeed, byte aLifespan, int aGeneration,
+ AutoMap<AlgaeGrowthRequirement> aRequirements) {
+ mIsDominant = isDominant;
+ mRequiresLight = requiresLight;
+ mSaltWater = isSalt;
+ mFreshWater = isFresh;
+ mTempTolerance = aTempTolerance;
+ mFertility = aFertility;
+ mProductionSpeed = aSpeed;
+ mLifespan = aLifespan;
+ mGeneration = aGeneration;
+ mSpecialRequirements = aRequirements;
+ }
+
+ public AlgaeGeneticData(NBTTagCompound aNBT) {
+ if (aNBT == null || aNBT.hasNoTags()) {
+ mIsDominant = true;
+ mRequiresLight = true;
+ mSaltWater = true;
+ mFreshWater = true;
+ mTempTolerance = 0;
+ mFertility = 1;
+ mProductionSpeed = 1;
+ mLifespan = 30;
+ mGeneration = 0;
+ } else {
+ mIsDominant = aNBT.getBoolean("mIsDominant");
+ mRequiresLight = aNBT.getBoolean("mRequiresLight");
+ mSaltWater = aNBT.getBoolean("mSaltWater");
+ mFreshWater = aNBT.getBoolean("mFreshWater");
+ mTempTolerance = aNBT.getByte("mTempTolerance");
+ mFertility = aNBT.getFloat("mFertility");
+ mProductionSpeed = aNBT.getFloat("mProductionSpeed");
+ mLifespan = aNBT.getByte("mLifespan");
+ mGeneration = aNBT.getInteger("mGeneration");
+ }
+ mSpecialRequirements = new AutoMap<>();
+ }
+
+ /**
+ * In MC Days
+ */
+ public final int getLifespan() {
+ return this.mLifespan;
+ }
+
+ public final boolean isDominant() {
+ return this.mIsDominant;
+ }
+
+ public final boolean RequiresLight() {
+ return this.mRequiresLight;
+ }
+
+ public final boolean isSaltWater() {
+ return this.mSaltWater;
+ }
+
+ public final boolean isFreshWater() {
+ return this.mFreshWater;
+ }
+
+ public final byte getTempTolerance() {
+ return this.mTempTolerance;
+ }
+
+ public final float getFertility() {
+ return this.mFertility;
+ }
+
+ public final float getProductionSpeed() {
+ return this.mProductionSpeed;
+ }
+
+ public final int getGeneration() {
+ return this.mGeneration;
+ }
+
+ public final AutoMap<AlgaeGrowthRequirement> getSpecialRequirements() {
+ return this.mSpecialRequirements;
+ }
+
+ public NBTTagCompound writeToNBT() {
+ NBTTagCompound aGenes = new NBTTagCompound();
+ aGenes.setBoolean("mIsDominant", this.mIsDominant);
+ aGenes.setBoolean("mRequiresLight", this.mRequiresLight);
+ aGenes.setBoolean("mSaltWater", this.mSaltWater);
+ aGenes.setBoolean("mFreshWater", this.mFreshWater);
+ aGenes.setInteger("mLifespan", this.mLifespan);
+ aGenes.setInteger("mGeneration", this.mGeneration);
+ aGenes.setByte("mTempTolerance", this.mTempTolerance);
+ aGenes.setFloat("mFertility", this.mFertility);
+ aGenes.setFloat("mProductionSpeed", this.mProductionSpeed);
+ return aGenes;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java b/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java
new file mode 100644
index 0000000000..07b89e5b5e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java
@@ -0,0 +1,4 @@
+package gtPlusPlus.plugin.agrichem.logic;
+
+public class AlgaeGrowthRequirement {
+}
diff --git a/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java b/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java
new file mode 100644
index 0000000000..b35ad2c063
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java
@@ -0,0 +1,6 @@
+package gtPlusPlus.plugin.fixes.interfaces;
+
+public interface IBugFix {
+
+ boolean isFixValid();
+}
diff --git a/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java
new file mode 100644
index 0000000000..cc181756c0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java
@@ -0,0 +1,101 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.manager.Core_Manager;
+
+// Called by Core_Manager#veryEarlyInit
+@SuppressWarnings("unused")
+public class Core_VanillaFixes implements IPlugin {
+
+ static final Core_VanillaFixes mInstance;
+ static final VanillaBedHeightFix mBedFixInstance;
+ static final VanillaBackgroundMusicFix mMusicFixInstance;
+
+ static {
+ mInstance = new Core_VanillaFixes();
+ mBedFixInstance = new VanillaBedHeightFix(mInstance);
+ mMusicFixInstance = new VanillaBackgroundMusicFix(mInstance);
+ mInstance.log("Preparing " + mInstance.getPluginName() + " for use.");
+ }
+
+ Core_VanillaFixes() {
+ Core_Manager.registerPlugin(this);
+ }
+
+ @Override
+ public boolean preInit() {
+ return fixVanillaOD();
+ }
+
+ @Override
+ public boolean init() {
+ return true;
+ }
+
+ @Override
+ public boolean postInit() {
+ return true;
+ }
+
+ @Override
+ public boolean serverStart() {
+ mMusicFixInstance.manage();
+ return true;
+ }
+
+ @Override
+ public boolean serverStop() {
+ return true;
+ }
+
+ @Override
+ public String getPluginName() {
+ return "GT++ Vanilla Fixes Module";
+ }
+
+ @Override
+ public String getPluginAbbreviation() {
+ return "VFIX";
+ }
+
+ private boolean fixVanillaOD() {
+ registerToOreDict(ItemUtils.getSimpleStack(Items.blaze_rod), "rodBlaze");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.nether_wart), "cropNetherWart");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.reeds), "sugarcane");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.paper), "paper");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.ender_pearl), "enderpearl");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.bone), "bone");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.gunpowder), "gunpowder");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.string), "string");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.nether_star), "netherStar");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.leather), "leather");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.feather), "feather");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.egg), "egg");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.end_stone), "endstone");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.vine), "vine");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.cactus), "blockCactus");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.grass), "grass");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.obsidian), "obsidian");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.crafting_table), "workbench");
+ return true;
+ }
+
+ private void registerToOreDict(ItemStack aStack, String aString) {
+ if (aStack.getItem() == Items.blaze_rod) {
+ mInstance
+ .log("Registering " + aStack.getDisplayName() + " to OreDictionary under the tag '" + aString + "'.");
+ } else {
+ mInstance.log(
+ "Registering " + aStack.getDisplayName()
+ + " to OreDictionary under the tag '"
+ + aString
+ + "'. (Added to Forge in 1.8.9)");
+ }
+ ItemUtils.addItemToOreDictionary(aStack, aString);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java
new file mode 100644
index 0000000000..22ae6f29c6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java
@@ -0,0 +1,64 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.plugin.fixes.interfaces.IBugFix;
+import gtPlusPlus.plugin.fixes.vanilla.music.MusicTocker;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class VanillaBackgroundMusicFix implements IBugFix {
+
+ private final IPlugin mParent;
+ private final boolean enabled;
+ private MusicTocker mFixInstance;
+
+ public VanillaBackgroundMusicFix(IPlugin minstance) {
+ mParent = minstance;
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ mParent.log("[BGM] Registering BGM delay Fix.");
+ enabled = true;
+ mFixInstance = new MusicTocker(mParent);
+ } else if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isServer()) {
+ mParent.log("[BGM] Tried registering BGM delay Fix on Server, disabling.");
+ enabled = false;
+ } else {
+ mParent.log("[BGM] Not registering BGM delay Fix.");
+ enabled = false;
+ }
+ }
+
+ @Override
+ public boolean isFixValid() {
+ return enabled;
+ }
+
+ public void manage() {
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ TimerTask task = new ManageTask(this.mFixInstance);
+ Timer timer = new Timer("BGM-WatchDog");
+ long delay = 1000 * 60;
+ timer.scheduleAtFixedRate(task, delay, 5000);
+ }
+ }
+
+ private static class ManageTask extends TimerTask {
+
+ private final MusicTocker A;
+
+ public ManageTask(MusicTocker a) {
+ A = a;
+ }
+
+ @Override
+ public void run() {
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ if (!A.mVanillaManager) {
+ A.run();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java
new file mode 100644
index 0000000000..60ab048ca3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java
@@ -0,0 +1,85 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
+
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.fixes.interfaces.IBugFix;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class VanillaBedHeightFix implements IBugFix {
+
+ private final Method mSleepInBedAt;
+ private final IPlugin mParent;
+
+ public VanillaBedHeightFix(IPlugin minstance) {
+ mParent = minstance;
+ Method m;
+ if (!CORE_Preloader.DEV_ENVIRONMENT) {
+ m = ReflectionUtils.getMethod(EntityPlayer.class, "func_71018_a", int.class, int.class, int.class);
+ } else {
+ m = ReflectionUtils.getMethod(
+ net.minecraft.entity.player.EntityPlayer.class,
+ "sleepInBedAt",
+ int.class,
+ int.class,
+ int.class);
+ }
+ if (m != null) {
+ mSleepInBedAt = m;
+ mParent.log("Registering Bed Height Fix.");
+ Utils.registerEvent(this);
+ } else {
+ mSleepInBedAt = null;
+ }
+ }
+
+ @Override
+ public boolean isFixValid() {
+ return mSleepInBedAt != null;
+ }
+
+ /**
+ * Fix created by deNULL -
+ * https://github.com/deNULL/BugPatch/blob/master/src/main/java/ru/denull/BugPatch/mod/ClientEvents.java#L45
+ *
+ * @param evt - The event where a player sleeps
+ */
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void playerSleepInBed(PlayerSleepInBedEvent evt) {
+ Logger.WARNING("Sleep Event Detected. Player is sleeping at Y: " + evt.y);
+ if (evt.y <= 0 && isFixValid()) {
+ int correctY = 256 + evt.y;
+ if (correctY <= 0) {
+ Logger.WARNING(
+ "You're trying to sleep at y=" + evt.y
+ + ", which is impossibly low. However, fixed y value is "
+ + correctY
+ + ", which is still below 0. Falling back to default behavior.");
+ } else {
+ Logger.WARNING(
+ "You're trying to sleep at y=" + evt.y
+ + ". This is probably caused by overflow, stopping original event; retrying with y="
+ + correctY
+ + ".");
+ evt.result = EntityPlayer.EnumStatus.OTHER_PROBLEM;
+ try {
+ mSleepInBedAt.invoke(evt.entityPlayer, evt.x, correctY, evt.z);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ Logger.WARNING("Encountered an error trying to sleep.");
+ }
+ }
+ } else if (!isFixValid()) {
+ Logger.WARNING(
+ "Method sleepInBedAt was not found in EntityPlayer (wrong MC and/or Forge version?), unable to fix");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java
new file mode 100644
index 0000000000..c669f93f62
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.plugin.fixes.vanilla.music;
+
+import java.lang.reflect.Field;
+import java.util.Random;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.audio.ISound;
+import net.minecraft.client.audio.MusicTicker;
+import net.minecraft.client.audio.PositionedSoundRecord;
+import net.minecraft.util.MathHelper;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+@SideOnly(Side.CLIENT)
+public class MusicTocker extends MusicTicker implements Runnable {
+
+ private final Random mRandom = new XSTR();
+ private final Minecraft mMinecraft;
+ private final IPlugin mPlugin;
+ private ISound mSound;
+ private int mTimeUntilNextTrack = 100;
+
+ public boolean mVanillaManager = false;
+
+ public MusicTocker(IPlugin aPlugin) {
+ super(Minecraft.getMinecraft());
+ mPlugin = aPlugin;
+ mMinecraft = Minecraft.getMinecraft();
+ mPlugin.log("[BGM] Created BGM Watchdog with a delay of " + getDelay() + " ticks.");
+ inject();
+ }
+
+ private static int getDelay() {
+ return CORE_Preloader.enableWatchdogBGM;
+ }
+
+ private boolean inject() {
+ mPlugin.log("[BGM] Inject new Watchdog into Minecraft instance.");
+ ReflectionUtils.setField(Minecraft.getMinecraft(), "mcMusicTicker", this);
+ mPlugin.log("[BGM] Verifying...");
+ Field f = ReflectionUtils.getField(Minecraft.class, "mcMusicTicker");
+ try {
+ Object m = f.get(mMinecraft);
+ if (m != null) {
+ if (m instanceof MusicTocker || m.getClass()
+ .isAssignableFrom(getClass())) {
+ mPlugin.log("[BGM] Success.");
+ return true;
+ } else if (m instanceof MusicTicker || m.getClass()
+ .isAssignableFrom(MusicTicker.class)) {
+ mPlugin.log("[BGM] Found Vanilla MusicTicker, but may be instance of MusicTocker.");
+ return true;
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+
+ mPlugin.log("[BGM] Failed.");
+ return false;
+ }
+
+ private void updateInternalNumber() {
+ if (ReflectionUtils.doesFieldExist(getClass(), "field_147676_d")) {
+ ReflectionUtils.setField(this, "field_147676_d", mTimeUntilNextTrack);
+ }
+ }
+
+ private void updateInternalSound(ISound aSound) {
+ if (ReflectionUtils.doesFieldExist(getClass(), "field_147678_c")) {
+ ReflectionUtils.setField(this, "field_147678_c", aSound);
+ }
+ }
+
+ /**
+ * Updates the JList with a new model.
+ */
+ @Override
+ public void update() {
+ run();
+ mVanillaManager = true;
+ }
+
+ @Override
+ public void run() {
+ MusicType musictype = this.mMinecraft.func_147109_W();
+
+ if (this.mSound != null) {
+ if (!musictype.getMusicTickerLocation()
+ .equals(this.mSound.getPositionedSoundLocation())) {
+ this.mMinecraft.getSoundHandler()
+ .stopSound(this.mSound);
+ this.mTimeUntilNextTrack = MathHelper.getRandomIntegerInRange(this.mRandom, 0, getDelay() / 2);
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM delay 1");
+ }
+ if (!this.mMinecraft.getSoundHandler()
+ .isSoundPlaying(this.mSound)) {
+ this.mSound = null;
+ updateInternalSound(null);
+ this.mTimeUntilNextTrack = Math.min(
+ MathHelper.getRandomIntegerInRange(this.mRandom, getDelay(), getDelay() * 2),
+ this.mTimeUntilNextTrack);
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM delay 2");
+ }
+ } else if (this.mSound == null && this.mTimeUntilNextTrack-- <= 0) {
+ this.mSound = PositionedSoundRecord.func_147673_a(musictype.getMusicTickerLocation());
+ updateInternalSound(mSound);
+ this.mMinecraft.getSoundHandler()
+ .playSound(this.mSound);
+ this.mTimeUntilNextTrack = getDelay();
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM 3");
+ }
+
+ /*
+ * try { // Get Value stored in underlying object. Integer aRealDelay = (Integer)
+ * ReflectionUtils.getField(getClass(), "field_147676_d").get(this); if (aRealDelay == null) { return; } else {
+ * if (aRealDelay > getDelay() || aRealDelay <= 0) { this.mTimeUntilNextTrack = getDelay();
+ * updateInternalNumber(); } else { this.mTimeUntilNextTrack -= 5 * 20; updateInternalNumber(); } aRealDelay =
+ * (Integer) ReflectionUtils.getField(getClass(), "field_147676_d").get(this);
+ * Logger.INFO("[BGM] Adjusted BGM - "+aRealDelay); } } catch (IllegalArgumentException | IllegalAccessException
+ * e) { }
+ */
+ }
+}
diff --git a/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java b/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java
new file mode 100644
index 0000000000..be1dafd231
--- /dev/null
+++ b/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.plugin.manager;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class Core_Manager {
+
+ public static AutoMap<IPlugin> mPlugins = new AutoMap<>();
+
+ /**
+ * @param plugin - Dynamically registers the plugin for loading.
+ */
+ public static void registerPlugin(IPlugin plugin) {
+ Logger.INFO("[Plugin] " + "Registered " + plugin.getPluginName() + ".");
+ mPlugins.put(plugin);
+ }
+
+ /**
+ * Dynamically loads all class objects within the "gtPlusPlus.plugin" package.
+ */
+ public static void veryEarlyInit() {
+ if (ReflectionUtils.dynamicallyLoadClassesInPackage("gtPlusPlus.plugin")) {
+ Logger.INFO("[Plugin] Plugin System loaded.");
+ }
+ }
+
+ public static boolean preInit() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.preInit()) {
+ Logger.INFO("[Plugin] Completed Pre-Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Pre-Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static boolean init() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.init()) {
+ Logger.INFO("[Plugin] Completed Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static boolean postInit() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.postInit()) {
+ Logger.INFO("[Plugin] Completed Post-Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Post-Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static void serverStart() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.serverStart()) {
+ Logger.INFO("[Plugin] Completed Server Start Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Server Start Phase for " + h.getPluginName() + ".");
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+
+ public static void serverStop() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.serverStop()) {
+ Logger.INFO("[Plugin] Completed Server Stop Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Server Stop Phase for " + h.getPluginName() + ".");
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java b/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java
new file mode 100644
index 0000000000..146c92764b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java
@@ -0,0 +1,33 @@
+package gtPlusPlus.preloader;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import cpw.mods.fml.common.versioning.ArtifactVersion;
+
+public class CORE_Preloader {
+
+ public static final String NAME = "GT++ Preloader";
+ public static final String MODID = "GT++_Preloader";
+ public static final String VERSION = "0.5-Beta";
+ public static final List<ArtifactVersion> DEPENDENCIES;
+ public static final String JAVA_VERSION = System.getProperty("java.version");
+
+ public static File MC_DIR;
+ public static boolean DEV_ENVIRONMENT = false;
+ public static boolean DEBUG_MODE = false;
+ public static boolean enableOldGTcircuits = false;
+ public static int enableWatchdogBGM = 0;
+
+ public static void setMinecraftDirectory(File aDir) {
+ MC_DIR = aDir;
+ }
+
+ static {
+ ArrayList<ArtifactVersion> deps = new ArrayList<>();
+ // deps.add("required-before:gregtech;");
+ DEPENDENCIES = Collections.unmodifiableList(deps);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java b/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java
new file mode 100644
index 0000000000..9a350ab5e4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java
@@ -0,0 +1,103 @@
+package gtPlusPlus.preloader;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.item.ItemStack;
+
+import org.apache.logging.log4j.Level;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class Preloader_GT_OreDict {
+
+ public static boolean shouldPreventRegistration(final String string, final ItemStack bannedItem) {
+
+ if (bannedItem == null) {
+ return false;
+ } else if (!CORE_Preloader.enableOldGTcircuits) {
+ return false;
+ }
+
+ try {
+ if (CORE_Preloader.enableOldGTcircuits) {
+ if ((bannedItem != null) && ItemUtils.getModId(bannedItem)
+ .toLowerCase()
+ .equals(GregTech.ID)) {
+ final int damageValue = bannedItem.getItemDamage() - 32000;
+ if (bannedItem.getItem() instanceof GT_MetaGenerated_Item_01) { // 700-720
+ if ((damageValue >= 700) && (damageValue <= 720)) {
+ return true;
+ }
+ } else {
+ if (ReflectionUtils.doesClassExist("gregtech.common.items.GT_MetaGenerated_Item_03")) { // 6/11/12/14/16/20/30-57/69-73/79-96
+ final Class<?> MetaItem03 = ReflectionUtils
+ .getClass("gregtech.common.items.GT_MetaGenerated_Item_03");
+ if (isInstanceOf(MetaItem03, bannedItem.getItem())) {
+ if ((damageValue == 6) || (damageValue == 7)
+ || (damageValue == 11)
+ || (damageValue == 12)
+ || (damageValue == 14)
+ || (damageValue == 16)
+ || (damageValue == 20)
+ || (damageValue == 21)
+ || (damageValue == 22)) {
+ return true;
+ } else if ((damageValue >= 30) && (damageValue <= 57)) {
+ return true;
+ } else if ((damageValue >= 69) && (damageValue <= 73)) {
+ return true;
+ } else if ((damageValue >= 78) && (damageValue <= 96)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ } catch (final Throwable e) {
+ if (CORE.ConfigSwitches.showHiddenNEIItems) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "A mod tried to register an invalid item with the OreDictionary.");
+ if (bannedItem != null) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Please report this issue to the authors of %s",
+ ItemUtils.getModId(bannedItem));
+ try {
+ if (bannedItem.getItemDamage() <= Short.MAX_VALUE - 1) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Item was not null, but still invalidly registering: %s",
+ bannedItem.getDisplayName() != null ? bannedItem.getDisplayName()
+ : "INVALID ITEM FOUND");
+ } else {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Item was not null, but still invalidly registering: %s",
+ "Found Wildcard item that is being registered too early.");
+ }
+ } catch (Exception h) {
+ h.printStackTrace();
+ }
+ }
+ }
+ // FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "%s", e.getMessage());
+ }
+ return false;
+ }
+
+ // Simplification of Life.
+ private static boolean isInstanceOf(final Class<?> clazz, final Object obj) {
+ return clazz.isInstance(obj);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java b/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java
new file mode 100644
index 0000000000..477e1371e3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.preloader;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class Preloader_Logger {
+
+ private Preloader_Logger() {}
+
+ // Logging Functions
+ public static final Logger MODLOGGER = LogManager.getLogger("GT++ ASM");
+
+ public static Logger getLogger() {
+ return MODLOGGER;
+ }
+
+ // Non-Dev Comments
+
+ public static void INFO(final String s, final String s2) {
+ INFO(s);
+ INFO(s2);
+ }
+
+ public static void INFO(final String s) {
+ MODLOGGER.info(s);
+ }
+
+ // Developer Comments
+ public static void WARNING(final String s) {
+ MODLOGGER.warn(s);
+ }
+
+ // Errors
+ public static void ERROR(final String s) {
+ MODLOGGER.fatal(s);
+ }
+
+ public static void LOG(String string, Level info, String string2) {
+ if (info.equals(Level.INFO)) {
+ INFO("[" + string + "] " + string2);
+ }
+ if (info.equals(Level.WARN)) {
+ WARNING("[" + string + "] " + string2);
+ }
+ if (info.equals(Level.ERROR)) {
+ ERROR("[" + string + "] " + string2);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java b/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java
new file mode 100644
index 0000000000..b4a49c275c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java
@@ -0,0 +1,144 @@
+package gtPlusPlus.preloader.asm;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import org.apache.logging.log4j.Level;
+
+import cpw.mods.fml.common.FMLLog;
+import gtPlusPlus.preloader.Preloader_Logger;
+
+public class AsmConfig {
+
+ public static Configuration config;
+
+ public static boolean enableOreDictPatch;
+ public static boolean enableGtTooltipFix;
+ public static boolean enableGtNbtFix;
+ public static boolean enableGtCharcoalPitFix;
+ public static boolean enableCofhPatch;
+ public static boolean enableTcAspectSafety;
+ public static boolean enabledLwjglKeybindingFix;
+ public static boolean enabledFixEntitySetHealth;
+ public static boolean enableThaumicTinkererRepairFix;
+
+ public static boolean disableAllLogging;
+ public static boolean debugMode;
+
+ static {
+ config = new Configuration(new File("config/GTplusplus/asm.cfg"));
+ syncConfig(true);
+ }
+
+ public static void syncConfig(boolean load) {
+ ArrayList<String> propOrder = new ArrayList<>();
+ ArrayList<String> propOrderDebug = new ArrayList<>();
+
+ try {
+ if (!config.isChild && load) {
+ config.load();
+ }
+
+ Property prop;
+
+ // Debug
+ prop = config.get("debug", "disableAllLogging", true);
+ prop.comment = "Disables ALL logging from GT++.";
+ prop.setLanguageKey("gtpp.disableAllLogging")
+ .setRequiresMcRestart(false);
+ disableAllLogging = prop.getBoolean(true);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "debugMode", false);
+ prop.comment = "Enables all sorts of debug logging. (Don't use unless told to, breaks other things.)";
+ prop.setLanguageKey("gtpp.debugMode")
+ .setRequiresMcRestart(false);
+ debugMode = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enabledFixEntitySetHealth", false);
+ prop.comment = "Enable/Disable entity setHealth() fix.";
+ prop.setLanguageKey("gtpp.enabledFixEntitySetHealth")
+ .setRequiresMcRestart(true);
+ enabledFixEntitySetHealth = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableGtNbtFix", true);
+ prop.comment = "Enable/Disable GT NBT Persistency Fix";
+ prop.setLanguageKey("gtpp.enableGtNbtFix")
+ .setRequiresMcRestart(true);
+ enableGtNbtFix = prop.getBoolean(true);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableCofhPatch", false);
+ prop.comment = "Enable/Disable COFH OreDictionaryArbiter Patch (Useful for Development)";
+ prop.setLanguageKey("gtpp.enableCofhPatch")
+ .setRequiresMcRestart(true);
+ enableCofhPatch = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableOreDictPatch", false);
+ prop.comment = "Enable/Disable Forge OreDictionary Patch (Useful for Development)";
+ prop.setLanguageKey("gtpp.enableOreDictPatch")
+ .setRequiresMcRestart(true);
+ enableOreDictPatch = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableThaumicTinkererRepairFix", false);
+ prop.comment = "Enable/Disable Patch for Thaumic Repairer";
+ prop.setLanguageKey("gtpp.enableThaumicTinkererRepairFix")
+ .setRequiresMcRestart(true);
+ enableThaumicTinkererRepairFix = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ // General Features
+ prop = config.get("general", "enabledLwjglKeybindingFix", true);
+ prop.comment = "Prevents the game crashing from having invalid keybinds. https://github.com/alkcorp/GTplusplus/issues/544";
+ prop.setLanguageKey("gtpp.enabledLwjglKeybindingFix")
+ .setRequiresMcRestart(true);
+ enabledLwjglKeybindingFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ prop = config.get("general", "enableGtTooltipFix", true);
+ prop.comment = "Enable/Disable Custom GT Tooltips";
+ prop.setLanguageKey("gtpp.enableGtTooltipFix")
+ .setRequiresMcRestart(true);
+ enableGtTooltipFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ prop = config.get("general", "enableGtCharcoalPitFix", true);
+ prop.comment = "Makes the Charcoal Pile Igniter work better.";
+ prop.setLanguageKey("gtpp.enableGtCharcoalPitFix")
+ .setRequiresMcRestart(true);
+ enableGtCharcoalPitFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ // TC Aspect Safety
+ prop = config.get("general", "enableTcAspectSafety", true);
+ prop.comment = "Fixes small oversights in Thaumcraft 4.";
+ prop.setLanguageKey("gtpp.enableTcAspectSafety")
+ .setRequiresMcRestart(true);
+ enableTcAspectSafety = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ config.setCategoryPropertyOrder("general", propOrder);
+ config.setCategoryPropertyOrder("debug", propOrderDebug);
+ if (config.hasChanged()) {
+ config.save();
+ }
+
+ Preloader_Logger.INFO("Gt Nbt Fix - Enabled: " + enableGtNbtFix);
+ Preloader_Logger.INFO("Gt Tooltip Fix - Enabled: " + enableGtTooltipFix);
+ Preloader_Logger.INFO("COFH Patch - Enabled: " + enableCofhPatch);
+ Preloader_Logger.INFO("Thaumcraft Aspect Safety Patch - Enabled: " + enableTcAspectSafety);
+ Preloader_Logger
+ .INFO("Fix bad usage of EntityLivingBase.setHealth Patch - Enabled: " + enabledFixEntitySetHealth);
+
+ } catch (Exception var3) {
+ FMLLog.log(Level.ERROR, var3, "GT++ ASM had a problem loading it's config", new Object[0]);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java b/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java
new file mode 100644
index 0000000000..c77f570a8d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.preloader.asm;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.io.File;
+import java.util.Collections;
+
+import net.minecraftforge.common.config.Configuration;
+
+import com.google.common.eventbus.EventBus;
+import com.google.common.eventbus.Subscribe;
+
+import cpw.mods.fml.common.DummyModContainer;
+import cpw.mods.fml.common.LoadController;
+import cpw.mods.fml.common.ModMetadata;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.Preloader_Logger;
+
+public class Preloader_DummyContainer extends DummyModContainer {
+
+ public Preloader_DummyContainer() {
+ super(new ModMetadata());
+ ModMetadata meta = getMetadata();
+ meta.modId = CORE_Preloader.MODID;
+ meta.name = CORE_Preloader.NAME;
+ meta.version = CORE_Preloader.VERSION;
+ meta.credits = "Roll Credits ...";
+ meta.authorList = Collections.singletonList("Alkalus");
+ meta.screenshots = new String[0];
+ meta.parent = GTPlusPlus.ID;
+ }
+
+ @Override
+ public boolean registerBus(EventBus bus, LoadController controller) {
+ bus.register(this);
+ return true;
+ }
+
+ @Subscribe
+ public void preInit(FMLPreInitializationEvent event) {
+ Preloader_Logger.INFO("Loading " + CORE_Preloader.MODID + " V" + CORE_Preloader.VERSION);
+ // Handle GT++ Config
+ handleConfigFile(event);
+ }
+
+ public static void handleConfigFile(final FMLPreInitializationEvent event) {
+ final Configuration config = new Configuration(
+ new File(event.getModConfigurationDirectory(), "GTplusplus/GTplusplus.cfg"));
+ config.load();
+
+ // BGM Watchdog
+ CORE_Preloader.enableWatchdogBGM = config.getInt(
+ "enableWatchdogBGM",
+ "features",
+ 0,
+ 0,
+ Short.MAX_VALUE,
+ "Set to a value greater than 0 to reduce the ticks taken to delay between BGM tracks. Acceptable Values are 1-32767, where 0 is disabled. Vanilla Uses 12,000 & 24,000. 200 is 10s.");
+
+ // Circuits
+ CORE_Preloader.enableOldGTcircuits = config.getBoolean(
+ "enableOldGTcircuits",
+ GregTech.ID,
+ false,
+ "Restores circuits and their recipes from Pre-5.09.28 times.");
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java b/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
new file mode 100644
index 0000000000..cdd25bb268
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.preloader.asm;
+
+import java.io.File;
+import java.util.Map;
+
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.transformers.Preloader_Transformer_Handler;
+
+@SortingIndex(10097)
+@MCVersion(value = "1.7.10")
+@IFMLLoadingPlugin.TransformerExclusions("gtPlusPlus.preloader")
+@IFMLLoadingPlugin.Name(CORE_Preloader.NAME)
+public class Preloader_FMLLoadingPlugin implements IFMLLoadingPlugin {
+
+ @Override
+ public String getAccessTransformerClass() {
+ return null;
+ }
+
+ @Override
+ public String[] getASMTransformerClass() {
+ return new String[] { Preloader_Transformer_Handler.class.getName() };
+ }
+
+ @Override
+ public String getModContainerClass() {
+ return Preloader_DummyContainer.class.getName();
+ }
+
+ @Override
+ public String getSetupClass() {
+ return null;
+ }
+
+ @Override
+ public void injectData(Map<String, Object> data) {
+ CORE_Preloader.DEV_ENVIRONMENT = !(boolean) data.get("runtimeDeobfuscationEnabled");
+ File mcDir = (File) data.get("mcLocation");
+ if (mcDir != null && mcDir.exists()) {
+ CORE_Preloader.setMinecraftDirectory(mcDir);
+ }
+ CORE_Preloader.DEBUG_MODE = AsmConfig.debugMode;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java
new file mode 100644
index 0000000000..0b41846928
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java
@@ -0,0 +1,187 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.RETURN;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
+import cofh.core.util.oredict.OreDictionaryArbiter;
+import cofh.lib.util.ItemWrapper;
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gnu.trove.map.TMap;
+import gnu.trove.map.hash.THashMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ClassTransformer_COFH_OreDictionaryArbiter {
+
+ // The qualified name of the class we plan to transform.
+ private static final String className = "cofh.core.util.oredict.OreDictionaryArbiter";
+ // cofh/core/util/oredict/OreDictionaryArbiter
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ public ClassTransformer_COFH_OreDictionaryArbiter(byte[] basicClass) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new localClassVisitor(aTempWriter), 0);
+
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null) {
+ injectMethod("registerOreDictionaryEntry");
+ }
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public void injectMethod(String aMethodName) {
+
+ String aItemStack = "net/minecraft/item/ItemStack";
+ MethodVisitor mv;
+ if (aMethodName.equals("registerOreDictionaryEntry")) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] COFH OreDictionaryArbiter Patch",
+ Level.INFO,
+ "Injecting " + aMethodName + " into " + className + ". ItemStack: " + aItemStack);
+ mv = getWriter().visitMethod(
+ ACC_PUBLIC + ACC_STATIC,
+ "registerOreDictionaryEntry",
+ "(L" + aItemStack + ";Ljava/lang/String;)V",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(61, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter$FixCOFH",
+ "registerOreDictionaryEntry",
+ "(L" + aItemStack + ";Ljava/lang/String;)V",
+ false);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLineNumber(62, l1);
+ mv.visitInsn(RETURN);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLocalVariable("arg", "L" + aItemStack + ";", null, l0, l2, 0);
+ mv.visitLocalVariable("arg0", "Ljava/lang/String;", null, l0, l2, 1);
+ mv.visitMaxs(2, 2);
+ mv.visitEnd();
+ }
+ FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Method injection complete.");
+ }
+
+ public static final class localClassVisitor extends ClassVisitor {
+
+ public localClassVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ if (name.equals("registerOreDictionaryEntry")) {
+ FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Removing method " + name);
+ return null;
+ }
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ return methodVisitor;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static class FixCOFH {
+
+ private static BiMap<String, Integer> oreIDs;
+ private static TMap<Integer, ArrayList<ItemStack>> oreStacks;
+ private static TMap<ItemWrapper, ArrayList<Integer>> stackIDs;
+ private static TMap<ItemWrapper, ArrayList<String>> stackNames;
+
+ static {
+ try {
+ oreIDs = (BiMap<String, Integer>) ReflectionUtils.getField(OreDictionaryArbiter.class, "oreIDs")
+ .get(null);
+ oreStacks = (TMap<Integer, ArrayList<ItemStack>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "oreStacks")
+ .get(null);
+ stackIDs = (TMap<ItemWrapper, ArrayList<Integer>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "stackIDs")
+ .get(null);
+ stackNames = (TMap<ItemWrapper, ArrayList<String>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "stackNames")
+ .get(null);
+ } catch (Throwable t) {
+ oreIDs = HashBiMap.create();
+ oreStacks = new THashMap<>();
+ stackIDs = new THashMap<>();
+ stackNames = new THashMap<>();
+ }
+ }
+
+ public static void registerOreDictionaryEntry(ItemStack arg, String arg0) {
+ try {
+ if (arg == null) {
+ return;
+ }
+ if (arg.getItem() != null && !Strings.isNullOrEmpty(arg0)) {
+ int arg1 = OreDictionary.getOreID(arg0);
+ oreIDs.put(arg0, Integer.valueOf(arg1));
+ if (!oreStacks.containsKey(Integer.valueOf(arg1))) {
+ oreStacks.put(Integer.valueOf(arg1), new ArrayList<>());
+ }
+ ((ArrayList<ItemStack>) oreStacks.get(Integer.valueOf(arg1))).add(arg);
+ ItemWrapper arg2 = ItemWrapper.fromItemStack(arg);
+ if (!stackIDs.containsKey(arg2)) {
+ stackIDs.put(arg2, new ArrayList<>());
+ stackNames.put(arg2, new ArrayList<>());
+ }
+ ((ArrayList<Integer>) stackIDs.get(arg2)).add(Integer.valueOf(arg1));
+ ((ArrayList<String>) stackNames.get(arg2)).add(arg0);
+ }
+ } catch (Throwable t) {
+ return;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java
new file mode 100644
index 0000000000..7aa5ff4f90
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java
@@ -0,0 +1,233 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.IRETURN;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class ClassTransformer_IC2_GetHarvestTool {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+ private final String className;
+
+ private final String aName_getItemDropped;
+ private final String aName_damageDropped;
+
+ public static String getHarvestTool(int aMeta) {
+ return "wrench";
+ }
+
+ public static Item getItemDropped(Block aBlock, int meta, Random random, int fortune) {
+ return Item.getItemFromBlock(aBlock);
+ }
+
+ public static int damageDropped(int aMeta) {
+ return aMeta;
+ }
+
+ public ClassTransformer_IC2_GetHarvestTool(byte[] basicClass, boolean obfuscated, String aClassName) {
+ className = aClassName;
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+
+ aName_getItemDropped = obfuscated ? "func_149650_a" : "getItemDropped";
+ aName_damageDropped = obfuscated ? "func_149692_a" : "damageDropped";
+
+ FMLRelaunchLog.log(
+ "[GT++ ASM] IC2 getHarvestTool Patch",
+ Level.INFO,
+ "Attempting to patch in mode " + className + ". Obfuscated? " + obfuscated);
+
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new localClassVisitor(aTempWriter, className), 0);
+
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Valid patch? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null) {
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Attempting Method Injection.");
+ injectMethod("getHarvestTool");
+ if (aClassName.equals("ic2.core.block.machine.BlockMachine2")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine3")
+ || aClassName.equals("ic2.core.block.wiring.BlockElectric")) {
+ injectMethod(aName_getItemDropped);
+ injectMethod(aName_damageDropped);
+ } else if (aClassName.equals("ic2.core.block.generator.block.BlockGenerator")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine")) {
+ injectMethod(aName_damageDropped);
+ }
+ }
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethod(String aMethodName) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ String aFormattedClassName = className.replace('.', '/');
+ ClassWriter cw = getWriter();
+
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ if (aMethodName.equals("getHarvestTool")) {
+ mv = getWriter().visitMethod(ACC_PUBLIC, "getHarvestTool", "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(63, l0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "getHarvestTool",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("aMeta", "I", null, l0, l1, 1);
+ mv.visitMaxs(1, 2);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aName_getItemDropped)) {
+ mv = cw.visitMethod(
+ ACC_PUBLIC,
+ aName_getItemDropped,
+ "(ILjava/util/Random;I)Lnet/minecraft/item/Item;",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(44, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ILOAD, 3);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "getItemDropped",
+ "(Lnet/minecraft/block/Block;ILjava/util/Random;I)Lnet/minecraft/item/Item;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("meta", "I", null, l0, l1, 1);
+ mv.visitLocalVariable("random", "Ljava/util/Random;", null, l0, l1, 2);
+ mv.visitLocalVariable("fortune", "I", null, l0, l1, 3);
+ mv.visitMaxs(4, 4);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aName_damageDropped)) {
+ mv = cw.visitMethod(ACC_PUBLIC, aName_damageDropped, "(I)I", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(48, l0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "damageDropped",
+ "(I)I",
+ false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("meta", "I", null, l0, l1, 1);
+ mv.visitMaxs(1, 2);
+ mv.visitEnd();
+ didInject = true;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public final class localClassVisitor extends ClassVisitor {
+
+ String aClassName;
+
+ public localClassVisitor(ClassVisitor cv, String aName) {
+ super(ASM5, cv);
+ aClassName = aName;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ if (aClassName.equals("ic2.core.block.machine.BlockMachine2")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine3")
+ || aClassName.equals("ic2.core.block.wiring.BlockElectric")) {
+ if (name.equals(aName_getItemDropped)) {
+ methodVisitor = null;
+ } else if (name.equals(aName_damageDropped)) {
+ methodVisitor = null;
+ } else if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ } else if (aClassName.equals("ic2.core.block.generator.block.BlockGenerator")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine")) {
+ if (name.equals(aName_damageDropped)) {
+ methodVisitor = null;
+ } else if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ } else {
+ if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ }
+ if (methodVisitor == null) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java
new file mode 100644
index 0000000000..4d3c78e6bd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java
@@ -0,0 +1,297 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ACC_SYNCHRONIZED;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.client.settings.KeyBinding;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ClassTransformer_LWJGL_Keyboard {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ private static final HashMap<String, String> mBadKeyCache = new HashMap<>();
+
+ /**
+ * Gets a key's name
+ *
+ * @param key The key
+ * @return a String with the key's human readable name in it or null if the key is unnamed
+ */
+ public static synchronized String getKeyName(int key) {
+ if (init()) {
+ String[] aTemp = getKeyName();
+ if (key < aTemp.length && key >= 0) {
+ return aTemp[key];
+ }
+ }
+ String aCachedValue = mBadKeyCache.get("key-" + key);
+ if (aCachedValue == null) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Unable to map key code " + key + " to LWJGL keymap.");
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Caching key value to be empty.");
+ // mBadKeyCache.put("key-"+key, getKeyName()[0x00]);
+ aCachedValue = "FIX!";
+ mBadKeyCache.put("key-" + key, aCachedValue);
+ trySetClientKey(key);
+ }
+ return aCachedValue; // Return nothing
+ }
+
+ public static void trySetClientKey(int aKey) {
+ if (Utils.isClient() && ReflectionUtils.doesClassExist("net.minecraft.client.Minecraft")) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Trying to set key value to be empty.");
+ GameSettings options = Minecraft.getMinecraft().gameSettings;
+ KeyBinding[] akeybinding = Minecraft.getMinecraft().gameSettings.keyBindings;
+ int i = akeybinding.length;
+ for (KeyBinding keybinding : akeybinding) {
+ if (keybinding != null && keybinding.getKeyCode() == aKey) {
+ options.setOptionKeyBinding(keybinding, 0);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Set keybind " + aKey + " to 0.");
+ break;
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ private static Class mKeyboard;
+
+ private static Field mKeyName;
+
+ @SuppressWarnings("rawtypes")
+ private static boolean init() {
+ if (mKeyName != null) {
+ return true;
+ }
+ Class aKeyboard = ReflectionUtils.getClass("org.lwjgl.input.Keyboard");
+ if (aKeyboard != null) {
+ mKeyboard = aKeyboard;
+ Field aKeyName = ReflectionUtils.getField(mKeyboard, "keyName");
+ if (aKeyName != null) {
+ mKeyName = aKeyName;
+ }
+ }
+ return mKeyName != null;
+ }
+
+ private static String[] getKeyName() {
+ if (init()) {
+ try {
+ Object o = mKeyName.get(null);
+ if (o instanceof String[]y) {
+ return y;
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ }
+ return new String[] {};
+ }
+
+ public ClassTransformer_LWJGL_Keyboard(byte[] basicClass, boolean isClientSettings) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ if (!isClientSettings) {
+ // gtPlusPlus.preloader.keyboard.BetterKeyboard.init();
+ aTempReader.accept(new PatchLWJGL(aTempWriter), 0);
+ injectLWJGLPatch(aTempWriter);
+ } else {
+ // gtPlusPlus.preloader.keyboard.BetterKeyboard.init();
+ aTempReader.accept(new PatchClientSettings(aTempWriter), 0);
+ injectClientSettingPatch(aTempWriter);
+ }
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Valid? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ private boolean isClientSettingsObfuscated = false;
+
+ public boolean injectLWJGLPatch(ClassWriter cw) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Injecting " + "getKeyName" + ".");
+ mv = cw
+ .visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_SYNCHRONIZED, "getKeyName", "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(49, l0);
+ mv.visitVarInsn(ILOAD, 0);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard",
+ "getKeyName",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("key", "I", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public boolean injectClientSettingPatch(ClassWriter cw) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ String aMethodName = this.isClientSettingsObfuscated ? "func_74298_c" : "getKeyDisplayString";
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, aMethodName, "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(130, l0);
+ mv.visitVarInsn(ILOAD, 0);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/keyboard/BetterKeyboard",
+ "getKeyDisplayString",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("p_74298_0_", "I", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public class PatchClientSettings extends ClassVisitor {
+
+ public PatchClientSettings(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ private final String[] aMethodsToStrip = new String[] { "func_74298_c", "getKeyDisplayString" };
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ if (name.equals(aMethodsToStrip[0])) {
+ isClientSettingsObfuscated = true;
+ } else {
+ isClientSettingsObfuscated = false;
+ }
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+ if (found) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+
+ public class PatchLWJGL extends ClassVisitor {
+
+ public PatchLWJGL(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ private final String[] aMethodsToStrip = new String[] { "getKeyName" };
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+ if (found) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java
new file mode 100644
index 0000000000..cf8b08d40c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java
@@ -0,0 +1,317 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.AALOAD;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACONST_NULL;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ARRAYLENGTH;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ASTORE;
+import static org.objectweb.asm.Opcodes.DUP;
+import static org.objectweb.asm.Opcodes.F_APPEND;
+import static org.objectweb.asm.Opcodes.F_CHOP;
+import static org.objectweb.asm.Opcodes.F_SAME;
+import static org.objectweb.asm.Opcodes.F_SAME1;
+import static org.objectweb.asm.Opcodes.GETSTATIC;
+import static org.objectweb.asm.Opcodes.GOTO;
+import static org.objectweb.asm.Opcodes.I2L;
+import static org.objectweb.asm.Opcodes.ICONST_0;
+import static org.objectweb.asm.Opcodes.IFEQ;
+import static org.objectweb.asm.Opcodes.IFLE;
+import static org.objectweb.asm.Opcodes.IFNONNULL;
+import static org.objectweb.asm.Opcodes.IFNULL;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.ISTORE;
+import static org.objectweb.asm.Opcodes.L2I;
+import static org.objectweb.asm.Opcodes.LDIV;
+import static org.objectweb.asm.Opcodes.LREM;
+import static org.objectweb.asm.Opcodes.NEW;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class ClassTransformer_TC_ItemWispEssence {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ public ClassTransformer_TC_ItemWispEssence(byte[] basicClass, boolean obfuscated2) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ FMLRelaunchLog.log(
+ "[GT++ ASM] Thaumcraft WispEssence_Patch",
+ Level.INFO,
+ "Are we patching obfuscated methods? " + obfuscated2);
+ String aGetColour = obfuscated2 ? "func_82790_a" : "getColorFromItemStack";
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new AddAdapter(aTempWriter, new String[] { "getAspects", aGetColour }), 0);
+ injectMethod("getAspects", aTempWriter, obfuscated2);
+ injectMethod(aGetColour, aTempWriter, obfuscated2);
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Valid? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethod(String aMethodName, ClassWriter cw, boolean obfuscated) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ FMLRelaunchLog.log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Injecting " + aMethodName + ".");
+
+ String aGetColour = obfuscated ? "func_82790_a" : "getColorFromItemStack";
+ String aHasTagCompound = obfuscated ? "func_77942_o" : "hasTagCompound";
+ String aGetTagCompound = obfuscated ? "func_77978_p" : "getTagCompound";
+
+ if (aMethodName.equals("getAspects")) {
+ mv = cw.visitMethod(
+ ACC_PUBLIC,
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(141, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(142, l2);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(144, l1);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/item/ItemStack", aHasTagCompound, "()Z", false);
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFEQ, l3);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(145, l4);
+ mv.visitTypeInsn(NEW, "thaumcraft/api/aspects/AspectList");
+ mv.visitInsn(DUP);
+ mv.visitMethodInsn(INVOKESPECIAL, "thaumcraft/api/aspects/AspectList", "<init>", "()V", false);
+ mv.visitVarInsn(ASTORE, 2);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLineNumber(146, l5);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "net/minecraft/item/ItemStack",
+ aGetTagCompound,
+ "()Lnet/minecraft/nbt/NBTTagCompound;",
+ false);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/api/aspects/AspectList",
+ "readFromNBT",
+ "(Lnet/minecraft/nbt/NBTTagCompound;)V",
+ false);
+ Label l6 = new Label();
+ mv.visitLabel(l6);
+ mv.visitLineNumber(147, l6);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/AspectList", "size", "()I", false);
+ Label l7 = new Label();
+ mv.visitJumpInsn(IFLE, l7);
+ mv.visitVarInsn(ALOAD, 2);
+ Label l8 = new Label();
+ mv.visitJumpInsn(GOTO, l8);
+ mv.visitLabel(l7);
+ mv.visitFrame(F_APPEND, 1, new Object[] { "thaumcraft/api/aspects/AspectList" }, 0, null);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitLabel(l8);
+ mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { "thaumcraft/api/aspects/AspectList" });
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(149, l3);
+ mv.visitFrame(F_CHOP, 1, null, 0, null);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitInsn(ARETURN);
+ Label l9 = new Label();
+ mv.visitLabel(l9);
+ mv.visitLocalVariable(
+ "this",
+ "LgtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence;",
+ null,
+ l0,
+ l9,
+ 0);
+ mv.visitLocalVariable("itemstack", "Lnet/minecraft/item/ItemStack;", null, l0, l9, 1);
+ mv.visitLocalVariable("aspects", "Lthaumcraft/api/aspects/AspectList;", null, l5, l3, 2);
+ mv.visitMaxs(2, 3);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aGetColour)) {
+
+ // thaumcraft/common/items/ItemWispEssence
+ mv = cw.visitMethod(ACC_PUBLIC, aGetColour, "(Lnet/minecraft/item/ItemStack;I)I", null, null);
+ AnnotationVisitor av0;
+ {
+ av0 = mv.visitAnnotation("Lcpw/mods/fml/relauncher/SideOnly;", true);
+ av0.visitEnum("value", "Lcpw/mods/fml/relauncher/Side;", "CLIENT");
+ av0.visitEnd();
+ }
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(197, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(198, l2);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(IRETURN);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(200, l1);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/common/items/ItemWispEssence",
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ false);
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFNULL, l3);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(201, l4);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/common/items/ItemWispEssence",
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ false);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/api/aspects/AspectList",
+ "getAspects",
+ "()[Lthaumcraft/api/aspects/Aspect;",
+ false);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/Aspect", "getColor", "()I", false);
+ mv.visitInsn(IRETURN);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(203, l3);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
+ mv.visitLdcInsn(new Long(500L));
+ mv.visitInsn(LDIV);
+ mv.visitFieldInsn(
+ GETSTATIC,
+ "thaumcraft/common/items/ItemWispEssence",
+ "displayAspects",
+ "[Lthaumcraft/api/aspects/Aspect;");
+ mv.visitInsn(ARRAYLENGTH);
+ mv.visitInsn(I2L);
+ mv.visitInsn(LREM);
+ mv.visitInsn(L2I);
+ mv.visitVarInsn(ISTORE, 3);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLineNumber(204, l5);
+ mv.visitFieldInsn(
+ GETSTATIC,
+ "thaumcraft/common/items/ItemWispEssence",
+ "displayAspects",
+ "[Lthaumcraft/api/aspects/Aspect;");
+ mv.visitVarInsn(ILOAD, 3);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/Aspect", "getColor", "()I", false);
+ mv.visitInsn(IRETURN);
+ Label l6 = new Label();
+ mv.visitLabel(l6);
+ mv.visitLocalVariable("this", "Lthaumcraft/common/items/ItemWispEssence;", null, l0, l6, 0);
+ mv.visitLocalVariable("stack", "Lnet/minecraft/item/ItemStack;", null, l0, l6, 1);
+ mv.visitLocalVariable("par2", "I", null, l0, l6, 2);
+ mv.visitLocalVariable("idx", "I", null, l5, l6, 3);
+ mv.visitMaxs(4, 4);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ FMLRelaunchLog.log(
+ "[GT++ ASM] Thaumcraft WispEssence_Patch",
+ Level.INFO,
+ "Method injection complete. " + (obfuscated ? "Obfuscated" : "Non-Obfuscated"));
+ return didInject;
+ }
+
+ public class AddAdapter extends ClassVisitor {
+
+ public AddAdapter(ClassVisitor cv, String[] aMethods) {
+ super(ASM5, cv);
+ this.cv = cv;
+ this.aMethodsToStrip = aMethods;
+ }
+
+ private final String[] aMethodsToStrip;
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+
+ if (found) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
new file mode 100644
index 0000000000..82526b1290
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.IFEQ;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.RETURN;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class Preloader_ClassTransformer {
+
+ public static final class OreDictionaryVisitor extends ClassVisitor {
+
+ public OreDictionaryVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ if (name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V")) {
+ FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Unobfuscated]");
+ return new RegisterOreImplVisitor(methodVisitor, false);
+ } else if (name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Ladd;)V")) {
+ FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Obfuscated]");
+ return new RegisterOreImplVisitor(methodVisitor, true);
+ }
+ return methodVisitor;
+ }
+ }
+
+ private static final class RegisterOreImplVisitor extends MethodVisitor {
+
+ private final boolean mObfuscated;
+
+ public RegisterOreImplVisitor(MethodVisitor mv, boolean obfuscated) {
+ super(ASM5, mv);
+ this.mObfuscated = obfuscated;
+ }
+
+ @Override
+ public void visitCode() {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Fixing Forge's poor attempt at an oreDictionary.");
+ super.visitCode();
+ super.visitVarInsn(ALOAD, 0);
+ super.visitVarInsn(ALOAD, 1);
+ if (!mObfuscated) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Injecting target method. [Unobfuscated]");
+ super.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/Preloader_GT_OreDict",
+ "shouldPreventRegistration",
+ "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z",
+ false);
+ } else {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Injecting target method. [Obfuscated]");
+ super.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/Preloader_GT_OreDict",
+ "shouldPreventRegistration",
+ "(Ljava/lang/String;Ladd;)Z",
+ false);
+ }
+ Label endLabel = new Label();
+ super.visitJumpInsn(IFEQ, endLabel);
+ super.visitInsn(RETURN);
+ super.visitLabel(endLabel);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
new file mode 100644
index 0000000000..922ce88e27
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.launchwrapper.IClassTransformer;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.Preloader_Logger;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.preloader.asm.transformers.Preloader_ClassTransformer.OreDictionaryVisitor;
+
+public class Preloader_Transformer_Handler implements IClassTransformer {
+
+ private static final Set<String> IC2_WRENCH_PATCH_CLASS_NAMES = new HashSet<>();
+ private static final String LWJGL_KEYBOARD = "org.lwjgl.input.Keyboard";
+ private static final String MINECRAFT_GAMESETTINGS = "net.minecraft.client.settings.GameSettings";
+ private static final String FORGE_CHUNK_MANAGER = "net.minecraftforge.common.ForgeChunkManager";
+ private static final String FORGE_ORE_DICTIONARY = "net.minecraftforge.oredict.OreDictionary";
+ private static final String COFH_ORE_DICTIONARY_ARBITER = "cofh.core.util.oredict.OreDictionaryArbiter";
+ private static final String THAUMCRAFT_ITEM_WISP_ESSENCE = "thaumcraft.common.items.ItemWispEssence";
+
+ static {
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.BlockTileEntity");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine2");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine3");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.kineticgenerator.block.BlockKineticGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.heatgenerator.block.BlockHeatGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.generator.block.BlockGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorAccessHatch");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorChamber");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorFluidPort");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorRedstonePort");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorVessel");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.personal.BlockPersonal.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockChargepad.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockElectric.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockLuminator.class");
+ }
+
+ @Override
+ public byte[] transform(String name, String transformedName, byte[] basicClass) {
+ // Fix LWJGL index array out of bounds on keybinding IDs
+ if ((transformedName.equals(LWJGL_KEYBOARD) || transformedName.equals(MINECRAFT_GAMESETTINGS))
+ && AsmConfig.enabledLwjglKeybindingFix
+ // Do not transform if using lwjgl3
+ && !ReflectionUtils.doesClassExist("org.lwjgl.system.Platform")) {
+ boolean isClientSettingsClass = !transformedName.equals("org.lwjgl.input.Keyboard");
+ Preloader_Logger.INFO("LWJGL Keybinding index out of bounds fix", "Transforming " + transformedName);
+ return new ClassTransformer_LWJGL_Keyboard(basicClass, isClientSettingsClass).getWriter()
+ .toByteArray();
+ }
+
+ // Fix the OreDictionary - Forge
+ if (transformedName.equals(FORGE_ORE_DICTIONARY) && AsmConfig.enableOreDictPatch) {
+ Preloader_Logger.INFO("OreDictTransformer", "Transforming " + transformedName);
+ ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ new ClassReader(basicClass).accept(new OreDictionaryVisitor(classWriter), 0);
+ return classWriter.toByteArray();
+ }
+
+ // Fix the OreDictionary COFH
+ if (transformedName.equals(COFH_ORE_DICTIONARY_ARBITER)
+ && (AsmConfig.enableCofhPatch || CORE_Preloader.DEV_ENVIRONMENT)) {
+ Preloader_Logger.INFO("COFH", "Transforming " + transformedName);
+ return new ClassTransformer_COFH_OreDictionaryArbiter(basicClass).getWriter()
+ .toByteArray();
+ }
+
+ if (IC2_WRENCH_PATCH_CLASS_NAMES.contains(transformedName)) {
+ Preloader_Logger.INFO("IC2 getHarvestTool Patch", "Transforming " + transformedName);
+ return new ClassTransformer_IC2_GetHarvestTool(basicClass, !CORE_Preloader.DEV_ENVIRONMENT, transformedName)
+ .getWriter()
+ .toByteArray();
+ }
+
+ // Fix Thaumcraft stuff
+ // Patching ItemWispEssence to allow invalid item handling
+ if (transformedName.equals(THAUMCRAFT_ITEM_WISP_ESSENCE) && AsmConfig.enableTcAspectSafety) {
+ Preloader_Logger.INFO("Thaumcraft WispEssence_Patch", "Transforming " + transformedName);
+ return new ClassTransformer_TC_ItemWispEssence(basicClass, !CORE_Preloader.DEV_ENVIRONMENT).getWriter()
+ .toByteArray();
+ }
+
+ return basicClass;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java b/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java
new file mode 100644
index 0000000000..510689911c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2002-2008 LWJGL Project All rights reserved. Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions are met: * Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in
+ * binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution. * Neither the name of 'LWJGL' nor the names of
+ * its contributors may be used to endorse or promote products derived from this software without specific prior written
+ * permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package gtPlusPlus.preloader.keyboard;
+
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.resources.I18n;
+
+import org.apache.logging.log4j.Level;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.input.Keyboard;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.asm.transformers.ClassTransformer_LWJGL_Keyboard;
+
+/**
+ * <br>
+ * A raw Keyboard interface. This can be used to poll the current state of the keys, or read all the keyboard presses /
+ * releases since the last read.
+ *
+ * DO NOT REMOVE. CALLED BY ASM CODE.
+ *
+ * @author cix_foo <cix_foo@users.sourceforge.net>
+ * @author elias_naur <elias_naur@users.sourceforge.net>
+ * @author Brian Matzon <brian@matzon.dk>
+ * @version $Revision$ $Id$
+ */
+@SuppressWarnings("unused")
+public class BetterKeyboard {
+
+ public static final int KEYBOARD_SIZE = Short.MAX_VALUE;
+
+ private static boolean init = false;
+
+ public static void init() {
+ if (!init) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Trying to patch out LWJGL internal arrays with larger ones.");
+ Field aKeyNameSize = ReflectionUtils.getField(Keyboard.class, "keyName");
+ Field aKeyMapSize = ReflectionUtils.getField(Keyboard.class, "keyMap");
+ Field aKeyDownBuffer = ReflectionUtils.getField(Keyboard.class, "keyDownBuffer");
+ String[] aOldKeyNameArray = ReflectionUtils.getFieldValue(aKeyNameSize);
+ if (aOldKeyNameArray != null && aOldKeyNameArray.length < Short.MAX_VALUE) {
+ String[] aNewKeyNameArray = new String[Short.MAX_VALUE];
+ for (int i = 0; i < aOldKeyNameArray.length; i++) {
+ aNewKeyNameArray[i] = aOldKeyNameArray[i];
+ }
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyNameSize.getName(), aNewKeyNameArray);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyNameSize.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ Map<String, Integer> aOldKeyMapArray = ReflectionUtils.getFieldValue(aKeyMapSize);
+ if (aOldKeyNameArray != null && aOldKeyMapArray.size() < Short.MAX_VALUE) {
+ Map<String, Integer> aNewKeyMapArray = new HashMap<String, Integer>(Short.MAX_VALUE);
+ aNewKeyMapArray.putAll(aOldKeyMapArray);
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyMapSize.getName(), aNewKeyMapArray);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyMapSize.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ ByteBuffer aOldByteBuffer = ReflectionUtils.getFieldValue(aKeyDownBuffer);
+ if (aOldByteBuffer != null && aOldByteBuffer.capacity() == Keyboard.KEYBOARD_SIZE) {
+ ByteBuffer aNewByteBuffer = BufferUtils.createByteBuffer(Short.MAX_VALUE);
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyDownBuffer.getName(), aNewByteBuffer);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyDownBuffer.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ init = true;
+ }
+ }
+
+ /**
+ * Gets a key's name
+ *
+ * @param key The key
+ * @return a String with the key's human readable name in it or null if the key is unnamed
+ */
+ public static synchronized String getKeyName(int key) {
+ return ClassTransformer_LWJGL_Keyboard.getKeyName(key);
+ }
+
+ /**
+ * Represents a key or mouse button as a string. Args: key
+ */
+ public static String getKeyDisplayString(int aKeyValue) {
+ return aKeyValue < 0 ? I18n.format("key.mouseButton", new Object[] { Integer.valueOf(aKeyValue + 101) })
+ : getKeyName(aKeyValue);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java b/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java
new file mode 100644
index 0000000000..347010f71b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.recipes;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class CokeAndPyrolyseOven {
+
+ public static void onLoadComplete() {
+ convertPyroToCokeOven();
+ }
+
+ public static void postInit() {
+ Logger.INFO("Loading Recipes for Industrial Coking Oven.");
+ // Wood to Charcoal
+ // Try use all woods found
+ ArrayList<ItemStack> aLogData = OreDictionary.getOres("logWood");
+ for (ItemStack stack : aLogData) {
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ ItemUtils.getSimpleStack(stack, 20),
+ 20,
+ GT_ModHandler.getSteam(1000),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 24L),
+ FluidUtils.getFluidStack("fluid.coalgas", 1440),
+ 60,
+ 30);
+ }
+
+ // Coal to Coke
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16L),
+ 22,
+ GT_ModHandler.getSteam(1000),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 10),
+ FluidUtils.getFluidStack("fluid.coalgas", 2880),
+ 30,
+ 120);
+
+ // Coke & Coal
+ CORE.RA.addCokeOvenRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 12L),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 6),
+ GT_ModHandler.getSteam(2000),
+ FluidUtils.getFluidStack("fluid.coalgas", 5040),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 14),
+ 60 * 20,
+ 240);
+
+ }
+
+ private static void convertPyroToCokeOven() {
+ int aCount = 0;
+ for (GT_Recipe g : RecipeMaps.pyrolyseRecipes.getAllRecipes()) {
+ if (AddGregtechRecipe.importPyroRecipe(g)) {
+ aCount++;
+ }
+ }
+ Logger.INFO("Converted " + aCount + " Pyrolyse recipes into Industrial Coke Oven recipes.");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java b/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java
new file mode 100644
index 0000000000..4462f81fc7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java
@@ -0,0 +1,107 @@
+package gtPlusPlus.recipes;
+
+import static gtPlusPlus.core.util.minecraft.MaterialUtils.getMaterialName;
+
+import java.util.Collection;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import advsolar.common.AdvancedSolarPanel;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeRemovals {
+
+ public static void postInit() {
+ if (Mods.AdvancedSolarPanel.isModLoaded()) {
+ RecipeUtils.removeRecipeByOutput(ItemUtils.getSimpleStack(AdvancedSolarPanel.blockMolecularTransformer));
+ }
+ }
+
+ public static void onLoadComplete() {
+ removeCrudeTurbineRotors();
+ }
+
+ // Doesn't actually remove recipes, just hide them
+ private static void removeCrudeTurbineRotors() {
+ int aRemoved = 0;
+ int CUT = CORE.turbineCutoffBase;
+ Item aU;
+ Collection<GT_Recipe> aAssRecipes = RecipeMaps.assemblerRecipes.getAllRecipes();
+ // 170, 172, 174, 176
+ if (aAssRecipes.size() > 0) {
+ for (GT_Recipe aG : aAssRecipes) {
+ if (ArrayUtils.isNotEmpty(aG.mOutputs)) {
+ for (ItemStack aI : aG.mOutputs) {
+ if (aI == null) {
+ continue;
+ }
+ aU = aI.getItem();
+ if (aU == null) {
+ continue;
+ }
+ if (aU instanceof GT_MetaGenerated_Tool_01) {
+ int aMeta = aI.getItemDamage();
+ // Found a Turbine
+ if (aMeta >= 170 && aMeta <= 176) {
+ int aCutoff;
+ String aType;
+ switch (aMeta) {
+ case 170 -> {
+ aCutoff = CUT;
+ aType = "Small ";
+ }
+ case 172 -> {
+ aCutoff = 2 * CUT;
+ aType = "";
+ }
+ case 174 -> {
+ aCutoff = 3 * CUT;
+ aType = "Large ";
+ }
+ default -> { // 176
+ aCutoff = 4 * CUT;
+ aType = "Huge ";
+ }
+ }
+ Materials aMainMaterial = GT_MetaGenerated_Tool.getPrimaryMaterial(aI);
+ Materials aSecondaryMaterial = GT_MetaGenerated_Tool.getSecondaryMaterial(aI);
+ long rotorDurabilityMax = GT_MetaGenerated_Tool.getToolMaxDamage(aI);
+ if (rotorDurabilityMax < aCutoff) {
+ Logger.WARNING(
+ "[Turbine Cleanup] " + getMaterialName(aMainMaterial)
+ + " "
+ + aType
+ + "Turbines have "
+ + rotorDurabilityMax
+ + ", which is below the cutoff durability of "
+ + aCutoff
+ + ", disabling.");
+ aG.mEnabled = false;
+ aG.mHidden = true;
+ aG.mCanBeBuffered = false;
+ aRemoved++;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Logger.INFO("Removed " + aRemoved + " useless Turbines.");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java b/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java
new file mode 100644
index 0000000000..9ca5488280
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.xmod.bartcrops;
+
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class HANDLER_CropsPlusPlus {
+
+ public static void preInit(FMLPreInitializationEvent preinit) {
+ LoaderOfTheCrops.load(preinit);
+ }
+
+ public static void postInit(FMLPostInitializationEvent postinit) {
+ LoaderOfTheCrops.register();
+ LoaderOfTheCrops.registerBaseSeed();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java b/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java
new file mode 100644
index 0000000000..c3c2f0b6cc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.xmod.bartcrops;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bartcrops.crops.Crop_Hemp;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.Crops;
+
+/**
+ * Mostly borrowed from the Crops++ Crop Loader.
+ *
+ * @author Alkalus
+ */
+public class LoaderOfTheCrops {
+
+ private static List<Boolean> mHasCropObj = new ArrayList<>();
+ private CropCard mCropObj;
+ private ItemStack mBaseSeed;
+ private static List<LoaderOfTheCrops> mCropList = cropLoader();
+
+ public LoaderOfTheCrops(CropCard cropObj) {
+ this.mCropObj = cropObj;
+ }
+
+ public LoaderOfTheCrops(CropCard cropObj, ItemStack baseseed) {
+ this.mCropObj = cropObj;
+ this.mBaseSeed = baseseed;
+ }
+
+ public static CropCard cropUnpackerCC(LoaderOfTheCrops inp) {
+ return inp.mCropObj;
+ }
+
+ private static ItemStack cropUnpackerCG(LoaderOfTheCrops inp) {
+ return inp.mBaseSeed;
+ }
+
+ private static LoaderOfTheCrops cropHelper(CropCard cropObj) {
+ return new LoaderOfTheCrops(cropObj, ItemUtils.getItemStackOfAmountFromOreDict("crop" + cropObj.name(), 0));
+ }
+
+ public static List<LoaderOfTheCrops> cropLoader() {
+ List<LoaderOfTheCrops> p = new ArrayList<>();
+
+ p.add(new LoaderOfTheCrops(new Crop_Hemp(), new ItemStack(Item.getItemById(111), 3)));
+
+ return p;
+ }
+
+ private static List<CropCard> cropObjs() {
+ List<CropCard> p = new ArrayList<>();
+
+ for (LoaderOfTheCrops loaderOfTheCrops : mCropList) {
+ p.add(cropUnpackerCC((LoaderOfTheCrops) loaderOfTheCrops));
+ }
+
+ return p;
+ }
+
+ private static List<ItemStack> setBaseSeed() {
+ List<ItemStack> p = new ArrayList<>();
+
+ for (LoaderOfTheCrops loaderOfTheCrops : mCropList) {
+ p.add(cropUnpackerCG((LoaderOfTheCrops) loaderOfTheCrops));
+ }
+
+ return p;
+ }
+
+ private static List<String> setnames() {
+ List<String> s = new ArrayList<>();
+
+ for (int i = 0; i < mCropList.size(); ++i) {
+ s.add(((CropCard) cropObjs().get(i)).name());
+ }
+
+ return s;
+ }
+
+ public static void load(FMLPreInitializationEvent preinit) {
+ for (int i = 0; i < mCropList.size(); ++i) {
+ mHasCropObj.add(true);
+ }
+ }
+
+ public static void register() {
+ for (int i = 0; i < mCropList.size(); ++i) {
+ if ((Boolean) mHasCropObj.get(i) && cropObjs().get(i) != null) {
+ Crops.instance.registerCrop((CropCard) cropObjs().get(i));
+ }
+ }
+ }
+
+ public static void registerBaseSeed() {
+ List<ItemStack> baseseed = new ArrayList<>(setBaseSeed());
+
+ for (int i = 0; i < mCropList.size(); ++i) {
+ if (baseseed.get(i) != null && cropObjs().get(i) != null) {
+ Crops.instance.registerBaseSeed((ItemStack) baseseed.get(i), (CropCard) cropObjs().get(i), 1, 1, 1, 1);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java
new file mode 100644
index 0000000000..c794c40878
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import gtPlusPlus.preloader.CORE_Preloader;
+import ic2.api.crops.ICropTile;
+
+public abstract class BaseAestheticCrop extends BaseHarvestableCrop {
+
+ @Override
+ public int tier() {
+ return 1;
+ }
+
+ @Override
+ public int stat(int n) {
+ return switch (n) {
+ case 0 -> 0;
+ case 1 -> 0;
+ case 2 -> 0;
+ case 3 -> 4;
+ case 4 -> 0;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ return CORE_Preloader.DEBUG_MODE ? 1 : 225;
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return 1;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java
new file mode 100644
index 0000000000..405c1ef1e1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.ICropTile;
+import speiger.src.crops.api.ICropCardInfo;
+
+public abstract class BaseCrop extends CropCard implements ICropCardInfo {
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerSprites(IIconRegister iconRegister) {
+ this.textures = new IIcon[this.maxSize()];
+ for (int i = 1; i <= this.textures.length; ++i) {
+ this.textures[i - 1] = iconRegister
+ .registerIcon(GTPlusPlus.ID + ":crop/blockCrop." + this.name() + "." + i);
+ }
+ }
+
+ @Override
+ public float dropGainChance() {
+ return (float) (Math.pow(0.95D, (double) ((float) this.tier())) * (double) 1f);
+ }
+
+ @Override
+ public boolean canCross(ICropTile crop) {
+ return crop.getSize() == this.maxSize();
+ }
+
+ @Override
+ public int getrootslength(ICropTile crop) {
+ return 3;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return "Alkalus";
+ }
+
+ @Override
+ public String owner() {
+ return "Gtplusplus";
+ }
+
+ @Override
+ public List<String> getCropInformation() {
+ List<String> ret = new ArrayList<>();
+ ret.add(Arrays.toString(this.attributes()));
+ return ret;
+ }
+
+ public ItemStack getDisplayItem(CropCard card) {
+ return ItemUtils.getItemStackOfAmountFromOreDict("crop" + this.name(), 0);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java
new file mode 100644
index 0000000000..80325edff0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import gtPlusPlus.preloader.CORE_Preloader;
+import ic2.api.crops.ICropTile;
+
+public abstract class BaseHarvestableCrop extends BaseCrop {
+
+ @Override
+ public int tier() {
+ return 2;
+ }
+
+ @Override
+ public int stat(int n) {
+ return switch (n) {
+ case 0 -> 0;
+ case 1 -> 4;
+ case 2 -> 0;
+ case 3 -> 4;
+ case 4 -> 0;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public boolean canGrow(ICropTile crop) {
+ return crop.getSize() < 3;
+ }
+
+ @Override
+ public int getOptimalHavestSize(ICropTile crop) {
+ return 3;
+ }
+
+ @Override
+ public boolean canBeHarvested(ICropTile crop) {
+ return crop.getSize() == 3;
+ }
+
+ @Override
+ public int weightInfluences(ICropTile crop, float humidity, float nutrients, float air) {
+ return (int) ((double) humidity * 1.2D + (double) nutrients * 0.9D + (double) air * 0.9D);
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ short r;
+ if (CORE_Preloader.DEBUG_MODE) {
+ r = 1;
+ } else if (crop.getSize() == 2) {
+ r = 200;
+ } else {
+ r = 700;
+ }
+
+ return r;
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return 2;
+ }
+
+ @Override
+ public int maxSize() {
+ return 3;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return "Alkalus";
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java b/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java
new file mode 100644
index 0000000000..f5bf252edb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.xmod.bartcrops.crops;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.bartcrops.abstracts.BaseAestheticCrop;
+import ic2.api.crops.ICropTile;
+
+public class Crop_Hemp extends BaseAestheticCrop {
+
+ @Override
+ public int tier() {
+ return 2;
+ }
+
+ @Override
+ public String name() {
+ return "Hemp";
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ return 550;
+ }
+
+ @Override
+ public String[] attributes() {
+ return new String[] { "Green", "Soil", "Orange" };
+ }
+
+ @Override
+ public ItemStack getGain(ICropTile crop) {
+ return new ItemStack(Items.string, MathUtils.randInt(1, 3), 0);
+ }
+
+ @Override
+ public ItemStack getDisplayItem() {
+ return new ItemStack(Items.string, 1, 0);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java b/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java
new file mode 100644
index 0000000000..e3fdc9ae0a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java
@@ -0,0 +1,17 @@
+package gtPlusPlus.xmod.bartworks;
+
+import net.minecraft.item.ItemStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
+import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
+
+import gregtech.api.enums.OrePrefixes;
+
+public class BW_Utils {
+
+ public static ItemStack getCorrespondingItemStack(OrePrefixes orePrefixes, short werkstoffID, int amount) {
+ Werkstoff werkstoff = Werkstoff.werkstoffHashMap.get(werkstoffID);
+ if (werkstoff == null) return null;
+ return WerkstoffLoader.getCorrespondingItemStackUnsafe(orePrefixes, werkstoff, amount);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java b/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java
new file mode 100644
index 0000000000..7727eaef38
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java
@@ -0,0 +1,178 @@
+package gtPlusPlus.xmod.bop;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class HANDLER_BiomesOPlenty {
+
+ public static Item mPineCone;
+
+ public static Block logs1;
+ public static Block logs2;
+ public static Block logs3;
+ public static Block logs4;
+
+ public static Block leaves1;
+ public static Block leaves2;
+ public static Block leaves3;
+ public static Block leaves4;
+
+ public static Block colorizedLeaves1;
+ public static Block colorizedLeaves2;
+
+ public static Block saplings;
+ public static Block colorizedSaplings;
+
+ public static void preInit() {
+ BOP_Block_Registrator.run();
+ if (BiomesOPlenty.isModLoaded()) {
+ setFields();
+ registerPineconeToOreDict();
+ }
+ }
+
+ public static void postInit() {
+ BOP_Block_Registrator.recipes();
+ }
+
+ private static void registerPineconeToOreDict() {
+ if (mPineCone != null) {
+ ItemStack aPinecone = ItemUtils.simpleMetaStack(mPineCone, 13, 1);
+ if (aPinecone != null) {
+ ItemUtils.addItemToOreDictionary(aPinecone, "pinecone");
+ }
+ }
+ }
+
+ public static ItemStack getStack(Block aBlock, int aMeta, int aSize) {
+ return ItemUtils.simpleMetaStack(aBlock, aMeta, aSize);
+ }
+
+ // BOPCBlocks.logs4 - 0
+ // BOPCBlocks.colorizedLeaves2 - 1
+
+ private static void setFields() {
+ Field aBopMiscItem = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCItems"), "misc");
+
+ Field aBopBlock1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs1");
+ Field aBopBlock2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs2");
+ Field aBopBlock3 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs3");
+ Field aBopBlock4 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs4");
+
+ Field aBopLeaves1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves1");
+ Field aBopLeaves2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves2");
+ Field aBopLeaves3 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves3");
+ Field aBopLeaves4 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves4");
+
+ Field aBopColouredLeaves1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedLeaves1");
+ Field aBopColouredLeaves2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedLeaves2");
+
+ Field aBopSapling = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "saplings");
+ Field aBopColouredSapling = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedSaplings");
+
+ if (aBopMiscItem != null) {
+ Item aMiscItem = ReflectionUtils.getFieldValue(aBopMiscItem);
+ if (aMiscItem != null) {
+ mPineCone = aMiscItem;
+ }
+ }
+
+ if (aBopBlock1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock1);
+ if (aBlock != null) {
+ logs1 = aBlock;
+ }
+ }
+ if (aBopBlock2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock2);
+ if (aBlock != null) {
+ logs2 = aBlock;
+ }
+ }
+ if (aBopBlock3 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock3);
+ if (aBlock != null) {
+ logs3 = aBlock;
+ }
+ }
+ if (aBopBlock4 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock4);
+ if (aBlock != null) {
+ logs4 = aBlock;
+ }
+ }
+
+ if (aBopLeaves1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves1);
+ if (aBlock != null) {
+ leaves1 = aBlock;
+ }
+ }
+ if (aBopLeaves2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves2);
+ if (aBlock != null) {
+ leaves2 = aBlock;
+ }
+ }
+ if (aBopLeaves3 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves3);
+ if (aBlock != null) {
+ leaves3 = aBlock;
+ }
+ }
+ if (aBopLeaves4 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves4);
+ if (aBlock != null) {
+ leaves4 = aBlock;
+ }
+ }
+
+ if (aBopColouredLeaves1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredLeaves1);
+ if (aBlock != null) {
+ colorizedLeaves1 = aBlock;
+ }
+ }
+ if (aBopColouredLeaves2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredLeaves2);
+ if (aBlock != null) {
+ colorizedLeaves2 = aBlock;
+ }
+ }
+
+ if (aBopSapling != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopSapling);
+ if (aBlock != null) {
+ saplings = aBlock;
+ }
+ }
+ if (aBopColouredSapling != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredSapling);
+ if (aBlock != null) {
+ colorizedSaplings = aBlock;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java
new file mode 100644
index 0000000000..4a3c91e9cb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.xmod.bop.blocks;
+
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.loaders.oreprocessing.ProcessingLog.addPyrolyeOvenRecipes;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.bop.blocks.pine.LeavesPineTree;
+import gtPlusPlus.xmod.bop.blocks.pine.LogPineTree;
+import gtPlusPlus.xmod.bop.blocks.pine.SaplingPineTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.LeavesRainforestTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.LogRainforestTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.SaplingRainforestTree;
+
+public class BOP_Block_Registrator {
+
+ public static Block log_Rainforest;
+ public static Block leaves_Rainforest;
+ public static Block sapling_Rainforest;
+ public static Block log_Pine;
+ public static Block leaves_Pine;
+ public static Block sapling_Pine;
+
+ // Runs Each tree Type separately
+ public static void run() {
+ registerTree_Rainforest();
+ registerTree_Pine();
+ }
+
+ private static void registerTree_Rainforest() {
+ log_Rainforest = new LogRainforestTree();
+ leaves_Rainforest = new LeavesRainforestTree();
+ sapling_Rainforest = new SaplingRainforestTree();
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(log_Rainforest), "logWood", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(leaves_Rainforest), "treeLeaves", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(sapling_Rainforest), "treeSapling", true);
+ }
+
+ private static void registerTree_Pine() {
+ log_Pine = new LogPineTree();
+ leaves_Pine = new LeavesPineTree();
+ sapling_Pine = new SaplingPineTree();
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(log_Pine), "logWood", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(leaves_Pine), "treeLeaves", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(sapling_Pine), "treeSapling", true);
+ }
+
+ public static void recipes() {
+ // Rainforest Oak
+ addLogRecipes(ItemUtils.getSimpleStack(log_Rainforest));
+ // Pine
+ addLogRecipes(ItemUtils.getSimpleStack(log_Pine));
+ }
+
+ public static void addLogRecipes(final ItemStack aStack) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { aStack },
+ ItemUtils
+ .getSimpleStack(Item.getItemFromBlock(Blocks.planks), GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 4));
+ RecipeUtils.recipeBuilder(
+ CI.craftingToolSaw,
+ null,
+ null,
+ aStack,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(Item.getItemFromBlock(Blocks.planks), 4));
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 2L),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sLf", 'L', GT_Utility.copyAmount(1L, aStack) });
+
+ final short aMeta = (short) aStack.getItemDamage();
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1L, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1L, aStack));
+ }
+ if (aMeta == 32767) {
+ for (int i = 0; i < 32767; ++i) {
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(new ItemStack(aStack.getItem(), 1, i), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(new ItemStack(aStack.getItem(), 1, i));
+ }
+ final ItemStack tStack = GT_ModHandler.getRecipeOutput(new ItemStack(aStack.getItem(), 1, i));
+ if (tStack == null) {
+ if (i >= 16) {
+ break;
+ }
+ } else {
+ final ItemStack tPlanks = GT_Utility.copy(tStack);
+ tPlanks.stackSize = tPlanks.stackSize * 3 / 2;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack.stackSize)
+ : (((long) tStack.stackSize) * 5L / 4),
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipe(new ItemStack(aStack.getItem(), 1, i));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack.stackSize)
+ : (((long) tStack.stackSize) * 5L / 4),
+ tStack),
+ new Object[] { "s", "L", 'L', new ItemStack(aStack.getItem(), 1, i) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility
+ .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+ new Object[] { new ItemStack(aStack.getItem(), 1, i) });
+ }
+ }
+ } else {
+ final ItemStack tStack2 = GT_ModHandler.getRecipeOutput(GT_Utility.copyAmount(1L, aStack));
+ if (tStack2 != null) {
+ final ItemStack tPlanks2 = GT_Utility.copy(tStack2);
+ tPlanks2.stackSize = tPlanks2.stackSize * 3 / 2;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1L, aStack))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack2.stackSize)
+ : (((long) tStack2.stackSize) * 5L / 4),
+ tStack2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipe(GT_Utility.copyAmount(1L, aStack));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack2.stackSize)
+ : (((long) tStack2.stackSize) * 5L / 4),
+ tStack2),
+ new Object[] { "s", "L", 'L', GT_Utility.copyAmount(1L, aStack) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(tStack2.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack2),
+ new Object[] { GT_Utility.copyAmount(1L, aStack) });
+ }
+ }
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1L, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1L, aStack));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java
new file mode 100644
index 0000000000..171bb9a58c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockLeaves;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LeavesBase extends BlockLeaves {
+
+ protected IIcon[][] leafTextures = new IIcon[2][];
+ protected String[][] leafType = new String[][] { {}, {} };
+ protected String[] treeType = new String[] {};
+ protected ItemStack[] bonusDrops;
+
+ public LeavesBase(String blockNameLocalized, String blockNameUnlocalized, ItemStack[] bonusDrops) {
+ this.bonusDrops = bonusDrops;
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized) + "Leaves";
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "treeLeaves", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ Blocks.fire.setFireInfo(this, 80, 150);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ @Override
+ public int quantityDropped(Random p_149745_1_) {
+ return p_149745_1_.nextInt(20) == 0 ? 1 : 0;
+ }
+
+ @Override // Drops when Leaf is broken
+ protected void func_150124_c(World world, int x, int y, int z, int meta, int randomChance) {
+ Logger.INFO("Dropping Bonus Drops");
+ for (ItemStack bonusDrop : this.bonusDrops) {
+ if (bonusDrop != null && world.rand.nextInt(randomChance) == 0) {
+ this.dropBlockAsItem(world, x, y, z, ItemUtils.getSimpleStack(bonusDrop, 1));
+ }
+ }
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, @SuppressWarnings("rawtypes") List metaList) {
+ for (int i = 0; i < this.treeType.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int metaID) {
+ return (metaID & 3) == 1 ? this.leafTextures[this.field_150127_b][1]
+ : this.leafTextures[this.field_150127_b][0];
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ for (int i = 0; i < leafType.length; ++i) {
+ this.leafTextures[i] = new IIcon[leafType[i].length];
+ for (int j = 0; j < leafType[i].length; ++j) {
+ this.leafTextures[i][j] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "leaves/" + "leaves_" + leafType[i][j]);
+ }
+ }
+ setVanillaVariable(this.field_150129_M, this.leafTextures);
+ }
+
+ @Override
+ public String[] func_150125_e() {
+ return treeType;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java
new file mode 100644
index 0000000000..2cf8ba1fbc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java
@@ -0,0 +1,85 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.BlockLog;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class LogBase extends BlockLog {
+
+ public String[] treeType = new String[] {};
+ protected IIcon[] textureSide;
+ protected IIcon[] textureTop;
+
+ public LogBase(String blockNameLocalized, String blockNameUnlocalized, String[] treeTypes) {
+ this.treeType = treeTypes;
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized) + "Log";
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(
+ ItemUtils.getSimpleStack(this),
+ "log" + Utils.sanitizeString(blockNameLocalized),
+ true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "logWood", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ Blocks.fire.setFireInfo(this, 20, 100);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, List metaList) {
+ for (int i = 0; i < this.textureSide.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected IIcon getTopIcon(int meta) {
+ return this.textureTop[meta % this.textureTop.length];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected IIcon getSideIcon(int metaID) {
+ return this.textureSide[metaID % this.textureSide.length];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ this.textureSide = new IIcon[treeType.length];
+ this.textureTop = new IIcon[treeType.length];
+
+ for (int i = 0; i < this.textureSide.length; ++i) {
+ this.textureSide[i] = iIcon.registerIcon(GTPlusPlus.ID + ":" + "trees/" + "logs/" + "log_" + treeType[i]);
+ this.textureTop[i] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "logs/" + "log_" + treeType[i] + "_top");
+ }
+
+ setVanillaVariable(this.field_150167_a, this.textureSide);
+ setVanillaVariable(this.field_150166_b, this.textureTop);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java
new file mode 100644
index 0000000000..ff5c8770d4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java
@@ -0,0 +1,166 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class SaplingBase extends BlockSapling {
+
+ protected String[] saplingTypes = new String[] {};
+ protected IIcon[] saplingTextures = new IIcon[] {};
+
+ // Sapling types - field_149882_a
+ // Iicons - field_149881_b
+
+ protected SaplingBase(String blockNameLocalized, String blockNameUnlocalized, String[] saplingTypes) {
+ float f = 0.4F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
+ this.saplingTypes = saplingTypes;
+ this.saplingTextures = new IIcon[saplingTypes.length];
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized);
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "treeSapling", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int someInt, int meta) {
+ /*
+ * meta &= 7; return saplingTextures[MathHelper.clamp_int(meta, 0, 5)];
+ */
+ // return this.saplingTextures[meta % this.saplingTextures.length];
+ try {
+ return this.saplingTextures[meta];
+ } catch (Throwable T) {
+ Logger.WARNING("Invalid Sapling meta is " + meta);
+ return this.saplingTextures[0];
+ }
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(World world, int x, int y, int z, Random rand) {
+ if (!world.isRemote) {
+ super.updateTick(world, x, y, z, rand);
+ if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextInt(7) == 0) {
+ Logger.WARNING("Update Tick");
+ this.updateMeta(world, x, y, z, rand);
+ } else {
+ Logger.WARNING("Tried to Tick.");
+ }
+ }
+ }
+
+ // Dunno - Think it is doGrow || doGrowthTick
+ @Override
+ public void func_149853_b(World world, Random rand, int x, int y, int z) {
+ Logger.WARNING("Please find what calls me - func_149853_b");
+ this.updateMeta(world, x, y, z, rand);
+ }
+
+ public void updateMeta(World world, int x, int y, int z, Random rand) {
+ func_149879_c(world, x, y, z, rand);
+ }
+
+ @Override
+ public void func_149879_c(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149879_c - 1");
+ int l = world.getBlockMetadata(x, y, z);
+
+ if ((l & 8) == 0) {
+ Logger.WARNING("func_149879_c - 2");
+ world.setBlockMetadataWithNotify(x, y, z, l | 8, 4);
+ } else {
+ Logger.WARNING("func_149879_c - 3");
+ this.func_149878_d(world, x, y, z, rand);
+ }
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ int l = world.getBlockMetadata(x, y, z) & 7;
+ Object object = rand.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ world.setBlock(x, y, z, block, 0, 4);
+
+ if (!((WorldGenerator) object).generate(world, rand, x + i1, y, z + j1)) {
+ world.setBlock(x, y, z, this, l, 4);
+ }
+ }
+
+ @Override
+ public boolean func_149880_a(World world, int p_149880_2_, int p_149880_3_, int p_149880_4_, int p_149880_5_) {
+ return world.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this
+ && (world.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_;
+ }
+
+ /**
+ * Determines the damage on the item the block drops. Used in cloth and wood.
+ */
+ @Override
+ public int damageDropped(int meta) {
+ return MathHelper.clamp_int(meta & 7, 0, 5);
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, List metaList) {
+ for (int i = 0; i < this.saplingTextures.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ for (int i = 0; i < saplingTextures.length; ++i) {
+ saplingTextures[i] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "saplings/" + "sapling_" + saplingTypes[i]);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java
new file mode 100644
index 0000000000..93f7e59a1e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import java.util.Random;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.LeavesBase;
+
+public class LeavesPineTree extends LeavesBase {
+
+ public LeavesPineTree() {
+ super("Pine", "pine", new ItemStack[] {});
+ this.treeType = new String[] { "pine" };
+ this.leafType = new String[][] { { "pine" }, { "pine_opaque" } };
+ }
+
+ @Override
+ public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
+ return Item.getItemFromBlock(BOP_Block_Registrator.sapling_Pine);
+ }
+
+ @Override // Drops when Leaf is broken
+ protected void func_150124_c(World world, int x, int y, int z, int meta, int randomChance) {
+ Logger.INFO("Dropping Bonus Drops");
+ if (MathUtils.randInt(0, 10) >= 9) {
+ this.dropBlockAsItem(
+ world,
+ x,
+ y,
+ z,
+ ItemUtils.getSimpleStack(AgriculturalChem.mPinecone, MathUtils.randInt(1, 4)));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java
new file mode 100644
index 0000000000..98e384cd3f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import gtPlusPlus.xmod.bop.blocks.base.LogBase;
+
+public class LogPineTree extends LogBase {
+
+ public LogPineTree() {
+ super("Pine Log", "pine", new String[] { "pine" });
+ this.treeType = new String[] { "pine" };
+ }
+
+ /*
+ * @Override
+ * @SideOnly(Side.CLIENT) protected IIcon getSideIcon(int metaID){ return this.textureSide[metaID %
+ * this.textureSide.length]; }
+ * @Override
+ * @SideOnly(Side.CLIENT) protected IIcon getTopIcon(int metaID){ return this.textureTop[metaID %
+ * this.textureTop.length]; }
+ */
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java
new file mode 100644
index 0000000000..2c2bb38af6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.bop.blocks.base.SaplingBase;
+import gtPlusPlus.xmod.bop.world.features.trees.WorldGenPineTree;
+
+public class SaplingPineTree extends SaplingBase {
+
+ public SaplingPineTree() {
+ super("Pine Sapling", "pine", new String[] { "pine" });
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ rand.nextInt(10);
+ new WorldGenBigTree(true);
+ new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, block, 0, 4);
+ } else {
+ world.setBlock(x, y, z, block, 0, 4);
+ }
+ Object obj = new WorldGenPineTree();
+ if (obj != null) {
+ world.setBlockToAir(x, y, z);
+ if (!((WorldGenerator) obj).generate(world, CORE.RANDOM, x, y, z)) {
+ world.setBlock(x, y, z, this, 0, 2);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java
new file mode 100644
index 0000000000..816b666a40
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import java.util.Random;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.LeavesBase;
+
+public class LeavesRainforestTree extends LeavesBase {
+
+ public LeavesRainforestTree() {
+ super("Rainforest Oak", "rainforestoak", new ItemStack[] { ItemUtils.getSimpleStack(Items.apple) });
+ this.treeType = new String[] { "rainforest" };
+ this.leafType = new String[][] { { "rainforest" }, { "rainforest_opaque" } };
+ }
+
+ @Override
+ public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
+ return Item.getItemFromBlock(BOP_Block_Registrator.sapling_Rainforest);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java
new file mode 100644
index 0000000000..4e769b7c95
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import gtPlusPlus.xmod.bop.blocks.base.LogBase;
+
+public class LogRainforestTree extends LogBase {
+
+ public LogRainforestTree() {
+ super("Rainforest Oak", "rainforestoak", new String[] { "rainforest" });
+ this.treeType = new String[] { "rainforest" };
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java
new file mode 100644
index 0000000000..362eb2f541
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.SaplingBase;
+import gtPlusPlus.xmod.bop.world.features.trees.WorldGenRainForestTree_Ex;
+
+public class SaplingRainforestTree extends SaplingBase {
+
+ public SaplingRainforestTree() {
+ super("Rainforest Oak Sapling", "rainforestoak", new String[] { "rainforest" });
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ int l = world.getBlockMetadata(x, y, z) & 7;
+ rand.nextInt(10);
+ new WorldGenBigTree(true);
+ new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, block, 0, 4);
+ } else {
+ world.setBlock(x, y, z, block, 0, 4);
+ }
+ Object o = new WorldGenRainForestTree_Ex(
+ BOP_Block_Registrator.log_Rainforest,
+ BOP_Block_Registrator.leaves_Rainforest,
+ 0,
+ 0,
+ true,
+ 50,
+ 75);
+
+ if (!((WorldGenerator) o).generate(world, rand, x + i1, y, z + j1)) {
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, this, l, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, this, l, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, this, l, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4);
+ } else {
+ world.setBlock(x, y, z, this, l, 4);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java b/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java
new file mode 100644
index 0000000000..bc97042c82
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java
@@ -0,0 +1,172 @@
+package gtPlusPlus.xmod.bop.world.features.trees;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class WorldGenPineTree extends WorldGenAbstractTree {
+
+ public WorldGenPineTree() {
+ super(true);
+ }
+
+ @Override
+ public boolean generate(World world, Random random, int x, int y, int z) {
+ while (world.isAirBlock(x, y, z) && y > 2) {
+ --y;
+ }
+
+ Block aSoilBlock = world.getBlock(x, y, z);
+
+ if (!canBlockSustainSapling(world, aSoilBlock, x, y, z)) {
+ return false;
+ } else {
+ int height;
+ int branches;
+ for (height = -2; height <= 2; ++height) {
+ for (branches = -2; branches <= 2; ++branches) {
+ if (world.isAirBlock(x + height, y - 1, z + branches)
+ && world.isAirBlock(x + height, y - 2, z + branches)
+ && !world.isAirBlock(x + height, y, z + branches)) {
+ return false;
+ }
+ }
+ }
+
+ height = 2 + MathUtils.randInt(8, 16);
+ branches = 2 + MathUtils.randInt(6, 18);
+ int h = 1;
+ aSoilBlock.onPlantGrow(world, x, y - 1, z, x, y, z);
+
+ int c;
+ int r = MathUtils.randInt(1, 3);
+ for (c = 0; c < height; ++c) {
+ this.buildBlock(world, x, y + h, z, BOP_Block_Registrator.log_Pine, 0);
+ h++;
+ if (c >= r && c % 2 == 0) {
+ this.generateBranch(world, random, x, y + h, z, c);
+ }
+ }
+
+ this.generateTop(world, x, y + h, z);
+ return true;
+ }
+ }
+
+ public void generateTop(World world, int x, int y, int z) {
+ for (int i = -1; i < 2; ++i) {
+ for (int j = -1; j < 2; ++j) {
+ this.buildBlock(world, x + i, y, z + j, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ this.buildBlock(world, x, y, z, BOP_Block_Registrator.log_Pine, 0);
+ this.buildBlock(world, x + 1, y + 1, z, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y + 1, z, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 2, z, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+
+ public void generateBranch(World world, Random rand, int x, int y, int z, int n) {
+ int var99999;
+ int var99998;
+ for (var99999 = -1; var99999 < 2; ++var99999) {
+ for (var99998 = -1; var99998 < 2; ++var99998) {
+ this.buildBlock(world, x + var99999, y, z + var99998, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ var99999 = rand.nextInt(2);
+ var99998 = rand.nextInt(2);
+ int var99997 = rand.nextInt(2);
+ int var99996 = rand.nextInt(2);
+ if (n % 2 == 0) {
+ if (var99998 == 0) {
+ this.buildBlock(world, x + 1, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y - 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 2, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x + 1, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+
+ if (var99997 == 0) {
+ this.buildBlock(world, x - 2, y - 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 2, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x - 2, y, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ if (var99998 == 0) {
+ this.buildBlock(world, x + 2, y - 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 1, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 2, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x + 2, y, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 1, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ if (var99997 == 0) {
+ this.buildBlock(world, x - 1, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y - 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 2, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x - 1, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+ }
+
+ this.buildBlock(world, x, y, z, BOP_Block_Registrator.log_Pine, 0);
+ this.buildBlock(world, x, y + 1, z, BOP_Block_Registrator.log_Pine, 0);
+ }
+
+ public void buildBlock(World world, int x, int y, int z, Block block, int meta) {
+ if (world.isAirBlock(x, y, z) || world.getBlock(x, y, z)
+ .isLeaves(world, x, y, z)) {
+ world.setBlock(x, y, z, block, meta, 2);
+ }
+ }
+
+ public boolean canBlockSustainSapling(World world, Block block, int x, int y, int z) {
+ return block.canSustainPlant(world, x, y, z, ForgeDirection.UP, (BlockSapling) Blocks.sapling);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java b/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java
new file mode 100644
index 0000000000..d3ad2efaea
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java
@@ -0,0 +1,310 @@
+package gtPlusPlus.xmod.bop.world.features.trees;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class WorldGenRainForestTree_Ex extends WorldGenAbstractTree {
+
+ private final int minTreeHeight;
+ private final int randomTreeHeight;
+ private final Block wood;
+ private final Block leaves;
+ private final int woodMeta;
+ private final int leavesMeta;
+
+ // return random.nextInt(5) == 0 ? new WorldGenTrees(false, 4 + random.nextInt(7), 3, 3, true) : new
+ // WorldGenRainforestTree1(BOPCBlocks.logs4, BOPCBlocks.colorizedLeaves2, 3, 2, false, 8, 8);
+
+ public WorldGenRainForestTree_Ex(Block wood, Block leaves, int woodMeta, int leavesMeta, boolean doBlockNotify,
+ int minTreeHeight, int randomTreeHeight) {
+ super(doBlockNotify);
+ this.wood = wood;
+ this.leaves = leaves;
+ this.woodMeta = woodMeta;
+ this.leavesMeta = leavesMeta;
+ this.minTreeHeight = minTreeHeight;
+ this.randomTreeHeight = randomTreeHeight;
+ }
+
+ @Override
+ public boolean generate(World world, Random random, int x, int y, int z) {
+ int treeHeight = random.nextInt(this.randomTreeHeight) + this.minTreeHeight;
+ boolean flag = true;
+ if ((y >= 1) && (y + treeHeight + 1 <= 256)) {
+ for (int i1 = y; i1 <= y + 1 + treeHeight; i1++) {
+ byte b0 = 1;
+ if (i1 == y) {
+ b0 = 0;
+ }
+ if (i1 >= y + 1 + treeHeight - 2) {
+ b0 = 2;
+ }
+ for (int j1 = x - b0; (j1 <= x + b0) && (flag); j1++) {
+ for (int k1 = z - b0; (k1 <= z + b0) && (flag); k1++) {
+ if ((i1 >= 0) && (i1 < 256)) {
+ Block block = world.getBlock(j1, i1, k1);
+ if (!isReplaceable(world, j1, i1, k1)) {
+ flag = false;
+ }
+ } else {
+ flag = false;
+ }
+ }
+ }
+ }
+ if (!flag) {
+ return false;
+ }
+ Block block2 = world.getBlock(x, y - 1, z);
+
+ boolean isSoil = block2
+ .canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, (BlockSapling) Blocks.sapling);
+ if ((isSoil) && (y < 256 - treeHeight - 1)) {
+ block2.onPlantGrow(world, x, y - 1, z, x, y, z);
+ byte b0 = 3;
+ byte b1 = 0;
+ Logger.WARNING("Sapling located at X:" + x + " | Y:" + y + " | Z:" + z);
+ for (int k1 = y - b0 + treeHeight; k1 <= y + treeHeight; k1++) {
+ Logger
+ .WARNING("[1]| k1 = " + k1 + " | y = " + y + " | b0 = " + b0 + " | l = " + treeHeight + " | ");
+ int i3 = k1 - (y + treeHeight);
+ int l1 = b1 + 1 - i3;
+ for (int i2 = x - l1; i2 <= x + l1; i2++) {
+ int j2 = i2 - x;
+ Logger.WARNING("[2]| i2 = " + i2 + " | x = " + x + " | l1 = " + l1 + " | j2 = " + j2 + " | ");
+ for (int k2 = z - l1; k2 <= z + l1; k2++) {
+ int l2 = k2 - z;
+ Logger
+ .WARNING("[3]| k2 = " + k2 + " | z = " + z + " | l1 = " + l1 + " | l2 = " + l2 + " | ");
+ if ((Math.abs(j2) != l1) || (Math.abs(l2) != l1)
+ || ((random.nextInt(2) != 0) && (i3 != 0))) {
+ Block block1 = world.getBlock(i2, k1, k2);
+ if ((block1.isAir(world, i2, k1, k2)) || (block1.isLeaves(world, i2, k1, k2))) {
+ Logger.WARNING("Setting something as leaves?");
+ setBlockAndNotifyAdequately(world, i2, k1, k2, this.leaves, this.leavesMeta);
+ }
+ }
+ }
+ }
+ }
+ for (int k1 = 0; k1 < treeHeight; k1++) {
+ Logger.WARNING("Building tree - Layer " + k1 + " | Max height is " + treeHeight);
+ Block block = world.getBlock(x, y + k1, z);
+ if ((block.isAir(world, x, y + k1, z)) || (block.isLeaves(world, x, y + k1, z))) {
+ setBlockAndNotifyAdequately(world, x, y + k1, z, this.wood, this.woodMeta);
+
+ // Trying this to make trunk
+ setBlockAndNotifyAdequately(world, x, y + k1, z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + k1, z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + k1, z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 1, y + k1, z, this.wood, this.woodMeta);
+
+ if (k1 >= 5) {
+ if (k1 % 5 == 0) {
+ // Bottom layer
+ Block block5 = world.getBlock(x, y + k1, z);
+ for (int xDir = -5; xDir <= 5; xDir++) {
+ for (int zDir = -5; zDir <= 5; zDir++) {
+ if (canRemoveLeafBlockLayer2(-5, 5, xDir, -5, 5, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x=" + xDir + " | y=" + y + " z=" + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+ // Next Layer
+ for (int xDir = -4; xDir <= 4; xDir++) {
+ for (int zDir = -4; zDir <= 4; zDir++) {
+ if (canRemoveLeafBlockLayer2(-4, 4, xDir, -4, 4, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 1
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 1
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 1, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 1, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 1,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+
+ // Third Layer
+ for (int xDir = -3; xDir <= 3; xDir++) {
+ for (int zDir = -3; zDir <= 3; zDir++) {
+ if (canRemoveLeafBlockLayer2(-3, 3, xDir, -3, 3, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 2
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 2
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 2, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 2, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 2,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+
+ // Fourth Layer
+ for (int xDir = -2; xDir <= 2; xDir++) {
+ for (int zDir = -2; zDir <= 2; zDir++) {
+ if (canRemoveLeafBlockLayer2(-2, 2, xDir, -2, 2, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 3
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 3
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 3, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 3, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 3,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+ } else {
+
+ }
+ }
+
+ setBlockAndNotifyAdequately(world, x - 3, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 3, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z - 3, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z + 3, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 2, y + (treeHeight - 4), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 2, y + (treeHeight - 4), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 4), z - 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 4), z + 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 2, y + (treeHeight - 5), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 2, y + (treeHeight - 5), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 5), z - 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 5), z + 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 1, y + (treeHeight - 6), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + (treeHeight - 6), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 6), z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 6), z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 2), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 1), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + treeHeight, z, this.leaves, this.leavesMeta);
+ func_150515_a(world, x, y + (treeHeight - 4), z, Blocks.air);
+ func_150515_a(world, x, y + (treeHeight - 5), z, Blocks.air);
+ setBlockAndNotifyAdequately(world, x - 1, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 2), z, this.wood, this.woodMeta);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+ return false;
+ }
+
+ private boolean canRemoveLeafBlockLayer2(int xDirMin, int xDirMax, int xDir, int zDirMin, int zDirMax, int zDir) {
+ if (xDir == xDirMin || xDir == xDirMin + 1 || xDir == xDirMax || xDir == xDirMax - 1) {
+ if (zDir == zDirMin || zDir == zDirMin + 1 || zDir == zDirMax || zDir == zDirMax - 1) {
+ if (xDir == xDirMin + 1 && zDir == zDirMin + 1) {
+ return false;
+ } else if (xDir == xDirMin + 1 && zDir == zDirMax - 1) {
+ return false;
+ } else if (xDir == xDirMax - 1 && zDir == zDirMin + 1) {
+ return false;
+ } else if (xDir == xDirMax - 1 && zDir == zDirMax - 1) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java b/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java
new file mode 100644
index 0000000000..a1b96d0f2f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.forestry;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import gtPlusPlus.xmod.forestry.bees.items.FR_ItemRegistry;
+import gtPlusPlus.xmod.forestry.bees.recipe.FR_Gregtech_Recipes;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class HANDLER_FR {
+
+ public static void preInit() {
+ if (Forestry.isModLoaded()) {
+ FR_ItemRegistry.Register();
+ }
+ }
+
+ public static void postInit() {
+ if (Forestry.isModLoaded()) {
+ FR_Gregtech_Recipes.registerItems();
+ new GTPP_Bees();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java
new file mode 100644
index 0000000000..3c00c79fcb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.util.Utils;
+
+public enum CustomCombs {
+ // Custom Bees
+
+ // Rubbers & Silicons
+ SILICON("silicon", true, Materials.Silicon, 100),
+ RUBBER("rubber", true, Materials.Rubber, 100),
+ PLASTIC("polyethylene", true, Materials.Plastic, 75),
+ PTFE("polytetrafluoroethylene", true, GTPP_Bees.PTFE, 50),
+ PBS("styrene-butadiene", true, GTPP_Bees.PBS, 25),
+
+ // Fuels
+ BIOMASS("biomass", true, Materials.Biomass, 100),
+ ETHANOL("ethanol", true, Materials.Ethanol, 75),
+ DIESEL("diesel", true, Materials.Fuel, 50),
+ NITRO("nitro", true, Materials.NitroFuel, 25),
+ HOOTCH("hootch", true, Materials.Silicon, 50),
+ ROCKETFUEL("rocket", true, Materials.Silicon, 25),
+
+ // Materials which are hard, if not impossible to obtain.
+ FLUORINE("fluorine", true, Materials.Fluorine, 25),
+ COKE("coke", true, Materials._NULL, 50),
+ FORCE("force", true, Materials.Force, 50),
+ NIKOLITE("nikolite", true, Materials.Nikolite, 75),
+ MITHRIL("mithril", true, Materials.Mithril, 10),
+ ADAMANTIUM("adamantium", true, Materials.Adamantium, 5),
+
+ // Trash
+ SALT("salt", true, Materials.Salt, 75),
+ SAND("sand", true, Materials.Sand, 100),;
+
+ private static final int[][] colours = new int[][] {
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, // SILICON
+ { Utils.rgbtoHexValue(55, 55, 55), Utils.rgbtoHexValue(75, 75, 75) }, // RUBBER
+ { Utils.rgbtoHexValue(245, 245, 245), Utils.rgbtoHexValue(175, 175, 175) }, // PLASTIC
+ { Utils.rgbtoHexValue(150, 150, 150), Utils.rgbtoHexValue(75, 75, 75) }, // PTFE
+ { Utils.rgbtoHexValue(33, 26, 24), Utils.rgbtoHexValue(23, 16, 14) }, // PBS
+ // Unused
+ { Utils.rgbtoHexValue(33, 225, 24), Utils.rgbtoHexValue(23, 175, 14) }, // Biofuel
+ { Utils.rgbtoHexValue(255, 128, 0), Utils.rgbtoHexValue(220, 156, 32) }, // Ethanol
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(30, 230, 230), Utils.rgbtoHexValue(10, 150, 150) }, // Fluorine
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5) }, // Force
+ { Utils.rgbtoHexValue(60, 180, 200), Utils.rgbtoHexValue(40, 150, 170) }, // Nikolite
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, { 0x666666, 0x525252 },
+ { 0x2E8F5B, 0xDCC289 }, { 0x4C4C4C, 0x333333 }, { 0x808080, 0x999999 }, { 0x57CFFB, 0xBBEEFF },
+ { 0x7D0F0F, 0xD11919 }, { 0x1947D1, 0x476CDA }, { 0xE6005C, 0xCC0052 }, { 0x0033CC, 0x00248F },
+ { 0xCCFFFF, 0xA3CCCC }, { 0x248F24, 0xCCFFCC }, { 0x248F24, 0x2EB82E }, { 0xD4D4D4, 0x58300B },
+ { 0xFF6600, 0xE65C00 }, { 0xD4D4D4, 0xDDDDDD }, { 0x666699, 0xA3A3CC }, { 0xDA9147, 0xDE9C59 },
+ { 0x808080, 0x999999 }, { 0x8585AD, 0x9D9DBD }, { 0xF0DEF0, 0xF2E1F2 }, { 0xC2C2D6, 0xCECEDE },
+ { 0xE6B800, 0xCFA600 }, { 0x008AB8, 0xD6D6FF }, { 0xD5D5D5, 0xAAAAAA }, { 0xCC99FF, 0xDBB8FF },
+ { 0xEBA1EB, 0xF2C3F2 }, { 0x62626D, 0x161620 }, { 0xE6E6E6, 0xFFFFCC }, { 0xDADADA, 0xD1D1E0 },
+ { 0x19AF19, 0x169E16 }, { 0x335C33, 0x6B8F00 }, { 0x003300, 0x002400 }, };
+ public boolean showInList;
+ public final Materials material;
+ public final int chance;
+ private final String name;
+
+ private CustomCombs(String pName, boolean show, Materials material, int chance) {
+ this.name = pName;
+ this.material = material;
+ this.chance = chance;
+ this.showInList = show;
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+ // return "gt.comb."+this.name;
+ return GT_LanguageManager.addStringLocalization(
+ "comb." + this.name,
+ this.name.substring(0, 1)
+ .toUpperCase() + this.name.substring(1) + " Comb");
+ }
+
+ public int[] getColours() {
+ return colours[this.ordinal()];
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java
new file mode 100644
index 0000000000..0cdb49a9b5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java
@@ -0,0 +1,604 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Locale;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.BiomeDictionary.Type;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.text.WordUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.BeeDefinition;
+import forestry.apiculture.genetics.BeeVariation;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.core.genetics.alleles.AlleleHelper;
+import gregtech.loaders.misc.GT_BeeDefinition;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public enum GTPP_Bee_Definition implements IBeeDefinition {
+
+ SILICON(GTPP_Branch_Definition.ORGANIC, "Silicon", true, Utils.rgbtoHexValue(75, 75, 75),
+ Utils.rgbtoHexValue(125, 125, 125)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getSlagComb(), 0.10f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SILICON), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("SLIMEBALL"),
+ getGregtechBeeType("STICKYRESIN"),
+ 10);
+ }
+ },
+
+ RUBBER(GTPP_Branch_Definition.ORGANIC, "Rubber", true, Utils.rgbtoHexValue(55, 55, 55),
+ Utils.rgbtoHexValue(75, 75, 75)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getSlagComb(), 0.10f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.RUBBER), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("SLIMEBALL"),
+ getGregtechBeeType("STICKYRESIN"),
+ 10);
+ }
+ },
+
+ PLASTIC(GTPP_Branch_Definition.ORGANIC, "Plastic", true, Utils.rgbtoHexValue(245, 245, 245),
+ Utils.rgbtoHexValue(175, 175, 175)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PLASTIC), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(RUBBER.species, getGregtechBeeType("OIL"), 10);
+ }
+ },
+
+ PTFE(GTPP_Branch_Definition.ORGANIC, "Ptfe", true, Utils.rgbtoHexValue(150, 150, 150),
+ Utils.rgbtoHexValue(75, 75, 75)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PTFE), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(RUBBER.species, PLASTIC.species, 10);
+ }
+ },
+
+ PBS(GTPP_Branch_Definition.ORGANIC, "Pbs", true, Utils.rgbtoHexValue(33, 26, 24), Utils.rgbtoHexValue(23, 16, 14)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PBS), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(PTFE.species, PLASTIC.species, 10);
+ }
+ },
+
+ /**
+ * Fuels
+ */
+ BIOMASS(GTPP_Branch_Definition.ORGANIC, "Biomass", true, Utils.rgbtoHexValue(33, 225, 24),
+ Utils.rgbtoHexValue(23, 175, 14)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.BIOMASS), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(getSpecies("Industrious"), getSpecies("Rural"), 10);
+ tMutation.restrictBiomeType(Type.FOREST);
+ }
+ },
+
+ ETHANOL(GTPP_Branch_Definition.ORGANIC, "Ethanol", true, Utils.rgbtoHexValue(255, 128, 0),
+ Utils.rgbtoHexValue(220, 156, 32)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ETHANOL), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(BIOMASS.species, getSpecies("Farmerly"), 5);
+ tMutation.restrictBiomeType(Type.FOREST);
+ }
+ },
+
+ /**
+ * Materials
+ */
+ FLUORINE(GTPP_Branch_Definition.ORGANIC, "Fluorine", true, Utils.rgbtoHexValue(30, 230, 230),
+ Utils.rgbtoHexValue(10, 150, 150)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.FLUORINE), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.COLD);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("LAPIS"),
+ getGregtechBeeType("SAPPHIRE"),
+ 5);
+ tMutation.restrictBiomeType(Type.COLD);
+ }
+ },
+
+ // Coke
+
+ // Force
+ FORCE(GTPP_Branch_Definition.METAL, "Force", true, Utils.rgbtoHexValue(250, 250, 20),
+ Utils.rgbtoHexValue(200, 200, 5)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.25f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.FORCE), 0.25f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SALT), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("STEEL"),
+ getGregtechBeeType("GOLD"),
+ 10);
+ tMutation.restrictBiomeType(Type.HOT);
+ }
+ },
+
+ // Nikolite
+ NIKOLITE(GTPP_Branch_Definition.METAL, "Nikolite", true, Utils.rgbtoHexValue(60, 180, 200),
+ Utils.rgbtoHexValue(40, 150, 170)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.NIKOLITE), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("ALUMINIUM"),
+ getGregtechBeeType("SILVER"),
+ 8);
+ tMutation.restrictBiomeType(Type.HOT);
+ }
+ },
+
+ /*
+ * CLAY(GTPP_Branch_Definition.ORGANIC, "Clay", true, 0x19d0ec, 0xffdc16) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(new ItemStack(Items.clay_ball, 1), 0.15f); beeSpecies.setHumidity(EnumHumidity.DAMP);
+ * beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), getSpecies("Diligent"), 20); } },
+ * SLIMEBALL(GTPP_Branch_Definition.ORGANIC, "SlimeBall", true, 0x4E9E55, 0x00FF15) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 15), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STICKY), 0.30f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MARSHY.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Marshy"), CLAY.species, 15); } }, PEAT(GTPP_Branch_Definition.ORGANIC, "Peat", true,
+ * 0x906237, 0x58300B) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LIGNIE), 0.30f);
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.RURAL.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Rural"), CLAY.species, 20); } }, STICKYRESIN(GTPP_Branch_Definition.ORGANIC,
+ * "StickyResin", true, 0x2E8F5B, 0xDCC289) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(ItemList.IC2_Resin.get(1, new Object[0]), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(SLIMEBALL.species,
+ * PEAT.species, 25); } }, COAL(GTPP_Branch_Definition.ORGANIC, "Coal", true, 0x666666, 0x525252) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LIGNIE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.COAL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.AUSTERE.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), PEAT.species, 18); } }, OIL(GTPP_Branch_Definition.ORGANIC, "Oil",
+ * true, 0x4C4C4C, 0x333333) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.OIL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ * beeSpecies.setNocturnal(); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(COAL.species,
+ * STICKYRESIN.species, 8); } }, REDSTONE(GTPP_Branch_Definition.GEM, "Redstone", true, 0x7D0F0F, 0xD11919) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.REDSTONE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), getSpecies("Demonic"), 20); } }, LAPIS(GTPP_Branch_Definition.GEM,
+ * "Lapis", true, 0x1947D1, 0x476CDA) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LAPIS), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Demonic"), getSpecies("Imperial"), 20); } }, CERTUS(GTPP_Branch_Definition.GEM,
+ * "CertusQuartz", true, 0x57CFFB, 0xBBEEFF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.CERTUS), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Hermitic"), LAPIS.species, 20); } }, RUBY(GTPP_Branch_Definition.GEM, "Ruby", true,
+ * 0xE6005C, 0xCC0052) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.RUBY), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(REDSTONE.species,
+ * DIAMOND.species, 10); } }, SAPPHIRE(GTPP_Branch_Definition.GEM, "Sapphire", true, 0x0033CC, 0x00248F) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAPPHIRE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * LAPIS.species, 10); } }, DIAMOND(GTPP_Branch_Definition.GEM, "Diamond", true, 0xCCFFFF, 0xA3CCCC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.DIAMOND), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * COAL.species, 6); } }, OLIVINE(GTPP_Branch_Definition.GEM, "Olivine", true, 0x248F24, 0xCCFFCC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.OLIVINE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * getSpecies("Ended"), 10); } }, EMERALD(GTPP_Branch_Definition.GEM, "Emerald", true, 0x248F24, 0x2EB82E) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.EMERALD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.COLD); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(OLIVINE.species,
+ * DIAMOND.species, 8); } }, COPPER(GTPP_Branch_Definition.METAL, "Copper", true, 0xFF6600, 0xE65C00) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.COPPER), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Majestic"), CLAY.species, 25); } }, TIN(GTPP_Branch_Definition.METAL, "Tin", true,
+ * 0xD4D4D4, 0xDDDDDD) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.TIN), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CLAY.species,
+ * getSpecies("Diligent"), 25); } }, LEAD(GTPP_Branch_Definition.METAL, "Lead", true, 0x666699, 0xA3A3CC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LEAD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.WARM); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(COAL.species,
+ * COPPER.species, 25); } }, IRON(GTPP_Branch_Definition.METAL, "Iron", true, 0xDA9147, 0xDE9C59) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.IRON), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(TIN.species,
+ * COPPER.species, 25); } }, STEEL(GTPP_Branch_Definition.METAL, "Steel", true, 0x808080, 0x999999) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STEEL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * COAL.species, 20); } }, NICKEL(GTPP_Branch_Definition.METAL, "Nickel", true, 0x8585AD, 0x8585AD) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.NICKEL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * COPPER.species, 25); } }, ZINC(GTPP_Branch_Definition.METAL, "Zinc", true, 0xF0DEF0, 0xF2E1F2) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ZINC), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * TIN.species, 20); } }, SILVER(GTPP_Branch_Definition.METAL, "Silver", true, 0xC2C2D6, 0xCECEDE) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SILVER), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(LEAD.species,
+ * TIN.species, 20); } }, GOLD(GTPP_Branch_Definition.METAL, "Gold", true, 0xEBC633, 0xEDCC47) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.GOLD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(LEAD.species,
+ * COPPER.species, 20); } }, ALUMINIUM(GTPP_Branch_Definition.RAREMETAL, "Aluminium", true, 0xB8B8FF, 0xD6D6FF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ALUMINIUM), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.ARID); beeSpecies.setTemperature(EnumTemperature.HOT); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(NICKEL.species,
+ * ZINC.species, 18); } }, TITANIUM(GTPP_Branch_Definition.RAREMETAL, "Titanium", true, 0xCC99FF, 0xDBB8FF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.TITANIUM), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.ARID); beeSpecies.setTemperature(EnumTemperature.HOT); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(REDSTONE.species,
+ * ALUMINIUM.species, 5); } }
+ */
+
+ ;
+
+ private final GTPP_Branch_Definition branch;
+ private final IAlleleBeeSpeciesCustom species;
+
+ private IAllele[] template;
+ private IBeeGenome genome;
+
+ GTPP_Bee_Definition(GTPP_Branch_Definition branch, String binomial, boolean dominant, int primary, int secondary) {
+ String lowercaseName = this.toString()
+ .toLowerCase(Locale.ENGLISH);
+ String species = "species" + WordUtils.capitalize(lowercaseName);
+
+ String uid = "forestry." + species;
+ String description = "for.description." + species;
+ String name = "for.bees.species." + lowercaseName;
+
+ this.branch = branch;
+ this.species = BeeManager.beeFactory.createSpecies(
+ uid,
+ dominant,
+ "Sengir",
+ name,
+ description,
+ branch.getBranch(),
+ binomial,
+ primary,
+ secondary);
+ }
+
+ public static void initBees() {
+ for (GTPP_Bee_Definition bee : values()) {
+ bee.init();
+ }
+ for (GTPP_Bee_Definition bee : values()) {
+ bee.registerMutations();
+ }
+ }
+
+ private static IAlleleBeeSpecies getSpecies(String name) {
+ return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(
+ (new StringBuilder()).append("forestry.species")
+ .append(name)
+ .toString());
+ }
+
+ protected abstract void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies);
+
+ protected abstract void setAlleles(IAllele[] template);
+
+ protected abstract void registerMutations();
+
+ private void init() {
+ setSpeciesProperties(species);
+
+ template = branch.getTemplate();
+ AlleleHelper.instance.set(template, EnumBeeChromosome.SPECIES, species);
+ setAlleles(template);
+
+ genome = BeeManager.beeRoot.templateAsGenome(template);
+
+ BeeManager.beeRoot.registerTemplate(template);
+ }
+
+ protected final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ IAllele[] template = getTemplate();
+ Logger.DEBUG_BEES("parent1: " + (parent1 != null));
+ Logger.DEBUG_BEES("parent2: " + (parent2 != null));
+ Logger.DEBUG_BEES("chance: " + (chance));
+ Logger.DEBUG_BEES("template: " + (template != null));
+ return BeeManager.beeMutationFactory.createMutation(parent1, parent2, template, chance);
+ }
+
+ @Override
+ public final IAllele[] getTemplate() {
+ return Arrays.copyOf(template, template.length);
+ }
+
+ @Override
+ public final IBeeGenome getGenome() {
+ return genome;
+ }
+
+ @Override
+ public final IBee getIndividual() {
+ return new Bee(genome);
+ }
+
+ @Override
+ public final ItemStack getMemberStack(EnumBeeType beeType) {
+ IBee bee = getIndividual();
+ return BeeManager.beeRoot.getMemberStack(bee, beeType.ordinal());
+ }
+
+ public final IBeeDefinition getRainResist() {
+ return new BeeVariation.RainResist(this);
+ }
+
+ private static ItemStack getSlagComb() {
+ return issStackValid(ItemUtils.getSimpleStack(GTPP_Bees.Comb_Slag, 1));
+ }
+
+ private static ItemStack getStoneComb() {
+ return issStackValid(ItemUtils.getSimpleStack(GTPP_Bees.Comb_Stone, 1));
+ }
+
+ private static ItemStack issStackValid(ItemStack result) {
+ if (result == null) {
+ return ItemUtils.getErrorStack(1);
+ }
+ return result;
+ }
+
+ public static IAlleleBeeSpecies getGregtechBeeType(String name) {
+ try {
+ Enum<GT_BeeDefinition> gtBeeEnumObject = Enum.valueOf(GT_BeeDefinition.class, name);
+ Field gtBeesField = FieldUtils.getDeclaredField(GT_BeeDefinition.class, "species", true);
+ gtBeesField.setAccessible(true);
+ ReflectionUtils.makeFieldAccessible(gtBeesField);
+ Object beeType = gtBeesField.get(gtBeeEnumObject);
+ return (IAlleleBeeSpecies) beeType;
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java
new file mode 100644
index 0000000000..4d04e3ad31
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java
@@ -0,0 +1,172 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot_OLD;
+import gtPlusPlus.core.item.base.misc.BaseItemMisc;
+import gtPlusPlus.core.item.base.misc.BaseItemMisc.MiscTypes;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class GTPP_Bees {
+
+ // Custom Comb Drop Base Items
+ public static Item dropForceGem;
+ public static Item dropBiomassBlob;
+ public static Item dropEthanolBlob;
+ public static Item dropNikoliteDust;
+ public static Item dropFluorineBlob;
+
+ // Base Comb Item
+ public static ItemCustomComb combs;
+
+ // Combs obtained via reflection
+ public static ItemStack Comb_Slag;
+ public static ItemStack Comb_Stone;
+
+ // Materials obtained via reflection
+ public static Materials PTFE;
+ public static Materials PBS;
+
+ // public static GTPP_Branch_Definition definition;
+
+ public GTPP_Bees() {
+ if (Forestry.isModLoaded()) {
+
+ // Set Materials and Comb stacks from GT via Reflection
+ setMaterials();
+ setCustomItems();
+
+ try {
+ combs = new ItemCustomComb();
+ combs.initCombsRecipes();
+ GTPP_Bee_Definition.initBees();
+ } catch (Throwable t) {
+ Logger.BEES("Failed to load bees, probably due to an ancient forestry version");
+ t.printStackTrace();
+ }
+ }
+ }
+
+ private void setCustomItems() {
+ dropForceGem = new BaseItemMisc("Force", new short[] { 250, 250, 20 }, 64, MiscTypes.GEM, null);
+ dropBiomassBlob = new BaseItemMisc("Biomass", new short[] { 33, 225, 24 }, 64, MiscTypes.DROP, null);
+ dropEthanolBlob = new BaseItemMisc("Ethanol", new short[] { 255, 128, 0 }, 64, MiscTypes.DROP, null);
+
+ // Nikolite may not exist, so lets make it.
+ dropNikoliteDust = ItemUtils
+ .generateSpecialUseDusts("Nikolite", "Nikolite", Utils.rgbtoHexValue(60, 180, 200))[2];
+
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotNikolite", 1) == null) {
+ new BaseItemIngot_OLD("itemIngotNikolite", "Nikolite", Utils.rgbtoHexValue(60, 180, 200), 0);
+ }
+
+ dropFluorineBlob = new BaseItemMisc("Fluorine", new short[] { 30, 230, 230 }, 64, MiscTypes.DROP, null);
+ addRecipes();
+ }
+
+ private void addRecipes() {
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropBiomassBlob), FluidUtils.getFluidStack("biomass", 30));
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropEthanolBlob), FluidUtils.getFluidStack("ethanol", 6));
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropFluorineBlob), FluidUtils.getFluidStack("fluorine", 4));
+ }
+
+ private void addExtractorRecipe(ItemStack input, FluidStack output) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(input)
+ .fluidOutputs(output)
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static boolean tryGetBeesBoolean() {
+ try {
+ Class<?> mProxy = Class.forName("gregtech.GT_Mod.gregtechproxy");
+ Field mNerf = FieldUtils.getDeclaredField(mProxy, "mGTBees", true);
+ boolean returnValue = (boolean) mNerf.get(GT_Mod.gregtechproxy);
+ return returnValue;
+ } catch (ClassNotFoundException | IllegalArgumentException | IllegalAccessException e) {
+ return false;
+ }
+ }
+
+ private void setMaterials() {
+ try {
+
+ Class<?> gtBees = Class.forName("gregtech.loaders.misc.GT_Bees");
+ Class<?> gtCombItemClass = Class.forName("gregtech.common.items.ItemComb");
+ Class gtCombEnumClass = Class.forName("gregtech.common.items.CombType");
+ Field gtCombs = FieldUtils.getDeclaredField(gtBees, "combs", true);
+ gtCombs.setAccessible(true);
+ ReflectionUtils.makeFieldAccessible(gtCombs);
+ Enum gtCombTypeSlag = Enum.valueOf(gtCombEnumClass, "SLAG");
+ Enum gtCombTypeStone = Enum.valueOf(gtCombEnumClass, "STONE");
+ Object oCombObject = gtCombs.get(null);
+
+ Logger.DEBUG_BEES("Field getModifiers: " + gtCombs.getModifiers());
+ Logger.DEBUG_BEES("Field toGenericString: " + gtCombs.toGenericString());
+ Logger.DEBUG_BEES("Field getClass: " + gtCombs.getClass());
+ Logger.DEBUG_BEES("Field isEnumConstant: " + gtCombs.isEnumConstant());
+ Logger.DEBUG_BEES("Field isSynthetic: " + gtCombs.isSynthetic());
+ Logger.DEBUG_BEES("Field get(gtBees) != null: " + (gtCombs.get(gtBees) != null));
+ Logger.DEBUG_BEES("Field isAccessible: " + gtCombs.isAccessible());
+
+ Logger.BEES("gtBees: " + (gtBees != null));
+ Logger.BEES("gtCombItemClass: " + (gtCombItemClass != null));
+ Logger.BEES("gtCombEnumClass: " + (gtCombEnumClass != null));
+ Logger.BEES("gtCombs: " + (gtCombs != null));
+ Logger.BEES("gtCombTypeSlag: " + (gtCombTypeSlag != null));
+ Logger.BEES("gtCombTypeStone: " + (gtCombTypeStone != null));
+ Logger.BEES("oCombObject: " + (oCombObject != null));
+
+ // if (gtCombItemClass.isInstance(oCombObject)){
+ Method getStackForType;
+ getStackForType = gtCombItemClass.getDeclaredMethod("getStackForType", gtCombEnumClass);
+
+ if (getStackForType != null) {
+ Logger.BEES("Found Method: getStackForType");
+ }
+ if (Comb_Slag == null) {
+ Comb_Slag = (ItemStack) getStackForType.invoke(gtBees, gtCombTypeSlag);
+ }
+ if (Comb_Stone == null) {
+ Comb_Stone = (ItemStack) getStackForType.invoke(gtBees, gtCombTypeStone);
+ }
+
+ } catch (NullPointerException | ClassNotFoundException | IllegalArgumentException | IllegalAccessException
+ | NoSuchMethodException | SecurityException | InvocationTargetException e) {
+ Logger.BEES("Bad Reflection. setMaterials()");
+ }
+
+ PTFE = trySetValue("Polytetrafluoroethylene");
+ PBS = trySetValue("StyreneButadieneRubber");
+ }
+
+ private Materials trySetValue(String material) {
+ Materials mTemp = Materials.get(material);
+ if (mTemp != Materials._NULL) {
+ return mTemp;
+ }
+ return Materials._NULL;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java
new file mode 100644
index 0000000000..94e6078c49
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import gtPlusPlus.api.objects.Logger;
+
+public enum GTPP_Branch_Definition {
+
+ ORGANIC("ORGANIC"),
+ GEM("GEM"),
+ METAL("METAL"),
+ RAREMETAL("RAREMETAL"),
+ RADIOACTIVE("RADIOACTIVE");
+
+ final String mFieldName;
+ final Enum mActualValues;
+
+ GTPP_Branch_Definition(String mValue) {
+ this.mFieldName = mValue;
+ this.mActualValues = setEnumVar(mValue);
+ }
+
+ public final IAllele[] getTemplate() {
+ Class gtBranchDefClass;
+ try {
+ gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum enumA = mActualValues;
+ Method methodMyMethod = gtBranchDefClass.getMethod("getTemplate");
+
+ Logger.INFO("[Bees] gtBranchDefClass: " + (gtBranchDefClass != null));
+ Logger.INFO("[Bees] enumA: " + (enumA != null));
+ Logger.INFO("[Bees] methodMyMethod: " + (methodMyMethod != null));
+
+ return (IAllele[]) methodMyMethod.invoke(enumA);
+ } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ Logger.INFO("[Bees] Bad Reflection. getTemplate()");
+ e.printStackTrace();
+ // gregtech.loaders.misc.GT_BranchDefinition.getTemplate()
+ return null;
+ }
+ }
+
+ public final IClassification getBranch() {
+ Class gtBranchDefClass;
+ try {
+ gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum enum_MY_SAMPLE_ENUM = mActualValues;
+ Method methodMyMethod = gtBranchDefClass.getMethod("getBranch");
+
+ Logger.INFO("[Bees] gtBranchDefClass: " + (gtBranchDefClass != null));
+ Logger.INFO("[Bees] enum_MY_SAMPLE_ENUM: " + (enum_MY_SAMPLE_ENUM != null));
+ Logger.INFO("[Bees] methodMyMethod: " + (methodMyMethod != null));
+
+ return (IClassification) methodMyMethod.invoke(enum_MY_SAMPLE_ENUM);
+ } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ Logger.INFO("[Bees] Bad Reflection. getBranch()");
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private Enum setEnumVar(String value) {
+ try {
+ Class gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum branchDef = Enum.valueOf(gtBranchDefClass, value);
+ return branchDef;
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java
new file mode 100644
index 0000000000..63c0ae53ec
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemCustomComb extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemCustomComb() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.comb");
+ GameRegistry.registerItem(this, "gtpp.comb", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(CustomCombs type) {
+ return new ItemStack(this, 1, type.ordinal());
+ }
+
+ public ItemStack getStackForType(CustomCombs type, int count) {
+ return new ItemStack(this, count, type.ordinal());
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (CustomCombs type : CustomCombs.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:beeCombs.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:beeCombs.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int meta = Math.max(0, Math.min(CustomCombs.values().length - 1, stack.getItemDamage()));
+ int colour = CustomCombs.values()[meta].getColours()[0];
+
+ if (pass >= 1) {
+ colour = CustomCombs.values()[meta].getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return CustomCombs.values()[stack.getItemDamage()].getName();
+ }
+
+ public void initCombsRecipes() {
+ ItemStack tComb;
+
+ tComb = getStackForType(CustomCombs.SILICON);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Silicon, 1), 30);
+ // addProcess(tComb, Materials.Silver, 100);
+ // addProcess(tComb, Materials.Galena, 100);
+
+ // Rubbers
+ tComb = getStackForType(CustomCombs.RUBBER);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Rubber, 1), 30);
+ tComb = getStackForType(CustomCombs.PLASTIC);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plastic, 1), 20);
+ tComb = getStackForType(CustomCombs.PTFE);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, GTPP_Bees.PTFE, 1), 10);
+ tComb = getStackForType(CustomCombs.PBS);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, GTPP_Bees.PBS, 1), 5);
+
+ // Fuels
+ tComb = getStackForType(CustomCombs.BIOMASS);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropBiomassBlob), 5);
+ tComb = getStackForType(CustomCombs.PBS);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropEthanolBlob), 5);
+
+ // Misc Materials
+ tComb = getStackForType(CustomCombs.FORCE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropForceGem), 5);
+ tComb = getStackForType(CustomCombs.FLUORINE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropFluorineBlob), 5);
+ tComb = getStackForType(CustomCombs.NIKOLITE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropNikoliteDust), 5);
+ }
+
+ public void addSpecialCent(ItemStack tComb, ItemStack aOutput, int chance) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tComb)
+ .itemOutputs(aOutput, ItemList.FR_Wax.get(1))
+ .outputChances(chance * 100, 3000)
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java
new file mode 100644
index 0000000000..31b14ed4e6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_CombType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, 30, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20)),
+ FORCE(1, "Force", true, 30, Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public final int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_CombType aType) {
+ GTPP_Bees.sCombMappings.put(aId, aType);
+ }
+
+ public static GTPP_CombType get(int aID) {
+ return GTPP_Bees.sCombMappings.get(aID);
+ }
+
+ GTPP_CombType(int aID, String aName, boolean aShow, int aChance, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mChance = aChance;
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.comb." + this.mNameUnlocal, this.mName + " Comb");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.comb." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour == null || mColour.length != 2 ? new int[] { 0, 0 } : mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.combs, count, mID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java
new file mode 100644
index 0000000000..9819c586cd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_DropType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20)),
+ FORCE(1, "Force", true, Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_DropType aType) {
+ GTPP_Bees.sDropMappings.put(aId, aType);
+ }
+
+ public static GTPP_DropType get(int aID) {
+ return GTPP_Bees.sDropMappings.get(aID);
+ }
+
+ private GTPP_DropType(int aID, String aName, boolean aShow, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.drop." + this.mNameUnlocal, this.mName + " Drop");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.drop." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.drop, count, mID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java
new file mode 100644
index 0000000000..66451c7581
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java
@@ -0,0 +1,60 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_PollenType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_PollenType aType) {
+ GTPP_Bees.sPollenMappings.put(aId, aType);
+ }
+
+ public static GTPP_PollenType get(int aID) {
+ return GTPP_Bees.sPollenMappings.get(aID);
+ }
+
+ private GTPP_PollenType(int aID, String aName, boolean aShow, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.pollen." + this.mNameUnlocal, this.mName + " Pollen");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.pollen." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.pollen, count, mID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java
new file mode 100644
index 0000000000..eb3b617077
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_PropolisType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20)),
+ FORCE(1, "Force", true, Utils.rgbtoHexValue(250, 250, 20));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int mColour;
+
+ private static void map(int aId, GTPP_PropolisType aType) {
+ GTPP_Bees.sPropolisMappings.put(aId, aType);
+ }
+
+ public static GTPP_PropolisType get(int aID) {
+ return GTPP_Bees.sPropolisMappings.get(aID);
+ }
+
+ private GTPP_PropolisType(int aID, String aName, boolean aShow, int aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.propolis." + this.mNameUnlocal, this.mName + " Propolis");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.propolis." + this.mNameUnlocal);
+ }
+
+ public int getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.propolis, count, mID);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java
new file mode 100644
index 0000000000..b61a91710e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2014 SirSengir. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the GNU Lesser Public License v3 which accompanies this distribution, and is available
+ * at http://www.gnu.org/licenses/lgpl-3.0.txt
+ *
+ * Various Contributors including, but not limited to: SirSengir (original work), CovertJaguar, Player, Binnie,
+ * MysteriousAges
+ ******************************************************************************/
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraftforge.common.ChestGenHooks;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import forestry.core.utils.StringUtil;
+import gregtech.api.enums.Mods;
+
+public class FR_ItemRegistry {
+
+ // ----- Apiary Frames ----------------------
+
+ // Magic Bee Frame Items
+ public static MB_ItemFrame hiveFrameAccelerated;
+ public static MB_ItemFrame hiveFrameVoid;
+ public static MB_ItemFrame hiveFrameMutagenic;
+ public static MB_ItemFrame hiveFrameBusy;
+
+ // Extra Bee Frame Items
+ public static MB_ItemFrame hiveFrameCocoa;
+ public static MB_ItemFrame hiveFrameCaged;
+ public static MB_ItemFrame hiveFrameSoul;
+ public static MB_ItemFrame hiveFrameClay;
+ public static MB_ItemFrame hiveFrameNova;
+
+ // Frame Items added by bartimaeusnek
+ public static MB_ItemFrame hiveFrameDecay;
+ public static MB_ItemFrame hiveFrameSlow;
+ public static MB_ItemFrame hiveFrameStalilize;
+ public static MB_ItemFrame hiveFrameArborist;
+
+ @Optional.Method(modid = Mods.Names.FORESTRY)
+ public static void Register() {
+
+ // Forestry Frames
+ // frameUntreated = registerItem(new FR_ItemHiveFrame(80, 0.9f), "frameUntreated");
+ // frameImpregnated = registerItem(new FR_ItemHiveFrame(240, 0.4f), "frameImpregnated");
+ // frameProven = registerItem(new FR_ItemHiveFrame(720, 0.3f), "frameProven");
+
+ // Magic Bee like Frames
+
+ hiveFrameVoid = new MB_ItemFrame(
+ MB_FrameType.USELESS,
+ EnumRarity.common,
+ "No more cheaty frames for GTNH players.");
+
+ hiveFrameAccelerated = new MB_ItemFrame(
+ MB_FrameType.ACCELERATED,
+ "Longevity for bees isn't very common, especially if they're working harder.");
+ hiveFrameMutagenic = new MB_ItemFrame(
+ MB_FrameType.MUTAGENIC,
+ EnumRarity.epic,
+ "Evolution of the fittest, finest and fastest.");
+ hiveFrameBusy = new MB_ItemFrame(MB_FrameType.BUSY, "Your bee will work harder and longer than you expected.");
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 14));
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_LIBRARY,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 3, 18));
+ ChestGenHooks.addItem(
+ ChestGenHooks.DUNGEON_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 14));
+ ChestGenHooks.addItem(
+ ChestGenHooks.MINESHAFT_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 9));
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_DESERT_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 1, 9));
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_JUNGLE_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 12));
+ ChestGenHooks.addItem(
+ ChestGenHooks.MINESHAFT_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 8));
+ ChestGenHooks.addItem(
+ ChestGenHooks.DUNGEON_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 12));
+
+ // Frame Items added by bartimaeusnek
+ hiveFrameDecay = new MB_ItemFrame(
+ MB_FrameType.DECAYING,
+ EnumRarity.uncommon,
+ "Who really needs stable genetics?");
+ hiveFrameSlow = new MB_ItemFrame(MB_FrameType.SLOWING, EnumRarity.common, "The journey is its own reward.");
+ hiveFrameStalilize = new MB_ItemFrame(
+ MB_FrameType.STABILIZING,
+ EnumRarity.rare,
+ "If you wish your bees to keep their form.");
+ hiveFrameArborist = new MB_ItemFrame(
+ MB_FrameType.ARBORISTS,
+ EnumRarity.common,
+ "Who need Bees when you can have Trees?");
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_JUNGLE_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameArborist), 1, 4, 24));
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_LIBRARY,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameSlow), 1, 4, 24));
+ }
+
+ protected static <T extends Item> T registerItem(final T item, final String name) {
+ item.setUnlocalizedName(name);
+ GameRegistry.registerItem(item, StringUtil.cleanItemName(item));
+ return item;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java
new file mode 100644
index 0000000000..c63401aecf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import net.minecraft.util.StatCollector;
+
+public class FR_StringUtil {
+
+ public static String getLocalizedString(final String key) {
+ if (StatCollector.canTranslate(key)) {
+ return StatCollector.translateToLocal(key);
+ }
+ return StatCollector.translateToFallback(key);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java
new file mode 100644
index 0000000000..418c05587f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeModifier;
+
+public enum MB_FrameType implements IBeeModifier {
+
+ // ExtraBees Clone Frames
+ // Name, FrameHP, territory (1f), Mutation rate, lifespan rate, production rate, genetic decay (1f)
+ COCOA("Chocolate", 240, 1.0f, 1.0f, 0.50f, 0.50f, 1f), // production was 1.5x, now +0.5
+ CAGE("Restraint", 240, 0.5f, 1.0f, 0.75f, -0.25f, 1f), // production was 0.75x, now -0.25
+ SOUL("Soul", 80, 1.0f, 1.5f, 0.75f, -0.75f, 1f), // production was 0.25x, now -0.75
+ CLAY("Healing", 240, 1.0f, 0.5f, 1.50f, -0.25f, 1f), // production was 0.75x, now -0.25
+ NOVA("Nova", 240, 1.0f, 100.0f, 0.0001f, 0.00f, 1f), // production was 1x, now +0
+
+ // Name, FrameHP, territory (1f), Mutation rate, lifespan rate, production rate, genetic decay (1f)
+ ACCELERATED("Accelerated", 175, 1f, 1.2f, 0.9f, 0.8f, 1f), // production was 1.8x, now +0.8
+ VOID("Void", 20, 1f, 1f, 0.0001f, 9f, 1f), // production was 10x, now +9
+ MUTAGENIC("Mutagenic", 3, 1f, 5f, 0.0001f, 9f, 1f), // production was 10x, now +9
+ BUSY("Busy", 2000, 1f, 0f, 3f, 3f, 1f), // production was 4x, now +3
+ USELESS("Useless", 100, 1f, 0f, 1f, 0f, 1f), // production was 1x, now +0
+
+ // Frame Items added by bartimaeusnek
+ DECAYING("Decaying", 240, 1f, 1f, 1f, 0f, 10f), // enhanches decay to 10x // production was 1x, now +0
+ SLOWING("Slowing", 175, 1f, 0.5f, 2f, -0.5f, 1f), // reduces mutation, production rate and enhanches lifespan //
+ // production was 0.5x, now -0.5
+ STABILIZING("Stabilizing", 60, 1f, 0.1f, 1f, -0.9f, 0.5f), // reduces mutation, production and decay // production
+ // was 0.1x, now -0.9
+ ARBORISTS("Arborists", 240, 3f, 0f, 3f, -9001f, 1f); // 3x territory and lifespan, sets mutation and production to
+ // zero // production was 0x, now -9001
+
+ private final String frameName;
+ public final int maxDamage;
+
+ private final float territoryMod;
+ private final float mutationMod;
+ private final float lifespanMod;
+ private final float productionMod;
+ private final float floweringMod;
+ private final float geneticDecayMod;
+ private final boolean isSealed;
+ private final boolean isLit;
+ private final boolean isSunlit;
+ private final boolean isHellish;
+
+ MB_FrameType(final String name, final int damage, final float territory, final float mutation, final float lifespan,
+ final float production, final float geneticDecay) {
+ this(name, damage, territory, mutation, lifespan, production, 1f, geneticDecay, false, false, false, false);
+ }
+
+ MB_FrameType(final String name, final int damage, final float territory, final float mutation, final float lifespan,
+ final float production, final float flowering, final float geneticDecay, final boolean sealed,
+ final boolean lit, final boolean sunlit, final boolean hellish) {
+ this.frameName = name;
+ this.maxDamage = damage;
+
+ this.territoryMod = territory;
+ this.mutationMod = mutation;
+ this.lifespanMod = lifespan;
+ this.productionMod = production;
+ this.floweringMod = flowering;
+ this.geneticDecayMod = geneticDecay;
+ this.isSealed = sealed;
+ this.isLit = lit;
+ this.isSunlit = sunlit;
+ this.isHellish = hellish;
+ }
+
+ public String getName() {
+ return this.frameName;
+ }
+
+ public String getLocalizedName() {
+ return FR_StringUtil.getLocalizedString("frame." + this.frameName);
+ }
+
+ @Override
+ public float getTerritoryModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.territoryMod;
+ }
+
+ @Override
+ public float getMutationModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.mutationMod;
+ }
+
+ @Override
+ public float getLifespanModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.lifespanMod;
+ }
+
+ @Override
+ public float getProductionModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.productionMod;
+ }
+
+ @Override
+ public float getFloweringModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.floweringMod;
+ }
+
+ @Override
+ public float getGeneticDecay(final IBeeGenome genome, final float currentModifier) {
+ return this.geneticDecayMod;
+ }
+
+ @Override
+ public boolean isSealed() {
+ return this.isSealed;
+ }
+
+ @Override
+ public boolean isSelfLighted() {
+ return this.isLit;
+ }
+
+ @Override
+ public boolean isSunlightSimulated() {
+ return this.isSunlit;
+ }
+
+ @Override
+ public boolean isHellish() {
+ return this.isHellish;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java
new file mode 100644
index 0000000000..e5d36d15e8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.apiculture.IHiveFrame;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class MB_ItemFrame extends Item implements IHiveFrame {
+
+ private final MB_FrameType type;
+ private EnumRarity rarity_value = EnumRarity.uncommon;
+ private final String toolTip;
+
+ public MB_ItemFrame(final MB_FrameType frameType, final String description) {
+ this(frameType, EnumRarity.uncommon, description);
+ }
+
+ public MB_ItemFrame(final MB_FrameType frameType, final EnumRarity rarity, final String description) {
+ super();
+ this.type = frameType;
+ this.setMaxDamage(this.type.maxDamage);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName("frame" + frameType.getName());
+ this.rarity_value = rarity;
+ this.toolTip = description;
+ GameRegistry.registerItem(this, "frame" + frameType.getName());
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if ((this.toolTip != "") || !this.toolTip.equals("")) {
+ list.add(EnumChatFormatting.GRAY + this.toolTip);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon(GTPlusPlus.ID + ":frame" + this.type.getName());
+ }
+
+ // --------- IHiveFrame functions -----------------------------------------
+
+ @Override
+ public ItemStack frameUsed(final IBeeHousing housing, ItemStack frame, final IBee queen, final int wear) {
+ frame.setItemDamage(frame.getItemDamage() + wear);
+
+ if (frame.getItemDamage() >= frame.getMaxDamage()) {
+ // Break the frame.
+ frame = null;
+ }
+
+ return frame;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity_value;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ if ((this.rarity_value == EnumRarity.uncommon) || (this.rarity_value == EnumRarity.common)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public IBeeModifier getBeeModifier() {
+ return this.type;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack itemstack1, final ItemStack itemstack2) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ public float getTerritoryModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getTerritoryModifier(genome, currentModifier);
+ }
+
+ public float getMutationModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.type.getMutationModifier(genome, mate, currentModifier);
+ }
+
+ public float getLifespanModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.type.getLifespanModifier(genome, mate, currentModifier);
+ }
+
+ public float getProductionModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getProductionModifier(genome, currentModifier);
+ }
+
+ public float getFloweringModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getFloweringModifier(genome, currentModifier);
+ }
+
+ public float getGeneticDecay(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getGeneticDecay(genome, currentModifier);
+ }
+
+ public boolean isSealed() {
+ return this.type.isSealed();
+ }
+
+ public boolean isSelfLighted() {
+ return this.type.isSelfLighted();
+ }
+
+ public boolean isSunlightSimulated() {
+ return this.type.isSunlightSimulated();
+ }
+
+ public boolean isHellish() {
+ return this.type.isHellish();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java
new file mode 100644
index 0000000000..7c9cc5a990
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Comb extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Comb() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.comb");
+ GameRegistry.registerItem(this, "gtpp.comb", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_CombType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_CombType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_CombType type : GTPP_CombType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:beeCombs.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:beeCombs.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_CombType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_CombType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_CombType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ public static void initCombsRecipes() {
+
+ addChemicalRecipe(
+ GTPP_CombType.DRAGONBLOOD,
+ new ItemStack[] { GT_ModHandler.getModItem(Forestry.ID, "refractoryWax", 1L, 0),
+ GTPP_Bees.propolis.getStackForType(GTPP_PropolisType.DRAGONBLOOD),
+ GTPP_Bees.drop.getStackForType(GTPP_DropType.DRAGONBLOOD) },
+ new int[] { 3000, 1500, 500 });
+ addChemicalRecipe(
+ GTPP_CombType.FORCE,
+ new ItemStack[] { GT_ModHandler.getModItem(Forestry.ID, "beeswax", 1L, 0),
+ GTPP_Bees.propolis.getStackForType(GTPP_PropolisType.FORCE),
+ GTPP_Bees.drop.getStackForType(GTPP_DropType.FORCE) },
+ new int[] { 5000, 3000, 1000 });
+ }
+
+ public static void addChemicalRecipe(GTPP_CombType aInputStack, ItemStack[] aOutputs, int[] aChances) {
+ Material aMat = aInputStack.mMaterial;
+ long aEU = aMat.vVoltageMultiplier;
+ int aTier = Math.max(aMat.vTier / 2, 1);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { aInputStack.getStackForType(aTier), },
+ new FluidStack[] {},
+ aOutputs,
+ new FluidStack[] {},
+ aChances,
+ aTier * 20 * 60,
+ aEU,
+ aTier);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java
new file mode 100644
index 0000000000..a84d11e74c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Drop extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Drop() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.drop");
+ GameRegistry.registerItem(this, "gtpp.drop", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_DropType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_DropType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_DropType type : GTPP_DropType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:honeyDrop.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:honeyDrop.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_DropType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_DropType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_DropType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ private static final int[] sFluidOutputs = new int[] { 144, 136, 128, 120, 112, 104, 96, 88, 80, 72, 64, 48, 32, 16,
+ 8, 4 };
+
+ public static void initDropsRecipes() {
+ ItemStack tDrop;
+ Logger.BEES("Processing recipes for " + GTPP_Bees.sDropMappings.size() + " Drops.");
+ for (GTPP_DropType aDrop : GTPP_Bees.sDropMappings.values()) {
+ tDrop = aDrop.getStackForType(1);
+ if (addProcess(
+ tDrop,
+ new FluidStack(aDrop.mMaterial.getFluid(), sFluidOutputs[aDrop.mMaterial.vTier]),
+ aDrop.mMaterial.vTier * 20 * 30,
+ aDrop.mMaterial.vVoltageMultiplier)) {
+ Logger.BEES("Added Drop extraction recipe for: " + aDrop.getName());
+ } else {
+ Logger.BEES("Failed to add Drop extraction recipe for: " + aDrop.getName());
+ }
+ }
+ }
+
+ public static boolean addProcess(ItemStack tDrop, FluidStack aOutput, int aDuration, int aEUt) {
+ if (aOutput == null) {
+ return false;
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .fluidOutputs(aOutput)
+ .duration(aDuration * TICKS)
+ .eut(aEUt)
+ .addTo(fluidExtractionRecipes);
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java
new file mode 100644
index 0000000000..7e959151a0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType;
+
+public class GTPP_Pollen extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Pollen() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.pollen");
+ GameRegistry.registerItem(this, "gtpp.pollen", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_PollenType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_PollenType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_PollenType type : GTPP_PollenType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:pollen.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:pollen.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_PollenType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_PollenType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_PollenType.get(stack.getItemDamage())
+ .getName();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java
new file mode 100644
index 0000000000..1c1bd95d09
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java
@@ -0,0 +1,110 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Propolis extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Propolis() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.propolis");
+ GameRegistry.registerItem(this, "gtpp.propolis", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_PropolisType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_PropolisType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_PropolisType type : GTPP_PropolisType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:propolis.0");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return itemIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ return GTPP_PropolisType.get(stack.getItemDamage())
+ .getColours();
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_PropolisType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ public static void initPropolisRecipes() {
+ ItemStack tDrop;
+ Logger.BEES("Processing recipes for " + GTPP_Bees.sPropolisMappings.size() + " Propolis.");
+ for (GTPP_PropolisType aProp : GTPP_Bees.sPropolisMappings.values()) {
+ tDrop = aProp.getStackForType(1);
+ if (addProcess(
+ tDrop,
+ aProp.mMaterial.getDust(1),
+ Math.min(Math.max(10000 - (aProp.mMaterial.vTier * 625), 100), 10000),
+ aProp.mMaterial.vTier * 20 * 15,
+ aProp.mMaterial.vVoltageMultiplier)) {
+ Logger.BEES("Added Propolis extraction recipe for: " + aProp.getName());
+ } else {
+ Logger.BEES("Failed to add Propolis extraction recipe for: " + aProp.getName());
+ }
+ }
+ }
+
+ public static boolean addProcess(ItemStack tDrop, ItemStack aOutput, int aChance, int aDuration, int aEUt) {
+ if (aOutput == null) {
+ return false;
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .itemOutputs(aOutput)
+ .outputChances(aChance)
+ .duration(aDuration * TICKS)
+ .eut(aEUt)
+ .addTo(extractorRecipes);
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java
new file mode 100644
index 0000000000..ce982cd67e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.xmod.forestry.bees.recipe;
+
+import static gregtech.api.enums.Mods.MagicBees;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.forestry.bees.items.FR_ItemRegistry;
+
+public class FR_Gregtech_Recipes {
+
+ private static String rod_Electrum = "stickElectrum";
+ private static String rod_LongElectrum = "stickLongElectrum";
+ private static String foil_Electrum = "foilElectrum";
+ private static String rod_Uranium = "stickUranium";
+ private static String rod_LongUranium = "stickLongUranium";
+ private static String foil_Uranium235 = "foilUranium235";
+ private static ItemStack hiveFrameAccelerated = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameAccelerated);
+ private static ItemStack hiveFrameMutagenic = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameMutagenic);
+ private static ItemStack hiveFrameVoid = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameVoid);
+ private static ItemStack hiveFrameBusy = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameBusy);
+
+ private static ItemStack hiveFrameCocoa = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameCocoa);
+ private static ItemStack hiveFrameCaged = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameCaged);
+ private static ItemStack hiveFrameSoul = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameSoul);
+ private static ItemStack hiveFrameClay = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameClay);
+ private static ItemStack hiveFrameNova = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameNova);
+
+ private static ItemStack hiveFrameImpregnated = ItemUtils.getItemStackFromFQRN("Forestry:frameImpregnated", 1);
+ private static ItemStack blockSoulSand = new ItemStack(Blocks.soul_sand, 1);
+ private static ItemStack blockIronBars = new ItemStack(Blocks.iron_bars, 1);
+ private static ItemStack itemClayDust = new ItemStack(Items.clay_ball, 1);
+ private static ItemStack itemCocoaBeans = new ItemStack(Items.dye, 1, 3);
+
+ private static ItemStack hiveFrameDecay = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameDecay);
+ private static ItemStack hiveFrameSlow = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameSlow);
+ private static ItemStack hiveFrameStalilize = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameStalilize);
+ private static ItemStack hiveFrameArborist = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameArborist);
+
+ public static void registerItems() {
+ // Magic Bee Like Frames
+ RecipeUtils.addShapedGregtechRecipe(
+ rod_LongElectrum,
+ rod_Electrum,
+ rod_LongElectrum,
+ rod_LongElectrum,
+ foil_Electrum,
+ rod_LongElectrum,
+ rod_Electrum,
+ rod_Electrum,
+ rod_Electrum,
+ hiveFrameAccelerated);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ rod_LongUranium,
+ rod_Uranium,
+ rod_LongUranium,
+ rod_LongUranium,
+ foil_Uranium235,
+ rod_LongUranium,
+ rod_Uranium,
+ rod_Uranium,
+ rod_Uranium,
+ hiveFrameMutagenic);
+ if (MagicBees.isModLoaded()) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { hiveFrameVoid },
+ ItemUtils.getCorrectStacktype("MagicBees:frameOblivion", 1));
+ }
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongBlueSteel",
+ "stickBlueSteel",
+ "stickLongBlueSteel",
+ "stickLongBlueSteel",
+ ItemUtils.getSimpleStack(Items.nether_star),
+ "stickLongBlueSteel",
+ "stickBlueSteel",
+ "stickBlueSteel",
+ "stickBlueSteel",
+ hiveFrameBusy);
+
+ // Frame Items added by bartimaeusnek
+ RecipeUtils.addShapedGregtechRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ foil_Electrum,
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ hiveFrameSlow);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongWroughtIron",
+ "stickWroughtIron",
+ "stickLongWroughtIron",
+ "stickLongWroughtIron",
+ "foilZinc",
+ "stickLongWroughtIron",
+ "stickWroughtIron",
+ "stickWroughtIron",
+ "stickWroughtIron",
+ hiveFrameDecay);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongOsmiridium",
+ "stickOsmiridium",
+ "stickLongOsmiridium",
+ "stickLongOsmiridium",
+ "foilOsmiridium",
+ "stickLongOsmiridium",
+ "stickOsmiridium",
+ "stickOsmiridium",
+ "stickOsmiridium",
+ hiveFrameStalilize);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongWoodSealed",
+ "stickWoodSealed",
+ "stickLongWoodSealed",
+ "stickLongWoodSealed",
+ Items.paper,
+ "stickLongWoodSealed",
+ "stickWoodSealed",
+ "stickWoodSealed",
+ "stickWoodSealed",
+ hiveFrameArborist);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java
new file mode 100644
index 0000000000..05ce6e56e6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleBeeSpecies;
+
+public class GTPP_AlleleBeeSpecies extends AlleleBeeSpecies {
+
+ public GTPP_AlleleBeeSpecies(String uid, boolean dominant, String unlocalizedName, String authority,
+ String unlocalizedDescription, IClassification branch, String binomial, int primaryColor, int secondaryColor) {
+ super(
+ uid,
+ unlocalizedName,
+ authority,
+ unlocalizedDescription,
+ dominant,
+ branch,
+ binomial,
+ primaryColor,
+ secondaryColor);
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPECIES);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addProduct(ItemStack product, Float chance) {
+ if (product == null || product.getItem() == null) {
+ product = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addProduct(product, chance);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addSpecialty(ItemStack specialty, Float chance) {
+ if (specialty == null || specialty.getItem() == null) {
+ specialty = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addSpecialty(specialty, chance);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java
new file mode 100644
index 0000000000..73418bdab8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java
@@ -0,0 +1,301 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.SPECIES;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.core.EnumHumidity.ARID;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.function.Consumer;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.BiomeDictionary;
+
+import org.apache.commons.lang3.text.WordUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleFlowers;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.BeeVariation;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.CombType;
+import gregtech.loaders.misc.GT_Bees;
+import gtPlusPlus.core.material.ELEMENT.STANDALONE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+
+public enum GTPP_BeeDefinition implements IBeeDefinition {
+
+ DRAGONBLOOD(GTPP_BranchDefinition.LEGENDARY, "Dragon Blood", STANDALONE.DRAGON_METAL, true,
+ Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GTPP_Bees.combs.getStackForType(GTPP_CombType.DRAGONBLOOD), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_3);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_3);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation("DRAGONESSENCE", "NEUTRONIUM", 2);
+ tMutation.restrictHumidity(ARID);
+ tMutation.requireResource(STANDALONE.DRAGON_METAL.getBlock(), 1);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ FORCE(GTPP_BranchDefinition.LEGENDARY, "Force", STANDALONE.FORCE, true, Utils.rgbtoHexValue(250, 250, 20),
+ Utils.rgbtoHexValue(200, 200, 5), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALT), 0.15f);
+ beeSpecies.addSpecialty(GTPP_Bees.combs.getStackForType(GTPP_CombType.FORCE), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation("STEEL", "GOLD", 10);
+ tMutation.restrictHumidity(ARID);
+ tMutation.restrictBiomeType(BiomeDictionary.Type.HOT);
+ }),;
+
+ private final GTPP_BranchDefinition branch;
+ private final GTPP_AlleleBeeSpecies species;
+ private final Consumer<GTPP_AlleleBeeSpecies> mSpeciesProperties;
+ private final Consumer<IAllele[]> mAlleles;
+ private final Consumer<GTPP_BeeDefinition> mMutations;
+ private IAllele[] template;
+ private IBeeGenome genome;
+
+ GTPP_BeeDefinition(GTPP_BranchDefinition branch, String binomial, Materials aMat, boolean dominant, int primary,
+ int secondary, Consumer<GTPP_AlleleBeeSpecies> aSpeciesProperties, Consumer<IAllele[]> aAlleles,
+ Consumer<GTPP_BeeDefinition> aMutations) {
+ this(
+ branch,
+ binomial,
+ MaterialUtils.generateMaterialFromGtENUM(aMat),
+ dominant,
+ primary,
+ secondary,
+ aSpeciesProperties,
+ aAlleles,
+ aMutations);
+ }
+
+ GTPP_BeeDefinition(GTPP_BranchDefinition branch, String binomial, Material aMat, boolean dominant, int primary,
+ int secondary, Consumer<GTPP_AlleleBeeSpecies> aSpeciesProperties, Consumer<IAllele[]> aAlleles,
+ Consumer<GTPP_BeeDefinition> aMutations) {
+ this.mAlleles = aAlleles;
+ this.mMutations = aMutations;
+ this.mSpeciesProperties = aSpeciesProperties;
+ String lowercaseName = this.toString()
+ .toLowerCase(Locale.ENGLISH);
+ String species = WordUtils.capitalize(binomial);
+ String uid = "gtpp.bee.species" + species;
+ String description = "for.description." + species;
+ String name = "for.bees.species." + lowercaseName;
+ GT_LanguageManager.addStringLocalization("for.bees.species." + lowercaseName, species, true);
+ GTPP_Bees.sMaterialMappings.put(
+ binomial.toLowerCase()
+ .replaceAll(" ", ""),
+ aMat);
+ this.branch = branch;
+ this.species = new GTPP_AlleleBeeSpecies(
+ uid,
+ dominant,
+ name,
+ "GT++",
+ description,
+ branch.getBranch(),
+ binomial,
+ primary,
+ secondary);
+ }
+
+ public static void initBees() {
+ for (GTPP_BeeDefinition bee : values()) {
+ bee.init();
+ }
+ for (GTPP_BeeDefinition bee : values()) {
+ bee.registerMutations();
+ }
+ }
+
+ private static IAlleleBeeEffect getEffect(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.effect." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.effect." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.effect" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.effect" + name;
+ default -> "forestry.effect" + name;
+ };
+ return (IAlleleBeeEffect) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ private static IAlleleFlowers getFlowers(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.flower." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.flower." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.flower" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.flower" + name;
+ default -> "forestry.flowers" + name;
+ };
+ return (IAlleleFlowers) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ private static IAlleleBeeSpecies getSpecies(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.species." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.bee." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.species" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.species" + name;
+ default -> "forestry.species" + name;
+ };
+ IAlleleBeeSpecies ret = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(s);
+ return ret;
+ }
+
+ private final void setSpeciesProperties(GTPP_AlleleBeeSpecies species2) {
+ this.mSpeciesProperties.accept(species2);
+ }
+
+ private final void setAlleles(IAllele[] template) {
+ this.mAlleles.accept(template);
+ }
+
+ private final void registerMutations() {
+ this.mMutations.accept(this);
+ }
+
+ private void init() {
+ setSpeciesProperties(species);
+
+ template = branch.getTemplate();
+ AlleleHelper.instance.set(template, SPECIES, species);
+ setAlleles(template);
+
+ genome = BeeManager.beeRoot.templateAsGenome(template);
+
+ BeeManager.beeRoot.registerTemplate(template);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTPP_BeeDefinition parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, GTPP_BeeDefinition parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(String parent1, String parent2, int chance) {
+ return registerMutation(getGregtechBeeType(parent1), getGregtechBeeType(parent2), chance, 1f);
+ }
+
+ /**
+ * Diese neue Funtion erlaubt Mutationsraten unter 1%. Setze dazu die Mutationsrate als Bruch mit chance /
+ * chancedivider This new function allows Mutation percentages under 1%. Set them as a fraction with chance /
+ * chancedivider
+ */
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance,
+ float chancedivider) {
+ return new GTPP_Bee_Mutation(parent1, parent2, this.getTemplate(), chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance,
+ float chancedivider) {
+ return registerMutation(parent1.species, parent2, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTPP_BeeDefinition parent2, int chance,
+ float chancedivider) {
+ return registerMutation(parent1, parent2.species, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, GTPP_BeeDefinition parent2,
+ int chance, float chancedivider) {
+ return registerMutation(parent1.species, parent2, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(String parent1, String parent2, int chance, float chancedivider) {
+ return registerMutation(getGregtechBeeType(parent1), getGregtechBeeType(parent2), chance, chancedivider);
+ }
+
+ @Override
+ public final IAllele[] getTemplate() {
+ return Arrays.copyOf(template, template.length);
+ }
+
+ @Override
+ public final IBeeGenome getGenome() {
+ return genome;
+ }
+
+ @Override
+ public final IBee getIndividual() {
+ return new Bee(genome);
+ }
+
+ @Override
+ public final ItemStack getMemberStack(EnumBeeType beeType) {
+ return BeeManager.beeRoot.getMemberStack(getIndividual(), beeType.ordinal());
+ }
+
+ public final IBeeDefinition getRainResist() {
+ return new BeeVariation.RainResist(this);
+ }
+
+ private static final Class sGtBees = ReflectionUtils.getClass("gregtech.loaders.misc.GT_BeeDefinition");
+
+ public static IAlleleBeeSpecies getGregtechBeeType(String name) {
+ try {
+ Enum aBeeObject = ReflectionUtils.getEnum(sGtBees, name);
+ Field gtBeesField = ReflectionUtils.getField(sGtBees, "species");
+ IAlleleBeeSpecies beeType = ReflectionUtils.getFieldValue(gtBeesField, aBeeObject);
+ return beeType != null ? beeType : null;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java
new file mode 100644
index 0000000000..d20b7ffb73
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java
@@ -0,0 +1,86 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.core.IClimateProvider;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IGenome;
+import forestry.api.genetics.IMutationCondition;
+import forestry.apiculture.genetics.BeeMutation;
+import forestry.core.genetics.mutations.Mutation;
+
+public class GTPP_Bee_Mutation extends BeeMutation {
+
+ private final float split;
+
+ public GTPP_Bee_Mutation(IAlleleBeeSpecies bee0, IAlleleBeeSpecies bee1, IAllele[] result, int chance,
+ float split) {
+ super(bee0, bee1, result, chance);
+ this.split = split;
+ BeeManager.beeRoot.registerMutation(this);
+ }
+
+ @Override
+ public float getBaseChance() {
+ return super.getBaseChance() / split;
+ }
+
+ @Override
+ public float getChance(IBeeHousing housing, IAlleleBeeSpecies allele0, IAlleleBeeSpecies allele1,
+ IBeeGenome genome0, IBeeGenome genome1) {
+ World world = housing != null ? housing.getWorld() : null;
+ ChunkCoordinates housingCoordinates = housing != null ? housing.getCoordinates() : null;
+ int x = housingCoordinates != null ? housingCoordinates.posX : 0;
+ int y = housingCoordinates != null ? housingCoordinates.posY : 0;
+ int z = housingCoordinates != null ? housingCoordinates.posZ : 0;
+
+ float processedChance = getBasicChance(world, x, y, z, allele0, allele1, genome0, genome1, housing);
+
+ if (processedChance <= 0f) {
+ return 0f;
+ }
+
+ IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+ IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world)
+ .getBeeModifier();
+
+ processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
+ processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
+
+ return processedChance;
+ }
+
+ @SuppressWarnings("unchecked")
+ private float getBasicChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+ IGenome genome1, IClimateProvider climate) {
+ float mutationChance = this.getBaseChance();
+ List<IMutationCondition> mutationConditions = null;
+ Field f = FieldUtils.getDeclaredField(Mutation.class, "mutationConditions", true);
+ if (f == null) f = FieldUtils.getField(Mutation.class, "mutationConditions", true);
+ if (f == null) return mutationChance;
+ try {
+ mutationConditions = f.get(this) instanceof List ? (List<IMutationCondition>) f.get(this) : null;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ if (mutationConditions != null) for (IMutationCondition mutationCondition : mutationConditions) {
+ mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
+ if (mutationChance == 0) {
+ return 0;
+ }
+ }
+ return mutationChance;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java
new file mode 100644
index 0000000000..77b7d57954
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.HashMap;
+
+import gregtech.GT_Mod;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Comb;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Drop;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Pollen;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Propolis;
+
+public class GTPP_Bees {
+
+ public static final byte FORESTRY = 0;
+ public static final byte EXTRABEES = 1;
+ public static final byte GENDUSTRY = 2;
+ public static final byte MAGICBEES = 3;
+ public static final byte GREGTECH = 4;
+
+ public static GTPP_Propolis propolis;
+ public static GTPP_Pollen pollen;
+ public static GTPP_Drop drop;
+ public static GTPP_Comb combs;
+
+ public static HashMap<String, Material> sMaterialMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_PropolisType> sPropolisMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_PollenType> sPollenMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_DropType> sDropMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_CombType> sCombMappings = new HashMap<>();
+
+ public GTPP_Bees() {
+ if (Forestry.isModLoaded() && GT_Mod.gregtechproxy.mGTBees) {
+ Logger.BEES("Creating required items.");
+ propolis = new GTPP_Propolis();
+ pollen = new GTPP_Pollen();
+ drop = new GTPP_Drop();
+ combs = new GTPP_Comb();
+
+ Logger.BEES("Loading types.");
+ initTypes();
+
+ Logger.BEES("Adding recipes.");
+ GTPP_Drop.initDropsRecipes();
+ GTPP_Propolis.initPropolisRecipes();
+ GTPP_Comb.initCombsRecipes();
+
+ Logger.BEES("Initialising bees.");
+ GTPP_BeeDefinition.initBees();
+
+ Logger.BEES("Done!");
+ }
+ }
+
+ private static void initTypes() {
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.registry.GTPP_BeeDefinition");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java
new file mode 100644
index 0000000000..39af813dec
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java
@@ -0,0 +1,89 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import forestry.core.genetics.alleles.EnumAllele.Fertility;
+import forestry.core.genetics.alleles.EnumAllele.Flowering;
+import forestry.core.genetics.alleles.EnumAllele.Flowers;
+import forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import forestry.core.genetics.alleles.EnumAllele.Speed;
+import forestry.core.genetics.alleles.EnumAllele.Territory;
+import forestry.core.genetics.alleles.EnumAllele.Tolerance;
+
+public enum GTPP_BranchDefinition {
+
+ LEGENDARY("gtpp.legendary", "Summa Potestas", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.END);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+ });
+
+ private static IAllele[] defaultTemplate;
+ private final IClassification branch;
+ private final Consumer<IAllele[]> mBranchProperties;
+
+ GTPP_BranchDefinition(String internal, String scientific, Consumer<IAllele[]> aBranchProperties) {
+ this.branch = BeeManager.beeFactory.createBranch(internal.toLowerCase(), scientific);
+ this.mBranchProperties = aBranchProperties;
+ }
+
+ private static IAllele[] getDefaultTemplate() {
+ if (defaultTemplate == null) {
+ defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
+
+ AlleleHelper.instance.set(defaultTemplate, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(defaultTemplate, FERTILITY, Fertility.NORMAL);
+ AlleleHelper.instance.set(defaultTemplate, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, NOCTURNAL, false);
+ AlleleHelper.instance.set(defaultTemplate, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, TOLERANT_FLYER, false);
+ AlleleHelper.instance.set(defaultTemplate, CAVE_DWELLING, false);
+ AlleleHelper.instance.set(defaultTemplate, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(defaultTemplate, FLOWERING, Flowering.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, TERRITORY, Territory.AVERAGE);
+ AlleleHelper.instance.set(defaultTemplate, EFFECT, AlleleEffect.effectNone);
+ }
+ return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
+ }
+
+ private final void setBranchProperties(IAllele[] template) {
+ this.mBranchProperties.accept(template);
+ }
+
+ public final IAllele[] getTemplate() {
+ IAllele[] template = getDefaultTemplate();
+ setBranchProperties(template);
+ return template;
+ }
+
+ public final IClassification getBranch() {
+ return branch;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java b/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java
new file mode 100644
index 0000000000..e95baf43df
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java
@@ -0,0 +1,98 @@
+package gtPlusPlus.xmod.gregtech;
+
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_Config;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT;
+import gtPlusPlus.recipes.CokeAndPyrolyseOven;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;
+import gtPlusPlus.xmod.gregtech.common.Meta_GT_Proxy;
+import gtPlusPlus.xmod.gregtech.common.blocks.fluid.GregtechFluidHandler;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import gtPlusPlus.xmod.gregtech.loaders.Gregtech_Blocks;
+import gtPlusPlus.xmod.gregtech.loaders.ProcessingAngleGrinder;
+import gtPlusPlus.xmod.gregtech.loaders.ProcessingElectricSnips;
+import gtPlusPlus.xmod.gregtech.loaders.misc.AddCustomMachineToPA;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_AlgaeFarm;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_MolecularTransformer;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits;
+
+public class HANDLER_GT {
+
+ public static GT_Config mMaterialProperties = null;
+ public static GTPP_Config sCustomWorldgenFile = null;
+ public static final List<WorldGen_GT> sWorldgenListEverglades = new ArrayList<>();
+ public static GT_MetaGenerated_Tool sMetaGeneratedToolInstance;
+
+ public static void preInit() {
+
+ if (mMaterialProperties != null) {
+ GT_Materials.init(mMaterialProperties);
+ }
+
+ GregtechFluidHandler.run();
+ }
+
+ public static void init() {
+
+ // Load General Blocks and set up some Basic Meta Tile Entity states
+ Gregtech_Blocks.run();
+
+ // Add Custom Pipes, Wires and Cables.
+ GregtechConduits.run();
+
+ // Register Tile Entities
+ COMPAT_HANDLER.registerGregtechMachines();
+
+ sMetaGeneratedToolInstance = MetaGeneratedGregtechTools.getInstance();
+ }
+
+ public static void postInit() {
+
+ // Only loads if the config option is true (default: true)
+ new ProcessingAngleGrinder().run();
+ new ProcessingElectricSnips().run();
+
+ // Add recipes
+ CokeAndPyrolyseOven.postInit();
+
+ // Register custom singles to the PA
+ AddCustomMachineToPA.register();
+
+ // Register some custom recipe maps for any enabled multiblocks.
+ // MultiblockRecipeMapHandler.run();
+
+ if (GregtechItemList.Circuit_BioRecipeSelector.hasBeenSet()) {
+ for (int i = 1; i <= 24; i++) {
+ GregTech_API.registerConfigurationCircuit(CI.getNumberedBioCircuit(i), 0);
+ }
+ }
+
+ if (GregtechItemList.Circuit_T3RecipeSelector.hasBeenSet()) {
+ for (int i = 1; i <= 24; i++) {
+ GregTech_API.registerConfigurationCircuit(CI.getNumberedAdvancedCircuit(i), 3);
+ }
+ }
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ CokeAndPyrolyseOven.onLoadComplete();
+ Meta_GT_Proxy.fixIC2FluidNames();
+ RecipeLoader_AlgaeFarm.generateRecipes();
+ RecipeLoader_TreeFarm.generateRecipes();
+ if (AdvancedSolarPanel.isModLoaded()) {
+ RecipeLoader_MolecularTransformer.run();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java
new file mode 100644
index 0000000000..6367d22f77
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java
@@ -0,0 +1,980 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.xmod.gregtech.api.interfaces.GregtechItemContainer;
+
+/**
+ * Class containing all non-OreDict Items of GregTech.
+ */
+public enum GregtechItemList implements GregtechItemContainer {
+
+ /**
+ * Items
+ */
+
+ // Advanced Hazmat Suit
+ Armour_Hazmat_Advanced_Helmet,
+ Armour_Hazmat_Advanced_Chest,
+ Armour_Hazmat_Advanced_Legs,
+ Armour_Hazmat_Advanced_Boots,
+
+ // Gregtech Machine Parts
+ Electric_Motor_LuV,
+ Electric_Motor_ZPM,
+ Electric_Motor_UV,
+ Electric_Pump_LuV,
+ Electric_Pump_ZPM,
+ Electric_Pump_UV,
+ Conveyor_Module_LuV,
+ Conveyor_Module_ZPM,
+ Conveyor_Module_UV,
+ Electric_Piston_LuV,
+ Electric_Piston_ZPM,
+ Electric_Piston_UV,
+ Robot_Arm_LuV,
+ Robot_Arm_ZPM,
+ Robot_Arm_UV,
+ Field_Generator_LuV,
+ Field_Generator_ZPM,
+ Field_Generator_UV,
+ Emitter_LuV,
+ Emitter_ZPM,
+ Emitter_UV,
+ Sensor_LuV,
+ Sensor_ZPM,
+ Sensor_UV,
+
+ // Mixed Components
+ TransmissionComponent_LV,
+ TransmissionComponent_MV,
+ TransmissionComponent_HV,
+ TransmissionComponent_EV,
+ TransmissionComponent_IV,
+ TransmissionComponent_LuV,
+ TransmissionComponent_ZPM,
+ TransmissionComponent_UV,
+ TransmissionComponent_UHV,
+
+ // Recipe Circuit
+ Circuit_BioRecipeSelector,
+ Circuit_T3RecipeSelector,
+
+ // Circuits
+ Old_Circuit_Primitive,
+ Old_Circuit_Basic,
+ Old_Circuit_Good,
+ Old_Circuit_Advanced,
+ Old_Circuit_Data,
+ Old_Circuit_Elite,
+ Old_Circuit_Master,
+ Old_Tool_DataOrb,
+ Old_Circuit_Ultimate,
+ Old_Tool_DataStick,
+ Circuit_IV,
+ Circuit_LuV,
+ Circuit_ZPM,
+
+ // Circuit Parts
+ Circuit_Board_IV,
+ Circuit_Board_LuV,
+ Circuit_Board_ZPM,
+ Circuit_Parts_Crystal_Chip_IV,
+ Circuit_Parts_Crystal_Chip_LuV,
+ Circuit_Parts_Crystal_Chip_ZPM,
+ Circuit_Parts_IV,
+ Circuit_Parts_LuV,
+ Circuit_Parts_ZPM,
+ Circuit_Parts_Wiring_IV,
+ Circuit_Parts_Wiring_LuV,
+ Circuit_Parts_Wiring_ZPM,
+
+ // Old Style Circuits
+ Old_Circuit_Board_Basic,
+ Old_Circuit_Board_Advanced,
+ Old_Circuit_Board_Elite,
+ Old_Circuit_Parts_Crystal_Chip_Elite,
+ Old_Circuit_Parts_Crystal_Chip_Master,
+ Old_Circuit_Parts_Advanced,
+ Old_Circuit_Parts_Wiring_Basic,
+ Old_Circuit_Parts_Wiring_Advanced,
+ Old_Circuit_Parts_Wiring_Elite,
+ Old_Empty_Board_Basic,
+ Old_Empty_Board_Elite,
+
+ // Batteries
+ Battery_RE_EV_Sodium,
+ Battery_RE_EV_Cadmium,
+ Battery_RE_EV_Lithium,
+
+ // Shapes for Extruder
+ Shape_Extruder_WindmillShaft,
+ Shape_Extruder_SmallGear,
+
+ // Cooked Raisin Toast for ImQ009
+ Food_Baked_Raisin_Bread,
+
+ // Fluid Cells to regulate flows.
+ Fluid_Cell_1L,
+ Fluid_Cell_16L,
+ Fluid_Cell_36L,
+ Fluid_Cell_144L,
+
+ // Debug
+ TESTITEM,
+
+ // Larger Volumetric Flasks
+ VOLUMETRIC_FLASK_8k,
+ VOLUMETRIC_FLASK_32k,
+
+ // RTG Fuels
+ Pellet_RTG_PU238,
+ Pellet_RTG_SR90,
+ Pellet_RTG_PO210,
+ Pellet_RTG_AM241,
+
+ // Computer Cube
+ Gregtech_Computer_Cube,
+
+ // Casings for batteries
+ Battery_Casing_Gem_1,
+ Battery_Casing_Gem_2,
+ Battery_Casing_Gem_3,
+ Battery_Casing_Gem_4,
+
+ // Custom Batteries
+ Battery_Gem_1,
+ Battery_Gem_2,
+ Battery_Gem_3,
+ Battery_Gem_4,
+
+ // Compressed Fusion MK3
+ Compressed_Fusion_Reactor,
+
+ // Carbon Materials
+
+ // End Game Laser Engraver Lens
+ Laser_Lens_WoodsGlass,
+ Laser_Lens_Special,
+
+ // Pellet Mold
+ Pellet_Mold,
+
+ // Upgrade chip for Distillus
+ Distillus_Upgrade_Chip,
+ Maceration_Upgrade_Chip,
+
+ // Milling Balls
+ Milling_Ball_Alumina,
+ Milling_Ball_Soapstone,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * MultiBlocks
+ */
+
+ // Tier GT++ Casings
+ GTPP_Casing_ULV,
+ GTPP_Casing_LV,
+ GTPP_Casing_MV,
+ GTPP_Casing_HV,
+ GTPP_Casing_EV,
+ GTPP_Casing_IV,
+ GTPP_Casing_LuV,
+ GTPP_Casing_ZPM,
+ GTPP_Casing_UV,
+ GTPP_Casing_UHV,
+
+ // IronBlastFurnace Machine_Bronze_BlastFurnace
+ Casing_IronPlatedBricks,
+
+ // Large Centrifuge
+ Industrial_Centrifuge,
+ Casing_Centrifuge1,
+
+ // Large Alloy Smelter
+ Industrial_AlloySmelter,
+
+ // Coke Oven
+ Industrial_CokeOven,
+ Casing_CokeOven,
+ Casing_CokeOven_Coil1,
+ Casing_CokeOven_Coil2,
+
+ // Bending Maching // Plate Press // Press
+ Industrial_PlatePress,
+ Casing_MaterialPress,
+
+ // Matter Fab
+ Industrial_MassFab,
+ Casing_MatterGen,
+ Casing_MatterFab,
+
+ // ABS
+ Industrial_AlloyBlastSmelter,
+ Casing_Coil_BlastSmelter,
+ Casing_BlastSmelter,
+ Mega_AlloyBlastSmelter,
+
+ // Quantum Force Transformer
+ QuantumForceTransformer,
+ Casing_Coil_QuantumForceTransformer,
+ NeutronPulseManipulator,
+ CosmicFabricManipulator,
+ InfinityInfusedManipulator,
+ SpaceTimeContinuumRipper,
+ NeutronShieldingCore,
+ CosmicFabricShieldingCore,
+ InfinityInfusedShieldingCore,
+ SpaceTimeBendingCore,
+ ForceFieldGlass,
+
+ // Industrial Electrolyzer
+ Industrial_Electrolyzer,
+ Casing_Electrolyzer,
+
+ // Industrial Maceration Stack
+ Industrial_MacerationStack,
+ Casing_MacerationStack,
+
+ // Industrial Wire Factory
+ Industrial_WireFactory,
+ Casing_WireFactory,
+
+ // Power sub-station for mass storage. 3 hatches for input and output, whatever voltages you desire.
+ PowerSubStation,
+ Casing_Vanadium_Redox,
+ Casing_Vanadium_Redox_IV,
+ Casing_Vanadium_Redox_LuV,
+ Casing_Vanadium_Redox_ZPM,
+ Casing_Vanadium_Redox_UV,
+ Casing_Vanadium_Redox_MAX,
+ Casing_Power_SubStation,
+
+ // LFTR
+ ThoriumReactor,
+ Casing_Reactor_I,
+ Casing_Reactor_II,
+
+ // Nuclear Salt Processing Plant
+ Nuclear_Salt_Processing_Plant,
+
+ // Multitank
+ /* Industrial_MultiTank, */
+ Industrial_MultiTankDense,
+ Casing_MultitankExterior,
+
+ // Fission Fuel Refinery
+ Industrial_FuelRefinery,
+ Casing_Refinery_External,
+ Casing_Refinery_Structural,
+ Casing_Refinery_Internal,
+
+ // Industrial Sifter
+ Industrial_Sifter,
+ Casing_Sifter,
+ Casing_SifterGrate,
+
+ // Large Thermal Centrifuge
+ Industrial_ThermalCentrifuge,
+ Casing_ThermalCentrifuge,
+
+ // Cyclotron
+ COMET_Cyclotron,
+ Casing_Cyclotron_Coil,
+ Casing_Cyclotron_External,
+
+ // Thermal Boiler
+ GT4_Thermal_Boiler,
+ Casing_ThermalContainment,
+
+ // Tree Farm
+ Industrial_TreeFarm,
+ TreeFarmer_Structural,
+ Casing_PLACEHOLDER_TreeFarmer,
+
+ // Fish Pond
+ Industrial_FishingPond,
+ Casing_FishPond,
+
+ // Algae
+ AlgaeFarm_Controller,
+
+ // Chemical Plant
+ ChemicalPlant_Controller,
+
+ // GT4 autoCrafter
+ GT4_Multi_Crafter,
+ Casing_Autocrafter,
+
+ // industrial Ore-Washer
+ Industrial_WashPlant,
+ Casing_WashPlant,
+
+ // Cutting Factory Controller
+ Industrial_CuttingFactoryController,
+ Casing_CuttingFactoryFrame,
+
+ // Large Extruder
+ Industrial_Extruder,
+ Casing_Extruder,
+
+ // Multi-Machine
+ Industrial_MultiMachine,
+ Casing_Multi_Use,
+
+ // Bedrock Mining Platforms
+ /* BedrockMiner_MKI, */
+ /* BedrockMiner_MKII, */
+ /* BedrockMiner_MKIII, */
+ Casing_BedrockMiner,
+
+ // Large Packager
+ Amazon_Warehouse_Controller,
+ Casing_AmazonWarehouse,
+
+ // Advanced GT vanilla Multis
+ Machine_Adv_BlastFurnace,
+ Casing_Adv_BlastFurnace,
+ Machine_Adv_ImplosionCompressor,
+ Machine_Adv_DistillationTower,
+
+ // Advanced Vacuum Freezer
+ Industrial_Cryogenic_Freezer,
+ Casing_AdvancedVacuum,
+
+ // FusionTek MK IV
+ FusionComputer_UV2,
+ Casing_Fusion_External,
+ Casing_Fusion_Internal,
+
+ // FusionTech MK V
+
+ FusionComputer_UV3,
+ Casing_Fusion_External2,
+ Casing_Fusion_Internal2,
+
+ // large mixer
+ Industrial_Mixer,
+
+ // Naq Reactor
+ Casing_Naq_Reactor_A,
+ Casing_Naq_Reactor_B,
+ Casing_Naq_Reactor_C,
+ /* Controller_Naq_Reactor, */
+ Casing_Containment,
+
+ // Arc Furnace
+ Industrial_Arc_Furnace,
+ Casing_Industrial_Arc_Furnace,
+
+ // Solar Tower
+ Industrial_Solar_Tower,
+ Casing_SolarTower_Structural,
+ Casing_SolarTower_SaltContainment,
+ Casing_SolarTower_HeatContainment,
+
+ // Larger Turbines
+ Large_Steam_Turbine,
+ Large_HPSteam_Turbine,
+ Large_Gas_Turbine,
+ Large_Plasma_Turbine,
+ Large_SCSteam_Turbine,
+ Casing_Turbine_Shaft,
+ Casing_Turbine_LP,
+ Casing_Turbine_HP,
+ Casing_Turbine_Gas,
+ Casing_Turbine_Plasma,
+ Casing_Turbine_SC,
+ XL_HeatExchanger,
+ Casing_XL_HeatExchanger,
+
+ // Large Engine
+ Casing_Reinforced_Engine_Casing,
+
+ // Large Vacuum Furnace
+ Casing_Vacuum_Furnace,
+ Controller_Vacuum_Furnace,
+
+ // Large Rocket Engine
+ Casing_RocketEngine,
+ Controller_RocketEngine,
+
+ // Large Semi-Fluid
+ Controller_LargeSemifluidGenerator,
+
+ // IsaMill
+ Controller_IsaMill,
+ Casing_IsaMill_Casing,
+ Casing_IsaMill_Gearbox,
+ Casing_IsaMill_Pipe,
+
+ // Flotation Cell
+ Controller_Flotation_Cell,
+ Casing_Flotation_Cell,
+
+ // Sparge Tower
+ Controller_Sparge_Tower,
+ Casing_Sparge_Tower_Exterior,
+ Casing_Sparge_Tower_Interior,
+
+ // Elemental Duplicator
+ Controller_ElementalDuplicator,
+ Casing_ElementalDuplicator,
+
+ // Forge Hammer
+ Controller_IndustrialForgeHammer,
+ Casing_IndustrialForgeHammer,
+
+ // Molecular Transformer
+ Controller_MolecularTransformer,
+ Casing_Molecular_Transformer_1,
+ Casing_Molecular_Transformer_2,
+ Casing_Molecular_Transformer_3,
+
+ // Big Steam Macerator
+ Controller_SteamMaceratorMulti,
+ // Big Steam Compressor
+ Controller_SteamCompressorMulti,
+
+ // Industrial Rock Breaker
+ Controller_IndustrialRockBreaker,
+
+ // Industrial Chisel
+ Controller_IndustrialAutoChisel,
+ Casing_IndustrialAutoChisel,
+
+ // Industrial Fluid Heater
+ Controller_IndustrialFluidHeater,
+
+ // Custom Machine Casings
+ Casing_Machine_Custom_1,
+ Casing_Machine_Custom_2,
+ Casing_Machine_Custom_3,
+ Casing_Machine_Custom_4,
+ Casing_Machine_Custom_5,
+ Casing_Machine_Custom_6,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Custom hatches/Busses
+ */
+
+ // Buffer Dynamos
+ Hatch_Buffer_Dynamo_ULV,
+ Hatch_Buffer_Dynamo_LV,
+ Hatch_Buffer_Dynamo_MV,
+ Hatch_Buffer_Dynamo_HV,
+ Hatch_Buffer_Dynamo_EV,
+ Hatch_Buffer_Dynamo_IV,
+ Hatch_Buffer_Dynamo_LuV,
+ Hatch_Buffer_Dynamo_ZPM,
+ Hatch_Buffer_Dynamo_UV,
+ Hatch_Buffer_Dynamo_MAX,
+
+ // Air Intake hatch
+ Hatch_Air_Intake,
+ Hatch_Air_Intake_Extreme,
+
+ // Reservoir Hatch
+ Hatch_Reservoir,
+
+ // XL Turbine Rotor Hatch
+ Hatch_Turbine_Rotor,
+
+ // Standard Turbine Rotor Hatch
+ Hatch_Input_TurbineHousing,
+
+ // Milling Ball Bus
+ Bus_Milling_Balls,
+
+ // Catalyst Bus
+ Bus_Catalysts,
+
+ // Custom Fluid Hatches
+ Hatch_Input_Cryotheum,
+ Hatch_Input_Pyrotheum,
+ Hatch_Input_Naquadah,
+ Hatch_Input_Steam,
+
+ // Steam Multi Buses
+ Hatch_Input_Bus_Steam,
+ Hatch_Output_Bus_Steam,
+
+ // Elemental Duplicator Data Orb Bus
+ Hatch_Input_Elemental_Duplicator,
+
+ // RTG Hatch
+
+ // Battery hatches for PSS
+ Hatch_Input_Battery_MV,
+ Hatch_Input_Battery_EV,
+ Hatch_Output_Battery_MV,
+ Hatch_Output_Battery_EV,
+
+ // Advanced Mufflers
+ Hatch_Muffler_Adv_LV,
+ Hatch_Muffler_Adv_MV,
+ Hatch_Muffler_Adv_HV,
+ Hatch_Muffler_Adv_EV,
+ Hatch_Muffler_Adv_IV,
+ Hatch_Muffler_Adv_LuV,
+ Hatch_Muffler_Adv_ZPM,
+ Hatch_Muffler_Adv_UV,
+ Hatch_Muffler_Adv_MAX,
+
+ // Super Input Busses
+ Hatch_SuperBus_Input_LV,
+ Hatch_SuperBus_Input_MV,
+ Hatch_SuperBus_Input_HV,
+ Hatch_SuperBus_Input_EV,
+ Hatch_SuperBus_Input_IV,
+ Hatch_SuperBus_Input_LuV,
+ Hatch_SuperBus_Input_ZPM,
+ Hatch_SuperBus_Input_UV,
+ Hatch_SuperBus_Input_MAX,
+
+ // Super Output Busses
+ Hatch_SuperBus_Output_LV,
+ Hatch_SuperBus_Output_MV,
+ Hatch_SuperBus_Output_HV,
+ Hatch_SuperBus_Output_EV,
+ Hatch_SuperBus_Output_IV,
+ Hatch_SuperBus_Output_LuV,
+ Hatch_SuperBus_Output_ZPM,
+ Hatch_SuperBus_Output_UV,
+ Hatch_SuperBus_Output_MAX,
+
+ // Chisel Buses for Industrial Chisel
+ GT_MetaTileEntity_ChiselBus_LV,
+ GT_MetaTileEntity_ChiselBus_MV,
+ GT_MetaTileEntity_ChiselBus_HV,
+
+ // Solidifier Hatches for Industrial Multi Machine
+ GT_MetaTileEntity_Solidifier_I,
+ GT_MetaTileEntity_Solidifier_II,
+ GT_MetaTileEntity_Solidifier_III,
+ GT_MetaTileEntity_Solidifier_IV,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Blocks
+ */
+ ResonanceChamber_I,
+ ResonanceChamber_II,
+ ResonanceChamber_III,
+ ResonanceChamber_IV,
+
+ Modulator_I,
+ Modulator_II,
+ Modulator_III,
+ Modulator_IV,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Single Block Tile Entities
+ */
+
+ // Crate Box
+ CrateStorage,
+
+ // Auto TC Research Creator
+ Thaumcraft_Researcher,
+
+ // infinite Items
+ Infinite_Item_Chest,
+
+ // GT4 automation
+ GT4_Electric_Auto_Workbench_LV,
+ GT4_Electric_Auto_Workbench_MV,
+ GT4_Electric_Auto_Workbench_HV,
+ GT4_Electric_Auto_Workbench_EV,
+ GT4_Electric_Auto_Workbench_IV,
+ GT4_Electric_Auto_Workbench_LuV,
+ GT4_Electric_Auto_Workbench_ZPM,
+ GT4_Electric_Auto_Workbench_UV,
+ GT4_Electric_Inventory_Manager_LV,
+ GT4_Electric_Inventory_Manager_MV,
+ GT4_Electric_Inventory_Manager_HV,
+ GT4_Electric_Inventory_Manager_EV,
+ GT4_Electric_Inventory_Manager_IV,
+ GT4_Electric_Inventory_Manager_LuV,
+ GT4_Electric_Inventory_Manager_ZPM,
+ GT4_Electric_Inventory_Manager_UV,
+
+ // GT4 Crop Harvester
+ GT4_Crop_Harvester_LV,
+ GT4_Crop_Harvester_MV,
+ GT4_Crop_Harvester_HV,
+ GT4_Crop_Harvester_EV,
+ GT4_Crop_Harvester_IV,
+ GT4_Crop_Harvester_LuV,
+ GT4_Crop_Harvester_ZPM,
+ GT4_Crop_Harvester_UV,
+
+ // Geothermal Engines
+ Geothermal_Engine_EV,
+ Geothermal_Engine_IV,
+ Geothermal_Engine_LuV,
+
+ // Tesseracts
+ GT4_Tesseract_Generator,
+ GT4_Tesseract_Terminal,
+
+ // Advanced Boilers
+ Boiler_Advanced_LV,
+ Boiler_Advanced_MV,
+ Boiler_Advanced_HV,
+
+ // Fancy Pollution Devices
+ Pollution_Detector,
+ Pollution_Cleaner_LV,
+ Pollution_Cleaner_MV,
+ Pollution_Cleaner_HV,
+ Pollution_Cleaner_EV,
+ Pollution_Cleaner_IV,
+ Pollution_Cleaner_LuV,
+ Pollution_Cleaner_ZPM,
+ Pollution_Cleaner_UV,
+ Pollution_Cleaner_MAX,
+
+ // Debug machine
+ Pollution_Creator,
+
+ // Basically is an automatic Cauldron
+ SimpleDustWasher_ULV,
+ SimpleDustWasher_MV,
+ SimpleDustWasher_EV,
+ SimpleDustWasher_LuV,
+ SimpleDustWasher_UV,
+
+ // Solar Tower Reflector
+ Solar_Tower_Reflector,
+
+ // Super Tier Chests
+ Super_Chest_LV,
+ Super_Chest_MV,
+ Super_Chest_HV,
+ Super_Chest_EV,
+ Super_Chest_IV,
+
+ // Wireless Chargers
+ Charger_LV,
+ Charger_MV,
+ Charger_HV,
+ Charger_EV,
+ Charger_IV,
+ Charger_LuV,
+ Charger_ZPM,
+ Charger_UV,
+ Charger_UHV,
+
+ // Reactor Processing Unit
+ ReactorProcessingUnit_IV,
+ ReactorProcessingUnit_ZPM,
+
+ // Cold Trap
+ ColdTrap_IV,
+ ColdTrap_ZPM,
+
+ // Solar Generators
+ GT_Solar_ULV,
+ GT_Solar_LV,
+ GT_Solar_MV,
+ GT_Solar_HV,
+ GT_Solar_EV,
+ GT_Solar_IV,
+ GT_Solar_LuV,
+ GT_Solar_ZPM,
+ GT_Solar_UV,
+ GT_Solar_MAX,
+
+ // Variable voltage RF convertor
+ Energy_Buffer_1by1_ULV,
+ Energy_Buffer_1by1_LV,
+ Energy_Buffer_1by1_MV,
+ Energy_Buffer_1by1_HV,
+ Energy_Buffer_1by1_EV,
+ Energy_Buffer_1by1_IV,
+ Energy_Buffer_1by1_LuV,
+ Energy_Buffer_1by1_ZPM,
+ Energy_Buffer_1by1_UV,
+ Energy_Buffer_1by1_MAX,
+
+ // Rocket Engines
+ Rocket_Engine_EV,
+ Rocket_Engine_IV,
+ Rocket_Engine_LuV,
+
+ // Hi Amp Transformers
+ Transformer_HA_LV_ULV,
+ Transformer_HA_MV_LV,
+ Transformer_HA_HV_MV,
+ Transformer_HA_EV_HV,
+ Transformer_HA_IV_EV,
+ Transformer_HA_LuV_IV,
+ Transformer_HA_ZPM_LuV,
+ Transformer_HA_UV_ZPM,
+ Transformer_HA_MAX_UV,
+
+ // Semi-Fluid generators
+ Generator_SemiFluid_LV,
+ Generator_SemiFluid_MV,
+ Generator_SemiFluid_HV,
+ Generator_SemiFluid_EV,
+ Generator_SemiFluid_IV,
+
+ // Advanced Mixer 4x4
+ Machine_Advanced_LV_Mixer,
+ Machine_Advanced_MV_Mixer,
+ Machine_Advanced_HV_Mixer,
+ Machine_Advanced_EV_Mixer,
+ Machine_Advanced_IV_Mixer,
+ Machine_Advanced_LuV_Mixer,
+ Machine_Advanced_ZPM_Mixer,
+ Machine_Advanced_UV_Mixer,
+
+ // Block that enables uplink to a superconductor network
+ SuperConductorInputNode,
+
+ // Heat Pipes
+ HeatPipe_Tier_1,
+ HeatPipe_Tier_2,
+ HeatPipe_Tier_3,
+
+ // Chemical Dehydrators for nuclear fuels
+ GT_Dehydrator_MV,
+ GT_Dehydrator_HV,
+ GT_Dehydrator_EV,
+ GT_Dehydrator_IV,
+ GT_Dehydrator_LuV,
+ GT_Dehydrator_ZPM,
+
+ // Fluid Storage Tanks
+ GT_FluidTank_ULV,
+ GT_FluidTank_LV,
+ GT_FluidTank_MV,
+ GT_FluidTank_HV,
+ GT_FluidTank_EV,
+ GT_FluidTank_IV,
+ GT_FluidTank_LuV,
+ GT_FluidTank_ZPM,
+ GT_FluidTank_UV,
+ GT_FluidTank_MAX,
+
+ // GT RTG
+ RTG,
+
+ // Chisel Machines
+ GT_Chisel_LV,
+ GT_Chisel_MV,
+ GT_Chisel_HV,
+
+ // Plasma Tank
+ /* Plasma_Tank, */
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Covers
+ */
+
+ // Fluid Void Covers
+ Cover_Overflow_LV,
+ Cover_Overflow_MV,
+ Cover_Overflow_HV,
+ Cover_Overflow_EV,
+ Cover_Overflow_IV,
+
+ // Item Void Covers
+ Cover_Overflow_Item_ULV,
+ Cover_Overflow_Item_LV,
+ Cover_Overflow_Item_MV,
+ Cover_Overflow_Item_HV,
+ Cover_Overflow_Item_EV,
+ Cover_Overflow_Item_IV,
+
+ // ----------------------------------------------------------------------------
+ // Additional washers
+ SimpleDustWasher_LV,
+ SimpleDustWasher_HV,
+ SimpleDustWasher_IV,
+ SimpleDustWasher_ZPM,
+
+ ;
+
+ public static final GregtechItemList[] DYE_ONLY_ITEMS = { Energy_Buffer_1by1_EV, Energy_Buffer_1by1_EV };
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ @Override
+ public GregtechItemList set(final Item aItem) {
+ this.mHasNotBeenSet = false;
+ if (aItem == null) {
+ return this;
+ }
+ final ItemStack aStack = new ItemStack(aItem, 1, 0);
+ this.mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public GregtechItemList set(final ItemStack aStack) {
+ this.mHasNotBeenSet = false;
+ this.mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return null;
+ }
+ return this.mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ return getBlockFromStack(this.getItem());
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !this.mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(final Object aStack) {
+ return this.isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(final Object aStack, final boolean aWildcard, final boolean aIgnoreNBT) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return GT_Utility
+ .areUnificationsEqual((ItemStack) aStack, aWildcard ? this.getWildcard(1) : this.get(1), aIgnoreNBT);
+ }
+
+ public static Block getBlockFromStack(Object aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return Blocks.air;
+ return Block.getBlockFromItem(((ItemStack) aStack).getItem());
+ }
+
+ @Override
+ public ItemStack get(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility
+ .copyAmountAndMetaData(aAmount, this.mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(final long aAmount, final String aDisplayName, final Object... aReplacements) {
+ final ItemStack rStack = this.get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ rStack.setStackDisplayName(aDisplayName);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(final long aAmount, final int aEnergy, final Object... aReplacements) {
+ final ItemStack rStack = this.get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(final long aAmount, final long aMetaValue, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public GregtechItemList registerOre(final Object... aOreNames) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ for (final Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, this.get(1));
+ }
+ return this;
+ }
+
+ @Override
+ public GregtechItemList registerWildcardAsOre(final Object... aOreNames) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ for (final Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, this.getWildcard(1));
+ }
+ return this;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java
new file mode 100644
index 0000000000..4bd8831098
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java
@@ -0,0 +1,39 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+/*
+ * Electric Components. usual Materials for this are: Primitive (Tier 1) Basic (Tier 2) as used by UE as well : IC2
+ * Circuit and RE-Battery Good (Tier 3) Advanced (Tier 4) as used by UE as well : Advanced Circuit, Advanced Battery and
+ * Lithium Battery Data (Tier 5) : Data Storage Circuit Elite (Tier 6) as used by UE as well : Energy Crystal and Data
+ * Control Circuit Master (Tier 7) : Energy Flow Circuit and Lapotron Crystal Ultimate (Tier 8) : Data Orb and
+ * Lapotronic Energy Orb Infinite (Cheaty) Circuits Circuit_Primitive, Circuit_Basic, Circuit_Good, Circuit_Advanced,
+ * Circuit_Data, Circuit_Elite, Circuit_Master, Tool_DataOrb, Circuit_Ultimate, Tool_DataStick, Circuit_IV, Circuit_LuV,
+ * Circuit_ZPM, Circuit Parts Circuit_Board_IV, Circuit_Board_LuV, Circuit_Board_ZPM, Circuit_Parts_Crystal_Chip_IV,
+ * Circuit_Parts_Crystal_Chip_LuV, Circuit_Parts_Crystal_Chip_ZPM, Circuit_Parts_IV, Circuit_Parts_LuV,
+ * Circuit_Parts_ZPM, Circuit_Parts_Wiring_IV, Circuit_Parts_Wiring_LuV, Circuit_Parts_Wiring_ZPM;
+ */
+public enum GregtechOreDictNames {
+
+ buffer_core,
+ itemGregConduit,
+ Circuit_IV,
+ Circuit_LuV,
+ Circuit_ZPM,
+ Circuit_Board_IV,
+ Circuit_Board_LuV,
+ Circuit_Board_ZPM,
+ Circuit_Parts_Crystal_Chip_IV,
+ Circuit_Parts_Crystal_Chip_LuV,
+ Circuit_Parts_Crystal_Chip_ZPM,
+ Circuit_Parts_IV,
+ Circuit_Parts_LuV,
+ Circuit_Parts_ZPM,
+ Circuit_Parts_Wiring_IV,
+ Circuit_Parts_Wiring_LuV,
+ Circuit_Parts_Wiring_ZPM;
+
+ public String unlocalisedName;
+
+ private void ModObject() {
+ this.unlocalisedName = this.name();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java
new file mode 100644
index 0000000000..3185810495
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java
@@ -0,0 +1,1324 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.GT_Values.D2;
+import static gregtech.api.enums.GT_Values.M;
+import static gtPlusPlus.core.util.Utils.getTcAspectStack;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Element;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.ICondition;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.api.objects.GregtechItemData;
+import gtPlusPlus.xmod.gregtech.api.objects.GregtechMaterialStack;
+
+public enum GregtechOrePrefixes {
+
+ /*
+ * Electric Components. usual Materials for this are: Primitive (Tier 1) Basic (Tier 2) as used by UE as well : IC2
+ * Circuit and RE-Battery Good (Tier 3) Advanced (Tier 4) as used by UE as well : Advanced Circuit, Advanced Battery
+ * and Lithium Battery Data (Tier 5) : Data Storage Circuit Elite (Tier 6) as used by UE as well : Energy Crystal
+ * and Data Control Circuit Master (Tier 7) : Energy Flow Circuit and Lapotron Crystal Ultimate (Tier 8) : Data Orb
+ * and Lapotronic Energy Orb Infinite (Cheaty)
+ */
+ ingotHot("Hot Ingots", "Hot ", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1],
+ M * 1, 16, 12), // A hot Ingot, which has to be cooled down by a Vacuum Freezer.
+ ingot("Ingots", "", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1], M * 1, 64,
+ 11), // A regular Ingot. Introduced by Eloraam
+ dustTiny("Tiny Dusts", "Tiny Pile of ", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M / 9, 64, 0), // 1/9th of a Dust.
+ dustSmall("Small Dusts", "Small Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ false, B[0] | B[1] | B[2] | B[3], M / 4, 64, 1), // 1/4th of a Dust.
+ dustImpure("Impure Dusts", "Impure Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 3), // Dust with impurities. 1 Unit of Main Material and 1/9 - 1/4 Unit of secondary
+ // Material
+ dustRefined("Refined Dusts", "Refined Pile of ", " Dust", true, true, false, false, false, false, false, true,
+ false, true, B[3], M * 1, 64, 2),
+ dustPure("Purified Dusts", "Purified Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 4),
+ dust("Dusts", "", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M * 1, 64, 2), // Pure Dust worth of one Ingot or Gem. Introduced by Alblaka.
+ nugget("Nuggets", "", " Nugget", true, true, false, false, false, false, false, true, false, false, B[1], M / 9, 64,
+ 9), // A Nugget. Introduced by Eloraam
+ plate("Plates", "", " Plate", true, true, false, false, false, false, true, true, false, false, B[1] | B[2], M * 1,
+ 64, 17), // Regular Plate made of one Ingot/Dust. Introduced by Calclavia
+ block("Storage Blocks", "Block of ", "", true, true, false, false, false, true, true, false, false, false, 0, M * 9,
+ 64, 71), // Storage Block consisting out of 9 Ingots/Gems/Dusts. Introduced by CovertJaguar
+ gem("Gemstones", "", "", true, true, true, false, false, false, true, true, false, false, B[2], M * 1, 64, 8), // A
+ // regular
+ // Gem
+ // worth
+ // one
+ // Dust.
+ // Introduced
+ // by
+ // Eloraam
+ gemChipped("Chipped Gemstones", "Chipped ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M / 4, 64, 59), // A regular Gem worth one small Dust. Introduced by TerraFirmaCraft
+ gemFlawed("Flawed Gemstones", "Flawed ", "", true, true, true, false, false, false, true, true, false, false, B[2],
+ M / 2, 64, 60), // A regular Gem worth two small Dusts. Introduced by TerraFirmaCraft
+ gemFlawless("Flawless Gemstones", "Flawless ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M * 2, 32, 61), // A regular Gem worth two Dusts. Introduced by TerraFirmaCraft
+ gemExquisite("Exquisite Gemstones", "Exquisite ", "", true, true, true, false, false, false, true, true, false,
+ false, B[2], M * 4, 16, 62), // A regular Gem worth four Dusts. Introduced by TerraFirmaCraft
+ stick("Sticks/Rods", "", " Rod", true, true, false, false, false, false, true, true, false, false, B[1] | B[2],
+ M / 2, 64, 23), // Stick made of half an Ingot. Introduced by Eloraam
+ type2("16x Wires", "16x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 8, 64,
+ -1),
+
+ toolAngleGrinder("Angle Grinder", "", "Angle Grinder", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricSnips("Electric Snips", "", "Electric Snips", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricLighter("Electric Lighter", "", "Electric Lighter", true, true, false, false, false, false, true, true,
+ false, false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricButcherKnife("Electric Butcher Knife", "", "Electric Butcher Knife", true, true, false, false, false,
+ false, true, true, false, false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+
+ batterySingleuse("Single Use Batteries", "", "", false, true, false, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ battery("Reusable Batteries", "", "", false, true, false, false, false, false, false, false, false, false, 0, -1,
+ 64, -1), // Introduced by Calclavia
+ circuit("Circuits", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1), // Introduced
+ // by
+ // Calclavia
+ chipset("Chipsets", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1), // Introduced
+ ;
+
+ public static final int VERSION = 508;
+
+ static {
+ ingotHot.mHeatDamage = 3.0F;
+ }
+
+ public final ArrayList<ItemStack> mPrefixedItems = new ArrayList<>();
+ public final short mTextureIndex;
+ public final String mRegularLocalName, mLocalizedMaterialPre, mLocalizedMaterialPost;
+ public final boolean mIsUsedForOreProcessing, mIsEnchantable, mIsUnificatable, mIsMaterialBased, mIsSelfReferencing,
+ mIsContainer, mDontUnificateActively, mIsUsedForBlocks, mAllowNormalRecycling, mGenerateDefaultItem;
+ public final List<TC_AspectStack> mAspects = new ArrayList<>();
+ public final Collection<GregtechOrePrefixes> mFamiliarPrefixes = new HashSet<>();
+ /**
+ * Used to determine the amount of Material this Prefix contains. Multiply or Divide GregTech_API.MATERIAL_UNIT to
+ * get the Amounts in comparision to one Ingot. 0 = Null Negative = Undefined Amount
+ */
+ public final long mMaterialAmount;
+
+ private final Collection<Materials> mNotGeneratedItems = new HashSet<>(), mIgnoredMaterials = new HashSet<>(),
+ mGeneratedItems = new HashSet<>();
+ private final ArrayList<Interface_OreRecipeRegistrator> mOreProcessing = new ArrayList<>();
+ private final ArrayList<Interface_OreRecipeRegistrator> mOreProcessingFake = new ArrayList<>();
+ public final ItemStack mContainerItem = null;
+ public final ICondition<ISubTagContainer> mCondition = null;
+ public byte mDefaultStackSize = 64;
+ public final GregtechMaterialStack mSecondaryMaterial = null;
+ public final GregtechOrePrefixes mPrefixInto = this;
+ public float mHeatDamage = 0.0F; // Negative for Frost Damage
+ /**
+ * Yes this Value can be changed to add Bits for the MetaGenerated-Item-Check.
+ */
+ public int mMaterialGenerationBits = 0;
+
+ private GregtechOrePrefixes(final String aRegularLocalName, final String aLocalizedMaterialPre,
+ final String aLocalizedMaterialPost, final boolean aIsUnificatable, final boolean aIsMaterialBased,
+ final boolean aIsSelfReferencing, final boolean aIsContainer, final boolean aDontUnificateActively,
+ final boolean aIsUsedForBlocks, final boolean aAllowNormalRecycling, final boolean aGenerateDefaultItem,
+ final boolean aIsEnchantable, final boolean aIsUsedForOreProcessing, final int aMaterialGenerationBits,
+ final long aMaterialAmount, final int aDefaultStackSize, final int aTextureindex) {
+ this.mIsUnificatable = aIsUnificatable;
+ this.mIsMaterialBased = aIsMaterialBased;
+ this.mIsSelfReferencing = aIsSelfReferencing;
+ this.mIsContainer = aIsContainer;
+ this.mDontUnificateActively = aDontUnificateActively;
+ this.mIsUsedForBlocks = aIsUsedForBlocks;
+ this.mAllowNormalRecycling = aAllowNormalRecycling;
+ this.mGenerateDefaultItem = aGenerateDefaultItem;
+ this.mIsEnchantable = aIsEnchantable;
+ this.mIsUsedForOreProcessing = aIsUsedForOreProcessing;
+ this.mMaterialGenerationBits = aMaterialGenerationBits;
+ this.mMaterialAmount = aMaterialAmount;
+ this.mRegularLocalName = aRegularLocalName;
+ this.mLocalizedMaterialPre = aLocalizedMaterialPre;
+ this.mLocalizedMaterialPost = aLocalizedMaterialPost;
+ this.mDefaultStackSize = (byte) aDefaultStackSize;
+ this.mTextureIndex = (short) aTextureindex;
+
+ // TODO - Utilise some form of way to check if it's gt 5.9 if so, use string switch.
+ if (this.name()
+ .startsWith("ore")) {
+ getTcAspectStack(TC_Aspects.TERRA.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("wire")
+ || this.name()
+ .startsWith("cable")) {
+ getTcAspectStack(TC_Aspects.ELECTRUM.name(), 1).addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("dust")) {
+ getTcAspectStack(TC_Aspects.PERDITIO.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("crushed")) {
+ getTcAspectStack(TC_Aspects.PERFODIO.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("ingot")
+ || this.name()
+ .startsWith("nugget")) {
+ getTcAspectStack(TC_Aspects.METALLUM.name(), 1).addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("armor")) {
+ getTcAspectStack(TC_Aspects.TUTAMEN.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("stone")) {
+ getTcAspectStack(TC_Aspects.TERRA.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("pipe")) {
+ getTcAspectStack(TC_Aspects.ITER.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("gear")) {
+ getTcAspectStack(TC_Aspects.MOTUS.name(), 1).addToAspectList(this.mAspects);
+ getTcAspectStack(TC_Aspects.MACHINA.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("frame")
+ || this.name()
+ .startsWith("plate")) {
+ getTcAspectStack(TC_Aspects.FABRICO.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("tool")) {
+ getTcAspectStack(TC_Aspects.INSTRUMENTUM.name(), 2)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("gem")
+ || this.name()
+ .startsWith("crystal")
+ || this.name()
+ .startsWith("lens")) {
+ getTcAspectStack(TC_Aspects.VITREUS.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("crate")) {
+ getTcAspectStack(TC_Aspects.ITER.name(), 2)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("circuit")) {
+ getTcAspectStack("COGNITIO", 1);
+ } else if (this.name()
+ .startsWith("battery")) {
+ getTcAspectStack(TC_Aspects.ELECTRUM.name(), 1)
+ .addToAspectList(this.mAspects);
+ }
+ }
+
+ public static GregtechOrePrefixes getOrePrefix(final String aOre) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return tPrefix;
+ }
+ }
+ return null;
+ }
+
+ public static String stripPrefix(final String aOre) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), "");
+ }
+ }
+ return aOre;
+ }
+
+ public static String replacePrefix(final String aOre, final GregtechOrePrefixes aPrefix) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), aPrefix.toString());
+ }
+ }
+ return "";
+ }
+
+ public static GregtechOrePrefixes getPrefix(final String aPrefixName) {
+ return getPrefix(aPrefixName, null);
+ }
+
+ public static GregtechOrePrefixes getPrefix(final String aPrefixName, final GregtechOrePrefixes aReplacement) {
+ final Object tObject = GT_Utility.getFieldContent(GregtechOrePrefixes.class, aPrefixName, false, false);
+ if ((tObject != null) && (tObject instanceof GregtechOrePrefixes)) {
+ return (GregtechOrePrefixes) tObject;
+ }
+ return aReplacement;
+ }
+
+ public static Materials getMaterial(final String aOre) {
+ return Materials.get(stripPrefix(aOre));
+ }
+
+ public static Materials getMaterial(final String aOre, final GregtechOrePrefixes aPrefix) {
+ return Materials.get(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public static Materials getRealMaterial(final String aOre, final GregtechOrePrefixes aPrefix) {
+ return Materials.getRealMaterial(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public static boolean isInstanceOf(final String aName, final GregtechOrePrefixes aPrefix) {
+ return aName == null ? false : aName.startsWith(aPrefix.toString());
+ }
+
+ public boolean add(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ if (!this.contains(aStack)) {
+ this.mPrefixedItems.add(aStack);
+ }
+ while (this.mPrefixedItems.contains(null)) {
+ this.mPrefixedItems.remove(null);
+ }
+ return true;
+ }
+
+ public boolean contains(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ for (final ItemStack tStack : this.mPrefixedItems) {
+ if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean doGenerateItem(final Materials aMaterial) {
+ return (aMaterial != null) && (aMaterial != Materials._NULL)
+ && (((aMaterial.mTypes & this.mMaterialGenerationBits) != 0) || this.mGeneratedItems.contains(aMaterial))
+ && !this.mNotGeneratedItems.contains(aMaterial)
+ && ((this.mCondition == null) || this.mCondition.isTrue(aMaterial));
+ }
+
+ public boolean ignoreMaterials(final Materials... aMaterials) {
+ for (final Materials tMaterial : aMaterials) {
+ if (tMaterial != null) {
+ this.mIgnoredMaterials.add(tMaterial);
+ }
+ }
+ return true;
+ }
+
+ public boolean addFamiliarPrefix(final GregtechOrePrefixes aPrefix) {
+ if ((aPrefix == null) || this.mFamiliarPrefixes.contains(aPrefix) || (aPrefix == this)) {
+ return false;
+ }
+ return this.mFamiliarPrefixes.add(aPrefix);
+ }
+
+ public boolean add(final Interface_OreRecipeRegistrator aRegistrator) {
+ if (aRegistrator == null) {
+ return false;
+ }
+ return this.mOreProcessing.add(aRegistrator);
+ }
+
+ public void processOre(final GT_Materials aMaterial, final String aOreDictName, final String aModName,
+ final ItemStack aStack) {
+ if ((aMaterial != null)
+ && ((aMaterial != GT_Materials._NULL) || this.mIsSelfReferencing || !this.mIsMaterialBased)
+ && GT_Utility.isStackValid(aStack)) {
+ for (final Interface_OreRecipeRegistrator tRegistrator : this.mOreProcessing) {
+ if (D2) {
+ GT_Log.ore.println(
+ "Processing '" + aOreDictName
+ + "' with the Prefix '"
+ + this.name()
+ + "' and the Material '"
+ + aMaterial.name()
+ + "' at "
+ + GT_Utility.getClassName(tRegistrator));
+ }
+ tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack));
+ }
+ }
+ }
+
+ // TODO
+ public void processOre(final Materials aMaterial, final String aOreDictName, final String aModName,
+ final ItemStack aStack) {
+ if ((aMaterial != null) && ((aMaterial != Materials._NULL) || this.mIsSelfReferencing || !this.mIsMaterialBased)
+ && GT_Utility.isStackValid(aStack)) {
+ for (final Interface_OreRecipeRegistrator tRegistrator : this.mOreProcessingFake) {
+ if (D2) {
+ GT_Log.ore.println(
+ "Processing '" + aOreDictName
+ + "' with the Prefix '"
+ + this.name()
+ + "' and the Material '"
+ + aMaterial.mName
+ + "' at "
+ + GT_Utility.getClassName(tRegistrator));
+ }
+ tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack));
+ }
+ }
+ }
+
+ public Object get(final Object aMaterial) {
+ if (aMaterial instanceof GT_Materials) {
+ return new GregtechItemData(this, (GT_Materials) aMaterial);
+ }
+ return this.name() + aMaterial;
+ }
+
+ public String getDefaultLocalNameForItem(final Materials aMaterial) {
+
+ // Use Standard Localization
+ return this.mLocalizedMaterialPre + aMaterial.mDefaultLocalName + this.mLocalizedMaterialPost;
+ }
+
+ public enum GT_Materials implements IColorModulationContainer, ISubTagContainer {
+
+ /**
+ * This is the Default Material returned in case no Material has been found or a NullPointer has been inserted
+ * at a location where it shouldn't happen.
+ * <p/>
+ * Mainly for preventing NullPointer Exceptions and providing Default Values.
+ *
+ * Unknown Material Components. Dead End Section.
+ *
+ * Alkalus Range 730-799 & 970-998 (aMetaItemSubID, TextureSet, aToolSpeed, aToolDurability, aToolQuality,
+ * aTypes, R, G, B, Alpha, aLocalName, aFuelType, aFuelPower, aMeltingPoint, aBlastFurnaceTemp,
+ * aBlastFurnaceRequired, aTransparent, aOreValue, aDensityMultiplier, aDensityDivider, aColor
+ * this(aMetaItemSubID, aIconSet, aToolSpeed, aToolDurability, aToolQuality, true);
+ *
+ */
+ _NULL(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "NULL", 0, 0, 0, 0, false, false, 1, 1, 1,
+ Dyes._NULL, Element._NULL, Arrays.asList(getTcAspectStack(TC_Aspects.VACUOS.name(), 1))),
+
+ // Lapis(526, TextureSet.SET_LAPIS, 1.0F, 0, 1, 1 | 4 | 8, 70, 70, 220, 0, "Lapis", 0, 0, -1, 0, false, false,
+ // 3, 1, 1, Dyes.dyeBlue, 2, Arrays.asList(new MaterialStack(Materials.Lazurite, 12), new
+ // MaterialStack(Materials.Sodalite, 2), new MaterialStack(Materials.Pyrite, 1), new
+ // MaterialStack(Materials.Calcite, 1)), Arrays.asList(getTcAspectStack(TC_Aspects.SENSUS, 1))),
+ Pyrotheum(20, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 255, 128, 0, 0, "Pyrotheum", 0, 0, -1, 0, false,
+ false, 2, 3, 1, Dyes.dyeYellow, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1)),
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 2), getTcAspectStack(TC_Aspects.IGNIS, 1))),
+ Cryotheum(21, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 102, 178, 255, 0, "Cryotheum", 0, 0, -1, 0, false,
+ false, 2, 3, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Blizz, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Snow, 1),
+ new MaterialStack(Materials.Niter, 1)),
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 2), getTcAspectStack(TC_Aspects.GELUM, 1))),
+ Ender(22, TextureSet.SET_FLUID, 1.0F, 0, 2, 1, 255, 255, 255, 0, "Ender", 0, 0, -1, 0, false, false, 3, 1, 1,
+ Dyes.dyeGreen),
+
+ /**
+ * Circuitry, Batteries and other Technical things
+ */
+ Symbiotic(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "IV Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 4), getTcAspectStack(TC_Aspects.MACHINA, 4))),
+ Neutronic(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "LuV Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 6), getTcAspectStack(TC_Aspects.MACHINA, 6))),
+ Quantum(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "ZPM Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 8), getTcAspectStack(TC_Aspects.MACHINA, 8))),
+
+ Superconductor(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 190, 240, 190, 0, "Superconductor", 0, 0, -1, 0, false,
+ false, 1, 1, 1, Dyes.dyeGreen, Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 8))),
+
+ Staballoy(30, TextureSet.SET_ROUGH, 10.0F, 5120, 4, 1 | 2 | 16 | 32 | 64 | 128, 68, 75, 66, 0, "Staballoy", 0,
+ 0, 1500, 2800, true, false, 1, 3, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(new MaterialStack(Materials.Titanium, 1), new MaterialStack(Materials.Uranium, 9)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Bedrockium(31, TextureSet.SET_FINE, 8.0F, 8196, 3, 1 | 2 | 16 | 32 | 64 | 128, 39, 39, 39, 0, "Bedrockium", 0,
+ 0, -1, 0, false, false, 1, 5, 1, Dyes.dyeLightGray, 2,
+ Arrays.asList(new MaterialStack(Materials.Carbon, 63), new MaterialStack(Materials.Carbon, 56)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.VACUOS, 8), getTcAspectStack(TC_Aspects.TUTAMEN, 3))),
+ BloodSteel(32, TextureSet.SET_METALLIC, 11.0F, 768, 4, 1 | 2 | 16 | 32 | 64 | 128, 142, 28, 0, 0, "Blood Steel",
+ 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed, 2, Arrays.asList(new MaterialStack(Materials.Steel, 3)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.VICTUS, 8), getTcAspectStack(TC_Aspects.IGNIS, 3))),
+ Void(33, TextureSet.SET_METALLIC, 6.0F, 1280, 3, 1 | 2 | 16 | 32 | 64 | 128, 82, 17, 82, 0, "Void Metal", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeBlack,
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 5), getTcAspectStack(TC_Aspects.VACUOS, 7))),
+ ConductiveIron(34, TextureSet.SET_METALLIC, 5.0F, 256, 2, 1 | 2, 164, 109, 100, 0, "Conductive Iron", 0, 0, -1,
+ 0, false, false, 3, 1, 1, Dyes.dyeRed, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 6), new MaterialStack(Materials.Redstone, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.POTENTIA, 2), getTcAspectStack(TC_Aspects.METALLUM, 2))),
+ ElectricalSteel(35, TextureSet.SET_METALLIC, 7.0F, 768, 3, 1 | 2 | 64 | 128, 194, 194, 194, 0,
+ "Electrical Steel", 0, 0, 1811, 1000, true, false, 3, 1, 1, Dyes.dyeLightGray, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Iron, 3),
+ new MaterialStack(Materials.Coal, 2),
+ new MaterialStack(Materials.Silicon, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.MAGNETO, 2), getTcAspectStack(TC_Aspects.ELECTRUM, 5))),
+ EnergeticAlloy(36, TextureSet.SET_SHINY, 5.0F, 512, 3, 1 | 2 | 64 | 128, 252, 152, 45, 0, "Energetic Alloy", 0,
+ 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeOrange, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Gold, 3),
+ new MaterialStack(Materials.Glowstone, 2),
+ new MaterialStack(Materials.Redstone, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.POTENTIA, 4), getTcAspectStack(TC_Aspects.LUX, 3))),
+ VibrantAlloy(37, TextureSet.SET_SHINY, 7.0F, 1280, 4, 1 | 2 | 64 | 128, 204, 242, 142, 0, "Vibrant Alloy", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeLime, 2,
+ Arrays.asList(new MaterialStack(Materials.EnergeticAlloy, 1), new MaterialStack(Materials.EnderPearl, 3)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.MACHINA, 5), getTcAspectStack(TC_Aspects.TELUM, 4))),
+ PulsatingIron(38, TextureSet.SET_SHINY, 5.0F, 256, 2, 1 | 2 | 64 | 128, 50, 91, 21, 0, "Pulsating Iron", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 2), new MaterialStack(Materials.EnderPearl, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.ALIENIS, 3), getTcAspectStack(TC_Aspects.METALLUM, 3))),
+ /* TODO */ RedstoneAlloy(39, TextureSet.SET_METALLIC, 1.0F, 256, 2, 1 | 2 | 16 | 32 | 64, 178, 34, 34, 0,
+ "Redstone Alloy", 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 2), new MaterialStack(Materials.Redstone, 4))),
+
+ // Needs more Use, I think.
+ Tantalloy60(40, TextureSet.SET_DULL, 8.0F, 5120, 3, 1 | 2 | 16 | 32 | 64 | 128, 68, 75, 166, 0, "Tantalloy-60",
+ 0, 0, 3035, 2200, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(new MaterialStack(Materials.Tungsten, 1), new MaterialStack(Materials.Tantalum, 9)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Tantalloy61(41, TextureSet.SET_DULL, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 122, 135, 196, 0,
+ "Tantalloy-61", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ Potin(42, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 201, 151, 129, 0, "Potin", 0, 0,
+ 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Inconel792(43, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 108, 240, 118, 0,
+ "Inconel-792", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Inconel690(44, TextureSet.SET_DULL, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 118, 220, 138, 0, "Inconel-690",
+ 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ MaragingSteel300(45, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 150, 150, 150, 0,
+ "Maraging Steel 300", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ MaragingSteel350(46, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 160, 160, 160, 0,
+ "Maraging Steel 350", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ HastelloyX(47, TextureSet.SET_SHINY, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 255, 193, 37, 0, "Hastelloy-X",
+ 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ TriniumNaquadahCarbonite(48, TextureSet.SET_SHINY, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 255, 233, 0, 0,
+ "Trinium Naquadah Carbonite", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ // Radioactive Materials
+ HydrofluoricAcid(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 200, 200, 200, 0, "Hydrofluoric Acid", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ UraniumHexaFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 73, 220, 83, 0, "Uranium Hexafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeLime, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ UraniumTetraFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 73, 220, 83, 0, "Uranium Tetrafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeLime, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ ThoriumTetraFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 15, 120, 15, 0, "Thorium Tetrafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+
+ SulfurousAcid(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 110, 220, 30, 0, "Sulfurous Acid", 0, 0, -1, 0,
+ false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ SulfurDioxide(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 150, 200, 50, 0, "Sulfur Dioxide", 0, 0, -1, 0,
+ false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ HydrogenChloride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 150, 240, 90, 0, "Hydrogen Chloride", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ SulfuricApatite(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Sulfuric Apatite Solution",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+
+ SulfuricLithium(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Sulfuric Lithium Solution",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ LithiumHydroxide(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Lithium Hydroxide", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),;
+
+ /**
+ * List of all Materials.
+ */
+ public static final Collection<GT_Materials> VALUES = new HashSet<>(Arrays.asList(values()));
+
+ static {
+ /*
+ * Primitive.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Basic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Good.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Advanced.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Data.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Elite.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Master.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Ultimate.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Superconductor.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Infinite.add(SubTag.NO_SMASHING,
+ * SubTag.NO_SMELTING);
+ */
+ Symbiotic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Neutronic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Quantum.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ }
+
+ /**
+ * This Array can be changed dynamically by a Tick Handler in order to get a glowing Effect on all GT Meta Items
+ * out of this Material.
+ */
+ public final short[] mRGBa = new short[] { 255, 255, 255, 0 }, mMoltenRGBa = new short[] { 255, 255, 255, 0 };
+
+ public final TextureSet mIconSet;
+ public final int mMetaItemSubID;
+ public final boolean mUnificatable;
+ public final GT_Materials mMaterialInto;
+ public final List<MaterialStack> mMaterialList = new ArrayList<>();
+ public final List<GT_Materials> mOreByProducts = new ArrayList<>(), mOreReRegistrations = new ArrayList<>();
+ public final List<TC_AspectStack> mAspects = new ArrayList<>();
+ private final ArrayList<ItemStack> mMaterialItems = new ArrayList<>();
+ private final Collection<SubTag> mSubTags = new HashSet<>();
+ public Enchantment mEnchantmentTools = null, mEnchantmentArmors = null;
+ public byte mEnchantmentToolsLevel = 0, mEnchantmentArmorsLevel = 0;
+ public boolean mBlastFurnaceRequired = false;
+ public float mToolSpeed = 1.0F, mHeatDamage = 0.0F;
+ public String mChemicalFormula = "?", mDefaultLocalName = "null";
+ public Dyes mColor = Dyes._NULL;
+ public short mMeltingPoint = 0, mBlastFurnaceTemp = 0;
+ public int mTypes = 0, mDurability = 16, mFuelPower = 0, mFuelType = 0, mExtraData = 0, mOreValue = 0,
+ mOreMultiplier = 1, mByProductMultiplier = 1, mSmeltingMultiplier = 1;
+ public long mDensity = M;
+ public Element mElement = null;
+ public GT_Materials mDirectSmelting = this;
+ public GT_Materials mOreReplacement = this;
+ public GT_Materials mMacerateInto = this;
+ public GT_Materials mSmeltInto = this;
+ public GT_Materials mArcSmeltInto = this;
+ public final GT_Materials mHandleMaterial = this;
+ public byte mToolQuality = 0;
+ public final Fluid mSolid = null;
+ public Fluid mFluid = null;
+ public Fluid mGas = null;
+ public Fluid mPlasma = null;
+ /**
+ * This Fluid is used as standard Unit for Molten Materials. 1296 is a Molten Block, what means 144 is one
+ * Material Unit worth
+ */
+ public final Fluid mStandardMoltenFluid = null;
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final boolean aUnificatable) {
+ this.mUnificatable = aUnificatable;
+ this.mMaterialInto = this;
+ this.mMetaItemSubID = aMetaItemSubID;
+ this.mToolQuality = (byte) aToolQuality;
+ this.mDurability = aToolDurability;
+ this.mToolSpeed = aToolSpeed;
+ this.mIconSet = aIconSet;
+ if (aMetaItemSubID >= 0) {
+ if (CORE.sMU_GeneratedMaterials[aMetaItemSubID] == null) {
+ CORE.sMU_GeneratedMaterials[aMetaItemSubID] = this;
+ } else {
+ throw new IllegalArgumentException("The Index " + aMetaItemSubID + " is already used!");
+ }
+ }
+ }
+
+ private GT_Materials(final GT_Materials aMaterialInto, final boolean aReRegisterIntoThis) {
+ this.mUnificatable = false;
+ this.mDefaultLocalName = aMaterialInto.mDefaultLocalName;
+ this.mMaterialInto = aMaterialInto.mMaterialInto;
+ if (aReRegisterIntoThis) {
+ this.mMaterialInto.mOreReRegistrations.add(this);
+ }
+ this.mChemicalFormula = aMaterialInto.mChemicalFormula;
+ this.mMetaItemSubID = -1;
+ this.mIconSet = TextureSet.SET_NONE;
+ }
+
+ /**
+ * @param aMetaItemSubID the Sub-ID used in my own MetaItems. Range 0-1000. -1 for no Material
+ * @param aTypes which kind of Items should be generated. Bitmask as follows: 1 = Dusts of all
+ * kinds. 2 = Dusts, Ingots, Plates, Rods/Sticks, Machine Components and other
+ * Metal specific things. 4 = Dusts, Gems, Plates, Lenses (if transparent). 8 =
+ * Dusts, Impure Dusts, crushed Ores, purified Ores, centrifuged Ores etc. 16 =
+ * Cells 32 = Plasma Cells 64 = Tool Heads 128 = Gears
+ * @param aR, aG, aB Color of the Material 0-255 each.
+ * @param aA transparency of the Material Texture. 0 = fully visible, 255 = Invisible.
+ * @param aLocalName The Name used as Default for localization.
+ * @param aFuelType Type of Generator to get Energy from this Material.
+ * @param aFuelPower EU generated. Will be multiplied by 1000, also additionally multiplied by 2 for
+ * Gems.
+ * @param aAmplificationValue Amount of UUM amplifier gotten from this.
+ * @param aUUMEnergy Amount of EU needed to shape the UUM into this Material.
+ * @param aMeltingPoint Used to determine the smelting Costs in Furnii.
+ * @param aBlastFurnaceTemp Used to determine the needed Heat capactiy Costs in Blast Furnii.
+ * @param aBlastFurnaceRequired If this requires a Blast Furnace.
+ * @param aColor Vanilla MC Wool Color which comes the closest to this.
+ */
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor) {
+ this(aMetaItemSubID, aIconSet, aToolSpeed, aToolDurability, aToolQuality, true);
+ this.mDefaultLocalName = aLocalName;
+ this.mMeltingPoint = (short) aMeltingPoint;
+ this.mBlastFurnaceTemp = (short) aBlastFurnaceTemp;
+ this.mBlastFurnaceRequired = aBlastFurnaceRequired;
+ if (aTransparent) {
+ this.add(SubTag.TRANSPARENT);
+ }
+ this.mFuelPower = aFuelPower;
+ this.mFuelType = aFuelType;
+ this.mOreValue = aOreValue;
+ this.mDensity = (M * aDensityMultiplier) / aDensityDivider;
+ this.mColor = aColor == null ? Dyes._NULL : aColor;
+ if (this.mColor != null) {
+ this.add(SubTag.HAS_COLOR);
+ }
+ this.mRGBa[0] = this.mMoltenRGBa[0] = (short) aR;
+ this.mRGBa[1] = this.mMoltenRGBa[1] = (short) aG;
+ this.mRGBa[2] = this.mMoltenRGBa[2] = (short) aB;
+ this.mRGBa[3] = this.mMoltenRGBa[3] = (short) aA;
+ this.mTypes = aTypes;
+ if ((this.mTypes & 2) != 0) {
+ this.add(SubTag.SMELTING_TO_FLUID);
+ }
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mAspects.addAll(aAspects);
+ }
+
+ /**
+ * @param aElement The Element Enum represented by this Material
+ */
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final Element aElement, final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mElement = aElement;
+ // mElement.mLinkedMaterials.add(this);
+ if (aElement == Element._NULL) {
+ this.mChemicalFormula = "Empty";
+ } else {
+ this.mChemicalFormula = aElement.toString();
+ this.mChemicalFormula = this.mChemicalFormula.replaceAll("_", "-");
+ }
+ this.mAspects.addAll(aAspects);
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final int aExtraData, final List<MaterialStack> aMaterialList) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor,
+ aExtraData,
+ aMaterialList,
+ null);
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final int aExtraData, final List<MaterialStack> aMaterialList,
+ final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mExtraData = aExtraData;
+ this.mMaterialList.addAll(aMaterialList);
+ this.mChemicalFormula = "";
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ this.mChemicalFormula += tMaterial.toString();
+ }
+ this.mChemicalFormula = this.mChemicalFormula.replaceAll("_", "-");
+
+ int tAmountOfComponents = 0, tMeltingPoint = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmountOfComponents += tMaterial.mAmount;
+ if (tMaterial.mMaterial.mMeltingPoint > 0) {
+ tMeltingPoint += tMaterial.mMaterial.mMeltingPoint * tMaterial.mAmount;
+ }
+ if (aAspects == null) {
+ for (final TC_AspectStack tAspect : tMaterial.mMaterial.mAspects) {
+ tAspect.addToAspectList(this.mAspects);
+ }
+ }
+ }
+
+ if (this.mMeltingPoint < 0) {
+ this.mMeltingPoint = (short) (tMeltingPoint / tAmountOfComponents);
+ }
+
+ tAmountOfComponents *= aDensityMultiplier;
+ tAmountOfComponents /= aDensityDivider;
+ if (aAspects == null) {
+ for (final TC_AspectStack tAspect : this.mAspects) {
+ tAspect.mAmount = Math.max(1, tAspect.mAmount / Math.max(1, tAmountOfComponents));
+ }
+ } else {
+ this.mAspects.addAll(aAspects);
+ }
+ }
+
+ public static GT_Materials get(final String aMaterialName) {
+ final Object tObject = GT_Utility.getFieldContent(GT_Materials.class, aMaterialName, false, false);
+ if ((tObject != null) && (tObject instanceof GT_Materials)) {
+ return (GT_Materials) tObject;
+ }
+ return _NULL;
+ }
+
+ public static GT_Materials getRealMaterial(final String aMaterialName) {
+ return get(aMaterialName).mMaterialInto;
+ }
+
+ /**
+ * Called in preInit with the Config to set Values.
+ *
+ * @param aConfiguration
+ */
+ public static void init(final GT_Config aConfiguration) {
+ for (final GT_Materials tMaterial : VALUES) {
+ final String tString = tMaterial.toString()
+ .toLowerCase();
+ tMaterial.mHeatDamage = (float) aConfiguration
+ .get(ConfigCategories.Materials.heatdamage, tString, tMaterial.mHeatDamage);
+ if (tMaterial.mBlastFurnaceRequired) {
+ tMaterial.mBlastFurnaceRequired = aConfiguration
+ .get(ConfigCategories.Materials.blastfurnacerequirements, tString, true);
+ }
+ if (tMaterial.mBlastFurnaceRequired && aConfiguration.get(
+ ConfigCategories.Materials.blastinductionsmelter,
+ tString,
+ tMaterial.mBlastFurnaceTemp < 1500)) {}
+ }
+ }
+
+ public boolean isRadioactive() {
+ if (this.mElement != null) {
+ return this.mElement.mHalfLifeSeconds >= 0;
+ }
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ if (tMaterial.mMaterial.isRadioactive()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public long getProtons() {
+ if (this.mElement != null) {
+ return this.mElement.getProtons();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getProtons();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getProtons();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getNeutrons() {
+ if (this.mElement != null) {
+ return this.mElement.getNeutrons();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getNeutrons();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getNeutrons();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getMass() {
+ if (this.mElement != null) {
+ return this.mElement.getMass();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getMass();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getDensity() {
+ return this.mDensity;
+ }
+
+ public String getToolTip() {
+ return this.getToolTip(1, false);
+ }
+
+ public String getToolTip(final boolean aShowQuestionMarks) {
+ return this.getToolTip(1, aShowQuestionMarks);
+ }
+
+ public String getToolTip(final long aMultiplier) {
+ return this.getToolTip(aMultiplier, false);
+ }
+
+ public String getToolTip(final long aMultiplier, final boolean aShowQuestionMarks) {
+ if (!aShowQuestionMarks && this.mChemicalFormula.equals("?")) {
+ return "";
+ }
+ if ((aMultiplier >= (M * 2)) && !this.mMaterialList.isEmpty()) {
+ return (((this.mElement != null)
+ || ((this.mMaterialList.size() < 2) && (this.mMaterialList.get(0).mAmount == 1)))
+ ? this.mChemicalFormula
+ : "(" + this.mChemicalFormula + ")")
+ + aMultiplier;
+ }
+ return this.mChemicalFormula;
+ }
+
+ /**
+ * Adds an ItemStack to this Material.
+ */
+ public GT_Materials add(final ItemStack aStack) {
+ if ((aStack != null) && !this.contains(aStack)) {
+ this.mMaterialItems.add(aStack);
+ }
+ return this;
+ }
+
+ /**
+ * This is used to determine if any of the ItemStacks belongs to this Material.
+ */
+ public boolean contains(final ItemStack... aStacks) {
+ if ((aStacks == null) || (aStacks.length <= 0)) {
+ return false;
+ }
+ for (final ItemStack tStack : this.mMaterialItems) {
+ for (final ItemStack aStack : aStacks) {
+ if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * This is used to determine if an ItemStack belongs to this Material.
+ */
+ public boolean remove(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ boolean temp = false;
+ for (int i = 0; i < this.mMaterialItems.size(); i++) {
+ if (GT_Utility.areStacksEqual(aStack, this.mMaterialItems.get(i))) {
+ this.mMaterialItems.remove(i--);
+ temp = true;
+ }
+ }
+ return temp;
+ }
+
+ /**
+ * Adds a SubTag to this Material
+ */
+ @Override
+ public ISubTagContainer add(final SubTag... aTags) {
+ if (aTags != null) {
+ for (final SubTag aTag : aTags) {
+ if ((aTag != null) && !this.contains(aTag)) {
+ aTag.addContainerToList(this);
+ this.mSubTags.add(aTag);
+ }
+ }
+ }
+ return this;
+ }
+
+ /**
+ * If this Material has this exact SubTag
+ */
+ @Override
+ public boolean contains(final SubTag aTag) {
+ return this.mSubTags.contains(aTag);
+ }
+
+ /**
+ * Removes a SubTag from this Material
+ */
+ @Override
+ public boolean remove(final SubTag aTag) {
+ return this.mSubTags.remove(aTag);
+ }
+
+ /**
+ * Sets the Heat Damage for this Material (negative = frost)
+ */
+ public GT_Materials setHeatDamage(final float aHeatDamage) {
+ this.mHeatDamage = aHeatDamage;
+ return this;
+ }
+
+ /**
+ * Adds a Material to the List of Byproducts when grinding this Ore. Is used for more precise Ore grinding, so
+ * that it is possible to choose between certain kinds of Materials.
+ */
+ public GT_Materials addOreByProduct(final GT_Materials aMaterial) {
+ if (!this.mOreByProducts.contains(aMaterial.mMaterialInto)) {
+ this.mOreByProducts.add(aMaterial.mMaterialInto);
+ }
+ return this;
+ }
+
+ /**
+ * Adds multiple Materials to the List of Byproducts when grinding this Ore. Is used for more precise Ore
+ * grinding, so that it is possible to choose between certain kinds of Materials.
+ */
+ public GT_Materials addOreByProducts(final GT_Materials... aMaterials) {
+ for (final GT_Materials tMaterial : aMaterials) {
+ if (tMaterial != null) {
+ this.addOreByProduct(tMaterial);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public GT_Materials setOreMultiplier(final int aOreMultiplier) {
+ if (aOreMultiplier > 0) {
+ this.mOreMultiplier = aOreMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Byproduct Material.
+ */
+ public GT_Materials setByProductMultiplier(final int aByProductMultiplier) {
+ if (aByProductMultiplier > 0) {
+ this.mByProductMultiplier = aByProductMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public GT_Materials setSmeltingMultiplier(final int aSmeltingMultiplier) {
+ if (aSmeltingMultiplier > 0) {
+ this.mSmeltingMultiplier = aSmeltingMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * This Ore should be smolten directly into an Ingot of this Material instead of an Ingot of itself.
+ */
+ public GT_Materials setDirectSmelting(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mDirectSmelting = aMaterial.mMaterialInto.mDirectSmelting;
+ }
+ return this;
+ }
+
+ /**
+ * This Material should be the Main Material this Ore gets ground into. Example, Chromite giving Chrome or
+ * Tungstate giving Tungsten.
+ */
+ public GT_Materials setOreReplacement(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mOreReplacement = aMaterial.mMaterialInto.mOreReplacement;
+ }
+ return this;
+ }
+
+ /**
+ * This Material smelts always into an instance of aMaterial. Used for Magnets.
+ */
+ public GT_Materials setSmeltingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mSmeltInto = aMaterial.mMaterialInto.mSmeltInto;
+ }
+ return this;
+ }
+
+ /**
+ * This Material arc smelts always into an instance of aMaterial. Used for Wrought Iron.
+ */
+ public GT_Materials setArcSmeltingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mArcSmeltInto = aMaterial.mMaterialInto.mArcSmeltInto;
+ }
+ return this;
+ }
+
+ /**
+ * This Material macerates always into an instance of aMaterial.
+ */
+ public GT_Materials setMaceratingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mMacerateInto = aMaterial.mMaterialInto.mMacerateInto;
+ }
+ return this;
+ }
+
+ public GT_Materials setEnchantmentForTools(final Enchantment aEnchantment, final int aEnchantmentLevel) {
+ this.mEnchantmentTools = aEnchantment;
+ this.mEnchantmentToolsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ public GT_Materials setEnchantmentForArmors(final Enchantment aEnchantment, final int aEnchantmentLevel) {
+ this.mEnchantmentArmors = aEnchantment;
+ this.mEnchantmentArmorsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ public FluidStack getSolid(final long aAmount) {
+ if (this.mSolid == null) {
+ return null;
+ }
+ return new FluidStack(this.mSolid, (int) aAmount);
+ }
+
+ public FluidStack getFluid(final long aAmount) {
+ if (this.mFluid == null) {
+ return null;
+ }
+ return new FluidStack(this.mFluid, (int) aAmount);
+ }
+
+ public FluidStack getGas(final long aAmount) {
+ if (this.mGas == null) {
+ return null;
+ }
+ return new FluidStack(this.mGas, (int) aAmount);
+ }
+
+ public FluidStack getPlasma(final long aAmount) {
+ if (this.mPlasma == null) {
+ return null;
+ }
+ return new FluidStack(this.mPlasma, (int) aAmount);
+ }
+
+ public FluidStack getMolten(final long aAmount) {
+ if (this.mStandardMoltenFluid == null) {
+ return null;
+ }
+ return new FluidStack(this.mStandardMoltenFluid, (int) aAmount);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return this.mRGBa;
+ }
+
+ public static final int VERSION = 508;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java
new file mode 100644
index 0000000000..0a116b1b9f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java
@@ -0,0 +1,9 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+public enum GregtechToolDictNames {
+ craftingToolHandPump,
+ craftingToolAngleGrinder,
+ craftingToolElectricSnips,
+ craftingToolElectricLighter,
+ craftingToolElectricButcherKnife;
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java
new file mode 100644
index 0000000000..e6276713f3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.xmod.gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+public class GTPP_UITextures {
+
+ public static final UITexture OVERLAY_SLOT_COAL = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/coal");
+ public static final UITexture OVERLAY_SLOT_CANISTER_DARK = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/canister_dark");
+
+ public static final AdaptableUITexture BACKGROUND_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/background/yellow", 176, 166, 4);
+
+ public static final AdaptableUITexture SLOT_ITEM_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/slot/item_yellow", 18, 18, 1);
+ public static final AdaptableUITexture[] SLOT_INVENTORY_MANAGER = new AdaptableUITexture[] {
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/red", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/green", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/blue", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/cyan", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/magenta", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/yellow", 18, 18, 1), };
+
+ public static final UITexture BUTTON_STANDARD_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/button/standard_bronze");
+
+ public static final UITexture OVERLAY_SLOT_WEED_EX = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/weed_ex");
+ public static final UITexture OVERLAY_SLOT_FERTILIZER = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/fertilizer");
+ public static final UITexture OVERLAY_SLOT_ELECTRIC_TOOL = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/electric_tool");
+ public static final UITexture OVERLAY_SLOT_PAGE_PRINTED_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/page_printed_bronze");
+ public static final UITexture OVERLAY_SLOT_ARROW = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow");
+ public static final UITexture OVERLAY_SLOT_ARROW_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_bronze");
+ public static final UITexture OVERLAY_SLOT_CRAFT_OUTPUT = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/craft_output");
+ public static final UITexture OVERLAY_SLOT_CRAFT_OUTPUT_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/craft_output_bronze");
+ public static final UITexture OVERLAY_SLOT_PARK = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/park");
+ public static final UITexture OVERLAY_SLOT_PARK_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/park_bronze");
+ public static final UITexture OVERLAY_SLOT_INGOT = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/ingot");
+ public static final UITexture OVERLAY_SLOT_ARROW_4 = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_4");
+ public static final UITexture OVERLAY_SLOT_TURBINE = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/turbine");
+ public static final UITexture OVERLAY_SLOT_CHEST = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/chest");
+ public static final UITexture[] OVERLAY_SLOT_INVENTORY_MANAGER_COLOR = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/red"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/green"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/blue"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/cyan"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/magenta"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/yellow"), };
+ public static final UITexture[] OVERLAY_SLOT_INVENTORY_MANAGER_ARROW = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_red"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_green"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_blue"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_cyan"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_magenta"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_yellow"), };
+
+ public static final UITexture PROGRESSBAR_FLUID_REACTOR = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/fluid_reactor");
+ public static final UITexture PROGRESSBAR_BOILER_EMPTY = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/boiler_empty");
+ public static final UITexture PROGRESSBAR_FUEL = UITexture.fullImage(GTPlusPlus.ID, "gui/progressbar/fuel");
+ public static final UITexture PROGRESSBAR_ARROW_2 = UITexture.fullImage(GTPlusPlus.ID, "gui/progressbar/arrow_2");
+ public static final UITexture PROGRESSBAR_PSS_ENERGY = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/pss_energy");
+
+ public static final AdaptableUITexture TAB_TITLE_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_yellow", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_ANGULAR_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_angular_yellow", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_DARK_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_dark_yellow", 28, 28, 4);
+
+ public static final UITexture OVERLAY_BUTTON_HARVESTER_MODE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/harvester_mode");
+ public static final UITexture OVERLAY_BUTTON_HARVESTER_TOGGLE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/harvester_toggle");
+ public static final UITexture OVERLAY_BUTTON_FLUSH = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/flush");
+ public static final UITexture OVERLAY_BUTTON_FLUSH_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/flush_bronze");
+ public static final UITexture OVERLAY_BUTTON_AUTOMATION = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/automation");
+ public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/lock");
+ public static final UITexture[] OVERLAY_BUTTON_THROUGHPUT = IntStream.range(0, 4) // GT_MetaTileEntity_ElectricAutoWorkbench#MAX_THROUGHPUT
+ .mapToObj(i -> UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/throughput_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] OVERLAY_BUTTON_MODE = IntStream.range(0, 10) // GT_MetaTileEntity_ElectricAutoWorkbench#MAX_MODES
+ .mapToObj(i -> UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/mode_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] OVERLAY_BUTTON_DIRECTION = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/bottom"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/top"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/north"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/south"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/west"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/east"), };
+ public static final UITexture[] OVERLAY_BUTTON_DIRECTION_GRAY = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/bottom_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/top_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/north_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/south_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/west_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/east_gray"), };
+ public static final UITexture OVERLAY_BUTTON_TIP_GREEN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/tip_green");
+ public static final UITexture OVERLAY_BUTTON_TIP_RED = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/tip_red");
+ public static final UITexture OVERLAY_BUTTON_ACTIVE_STATE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/active_state");
+ public static final UITexture OVERLAY_BUTTON_CHANGE_MODE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/change_mode");
+ public static final UITexture OVERLAY_BUTTON_PLUS_MINUS = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/plus_minus");
+
+ public static final UITexture PICTURE_WORKBENCH_CIRCLE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/workbench_circle");
+ public static final UITexture PICTURE_ARROW_WHITE_DOWN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/arrow_white_down");
+ public static final UITexture PICTURE_REDSTONE_CIRCUIT_SCREEN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/redstone_circuit_screen");
+ public static final UITexture PICTURE_ELECTRICITY_ERROR = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/electricity_error");
+ public static final UITexture PICTURE_ELECTRICITY_FINE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/electricity_fine");
+ public static final UITexture PICTURE_ENERGY_FRAME = UITexture.fullImage(GTPlusPlus.ID, "gui/picture/energy_frame");
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java
new file mode 100644
index 0000000000..e522d41799
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java
@@ -0,0 +1,40 @@
+package gtPlusPlus.xmod.gregtech.api.gui.widget;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import ic2.api.info.Info;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class ElectricSlotWidget extends SlotWidget {
+
+ public ElectricSlotWidget(IItemHandlerModifiable handler, int index) {
+ this(new BaseSlot(handler, index, false) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ });
+ }
+
+ private ElectricSlotWidget(BaseSlot slot) {
+ super(slot);
+ setFilter(
+ stack -> (accepts(stack)) || (stack.getItem() instanceof GT_MetaGenerated_Tool)
+ || (stack.getItem() instanceof IElectricItem));
+ }
+
+ private boolean accepts(final ItemStack stack) {
+ if (stack == null) {
+ return false;
+ }
+ return (Info.itemEnergy.getEnergyValue(stack) > 0.0D)
+ || (ElectricItem.manager.discharge(stack, (1.0D / 0.0D), 4, true, true, true) > 0.0D);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java
new file mode 100644
index 0000000000..9431739c45
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java
@@ -0,0 +1,40 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public interface GregtechItemContainer {
+
+ public Item getItem();
+
+ public Block getBlock();
+
+ public boolean isStackEqual(Object aStack);
+
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT);
+
+ public ItemStack get(long aAmount, Object... aReplacements);
+
+ public ItemStack getWildcard(long aAmount, Object... aReplacements);
+
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements);
+
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements);
+
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements);
+
+ public GregtechItemContainer set(Item aItem);
+
+ public GregtechItemContainer set(ItemStack aStack);
+
+ public GregtechItemContainer registerOre(Object... aOreNames);
+
+ public GregtechItemContainer registerWildcardAsOre(Object... aOreNames);
+
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements);
+
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements);
+
+ public boolean hasBeenSet();
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java
new file mode 100644
index 0000000000..faa39dadc3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java
@@ -0,0 +1,380 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.Material;
+
+@SuppressWarnings("UnusedReturnValue")
+public interface IGregtech_RecipeAdder {
+
+ /**
+ * Adds a Coke Oven Recipe
+ *
+ * @param aInput1 = first Input (not null, and respects StackSize)
+ * @param aInput2 = second Input (can be null, and respects StackSize)
+ * @param aFluidOutput = Output of the Creosote (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be null, and respects StackSize)
+ * @param aOutput = Output of the Coal/coke (can be null, and respects StackSize)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, int aDuration, int aEUt);
+
+ boolean addCokeOvenRecipe(int aCircuit, ItemStack aInput2, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int aDuration, int aEUt);
+
+ boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt);
+
+ /**
+ * Adds a Matter Fabricator Recipe
+ *
+ * @param aFluidOutput = Output of the UU-Matter (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be UU_Amp or null, and respects StackSize)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ @Deprecated
+ boolean addMatterFabricatorRecipe(FluidStack aFluidInput, FluidStack aFluidOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Dehydrator. (up to 9 Outputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be UU_Amp or null, and respects StackSize)
+ * @param aFluidOutput = Output of the UU-Matter (not null, and respects StackSize)
+ * @param aOutputItems = ItemStack[] (not null, and respects StackSize)
+ * @param aChances = Output Change (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ boolean addDehydratorRecipe(ItemStack[] aInput, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack[] aOutputItems, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aOutput, int aChance, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs, More than 1 Fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs, More than 1 fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe);
+
+ /**
+ * Adds a Recipe for the LFTRr. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Salts (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @param aSpecialValue = Power produced in EU/t per dynamo
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a Recipe for the Quantum Force Smelter (up to 9 Inputs)
+ *
+ *
+ **/
+ boolean addQuantumTransformerRecipe(ItemStack[] aInput, FluidStack[] aFluidInput, FluidStack[] aFluidOutput,
+ ItemStack[] aOutputStack, int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a Recipe for the LFTRr. (up to 9 Inputs, More than 1 fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Salts (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @param aSpecialValue = Power produced in EU/t per dynamo
+ * @return true if the Recipe got added, otherwise false.
+ */
+ @Deprecated
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a custom Semifluid fuel for the GT++ SemiFluid Generators.
+ *
+ * @param aFuelItem - A Fluidstack to be consumed.
+ * @param aFuelValue - Fuel value in thousands (1 = 1000)
+ * @return - Was the Fuel added?
+ */
+ boolean addSemifluidFuel(FluidStack aFuelItem, int aFuelValue);
+
+ /**
+ * Adds a custom Semifluid fuel for the GT++ SemiFluid Generators.
+ *
+ * @param aFuelItem - A Fluidstack to be consumed.
+ * @param aFuelValue - Fuel value in thousands (1 = 1000)
+ * @return - Was the Fuel added?
+ */
+ boolean addSemifluidFuel(ItemStack aFuelItem, int aFuelValue);
+
+ boolean addFissionFuel(FluidStack aInput1, FluidStack aInput2, FluidStack aInput3, FluidStack aInput4,
+ FluidStack aInput5, FluidStack aInput6, FluidStack aInput7, FluidStack aInput8, FluidStack aInput9,
+ FluidStack aOutput1, FluidStack aOutput2, int aDuration, int aEUt);
+
+ boolean addFissionFuel(boolean aOptimise, FluidStack aInput1, FluidStack aInput2, FluidStack aInput3,
+ FluidStack aInput4, FluidStack aInput5, FluidStack aInput6, FluidStack aInput7, FluidStack aInput8,
+ FluidStack aInput9, FluidStack aOutput1, FluidStack aOutput2, int aDuration, int aEUt);
+
+ boolean addCyclotronRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs, FluidStack aFluidOutput,
+ int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addCyclotronRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack[] aOutput,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt);
+
+ boolean addMultiblockCentrifugeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ boolean addMultiblockElectrolyzerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ boolean addAdvancedFreezerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ @Deprecated
+ boolean addSixSlotAssemblingRecipe(ItemStack[] aInputs, FluidStack aInputFluid, ItemStack aOutput1, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds an Assemblyline Recipe
+ *
+ * @param aInputs must be != null, 4-16 inputs
+ * @param aFluidInputs 0-4 fluids
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Assemblyline Recipe
+ *
+ * @param aInputs elements should be: ItemStack for single item; ItemStack[] for multiple equivalent items;
+ * {OreDict, amount} for oredict.
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, int time, int eu);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, Object object, int time, int eu);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, ItemStack object, int time);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, int aCircuit, FluidStack inputFluid,
+ FluidStack outputFluid, ItemStack output, ItemStack output2, int time, int eu);
+
+ @Deprecated
+ boolean addMultiblockChemicalRecipe(ItemStack[] itemStacks, FluidStack[] fluidStacks, FluidStack[] fluidStacks2,
+ ItemStack[] outputs, int time, int eu);
+
+ @Deprecated
+ boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addBrewingRecipe(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden);
+
+ @Deprecated
+ boolean addBrewingRecipe(int aCircuit, FluidStack aInput, FluidStack aOutput, int aTime, int aEu, boolean aHidden);
+
+ @Deprecated
+ boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aDust, ItemStack aOutput);
+
+ @Deprecated
+ boolean addFluidExtractionRecipe(ItemStack input, FluidStack output, int aTime, int aEu);
+
+ @Deprecated
+ boolean addFluidExtractionRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidOut, int aTime,
+ int aEu);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut, int aTime, int aEu);
+
+ boolean addVacuumFurnaceRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel);
+
+ boolean addVacuumFurnaceRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aLevel);
+
+ @Deprecated
+ boolean addUvLaserRecipe(ItemStack aInput1, ItemStack aOutput, int time, long eu);
+
+ boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aTier);
+
+ boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int time, long eu, int aTier);
+
+ @Deprecated
+ boolean addBlastRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aHeat);
+
+ @Deprecated
+ boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aChance, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, ItemStack aSolidOutput,
+ int aDuration, int aEUt, boolean aHidden);
+
+ @Deprecated
+ boolean addPulverisationRecipe(final ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ final ItemStack aOutput3);
+
+ boolean addMillingRecipe(Materials aMat, int aEU);
+
+ boolean addMillingRecipe(Material aMat, int aEU);
+
+ boolean addFlotationRecipe(Materials aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU);
+
+ boolean addFlotationRecipe(Material aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU);
+
+ @Deprecated
+ boolean addpackagerRecipe(ItemStack aRecipeType, ItemStack aInput1, ItemStack aInput2, ItemStack aOutputStack1);
+
+ boolean addFuelForRTG(ItemStack aFuelPellet, int aFuelDays, int aVoltage);
+
+ boolean addColdTrapRecipe(int aCircuit, ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, FluidStack aFluidOutput, int aTime, int aEU);
+
+ boolean addReactorProcessingUnitRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ ItemStack[] aOutputs, int[] aChances, FluidStack aFluidOutput, int aTime, int aEU);
+
+ @Deprecated
+ boolean addFluidHeaterRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addVacuumFreezerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU);
+
+ boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU);
+
+ boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU, int aAmps);
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java
new file mode 100644
index 0000000000..545a97288f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import java.util.List;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.SubTag;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaItem_Base;
+
+public interface Interface_ItemBehaviour<E extends Item> {
+
+ public boolean onLeftClickEntity(E aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity);
+
+ public boolean onItemUse(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int aSide, float hitX, float hitY, float hitZ);
+
+ public boolean onItemUseFirst(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int aSide, float hitX, float hitY, float hitZ);
+
+ public ItemStack onItemRightClick(E aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer);
+
+ public List<String> getAdditionalToolTips(E aItem, List<String> aList, ItemStack aStack);
+
+ public void onUpdate(E aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand);
+
+ public boolean isItemStackUsable(E aItem, ItemStack aStack);
+
+ public boolean canDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ public ItemStack onDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ public boolean hasProjectile(Gregtech_MetaItem_Base aItem, SubTag aProjectileType, ItemStack aStack);
+
+ public EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, double aX,
+ double aY, double aZ);
+
+ public EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ EntityLivingBase aEntity, float aSpeed);
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java
new file mode 100644
index 0000000000..6ae25525bd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public interface Interface_OreRecipeRegistrator {
+
+ /**
+ * Contains a Code Fragment, used in the OrePrefix to register Recipes. Better than using a switch/case, like I did
+ * before.
+ *
+ * @param aPrefix always != null
+ * @param aMaterial always != null, and can be == _NULL if the Prefix is Self Referencing or not Material based!
+ * @param aStack always != null
+ */
+ public void registerOre(GregtechOrePrefixes aPrefix, GT_Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack);
+
+ public void registerOre(GregtechOrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack copyAmount);
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java
new file mode 100644
index 0000000000..97d952d4a1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java
@@ -0,0 +1,202 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaTool;
+
+/**
+ * The Stats for GT Tools. Not including any Material Modifiers.
+ * <p/>
+ * And this is supposed to not have any ItemStack Parameters as these are generic Stats.
+ */
+public interface Interface_ToolStats extends IToolStats {
+
+ /**
+ * Called when aPlayer crafts this Tool
+ */
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Called when this gets added to a Tool Item
+ */
+ public void onStatsAddedToTool(Gregtech_MetaTool gregtech_MetaTool, int aID);
+
+ /**
+ * @return Damage the Tool receives when breaking a Block. 100 is one Damage Point (or 100 EU).
+ */
+ @Override
+ public int getToolDamagePerBlockBreak();
+
+ /**
+ * @return Damage the Tool receives when converting the drops of a Block. 100 is one Damage Point (or 100 EU).
+ */
+ @Override
+ public int getToolDamagePerDropConversion();
+
+ /**
+ * @return Damage the Tool receives when being used as Container Item. 100 is one use, however it is usually 8 times
+ * more than normal.
+ */
+ @Override
+ public int getToolDamagePerContainerCraft();
+
+ /**
+ * @return Damage the Tool receives when being used as Weapon, 200 is the normal Value, 100 for actual Weapons.
+ */
+ @Override
+ public int getToolDamagePerEntityAttack();
+
+ /**
+ * @return Basic Quality of the Tool, 0 is normal. If increased, it will increase the general quality of all Tools
+ * of this Type. Decreasing is also possible.
+ */
+ @Override
+ public int getBaseQuality();
+
+ /**
+ * @return The Damage Bonus for this Type of Tool against Mobs. 1.0F is normal punch.
+ */
+ @Override
+ public float getBaseDamage();
+
+ /**
+ * @return This gets the Hurt Resistance time for Entities getting hit. (always does 1 as minimum)
+ */
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity);
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Speed.
+ */
+ @Override
+ public float getSpeedMultiplier();
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Durability.
+ */
+ @Override
+ public float getMaxDurabilityMultiplier();
+
+ @Override
+ public DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity);
+
+ @Override
+ public String getMiningSound();
+
+ @Override
+ public String getCraftingSound();
+
+ @Override
+ public String getEntityHitSound();
+
+ @Override
+ public String getBreakingSound();
+
+ @Override
+ public Enchantment[] getEnchantments(ItemStack aStack);
+
+ @Override
+ public int[] getEnchantmentLevels(ItemStack aStack);
+
+ /**
+ * @return If this Tool can be used for blocking Damage like a Sword.
+ */
+ @Override
+ public boolean canBlock();
+
+ /**
+ * @return If this Tool can be used as an RC Crowbar.
+ */
+ @Override
+ public boolean isCrowbar();
+
+ /**
+ * @return If this Tool can be used as an BC Wrench.
+ */
+ @Override
+ public boolean isWrench();
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ @Override
+ public boolean isWeapon();
+
+ /**
+ * @return If this Tool is a Ranged Weapon. Return false at isWeapon unless you have a Blade attached to your
+ * Bow/Gun or something
+ */
+ @Override
+ public boolean isRangedWeapon();
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ @Override
+ public boolean isMiningTool();
+
+ /**
+ * aBlock.getHarvestTool(aMetaData) can return the following Values for example. "axe", "pickaxe", "sword",
+ * "shovel", "hoe", "grafter", "saw", "wrench", "crowbar", "file", "hammer", "plow", "plunger", "scoop",
+ * "screwdriver", "sense", "scythe", "softhammer", "cutter", "plasmatorch"
+ *
+ * @return If this is a minable Block. Tool Quality checks (like Diamond Tier or something) are separate from this
+ * check.
+ */
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData);
+
+ /**
+ * This lets you modify the Drop List, when this type of Tool has been used.
+ *
+ * @return the Amount of modified Items.
+ */
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent);
+
+ /**
+ * @return Returns a broken Version of the Item.
+ */
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ @Override
+ public float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer);
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack);
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack);
+
+ /**
+ * Called when this gets added to a Tool Item
+ */
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID);
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java
new file mode 100644
index 0000000000..3ad04ab014
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
+import net.minecraft.dispenser.BehaviorProjectileDispense;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IProjectile;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IProjectileItem;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+/**
+ * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur.
+ */
+public class Gregtech_Generic_Item extends Item implements IProjectileItem {
+
+ private final String mName, mTooltip;
+ protected IIcon mIcon;
+
+ public Gregtech_Generic_Item(final String aUnlocalized, final String aEnglish, final String aEnglishTooltip) {
+ this(aUnlocalized, aEnglish, aEnglishTooltip, true);
+ }
+
+ public Gregtech_Generic_Item(final String aUnlocalized, final String aEnglish, final String aEnglishTooltip,
+ final boolean aWriteToolTipIntoLangFile) {
+ super();
+ this.mName = aUnlocalized;
+ GT_LanguageManager.addStringLocalization(this.mName + ".name", aEnglish);
+ if (GT_Utility.isStringValid(aEnglishTooltip)) {
+ GT_LanguageManager.addStringLocalization(
+ this.mTooltip = this.mName + ".tooltip_main",
+ aEnglishTooltip,
+ aWriteToolTipIntoLangFile);
+ } else {
+ this.mTooltip = null;
+ }
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerItem(this, this.mName, GTPlusPlus.ID);
+ BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense());
+ }
+
+ @Override
+ public final Item setUnlocalizedName(final String aName) {
+ return this;
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return this.mName;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack aStack) {
+ return this.getHasSubtypes() ? this.mName + "." + this.getDamage(aStack) : this.mName;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister aIconRegister) {
+ this.mIcon = aIconRegister.registerIcon(GTPlusPlus.ID + ":" + this.mName);
+ }
+
+ @Override
+ public boolean doesSneakBypassUse(final World aWorld, final int aX, final int aY, final int aZ,
+ final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public IIcon getIconFromDamage(final int par1) {
+ return this.mIcon;
+ }
+
+ public int getTier(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, final List aList,
+ final boolean aF3_H) {
+ if ((this.getMaxDamage() > 0) && !this.getHasSubtypes()) {
+ aList.add((aStack.getMaxDamage() - this.getDamage(aStack)) + " / " + aStack.getMaxDamage());
+ }
+ if (this.mTooltip != null) {
+ aList.add(GT_LanguageManager.getTranslation(this.mTooltip));
+ }
+ if (GT_ModHandler.isElectricItem(aStack)) {
+ aList.add("Tier: " + this.getTier(aStack));
+ }
+ this.addAdditionalToolTips(aList, aStack);
+ }
+
+ protected void addAdditionalToolTips(final List aList, final ItemStack aStack) {
+ //
+ }
+
+ @Override
+ public void onCreated(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ this.isItemStackUsable(aStack);
+ }
+
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ return true;
+ }
+
+ public ItemStack onDispense(final IBlockSource aSource, final ItemStack aStack) {
+ final EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata());
+ final IPosition iposition = BlockDispenser.func_149939_a(aSource);
+ final ItemStack itemstack1 = aStack.splitStack(1);
+ BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition);
+ return aStack;
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final double aX, final double aY, final double aZ) {
+ return null;
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final EntityLivingBase aEntity, final float aSpeed) {
+ return null;
+ }
+
+ @Override
+ public boolean hasProjectile(final SubTag aProjectileType, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ItemStack getContainerItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public boolean hasContainerItem(final ItemStack aStack) {
+ return this.getContainerItem(aStack) != null;
+ }
+
+ public static class GT_Item_Dispense extends BehaviorProjectileDispense {
+
+ @Override
+ public ItemStack dispenseStack(final IBlockSource aSource, final ItemStack aStack) {
+ return ((Gregtech_Generic_Item) aStack.getItem()).onDispense(aSource, aStack);
+ }
+
+ @Override
+ protected IProjectile getProjectileEntity(final World aWorld, final IPosition aPosition) {
+ return null;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(0, 0, 150);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(50, 50, 60);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java
new file mode 100644
index 0000000000..015ba9d716
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java
@@ -0,0 +1,357 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IFoodStat;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ItemBehaviour;
+
+public abstract class Gregtech_MetaItem extends Gregtech_MetaItem_Base {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final HashMap<String, Gregtech_MetaItem> sInstances = new HashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final short mOffset, mItemAmount;
+ public final BitSet mEnabledItems;
+ public final BitSet mVisibleItems;
+ public final IIcon[][] mIconList;
+
+ public final HashMap<Short, IFoodStat> mFoodStats = new HashMap<>();
+ public final HashMap<Short, Long[]> mElectricStats = new HashMap<>();
+ public final HashMap<Short, Long[]> mFluidContainerStats = new HashMap<>();
+ public final HashMap<Short, Short> mBurnValues = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public Gregtech_MetaItem(final String aUnlocalized, final short aOffset, final short aItemAmount) {
+ super(aUnlocalized);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ this.mEnabledItems = new BitSet(aItemAmount);
+ this.mVisibleItems = new BitSet(aItemAmount);
+
+ this.mOffset = (short) Math.min(32766, aOffset);
+ this.mItemAmount = (short) Math.min(aItemAmount, 32766 - this.mOffset);
+ this.mIconList = new IIcon[aItemAmount][1];
+
+ sInstances.put(this.getUnlocalizedName(), this);
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aFoodBehavior The Food Value of this Item. Can be null aswell. Just a convenience thing.
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ public final ItemStack addItem(final int aID, final String aEnglish, String aToolTip, final Object... aRandomData) {
+ if (aToolTip == null) {
+ aToolTip = "";
+ }
+ if ((aID >= 0) && (aID < this.mItemAmount)) {
+ final ItemStack rStack = new ItemStack(this, 1, this.mOffset + aID);
+ this.mEnabledItems.set(aID);
+ this.mVisibleItems.set(aID);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".tooltip", aToolTip);
+ final List<TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ this.mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ continue;
+ }
+ }
+ }
+ // now check for the rest
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData != null) {
+ boolean tUseOreDict = true;
+
+ if (tRandomData instanceof Interface_ItemBehaviour) {
+ this.addItemBehavior(
+ this.mOffset + aID,
+ (Interface_ItemBehaviour<Gregtech_MetaItem_Base>) tRandomData);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof TC_AspectStack) {
+ ((TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ continue;
+ }
+ if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ } else {
+ GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ }
+ continue;
+ }
+ if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ continue;
+ }
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null) {
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ }
+ return rStack;
+ }
+ return null;
+ }
+
+ /**
+ * Sets the Furnace Burn Value for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU)
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setBurnValue(final int aMetaValue, final int aValue) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length())) || (aValue < 0)) {
+ return this;
+ }
+ if (aValue == 0) {
+ this.mBurnValues.remove((short) aMetaValue);
+ } else {
+ this.mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue);
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setElectricStats(final int aMetaValue, final long aMaxCharge,
+ final long aTransferLimit, final long aTier, final long aSpecialData, final boolean aUseAnimations) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length()))) {
+ return this;
+ }
+ if (aMaxCharge == 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mElectricStats.put(
+ (short) aMetaValue,
+ new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData });
+ if ((aMetaValue >= this.mOffset) && aUseAnimations) {
+ this.mIconList[aMetaValue - this.mOffset] = Arrays.copyOf(
+ this.mIconList[aMetaValue - this.mOffset],
+ Math.max(9, this.mIconList[aMetaValue - this.mOffset].length));
+ }
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setFluidContainerStats(final int aMetaValue, final long aCapacity,
+ final long aStacksize) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length()))) {
+ return this;
+ }
+ if (aCapacity < 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mFluidContainerStats.put((short) aMetaValue, new Long[] { aCapacity, Math.max(1, aStacksize) });
+ }
+ return this;
+ }
+
+ /**
+ * @return if this MetaGenerated Item should use my Default Renderer System.
+ */
+ public boolean useStandardMetaItemRenderer() {
+ return true;
+ }
+
+ /**
+ * @return the Color Modulation the Material is going to be rendered with.
+ */
+ public short[] getRGBa(final ItemStack aStack) {
+ return Materials._NULL.getRGBA();
+ }
+
+ /**
+ * @return the Icon the Material is going to be rendered with.
+ */
+ public IIconContainer getIconContainer(final int aMetaData) {
+ return null;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public int getMaxItemUseDuration(final ItemStack aStack) {
+ return this.mFoodStats.get((short) this.getDamage(aStack)) == null ? 0 : 32;
+ }
+
+ @Override
+ public EnumAction getItemUseAction(final ItemStack aStack) {
+ return EnumAction.none;
+ }
+
+ @Override
+ public final ItemStack onEaten(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IFoodStat tStat = this.mFoodStats.get((short) this.getDamage(aStack));
+ if (tStat != null) {}
+
+ return aStack;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = this.mEnabledItems.length(); i < j; i++) {
+ if (this.mVisibleItems.get(i) || (D1 && this.mEnabledItems.get(i))) {
+ final Long[] tStats = this.mElectricStats.get((short) (this.mOffset + i));
+ if ((tStats != null) && (tStats[3] < 0)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.setCharge(tStack, Math.abs(tStats[0]));
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ if ((tStats == null) || (tStats[3] != -2)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (short i = 0, j = (short) this.mEnabledItems.length(); i < j; i++) {
+ if (this.mEnabledItems.get(i)) {
+ for (byte k = 1; k < this.mIconList[i].length; k++) {
+ this.mIconList[i][k] = aIconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "/" + i + "/" + k);
+ }
+ this.mIconList[i][0] = aIconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "/" + i);
+ }
+ }
+ }
+
+ @Override
+ public final Long[] getElectricStats(final ItemStack aStack) {
+ return this.mElectricStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public final Long[] getFluidContainerStats(final ItemStack aStack) {
+ return this.mFluidContainerStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java
new file mode 100644
index 0000000000..3c4418c2bf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java
@@ -0,0 +1,745 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.inventory.Container;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ItemBehaviour;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+import ic2.api.item.ISpecialElectricItem;
+
+public abstract class Gregtech_MetaItem_Base extends Gregtech_Generic_Item
+ implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+ private final HashMap<Short, ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>>> mItemBehaviors = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
+ */
+ public Gregtech_MetaItem_Base(final String aUnlocalized) {
+ super(aUnlocalized, "Generated Item", null, false);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ }
+
+ /**
+ * Adds a special Item Behaviour to the Item.
+ * <p/>
+ * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
+ * @param aBehavior the Click Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem_Base addItemBehavior(final int aMetaValue,
+ final Interface_ItemBehaviour<Gregtech_MetaItem_Base> aBehavior) {
+ if ((aMetaValue < 0) || (aMetaValue >= 32766) || (aBehavior == null)) {
+ return this;
+ }
+ ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors.get((short) aMetaValue);
+ if (tList == null) {
+ tList = new ArrayList<>(1);
+ this.mItemBehaviors.put((short) aMetaValue, tList);
+ }
+ tList.add(aBehavior);
+ return this;
+ }
+
+ public abstract Long[] getElectricStats(ItemStack aStack);
+
+ public abstract Long[] getFluidContainerStats(ItemStack aStack);
+
+ @Override
+ public boolean hasProjectile(final SubTag aProjectileType, final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (tBehavior.hasProjectile(this, aProjectileType, aStack)) {
+ return true;
+ }
+ }
+ }
+ return super.hasProjectile(aProjectileType, aStack);
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final double aX, final double aY, final double aZ) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ final EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
+ if (rArrow != null) {
+ return rArrow;
+ }
+ }
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final EntityLivingBase aEntity, final float aSpeed) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ final EntityArrow rArrow = tBehavior
+ .getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ if (rArrow != null) {
+ return rArrow;
+ }
+ }
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+
+ @Override
+ public ItemStack onDispense(final IBlockSource aSource, final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (tBehavior.canDispense(this, aSource, aStack)) {
+ return tBehavior.onDispense(this, aSource, aStack);
+ }
+ }
+ }
+ return super.onDispense(aSource, aStack);
+ }
+
+ @Override
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (!tBehavior.isItemStackUsable(this, aStack)) {
+ return false;
+ }
+ }
+ }
+ return super.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public boolean onLeftClickEntity(final ItemStack aStack, final EntityPlayer aPlayer, final Entity aEntity) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUse(final ItemStack aStack, final EntityPlayer aPlayer, final World aWorld, final int aX,
+ final int aY, final int aZ, final int ordinalSide, final float hitX, final float hitY, final float hitZ) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUseFirst(final ItemStack aStack, final EntityPlayer aPlayer, final World aWorld, final int aX,
+ final int aY, final int aZ, final int ordinalSide, final float hitX, final float hitY, final float hitZ) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior
+ .onItemUseFirst(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer);
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return aStack;
+ }
+
+ @Override
+ public final void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, List aList,
+ final boolean aF3_H) {
+ final String tKey = this.getUnlocalizedName(aStack) + ".tooltip",
+ tString = GT_LanguageManager.getTranslation(tKey);
+ if (GT_Utility.isStringValid(tString) && !tKey.equals(tString)) {
+ aList.add(tString);
+ }
+
+ Long[] tStats = this.getElectricStats(aStack);
+ if (tStats != null) {
+ if (tStats[3] > 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + "Contains "
+ + GT_Utility.formatNumbers(tStats[3])
+ + " EU Tier: "
+ + (tStats[2] >= 0 ? tStats[2] : 0)
+ + EnumChatFormatting.GRAY);
+ } else {
+ final long tCharge = this.getRealCharge(aStack);
+ if ((tStats[3] == -2) && (tCharge <= 0)) {
+ aList.add(
+ EnumChatFormatting.AQUA + "Empty. You should recycle it properly." + EnumChatFormatting.GRAY);
+ } else {
+ aList.add(
+ EnumChatFormatting.AQUA + ""
+ + GT_Utility.formatNumbers(tCharge)
+ + " / "
+ + GT_Utility.formatNumbers(Math.abs(tStats[0]))
+ + " EU - Voltage: "
+ + GT_Utility.formatNumbers(
+ V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)])
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ tStats = this.getFluidContainerStats(aStack);
+ if ((tStats != null) && (tStats[0] > 0)) {
+ final FluidStack tFluid = this.getFluidContent(aStack);
+ aList.add(
+ EnumChatFormatting.BLUE
+ + ((tFluid == null ? "No Fluids Contained" : GT_Utility.getFluidName(tFluid, true)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ EnumChatFormatting.BLUE
+ + (GT_Utility.formatNumbers(tFluid == null ? 0 : tFluid.amount) + "L / "
+ + GT_Utility.formatNumbers(tStats[0])
+ + "L")
+ + EnumChatFormatting.GRAY);
+ }
+
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
+ }
+ }
+
+ this.addAdditionalToolTips(aList, aStack);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack aStack, final World aWorld, final Entity aPlayer, final int aTimer,
+ final boolean aIsInHand) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand);
+ }
+ }
+ }
+
+ @Override
+ public final boolean canProvideEnergy(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ return (tStats[3] > 0) || ((aStack.stackSize == 1) && ((tStats[3] == -2) || (tStats[3] == -3)));
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.abs(tStats[0]);
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.max(tStats[1], tStats[3]);
+ }
+
+ @Override
+ public final double charge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)
+ || !((tStats[3] == -1) || (tStats[3] == -3) || ((tStats[3] < 0) && (aCharge == Integer.MAX_VALUE)))
+ || (aStack.stackSize != 1)) {
+ return 0;
+ }
+ final long tChargeBefore = this.getRealCharge(aStack),
+ tNewCharge = aCharge == Integer.MAX_VALUE ? Long.MAX_VALUE
+ : Math.min(
+ Math.abs(tStats[0]),
+ tChargeBefore + (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tNewCharge - tChargeBefore;
+ }
+
+ @Override
+ public final double discharge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aBatteryAlike, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)) {
+ return 0;
+ }
+ if (aBatteryAlike && !this.canProvideEnergy(aStack)) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ if ((aCharge < tStats[3]) || (aStack.stackSize < 1)) {
+ return 0;
+ }
+ if (!aSimulate) {
+ aStack.stackSize--;
+ }
+ return tStats[3];
+ }
+ final long tChargeBefore = this.getRealCharge(aStack), tNewCharge = Math
+ .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tChargeBefore - tNewCharge;
+ }
+
+ @Override
+ public final double getCharge(final ItemStack aStack) {
+ return this.getRealCharge(aStack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack aStack, final double aAmount) {
+ return this.getRealCharge(aStack) >= aAmount;
+ }
+
+ @Override
+ public final boolean use(final ItemStack aStack, final double aAmount, final EntityLivingBase aPlayer) {
+ this.chargeFromArmor(aStack, aPlayer);
+ if ((aPlayer instanceof EntityPlayer) && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) {
+ return true;
+ }
+ final double tTransfer = this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
+ if (tTransfer == aAmount) {
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return true;
+ }
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return false;
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack aStack, final EntityLivingBase aPlayer) {
+ if ((aPlayer == null) || aPlayer.worldObj.isRemote) {
+ return;
+ }
+ for (int i = 1; i < 5; i++) {
+ final ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
+ if (GT_ModHandler.isElectricItem(tArmor)) {
+ final IElectricItem tArmorItem = (IElectricItem) tArmor.getItem();
+ if (tArmorItem.canProvideEnergy(tArmor) && (tArmorItem.getTier(tArmor) >= this.getTier(aStack))) {
+ final double tCharge = ElectricItem.manager.discharge(
+ tArmor,
+ this.charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true),
+ Integer.MAX_VALUE,
+ true,
+ true,
+ false);
+ if (tCharge > 0) {
+ this.charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
+ if (aPlayer instanceof EntityPlayer) {
+ final Container tContainer = ((EntityPlayer) aPlayer).openContainer;
+ if (tContainer != null) {
+ tContainer.detectAndSendChanges();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public final long getRealCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ return (int) (long) tStats[3];
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge");
+ }
+
+ public final boolean setCharge(final ItemStack aStack, long aCharge) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[3] > 0)) {
+ return false;
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.removeTag("GT.ItemCharge");
+ aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0]));
+ if (aCharge > 0) {
+ aStack.setItemDamage(this.getChargedMetaData(aStack));
+ tNBT.setLong("GT.ItemCharge", aCharge);
+ } else {
+ aStack.setItemDamage(this.getEmptyMetaData(aStack));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ return true;
+ }
+
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public short getEmptyMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ @Override
+ public FluidStack getFluid(final ItemStack aStack) {
+ return this.getFluidContent(aStack);
+ }
+
+ @Override
+ public int getCapacity(final ItemStack aStack) {
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ return tStats == null ? 0 : (int) Math.max(0, tStats[0]);
+ }
+
+ @Override
+ public int fill(final ItemStack aStack, final FluidStack aFluid, final boolean doFill) {
+ if ((aStack == null) || (aStack.stackSize != 1)) {
+ return 0;
+ }
+
+ final ItemStack tStack = GT_Utility.fillFluidContainer(aFluid, aStack, false, false);
+ if (tStack != null) {
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ return GT_Utility.getFluidForFilledItem(tStack, false).amount;
+ }
+
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)
+ || (aFluid == null)
+ || (aFluid.getFluid()
+ .getID() <= 0)
+ || (aFluid.amount <= 0)) {
+ return 0;
+ }
+
+ FluidStack tFluid = this.getFluidContent(aStack);
+
+ if ((tFluid == null) || (tFluid.getFluid()
+ .getID() <= 0)) {
+ if (aFluid.amount <= tStats[0]) {
+ if (doFill) {
+ this.setFluidContent(aStack, aFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid = aFluid.copy();
+ tFluid.amount = (int) (long) tStats[0];
+ this.setFluidContent(aStack, tFluid);
+ }
+ return (int) (long) tStats[0];
+ }
+
+ if (!tFluid.isFluidEqual(aFluid)) {
+ return 0;
+ }
+
+ final int space = (int) (long) tStats[0] - tFluid.amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ tFluid.amount += aFluid.amount;
+ this.setFluidContent(aStack, tFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid.amount = (int) (long) tStats[0];
+ this.setFluidContent(aStack, tFluid);
+ }
+ return space;
+ }
+
+ @Override
+ public FluidStack drain(final ItemStack aStack, final int maxDrain, final boolean doDrain) {
+ if ((aStack == null) || (aStack.stackSize != 1)) {
+ return null;
+ }
+
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, false);
+ if ((tFluid != null) && (maxDrain >= tFluid.amount)) {
+ final ItemStack tStack = GT_Utility.getContainerItem(aStack, false);
+ if (tStack == null) {
+ aStack.stackSize = 0;
+ return tFluid;
+ }
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ return tFluid;
+ }
+
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)) {
+ return null;
+ }
+
+ tFluid = this.getFluidContent(aStack);
+ if (tFluid == null) {
+ return null;
+ }
+
+ int used = maxDrain;
+ if (tFluid.amount < used) {
+ used = tFluid.amount;
+ }
+ if (doDrain) {
+ tFluid.amount -= used;
+ this.setFluidContent(aStack, tFluid);
+ }
+
+ final FluidStack drained = tFluid.copy();
+ drained.amount = used;
+ return drained;
+ }
+
+ public FluidStack getFluidContent(final ItemStack aStack) {
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)) {
+ return GT_Utility.getFluidForFilledItem(aStack, false);
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? null : FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent"));
+ }
+
+ public void setFluidContent(final ItemStack aStack, final FluidStack aFluid) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ } else {
+ tNBT.removeTag("GT.FluidContent");
+ }
+ if ((aFluid != null) && (aFluid.amount > 0)) {
+ tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound()));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public int getItemStackLimit(final ItemStack aStack) {
+ Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats != null) && ((tStats[3] == -1) || (tStats[3] == -3)) && (this.getRealCharge(aStack) > 0)) {
+ return 1;
+ }
+ tStats = this.getFluidContainerStats(aStack);
+ if (tStats != null) {
+ return (int) (long) tStats[1];
+ }
+ return 64;
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final int getTier(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]);
+ }
+
+ @Override
+ public final String getToolTip(final ItemStack aStack) {
+ return null;
+ } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point
+
+ @Override
+ public final IElectricItemManager getManager(final ItemStack aStack) {
+ return this;
+ } // We are our own Manager
+
+ @Override
+ public final boolean getShareTag() {
+ return true;
+ } // just to be sure.
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(0, 0, 150);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(50, 50, 60);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java
new file mode 100644
index 0000000000..c04acb9537
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java
@@ -0,0 +1,266 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+/**
+ * @author Gregorius Techneticies
+ * <p/>
+ * One Item for everything!
+ * <p/>
+ * This brilliant Item Class is used for automatically generating all possible variations of Material Items,
+ * like Dusts, Ingots, Gems, Plates and similar. It saves me a ton of work, when adding Items, because I always
+ * have to make a new Item SubType for each OreDict Prefix, when adding a new Material.
+ * <p/>
+ * As you can see, up to 32766 Items can be generated using this Class. And the last 766 Items can be custom
+ * defined, just to save space and MetaData.
+ * <p/>
+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike
+ * Item.
+ */
+public abstract class Gregtech_MetaItem_X32 extends Gregtech_MetaItem {
+
+ protected final OrePrefixes[] mGeneratedPrefixList;
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
+ */
+ public Gregtech_MetaItem_X32(final String aUnlocalized, final OrePrefixes... aGeneratedPrefixList) {
+ super(aUnlocalized, (short) 32000, (short) 766);
+ this.mGeneratedPrefixList = Arrays.copyOf(aGeneratedPrefixList, 32);
+
+ for (int i = 0; i < 32000; i++) {
+ final OrePrefixes tPrefix = this.mGeneratedPrefixList[i / 1000];
+ if (tPrefix == null) {
+ continue;
+ }
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[i % 1000];
+ if (tMaterial == null) {
+ continue;
+ }
+ if (this.doesMaterialAllowGeneration(tPrefix, tMaterial)) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ GT_LanguageManager.addStringLocalization(
+ this.getUnlocalizedName(tStack) + ".name",
+ this.getDefaultLocalization(tPrefix, tMaterial, i));
+ GT_LanguageManager.addStringLocalization(
+ this.getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(tPrefix.mMaterialAmount / GT_Values.M));
+ if (tPrefix.mIsUnificatable) {
+ GT_OreDictUnificator.set(tPrefix, tMaterial, tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(tPrefix.get(tMaterial), tStack);
+ }
+ if (((tPrefix == OrePrefixes.stick) || (tPrefix == OrePrefixes.wireFine))
+ && ((tMaterial == Materials.Lead) || (tMaterial == Materials.Tin)
+ || (tMaterial == Materials.SolderingAlloy))) {
+ GregTech_API.sSolderingMetalList.add(tStack);
+ }
+ }
+ }
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @return the Color Modulation the Material is going to be rendered with.
+ */
+ @Override
+ public short[] getRGBa(final ItemStack aStack) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[this.getDamage(aStack) % 1000];
+ return tMaterial == null ? Materials._NULL.mRGBa : tMaterial.mRGBa;
+ }
+
+ /**
+ * @param aPrefix this can be null, you have to return false in that case
+ * @param aMaterial this can be null, you have to return false in that case
+ * @return if this Item should be generated and visible.
+ */
+ public boolean doesMaterialAllowGeneration(final OrePrefixes aPrefix, final Materials aMaterial) {
+ // You have to check for at least these Conditions in every Case! So add a super Call like the following for
+ // this before executing your Code:
+ // if (!super.doesMaterialAllowGeneration(aPrefix, aMaterial)) return false;
+ return (aPrefix != null) && (aMaterial != null) && aPrefix.doGenerateItem(aMaterial);
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name when default LangFiles are used.
+ */
+ public String getDefaultLocalization(final OrePrefixes aPrefix, final Materials aMaterial, final int aMetaData) {
+ return aPrefix.getDefaultLocalNameForItem(aMaterial);
+ }
+
+ /**
+ * @param aMetaData a Index from [0 - 31999]
+ * @param aMaterial the Material
+ * @return an Icon Container for the Item Display.
+ */
+ public final IIconContainer getIconContainer(final int aMetaData, final Materials aMaterial) {
+ return (this.mGeneratedPrefixList[aMetaData / 1000] != null)
+ && (this.mGeneratedPrefixList[aMetaData / 1000].mTextureIndex >= 0)
+ ? aMaterial.mIconSet.mTextures[this.mGeneratedPrefixList[aMetaData / 1000].mTextureIndex]
+ : null;
+ }
+
+ /**
+ * @param aPrefix always != null
+ * @param aMaterial always != null
+ * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny
+ * Dusts or Crushed Ores as well.
+ * @return if this Item should be visible in NEI or Creative
+ */
+ public boolean doesShowInCreative(final OrePrefixes aPrefix, final Materials aMaterial,
+ final boolean aDoShowAllItems) {
+ return true;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public ItemStack getContainerItem(final ItemStack aStack) {
+ final int aDamage = aStack.getItemDamage();
+ if ((aDamage < 32000) && (aDamage >= 0)) {
+ final Materials aMaterial = GregTech_API.sGeneratedMaterials[aDamage % 1000];
+ if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) {
+ final OrePrefixes aPrefix = this.mGeneratedPrefixList[aDamage / 1000];
+ if (aPrefix != null) {
+ return GT_Utility.copyAmount(1, aPrefix.mContainerItem);
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public final IIconContainer getIconContainer(final int aMetaData) {
+ return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null
+ : this.getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData % 1000]);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0; i < 32000; i++) {
+ if (this.doesMaterialAllowGeneration(
+ this.mGeneratedPrefixList[i / 1000],
+ GregTech_API.sGeneratedMaterials[i % 1000])
+ && this.doesShowInCreative(
+ this.mGeneratedPrefixList[i / 1000],
+ GregTech_API.sGeneratedMaterials[i % 1000],
+ GregTech_API.sDoShowAllItemsInCreative)) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ super.getSubItems(var1, aCreativeTab, aList);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ if (aMetaData < 32000) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData % 1000];
+ if (tMaterial == null) {
+ return null;
+ }
+ final IIconContainer tIcon = this.getIconContainer(aMetaData, tMaterial);
+ if (tIcon != null) {
+ return tIcon.getIcon();
+ }
+ return null;
+ }
+ return (aMetaData - 32000) < this.mIconList.length ? this.mIconList[aMetaData - 32000][0] : null;
+ }
+
+ @Override
+ public int getItemStackLimit(final ItemStack aStack) {
+ final int tDamage = this.getDamage(aStack);
+ if ((tDamage < 32000) && (this.mGeneratedPrefixList[tDamage / 1000] != null)) {
+ return Math
+ .min(super.getItemStackLimit(aStack), this.mGeneratedPrefixList[tDamage / 1000].mDefaultStackSize);
+ }
+ return super.getItemStackLimit(aStack);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+
+ int aMeta = stack.getItemDamage();
+ if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(90, 90, 255);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 150, 80);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else if (stack.getDisplayName()
+ .contains("Wrought")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 180, 180);
+ } else if (stack.getDisplayName()
+ .contains("Bronze")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 128, 0);
+ } else if (stack.getDisplayName()
+ .contains("Brass")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 180, 0);
+ } else if (stack.getDisplayName()
+ .contains("Invar")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(180, 180, 120);
+ } else {
+ if (aMeta > 50 && aMeta != 150) {
+ HEX_OxFFFFFF = 0xffffff;
+ } else if (stack.getDisplayName()
+ .contains("ULV")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 180, 180);
+ } else if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xffe600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffb300;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(
+ MathUtils.randInt(220, 250),
+ MathUtils.randInt(221, 251),
+ MathUtils.randInt(220, 250));
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java
new file mode 100644
index 0000000000..fcfa5fae50
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java
@@ -0,0 +1,692 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map.Entry;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.item.EntityMinecart;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.stats.StatList;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import buildcraft.api.tools.IToolWrench;
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.interfaces.IDamagableItem;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ToolStats;
+import mods.railcraft.api.core.items.IToolCrowbar;
+
+/**
+ * This is an example on how you can create a Tool ItemStack, in this case a Bismuth Wrench:
+ * GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01").getToolWithStats(16, 1, Materials.Bismuth, Materials.Bismuth,
+ * null);
+ */
+@Optional.InterfaceList({
+ @Optional.Interface(iface = "forestry.api.arboriculture.IToolGrafter", modid = Mods.Names.FORESTRY),
+ @Optional.Interface(iface = "mods.railcraft.api.core.items.IToolCrowbar", modid = Mods.Names.RAILCRAFT),
+ @Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraft"),
+ @Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = Mods.Names.ENDER_I_O) })
+public abstract class Gregtech_MetaTool extends GT_MetaGenerated_Tool
+ implements IDamagableItem, IToolCrowbar, IToolWrench {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final HashMap<String, Gregtech_MetaTool> sInstances = new HashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final HashMap<Short, IToolStats> mToolStats = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public Gregtech_MetaTool(final String aUnlocalized) {
+ super(aUnlocalized);
+ GT_ModHandler.registerBoxableItemToToolBox(new ItemStack(this));
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setMaxStackSize(1);
+ sInstances.put(this.getUnlocalizedName(), this);
+ }
+
+ /**
+ * Called by the Block Harvesting Event within the GT_Proxy
+ */
+ @Override
+ public void onHarvestBlockEvent(final ArrayList<ItemStack> aDrops, final ItemStack aStack,
+ final EntityPlayer aPlayer, final Block aBlock, final int aX, final int aY, final int aZ, final byte aMetaData,
+ final int aFortune, final boolean aSilkTouch, final BlockEvent.HarvestDropsEvent aEvent) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (this.isItemStackUsable(aStack) && (this.getDigSpeed(aStack, aBlock, aMetaData) > 0.0F)) {
+ this.doDamage(
+ aStack,
+ tStats.convertBlockDrops(
+ aDrops,
+ aStack,
+ aPlayer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ aFortune,
+ aSilkTouch,
+ aEvent) * tStats.getToolDamagePerDropConversion());
+ }
+ }
+
+ @Override
+ public boolean onLeftClickEntity(final ItemStack aStack, final EntityPlayer aPlayer, final Entity aEntity) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats == null) || !this.isItemStackUsable(aStack)) {
+ return true;
+ }
+ GT_Utility.doSoundAtClient(tStats.getEntityHitSound(), 1, 1.0F);
+ if (super.onLeftClickEntity(aStack, aPlayer, aEntity)) {
+ return true;
+ }
+ if (aEntity.canAttackWithItem() && !aEntity.hitByEntity(aPlayer)) {
+ final float tMagicDamage = tStats.getMagicDamageAgainstEntity(
+ aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getEnchantmentModifierLiving(aPlayer, (EntityLivingBase) aEntity)
+ : 0.0F,
+ aEntity,
+ aStack,
+ aPlayer);
+ float tDamage = tStats.getNormalDamageAgainstEntity(
+ (float) aPlayer.getEntityAttribute(SharedMonsterAttributes.attackDamage)
+ .getAttributeValue() + this.getToolCombatDamage(aStack),
+ aEntity,
+ aStack,
+ aPlayer);
+ if ((tDamage + tMagicDamage) > 0.0F) {
+ final boolean tCriticalHit = (aPlayer.fallDistance > 0.0F) && !aPlayer.onGround
+ && !aPlayer.isOnLadder()
+ && !aPlayer.isInWater()
+ && !aPlayer.isPotionActive(Potion.blindness)
+ && (aPlayer.ridingEntity == null)
+ && (aEntity instanceof EntityLivingBase);
+ if (tCriticalHit && (tDamage > 0.0F)) {
+ tDamage *= 1.5F;
+ }
+ tDamage += tMagicDamage;
+ if (aEntity.attackEntityFrom(tStats.getDamageSource(aPlayer, aEntity), tDamage)) {
+ if (aEntity instanceof EntityLivingBase) {
+ aEntity.setFire(EnchantmentHelper.getFireAspectModifier(aPlayer) * 4);
+ }
+ final int tKnockcack = (aPlayer.isSprinting() ? 1 : 0) + (aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getKnockbackModifier(aPlayer, (EntityLivingBase) aEntity)
+ : 0);
+ if (tKnockcack > 0) {
+ aEntity.addVelocity(
+ -MathHelper.sin((aPlayer.rotationYaw * (float) Math.PI) / 180.0F) * tKnockcack * 0.5F,
+ 0.1D,
+ MathHelper.cos((aPlayer.rotationYaw * (float) Math.PI) / 180.0F) * tKnockcack * 0.5F);
+ aPlayer.motionX *= 0.6D;
+ aPlayer.motionZ *= 0.6D;
+ aPlayer.setSprinting(false);
+ }
+ if (tCriticalHit) {
+ aPlayer.onCriticalHit(aEntity);
+ }
+ if (tMagicDamage > 0.0F) {
+ aPlayer.onEnchantmentCritical(aEntity);
+ }
+ if (tDamage >= 18.0F) {
+ aPlayer.triggerAchievement(AchievementList.overkill);
+ }
+ aPlayer.setLastAttacker(aEntity);
+ if (aEntity instanceof EntityLivingBase) {
+ EnchantmentHelper.func_151384_a((EntityLivingBase) aEntity, aPlayer);
+ }
+ EnchantmentHelper.func_151385_b(aPlayer, aEntity);
+ if (aEntity instanceof EntityLivingBase) {
+ aPlayer.addStat(StatList.damageDealtStat, Math.round(tDamage * 10.0F));
+ }
+ aEntity.hurtResistantTime = Math
+ .max(1, tStats.getHurtResistanceTime(aEntity.hurtResistantTime, aEntity));
+ aPlayer.addExhaustion(0.3F);
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats != null) && tStats.canBlock()) {
+ aPlayer.setItemInUse(aStack, 72000);
+ }
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void addAdditionalToolTips(final List aList, final ItemStack aStack) {
+ final long tMaxDamage = getToolMaxDamage(aStack);
+ final Materials tMaterial = getPrimaryMaterial(aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ final int tOffset = this.getElectricStats(aStack) != null ? 2 : 1;
+ if (tStats != null) {
+ final String name = aStack.getUnlocalizedName();
+ if (name.equals("gt.metatool.01.170") || name.equals("gt.metatool.01.172")
+ || name.equals("gt.metatool.01.174")
+ || name.equals("gt.metatool.01.176")) {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Turbine Efficency: "
+ + EnumChatFormatting.BLUE
+ + (50.0F + (10.0F * this.getToolCombatDamage(aStack)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Steam flow: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "L/sec");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Gas flow(EU burnvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 25)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Plasma flow(Plasma energyvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+
+ } else {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Attack Damage: "
+ + EnumChatFormatting.BLUE
+ + this.getToolCombatDamage(aStack)
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Mining Speed: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math
+ .max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void addAdditionalToolTips(final List aList, final ItemStack aStack, final EntityPlayer aPlayer) {
+ final long tMaxDamage = getToolMaxDamage(aStack);
+ final Materials tMaterial = getPrimaryMaterial(aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ final int tOffset = this.getElectricStats(aStack) != null ? 2 : 1;
+ if (tStats != null) {
+ final String name = aStack.getUnlocalizedName();
+ if (name.equals("gt.metatool.01.170") || name.equals("gt.metatool.01.172")
+ || name.equals("gt.metatool.01.174")
+ || name.equals("gt.metatool.01.176")) {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Turbine Efficency: "
+ + EnumChatFormatting.BLUE
+ + (50.0F + (10.0F * this.getToolCombatDamage(aStack)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Steam flow: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "L/sec");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Gas flow(EU burnvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 50)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Plasma flow(Plasma energyvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+
+ } else {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Attack Damage: "
+ + EnumChatFormatting.BLUE
+ + this.getToolCombatDamage(aStack)
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Mining Speed: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math
+ .max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ + EnumChatFormatting.GRAY);
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if ((aNBT != null) && aNBT.hasKey("Heat")) {
+ int tHeat = aNBT.getInteger("Heat");
+ final long tWorldTime = aPlayer.getEntityWorld()
+ .getWorldTime();
+ if (aNBT.hasKey("HeatTime")) {
+ final long tHeatTime = aNBT.getLong("HeatTime");
+ if (tWorldTime > (tHeatTime + 10)) {
+ tHeat = (int) (tHeat - ((tWorldTime - tHeatTime) / 10));
+ if ((tHeat < 300) && (tHeat > -10000)) {
+ tHeat = 300;
+ }
+ }
+ aNBT.setLong("HeatTime", tWorldTime);
+ if (tHeat > -10000) {
+ aNBT.setInteger("Heat", tHeat);
+ }
+ }
+
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.RED + "Heat: "
+ + aNBT.getInteger("Heat")
+ + " K"
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public Long[] getFluidContainerStats(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public Long[] getElectricStats(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if ((aNBT != null) && aNBT.getBoolean("Electric")) {
+ return new Long[] { aNBT.getLong("MaxCharge"), aNBT.getLong("Voltage"), aNBT.getLong("Tier"),
+ aNBT.getLong("SpecialData") };
+ }
+ }
+ return new Long[] {};
+ }
+
+ @Override
+ public float getToolCombatDamage(final ItemStack aStack) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return tStats.getBaseDamage() + getPrimaryMaterial(aStack).mToolQuality;
+ }
+
+ @Override
+ public float getDigSpeed(final ItemStack aStack, final Block aBlock, final int aMetaData) {
+ if (!this.isItemStackUsable(aStack)) {
+ return 0.0F;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats == null) || (Math.max(0, this.getHarvestLevel(aStack, "")) < aBlock.getHarvestLevel(aMetaData))) {
+ return 0.0F;
+ }
+ return tStats.isMinableBlock(aBlock, (byte) aMetaData)
+ ? Math.max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ : 0.0F;
+ }
+
+ @Override
+ public boolean onBlockDestroyed(final ItemStack aStack, final World aWorld, final Block aBlock, final int aX,
+ final int aY, final int aZ, final EntityLivingBase aPlayer) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ GT_Utility.doSoundAtClient(tStats.getMiningSound(), 1, 1.0F);
+ this.doDamage(
+ aStack,
+ (int) Math.max(1, aBlock.getBlockHardness(aWorld, aX, aY, aZ) * tStats.getToolDamagePerBlockBreak()));
+ return this.getDigSpeed(aStack, aBlock, aWorld.getBlockMetadata(aX, aY, aZ)) > 0.0F;
+ }
+
+ private ItemStack getContainerItem(ItemStack aStack, final boolean playSound) {
+ if (!this.isItemStackUsable(aStack)) {
+ return null;
+ }
+ aStack = GT_Utility.copyAmount(1, aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return null;
+ }
+ this.doDamage(aStack, tStats.getToolDamagePerContainerCraft());
+ aStack = aStack.stackSize > 0 ? aStack : null;
+ if (playSound) {}
+ return aStack;
+ }
+
+ @Override
+ public Interface_ToolStats getToolStats(final ItemStack aStack) {
+ this.isItemStackUsable(aStack);
+ return this.getToolStatsInternal(aStack);
+ }
+
+ private Interface_ToolStats getToolStatsInternal(final ItemStack aStack) {
+ return (Interface_ToolStats) (aStack == null ? null : this.mToolStats.get((short) aStack.getItemDamage()));
+ }
+
+ @Override
+ public boolean canWhack(final EntityPlayer aPlayer, final ItemStack aStack, final int aX, final int aY,
+ final int aZ) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onWhack(final EntityPlayer aPlayer, final ItemStack aStack, final int aX, final int aY, final int aZ) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canWrench(final EntityPlayer player, final int x, final int y, final int z) {
+ // System.out.println("canWrench");
+ if (player == null) {
+ return false;
+ }
+ if (player.getCurrentEquippedItem() == null) {
+ return false;
+ }
+ if (!this.isItemStackUsable(player.getCurrentEquippedItem())) {
+ return false;
+ }
+ final Interface_ToolStats tStats = this.getToolStats(player.getCurrentEquippedItem());
+ return (tStats != null) && tStats.isWrench();
+ }
+
+ @Override
+ public void wrenchUsed(final EntityPlayer player, final int x, final int y, final int z) {
+ if (player == null) {
+ return;
+ }
+ if (player.getCurrentEquippedItem() == null) {
+ return;
+ }
+ final IToolStats tStats = this.getToolStats(player.getCurrentEquippedItem());
+ if (tStats != null) {
+ this.doDamage(player.getCurrentEquippedItem(), tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canLink(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onLink(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canBoost(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onBoost(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public void onCreated(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats != null) && (aPlayer != null)) {
+ tStats.onToolCrafted(aStack, aPlayer);
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public boolean isFull3D() {
+ return true;
+ }
+
+ @Override
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final IToolStats tStats = this.getToolStatsInternal(aStack);
+ if (((aStack.getItemDamage() % 2) == 1) || (tStats == null)) {
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT.removeTag("ench");
+ }
+ return false;
+ }
+ final Materials aMaterial = getPrimaryMaterial(aStack);
+ final HashMap<Integer, Integer> tMap = new HashMap<>(), tResult = new HashMap<>();
+ if (aMaterial.mEnchantmentTools != null) {
+ tMap.put(aMaterial.mEnchantmentTools.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ if (aMaterial.mEnchantmentTools == Enchantment.fortune) {
+ tMap.put(Enchantment.looting.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ if (aMaterial.mEnchantmentTools == Enchantment.knockback) {
+ tMap.put(Enchantment.power.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ if (aMaterial.mEnchantmentTools == Enchantment.fireAspect) {
+ tMap.put(Enchantment.flame.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ }
+ final Enchantment[] tEnchants = tStats.getEnchantments(aStack);
+ final int[] tLevels = tStats.getEnchantmentLevels(aStack);
+ for (int i = 0; i < tEnchants.length; i++) {
+ if (tLevels[i] > 0) {
+ final Integer tLevel = tMap.get(tEnchants[i].effectId);
+ tMap.put(
+ tEnchants[i].effectId,
+ tLevel == null ? tLevels[i] : tLevel == tLevels[i] ? tLevel + 1 : Math.max(tLevel, tLevels[i]));
+ }
+ }
+ for (final Entry<Integer, Integer> tEntry : tMap.entrySet()) {
+ if ((tEntry.getKey() == 33) || ((tEntry.getKey() == 20) && (tEntry.getValue() > 2))
+ || (tEntry.getKey() == Enchantment_Radioactivity.INSTANCE.effectId)) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ } else {
+ switch (Enchantment.enchantmentsList[tEntry.getKey()].type) {
+ case weapon:
+ if (tStats.isWeapon()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ case all:
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ case armor:
+ case armor_feet:
+ case armor_head:
+ case armor_legs:
+ case armor_torso:
+ break;
+ case bow:
+ if (tStats.isRangedWeapon()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ case breakable:
+ break;
+ case fishing_rod:
+ break;
+ case digger:
+ if (tStats.isMiningTool()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ }
+ }
+ }
+ EnchantmentHelper.setEnchantments(tResult, aStack);
+ return true;
+ }
+
+ @Override
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) (aStack.getItemDamage() - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public short getEmptyMetaData(final ItemStack aStack) {
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT.removeTag("ench");
+ }
+ return (short) ((aStack.getItemDamage() + 1) - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java
new file mode 100644
index 0000000000..3009c80c80
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+
+public class GT_MetaTileEntity_ChiselBus extends GT_MetaTileEntity_Hatch_InputBus implements IAddUIWidgets {
+
+ public GT_MetaTileEntity_ChiselBus(int id, String name, String nameRegional, int tier) {
+ super(id, name, nameRegional, tier);
+ }
+
+ public GT_MetaTileEntity_ChiselBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, getSlots(aTier), aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < getSlots(this.mTier);
+ }
+
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16 + 1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ChiselBus(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return false;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Item Input Bus for Industrial Chisel", getSlots(this.mTier) - 1 + " + 1 " + " Slots",
+ "Added by: " + EnumChatFormatting.AQUA
+ + "Quetz4l"
+ + " - "
+ + EnumChatFormatting.RED
+ + "[GT++]"
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ int slotIndex = 0;
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, slotIndex++).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+
+ }
+ }
+
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7)); // main slots
+ builder.widget(
+ new SlotWidget(inventoryHandler, slotIndex).setPos(18, 18)
+ .setSize(18, 18)); // slot for target
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java
new file mode 100644
index 0000000000..bab504910e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java
@@ -0,0 +1,128 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class GT_MetaTileEntity_Hatch_AirIntake extends GT_MetaTileEntity_Hatch_FluidGenerator {
+
+ public GT_MetaTileEntity_Hatch_AirIntake(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_AirIntake(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_AirIntake(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getCustomTooltip() {
+ String[] aTooltip = new String[3];
+ aTooltip[0] = "DO NOT OBSTRUCT THE INPUT!";
+ aTooltip[1] = "Draws in Air from the surrounding environment";
+ aTooltip[2] = "Creates " + getAmountOfFluidToGenerate() + "L of Air every " + getMaxTickTime() + " ticks";
+ return aTooltip;
+ }
+
+ @Override
+ public Fluid getFluidToGenerate() {
+ return FluidUtils.getAir(1)
+ .getFluid();
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 1000;
+ }
+
+ @Override
+ public int getMaxTickTime() {
+ return 4;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 128000;
+ }
+
+ @Override
+ public boolean doesHatchMeetConditionsToGenerate() {
+ return this.getBaseMetaTileEntity()
+ .getAirAtSide(
+ this.getBaseMetaTileEntity()
+ .getFrontFacing());
+ }
+
+ @Override
+ public void generateParticles(World aWorld, String name) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ return;
+ }
+ final float ran1 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ float ran2 = 0.0f;
+ float ran3 = 0.0f;
+ ran2 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ ran3 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+
+ final IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity();
+ final ForgeDirection aDir = aMuffler.getFrontFacing();
+ final float xPos = aDir.offsetX * 0.76f + aMuffler.getXCoord() + 0.25f;
+ float yPos = aDir.offsetY * 0.76f + aMuffler.getYCoord() + 0.65f;
+ final float zPos = aDir.offsetZ * 0.76f + aMuffler.getZCoord() + 0.25f;
+ float ySpd = aDir.offsetY * 0.1f + 0.2f + 0.1f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ float xSpd;
+ float zSpd;
+ if (aDir.offsetY == -1) {
+ // Logger.INFO("Y = -1");
+ final float temp = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 2.0f * CORE.PI;
+ xSpd = (float) Math.sin(temp) * 0.1f;
+ zSpd = (float) Math.cos(temp) * 0.1f;
+ ySpd = -ySpd;
+ yPos = yPos - 0.8f;
+ } else {
+ xSpd = aDir.offsetX * (0.1f + 0.2f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat());
+ zSpd = aDir.offsetZ * (0.1f + 0.2f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat());
+
+ xSpd = -xSpd;
+ zSpd = -zSpd;
+ }
+
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran1 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran2 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran3 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java
new file mode 100644
index 0000000000..007310fc06
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_AirIntake_Extreme extends GT_MetaTileEntity_Hatch_AirIntake {
+
+ public GT_MetaTileEntity_Hatch_AirIntake_Extreme(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_AirIntake_Extreme(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_AirIntake_Extreme(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 8000;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 256000;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java
new file mode 100644
index 0000000000..f375900800
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_DynamoBuffer extends GT_MetaTileEntity_Hatch_Dynamo {
+
+ public GT_MetaTileEntity_Hatch_DynamoBuffer(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_DynamoBuffer(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TexturesGtBlock.OVERLAYS_ENERGY_OUT_MULTI_BUFFER[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TexturesGtBlock.OVERLAYS_ENERGY_OUT_MULTI_BUFFER[this.mTier] };
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + GT_Values.V[this.mTier + 1] * 2048L;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DynamoBuffer(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] g;
+ g = new String[] { "Dynamo with internal storage and additional Amp capacity",
+ "Does not accept more than " + (this.maxEUOutput() * this.maxAmperesIn()) + "EU/t as input",
+ CORE.GT_Tooltip.get() };
+
+ return g;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 4;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java
new file mode 100644
index 0000000000..336c6eb011
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java
@@ -0,0 +1,229 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_ElementalDataOrbHolder extends GT_MetaTileEntity_Hatch
+ implements IConfigurationCircuitSupport {
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 17,
+ new String[] { "Holds Data Orbs for the Elemental Duplicator", "Can insert/extract the circuit slot",
+ "A circuit must be used to select a slot (1-16)", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 17, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 17, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Data_Orb) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Data_Orb) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length - 1; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length - 1; i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) {
+ mInventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ Logger.INFO("Checking if we can pull " + aStack.getDisplayName() + " from slot " + aIndex);
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && side == getBaseMetaTileEntity().getFrontFacing()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ Logger.INFO("Checking if we can put " + aStack.getDisplayName() + " into slot " + aIndex);
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && side == getBaseMetaTileEntity().getFrontFacing()) {
+ return true;
+ }
+ return false;
+ }
+
+ public ArrayList<ItemStack> getInventory() {
+ ArrayList<ItemStack> aContents = new ArrayList<>();
+ for (int i = getBaseMetaTileEntity().getSizeInventory() - 2; i >= 0; i--) {
+ if (getBaseMetaTileEntity().getStackInSlot(i) != null)
+ aContents.add(getBaseMetaTileEntity().getStackInSlot(i));
+ }
+ return aContents;
+ }
+
+ public ItemStack getOrbByCircuit() {
+ ItemStack aCirc = getBaseMetaTileEntity().getStackInSlot(getCircuitSlot());
+ if (aCirc != null && ItemUtils.isControlCircuit(aCirc)) {
+ int slot = aCirc.getItemDamage() - 1; // slots are 0 indexed but there's no 0 circuit
+ if (slot < getBaseMetaTileEntity().getSizeInventory() - 1) {
+ return getBaseMetaTileEntity().getStackInSlot(slot);
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && ordinalSide == getBaseMetaTileEntity().getFrontFacing()
+ .ordinal()) {
+ Logger.INFO("Putting " + aStack.getDisplayName() + " into slot " + aIndex);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)) {
+ Logger.INFO("Pulling " + aStack.getDisplayName() + " from slot " + aIndex);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return getSlots(mTier);
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 153;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 63;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .background(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_DATA_ORB)
+ .applyForWidget(
+ widget -> widget.setFilter(stack -> ItemList.Tool_DataOrb.isStackEqual(stack, false, true)))
+ .build()
+ .setPos(52, 7));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java
new file mode 100644
index 0000000000..b4e213e829
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java
@@ -0,0 +1,255 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public abstract class GT_MetaTileEntity_Hatch_FluidGenerator extends GT_MetaTileEntity_Hatch_Input {
+
+ protected static XSTR floatGen = new XSTR();
+ public int mProgresstime = 0, mMaxProgresstime = 0;
+
+ public GT_MetaTileEntity_Hatch_FluidGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_FluidGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public abstract String[] getCustomTooltip();
+
+ public abstract Fluid getFluidToGenerate();
+
+ public abstract int getAmountOfFluidToGenerate();
+
+ public abstract int getMaxTickTime();
+
+ @Override
+ public synchronized String[] getDescription() {
+ mDescriptionArray[1] = "Capacity: " + GT_Utility.formatNumbers(getCapacity()) + "L";
+ final String[] hatchTierString = new String[] { "Hatch Tier: " + GT_Utility.getColoredTierNameFromTier(mTier) };
+
+ String[] aCustomTips = getCustomTooltip();
+ final String[] desc = new String[mDescriptionArray.length + aCustomTips.length + 2];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ System.arraycopy(hatchTierString, 0, desc, mDescriptionArray.length, 1);
+ System.arraycopy(aCustomTips, 0, desc, mDescriptionArray.length + 1, aCustomTips.length);
+ desc[mDescriptionArray.length + aCustomTips.length] = CORE.GT_Tooltip.get();
+ return desc;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity);
+
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (!aBaseMetaTileEntity.isAllowedToWork()) {
+ aBaseMetaTileEntity.setActive(false);
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ } else {
+ aBaseMetaTileEntity.setActive(true);
+ mMaxProgresstime = getMaxTickTime();
+ if (++mProgresstime >= mMaxProgresstime) {
+ if (this.canTankBeFilled()) {
+ addFluidToHatch(aTick);
+ }
+ mProgresstime = 0;
+ }
+ }
+ }
+
+ @Override
+ public int getProgresstime() {
+ return mProgresstime;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return mMaxProgresstime;
+ }
+
+ @Override
+ public int increaseProgress(int aProgress) {
+ mProgresstime += aProgress;
+ return mMaxProgresstime - mProgresstime;
+ }
+
+ public abstract void generateParticles(final World aWorld, final String name);
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ @Override
+ public abstract int getCapacity();
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ public abstract boolean doesHatchMeetConditionsToGenerate();
+
+ public boolean addFluidToHatch(long aTick) {
+ if (!doesHatchMeetConditionsToGenerate()) {
+ return false;
+ }
+ int aFillAmount = this.fill(FluidUtils.getFluidStack(getFluidToGenerate(), getAmountOfFluidToGenerate()), true);
+ if (aFillAmount > 0) {
+ if (this.getBaseMetaTileEntity()
+ .isClientSide()) {
+ generateParticles(
+ this.getBaseMetaTileEntity()
+ .getWorld(),
+ "cloud");
+ }
+ }
+ return aFillAmount > 0;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0 || aFluid.amount <= 0 || aFluid.getFluid() != getFluidToGenerate() || !canTankBeFilled()) {
+ return 0;
+ }
+
+ if (getFillableStack() == null || getFillableStack().getFluid()
+ .getID() <= 0) {
+ if (aFluid.amount <= getCapacity()) {
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getFillableStack().amount = getCapacity();
+ getBaseMetaTileEntity().markDirty();
+ }
+ return getCapacity();
+ }
+
+ if (!getFillableStack().isFluidEqual(aFluid)) return 0;
+
+ int space = getCapacity() - getFillableStack().amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ getFillableStack().amount += aFluid.amount;
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) getFillableStack().amount = getCapacity();
+ return space;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection aSide, Fluid aFluid) {
+ return false;
+ }
+
+ @Override
+ public int fill(ForgeDirection arg0, FluidStack arg1, boolean arg2) {
+ return 0;
+ }
+
+ @Override
+ public int fill_default(ForgeDirection aSide, FluidStack aFluid, boolean doFill) {
+ return 0;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mProgresstime", mProgresstime);
+ aNBT.setInteger("mMaxProgresstime", mMaxProgresstime);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mProgresstime = aNBT.getInteger("mProgresstime");
+ mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java
new file mode 100644
index 0000000000..c55ddda47d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java
@@ -0,0 +1,235 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.widget.ElectricSlotWidget;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_InputBattery extends GT_MetaTileEntity_Hatch {
+
+ public final RecipeMap<?> mRecipeMap = null;
+
+ public GT_MetaTileEntity_Hatch_InputBattery(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier), "Chargeable Item Bus for Multiblocks");
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBattery(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 4 : 16, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ int mSlots = 0;
+ if (this.mTier == 2) {
+ mSlots = 4;
+ } else if (this.mTier == 4) {
+ mSlots = 16;
+ } else {
+ mSlots = 16;
+ }
+ return ArrayUtils.addAll(this.mDescriptionArray, "Capacity: " + mSlots + " slots", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 + V[mTier + 1] * 16;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 4;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Charger) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Charger) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputBattery(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (aBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) {
+ if (mMetaTileEntity.rechargerSlotCount() > 0 && aBaseMetaTileEntity.getStoredEU() > 0) {
+ for (int i = mMetaTileEntity.rechargerSlotStartIndex(),
+ k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) {
+ if (aBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) {
+ for (int u = 0; u < 10; u++) {
+ aBaseMetaTileEntity.decreaseStoredEnergyUnits(
+ GT_ModHandler.chargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ (int) Math.min(V[this.mTier] * 15, aBaseMetaTileEntity.getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, GT_Values.V[u]),
+ false,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) {
+ mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ }
+ }
+ } else {}
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return switch (mTier) {
+ case 2 -> 4;
+ case 4 -> 16;
+ default -> 16;
+ };
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mTier == 2) {
+ for (int i = 0; i < 4; i++) {
+ builder
+ .widget(new ElectricSlotWidget(inventoryHandler, i).setPos(70 + (i % 2) * 18, 25 + (i / 2) * 18));
+ }
+ } else {
+ for (int i = 0; i < 16; i++) {
+ builder.widget(new ElectricSlotWidget(inventoryHandler, i).setPos(52 + (i % 4) * 18, 7 + (i / 4) * 18));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java
new file mode 100644
index 0000000000..a3261af6f6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java
@@ -0,0 +1,370 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.common.GT_Pollution;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Muffler_Adv extends GT_MetaTileEntity_Hatch_Muffler implements IAddGregtechLogo {
+
+ protected int SLOT_FILTER = 0;
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ super.onConfigLoad(aConfig);
+ try {
+ int a1 = GT_Mod.gregtechproxy.mPollutionSmogLimit;
+ if (a1 > 0) {
+ mPollutionSmogLimit = a1;
+ }
+ } catch (Throwable t) {
+ mPollutionSmogLimit = 500000;
+ }
+ }
+
+ private int mPollutionSmogLimit = 500000;
+
+ public GT_MetaTileEntity_Hatch_Muffler_Adv(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 1, new String[] { "" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler_Adv(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ final String[] mDescription = new String[] { "Outputs pollution from a multiblock", "DO NOT OBSTRUCT THE OUTPUT!",
+ "Requires 3 Air Blocks in front of the exhaust face",
+ mTier < 5 ? "Requires an Air Filter"
+ : "Requires an Air Filter " + EnumChatFormatting.WHITE + "[Tier 2]" + EnumChatFormatting.GRAY,
+ "Can take Air Filters from an input bus of the multiblock",
+ "Reduces Pollution to " + calculatePollutionReduction(100, true) + "%",
+ "Recovers " + (100 - calculatePollutionReduction(100, true)) + "% of CO2/CO/SO2", CORE.GT_Tooltip.get() };
+
+ @Override
+ public String[] getDescription() {
+ return mDescription;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Muffler_Adv) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Muffler_Adv) };
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex == SLOT_FILTER;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return (aIndex == this.SLOT_FILTER && isAirFilter(aStack));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Muffler_Adv(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean polluteEnvironment(MetaTileEntity parentTileEntity) {
+ if (!airCheck()) return false; // Muffler obstructed.
+
+ int emission = 10000;
+ if (damageAirFilter(parentTileEntity)) {
+ // damageAirFilter already checks that we have a valid filter.
+ emission = calculatePollutionReduction(emission, true);
+ } else {
+ // Revert to reduction of the basic muffler.
+ emission = super.calculatePollutionReduction(emission);
+ }
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), emission);
+ return true;
+ }
+
+ @Override
+ public int calculatePollutionReduction(int aPollution) {
+ // This is called by EBF to calculate exhaust gas amounts, we need to check the filter.
+ return calculatePollutionReduction(aPollution, false);
+ }
+
+ /**
+ * Calculates pollution reduction.
+ *
+ * @param aPollution Amount of pollution to be reduced.
+ * @param ignoreFilter If this is true, assumes that a valid filter is present without checking (for example, to
+ * build tooltips).
+ * @return Amount of pollution after reduction.
+ */
+ protected int calculatePollutionReduction(int aPollution, boolean ignoreFilter) {
+ if (!ignoreFilter && !hasAirFilter()) {
+ // Without a filter, downgrade to basic muffler reduction.
+ return super.calculatePollutionReduction(aPollution);
+ }
+
+ // Special case to be always better than a basic muffler.
+ if (mTier < 2) return (int) (aPollution * 0.95);
+ if (mTier > 8) return 0;
+
+ return (int) (aPollution * Math.pow(0.64D, mTier - 1));
+ }
+
+ /**
+ *
+ * @return True if enough blocks in front of the muffler are air.
+ */
+ private boolean airCheck() {
+ IGregTechTileEntity bmte = getBaseMetaTileEntity();
+ ForgeDirection facing = bmte.getFrontFacing();
+ return bmte.getAirAtSide(facing) && bmte.getAirAtSideAndDistance(facing, 1)
+ && bmte.getAirAtSideAndDistance(facing, 2);
+ }
+
+ /**
+ * Try to damage an air filter. Will first try to find a valid filter in the hatch's own inventory, then in the
+ * input buses of the parent multiblock. If the filter is destroyed, will try to replace it from the parent
+ * multiblock's input buses again.
+ *
+ * @param parentTileEntity Which multiblock this hatch is a part of. If this is null, only checks inventory of the
+ * muffler.
+ * @return True if the filter has been successfully damaged.
+ */
+ private boolean damageAirFilter(MetaTileEntity parentTileEntity) {
+ if (!findAirFilter(parentTileEntity)) return false; // No filter available.
+
+ ItemStack filter = mInventory[SLOT_FILTER];
+ if (filter == null) return false; // This should never happen if findAirFilter() above succeeded.
+
+ long currentDamage = ItemAirFilter.getFilterDamage(filter);
+ if (currentDamage < ItemAirFilter.getFilterMaxDamage(filter) - 1) {
+ // Damage filter by one step.
+ ItemAirFilter.setFilterDamage(filter, currentDamage + 1);
+ return true;
+ } else {
+ // Destroy the filter.
+ mInventory[SLOT_FILTER] = null;
+
+ // Try to find a new one.
+ findAirFilter(parentTileEntity);
+
+ // Regardless of whether we have a new filter or not, *this* operation succeeded.
+ return true;
+ }
+ }
+
+ /**
+ * Try to find a valid air filter in the input buses of the parent multiblock.
+ *
+ * @param parentTileEntity Which multiblock this hatch is a part of. If this is null, only checks inventory of the
+ * muffler.
+ * @return True if the inventory of the muffler already contains an air filter, or if one was retrieved from the
+ * parent multiblock.
+ */
+ private boolean findAirFilter(MetaTileEntity parentTileEntity) {
+ if (hasAirFilter()) return true; // Has a filter in inventory.
+ if (mInventory[SLOT_FILTER] != null) return false; // Has a non-filter item in inventory.
+ if (parentTileEntity == null) return false; // Unknown parent multiblock.
+
+ if (parentTileEntity instanceof GT_MetaTileEntity_MultiBlockBase GTMultiBase) {
+ for (var inputBus : GTMultiBase.mInputBusses) {
+ for (ItemStack stack : inputBus.mInventory) {
+ if (isAirFilter(stack)) {
+ ItemStack stackCopy = stack.copy();
+ if (GTMultiBase.depleteInput(stack)) {
+ mInventory[SLOT_FILTER] = stackCopy;
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ *
+ * @return True if the item currently in the inventory is an air filter valid for this tier of muffler hatch.
+ */
+ private boolean hasAirFilter() {
+ return isAirFilter(mInventory[SLOT_FILTER]);
+ }
+
+ /**
+ *
+ * @param filter
+ * @return True if the argument is an air filter valid for this tier of muffler hatch.
+ */
+ public boolean isAirFilter(ItemStack filter) {
+ if (filter == null) return false;
+ if (filter.getItem() instanceof ItemAirFilter) {
+ if (mTier < 5) {
+ // Accept any filter.
+ return true;
+ } else {
+ // Accept only T2 filter.
+ return filter.getItemDamage() == 1;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isClientSide()) {
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ String aParticleName;
+ if ((aTick % 2) == 0) {
+ aParticleName = "cloud";
+ } else {
+ aParticleName = "smoke";
+ }
+ this.pollutionParticles(
+ this.getBaseMetaTileEntity()
+ .getWorld(),
+ aParticleName);
+ }
+ }
+ }
+
+ @Override
+ public void pollutionParticles(World aWorld, String name) {
+ float ran1 = CORE.RANDOM.nextFloat();
+ float ran2 = 0.0F;
+ float ran3 = 0.0F;
+ boolean chk1 = ran1 * 100.0F < (float) this.calculatePollutionReduction(100);
+ boolean chk2;
+ boolean chk3;
+ int aPollutionAmount = PollutionUtils.getPollution(getBaseMetaTileEntity());
+ if (aPollutionAmount >= mPollutionSmogLimit) {
+ ran2 = CORE.RANDOM.nextFloat();
+ ran3 = CORE.RANDOM.nextFloat();
+ chk2 = ran2 * 100.0F < (float) this.calculatePollutionReduction(100);
+ chk3 = ran3 * 100.0F < (float) this.calculatePollutionReduction(100);
+ if (!chk1 && !chk2 && !chk3) {
+ return;
+ }
+ } else {
+ if (!chk1) {
+ return;
+ }
+
+ chk3 = false;
+ chk2 = false;
+ }
+
+ IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity();
+ ForgeDirection aDir = aMuffler.getFrontFacing();
+ float xPos = (float) aDir.offsetX * 0.76F + (float) aMuffler.getXCoord() + 0.25F;
+ float yPos = (float) aDir.offsetY * 0.76F + (float) aMuffler.getYCoord() + 0.25F;
+ float zPos = (float) aDir.offsetZ * 0.76F + (float) aMuffler.getZCoord() + 0.25F;
+ float ySpd = (float) aDir.offsetY * 0.1F + 0.2F + 0.1F * CORE.RANDOM.nextFloat();
+ float xSpd;
+ float zSpd;
+ if (aDir.offsetY == -1) {
+ float temp = CORE.RANDOM.nextFloat() * 2.0F * CORE.PI;
+ xSpd = (float) Math.sin((double) temp) * 0.1F;
+ zSpd = (float) Math.cos((double) temp) * 0.1F;
+ } else {
+ xSpd = (float) aDir.offsetX * (0.1F + 0.2F * CORE.RANDOM.nextFloat());
+ zSpd = (float) aDir.offsetZ * (0.1F + 0.2F * CORE.RANDOM.nextFloat());
+ }
+
+ if (chk1) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran1 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+
+ if (chk2) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran2 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+
+ if (chk3) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran3 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {}
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setMainBackground(GTPP_UITextures.BACKGROUND_YELLOW)
+ .setItemSlot(GTPP_UITextures.SLOT_ITEM_YELLOW)
+ .setTitleTab(
+ GTPP_UITextures.TAB_TITLE_YELLOW,
+ GTPP_UITextures.TAB_TITLE_DARK_YELLOW,
+ GTPP_UITextures.TAB_TITLE_ANGULAR_YELLOW);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(stack -> stack.getItem() instanceof ItemAirFilter)
+ .setBackground(getGUITextureSet().getItemSlot())
+ .setPos(79, 34));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java
new file mode 100644
index 0000000000..ad94907d4c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java
@@ -0,0 +1,203 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class GT_MetaTileEntity_Hatch_Naquadah extends GT_MetaTileEntity_Hatch_Input {
+
+ public final FluidStack[] mFluidsToUse = new FluidStack[3];
+ public final int mFluidCapacity;
+
+ public GT_MetaTileEntity_Hatch_Naquadah(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional, 6);
+ mFluidCapacity = 32000;
+ initHatch();
+ }
+
+ public GT_MetaTileEntity_Hatch_Naquadah(final String aName, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, 6, aDescription[0], aTextures);
+ mFluidCapacity = 32000;
+ initHatch();
+ }
+
+ private void initHatch() {
+ if (mFluidsToUse[0] == null) {
+ mFluidsToUse[0] = Materials.Naquadah.getMolten(1);
+ }
+ if (mFluidsToUse[1] == null) {
+ mFluidsToUse[1] = Materials.NaquadahEnriched.getMolten(1);
+ }
+ if (mFluidsToUse[2] == null) {
+ mFluidsToUse[2] = Materials.Naquadria.getMolten(1);
+ }
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE) };
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ if (side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0) {
+ for (FluidStack f : mFluidsToUse) {
+ if (f != null) {
+ if (GT_Utility.getFluidForFilledItem(aStack, true)
+ .getFluid() == f.getFluid()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ for (FluidStack f : mFluidsToUse) {
+ if (f != null) {
+ if (aFluid.getFluid() == f.getFluid()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getCapacity() {
+ return this.mFluidCapacity;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Naquadah(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (aDescCache[0] == null || aDescCache[0].contains(".name") || aDescCache[0].contains("fluid.")) {
+ aDescCache[0] = formatFluidString(this.mFluidsToUse[0]);
+ }
+ if (aDescCache[1] == null || aDescCache[1].contains(".name") || aDescCache[1].contains("fluid.")) {
+ aDescCache[1] = formatFluidString(this.mFluidsToUse[1]);
+ }
+ if (aDescCache[2] == null || aDescCache[2].contains(".name") || aDescCache[2].contains("fluid.")) {
+ aDescCache[2] = formatFluidString(this.mFluidsToUse[2]);
+ }
+ String aNaq = aDescCache[0];
+ String aEnrNaq = aDescCache[1];
+ String aNaquad = aDescCache[2];
+ String[] s2 = new String[] { "Fluid Input for Multiblocks", "Capacity: " + getCapacity() + "L",
+ "Accepted Fluid: " + aNaq, "Accepted Fluid: " + aEnrNaq, "Accepted Fluid: " + aNaquad,
+ CORE.GT_Tooltip.get() };
+ return s2;
+ }
+
+ private static String[] aDescCache = new String[3];
+
+ private String formatFluidString(FluidStack f) {
+ FluidStack mLockedStack = f;
+ Integer mLockedTemp = 0;;
+ String mTempMod = "" + EnumChatFormatting.RESET;
+ mLockedTemp = mLockedStack.getFluid()
+ .getTemperature();
+ if (mLockedTemp != null) {
+ if (mLockedTemp <= -3000) {
+ mTempMod = "" + EnumChatFormatting.DARK_PURPLE;
+ } else if (mLockedTemp >= -2999 && mLockedTemp <= -500) {
+ mTempMod = "" + EnumChatFormatting.DARK_BLUE;
+ } else if (mLockedTemp >= -499 && mLockedTemp <= -50) {
+ mTempMod = "" + EnumChatFormatting.BLUE;
+ } else if (mLockedTemp >= 30 && mLockedTemp <= 300) {
+ mTempMod = "" + EnumChatFormatting.AQUA;
+ } else if (mLockedTemp >= 301 && mLockedTemp <= 800) {
+ mTempMod = "" + EnumChatFormatting.YELLOW;
+ } else if (mLockedTemp >= 801 && mLockedTemp <= 1500) {
+ mTempMod = "" + EnumChatFormatting.GOLD;
+ } else if (mLockedTemp >= 1501) {
+ mTempMod = "" + EnumChatFormatting.RED;
+ }
+ }
+ return mTempMod + mLockedStack.getLocalizedName();
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ // TODO Auto-generated method stub
+ return super.getTextureSet(aTextures);
+ }
+
+ private Field F1, F2;
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ byte a1 = 0, a2 = 0;
+ try {
+ if (F1 == null) {
+ F1 = ReflectionUtils.getField(getClass(), "actualTexture");
+ }
+ if (F2 == null) {
+ F2 = ReflectionUtils.getField(getClass(), "mTexturePage");
+ }
+
+ if (F1 != null) {
+ a1 = F1.getByte(this);
+ }
+ if (F2 != null) {
+ a2 = F2.getByte(this);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException n) {}
+
+ int textureIndex = a1 | a2 << 7;
+ byte texturePointer = (byte) (a1 & 127);
+
+ if (side == ForgeDirection.UP || side == ForgeDirection.DOWN) {
+ ITexture g = textureIndex > 0 ? BlockIcons.casingTexturePages[a2][texturePointer]
+ : BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1];
+
+ return new ITexture[] { g,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_TOP_ACTIVE) };
+ }
+
+ return side != facing
+ ? (textureIndex > 0 ? new ITexture[] { BlockIcons.casingTexturePages[a2][texturePointer] }
+ : new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1] })
+ : (textureIndex > 0
+ ? (aActive ? this.getTexturesActive(BlockIcons.casingTexturePages[a2][texturePointer])
+ : this.getTexturesInactive(BlockIcons.casingTexturePages[a2][texturePointer]))
+ : (aActive ? this.getTexturesActive(BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1])
+ : this.getTexturesInactive(BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1])));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java
new file mode 100644
index 0000000000..58dc7ec380
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.widget.ElectricSlotWidget;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_OutputBattery extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_OutputBattery(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier), "Dischargeable Item Bus for Multiblocks");
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBattery(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 9 : 16, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ int mSlots = 0;
+ if (this.mTier == 2) {
+ mSlots = 4;
+ } else if (this.mTier == 4) {
+ mSlots = 16;
+ } else {
+ mSlots = 16;
+ }
+ return ArrayUtils.addAll(this.mDescriptionArray, "Capacity: " + mSlots + " slots", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 + V[mTier + 1] * 8;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Discharger) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Discharger) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputBattery(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return mTier == 2 ? 4 : 16;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (aBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) {
+ if (mMetaTileEntity.dechargerSlotCount() > 0
+ && mMetaTileEntity.getEUVar() < aBaseMetaTileEntity.getEUCapacity()) {
+ for (int i = mMetaTileEntity.dechargerSlotStartIndex(),
+ k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) {
+ if (mMetaTileEntity.mInventory[i] != null
+ && mMetaTileEntity.getEUVar() < aBaseMetaTileEntity.getEUCapacity()) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(
+ GT_ModHandler.dischargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ (int) Math.min(
+ V[mTier] * 15,
+ aBaseMetaTileEntity.getEUCapacity() - aBaseMetaTileEntity.getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()),
+ true,
+ false,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ }
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mTier == 2) {
+ for (int i = 0; i < 4; i++) {
+ builder
+ .widget(new ElectricSlotWidget(inventoryHandler, i).setPos(70 + (i % 2) * 18, 25 + (i / 2) * 18));
+ }
+ } else {
+ for (int i = 0; i < 16; i++) {
+ builder.widget(new ElectricSlotWidget(inventoryHandler, i).setPos(52 + (i % 4) * 18, 7 + (i / 4) * 18));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java
new file mode 100644
index 0000000000..bfe8290240
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java
@@ -0,0 +1,75 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Reservoir extends GT_MetaTileEntity_Hatch_FluidGenerator {
+
+ public GT_MetaTileEntity_Hatch_Reservoir(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_Reservoir(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Reservoir(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getCustomTooltip() {
+ String[] aTooltip = new String[2];
+ aTooltip[0] = "Infinite water supply hatch";
+ aTooltip[1] = "Fills to max capacity every 5 seconds";
+ return aTooltip;
+ }
+
+ @Override
+ public Fluid getFluidToGenerate() {
+ return FluidRegistry.WATER;
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 2_000_000_000;
+ }
+
+ @Override
+ public int getMaxTickTime() {
+ return 100;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 2_000_000_000;
+ }
+
+ @Override
+ public boolean doesHatchMeetConditionsToGenerate() {
+ return true;
+ }
+
+ @Override
+ public void generateParticles(World aWorld, String name) {}
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Water) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Water) };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java
new file mode 100644
index 0000000000..94c28877d8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java
@@ -0,0 +1,72 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Hatch_Solidifier extends GT_MetaTileEntity_Hatch_Input {
+
+ static final int moldSlot = 2;
+
+ public GT_MetaTileEntity_Hatch_Solidifier(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] {
+ "Fluid Input with Mold for " + EnumChatFormatting.YELLOW
+ + "Large Processing Factory"
+ + EnumChatFormatting.RESET,
+ "#22 Circuit is imprinted in Hatch", "Capacity: " + GT_Utility.formatNumbers(getCapacity()) + "L",
+ "Added by: " + EnumChatFormatting.AQUA
+ + "Quetz4l"
+ + " - "
+ + EnumChatFormatting.RED
+ + "[GT++]"
+ + EnumChatFormatting.RESET };
+ }
+
+ public GT_MetaTileEntity_Hatch_Solidifier(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, getSlots(aTier), aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Solidifier(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ public ItemStack getMold() {
+ return this.getStackInSlot(moldSlot);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(
+ new SlotWidget(inventoryHandler, moldSlot).setPos(125, 35)
+ .setSize(18, 18));
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ super.onBlockDestroyed();
+ }
+
+ // for a drop-down form when the hatch is destroyed
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ if (aIndex == moldSlot) return true;
+ else return super.isValidSlot(aIndex);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java
new file mode 100644
index 0000000000..5cc1e64d13
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java
@@ -0,0 +1,279 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_Hatch_Steam_BusInput extends GT_MetaTileEntity_Hatch {
+
+ public RecipeMap<?> mRecipeMap = null;
+ public boolean disableSort;
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ getSlots(aTier),
+ new String[] { "Item Input for Steam Multiblocks",
+ "Shift + right click with screwdriver to toggle automatic item shuffling", "Capacity: 4 stacks",
+ "Does not work with non-steam multiblocks", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Steam_BusInput(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ if (disableSort) {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ } else {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j])))
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("disableSort", disableSort);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ disableSort = aNBT.getBoolean("disableSort");
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ disableSort = !disableSort;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("200.1", "Automatic Item Shuffling: ")
+ + (disableSort ? GT_Utility.trans("087", "Disabled") : GT_Utility.trans("088", "Enabled")));
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[14][17][];
+ for (byte c = -1; c < 16; c++) {
+ if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c);
+ if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c);
+ if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c);
+ if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c);
+ if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c);
+ if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c);
+ if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c);
+ if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c);
+ if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c);
+ if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c);
+ if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c);
+ if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c);
+ if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c);
+ if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c);
+ }
+ return rTextures;
+ }
+
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java
new file mode 100644
index 0000000000..1d4dbc8987
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.render.TextureFactory;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_Hatch_Steam_BusOutput extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 4,
+ new String[] { "Item Output for Steam Multiblocks", "Does not automatically export items",
+ "Capacity: 4 stacks", "Does not work with non-steam multiblocks", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Steam_BusOutput(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[14][17][];
+ for (byte c = -1; c < 16; c++) {
+ if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c);
+ if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c);
+ if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c);
+ if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c);
+ if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c);
+ if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c);
+ if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c);
+ if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c);
+ if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c);
+ if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c);
+ if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c);
+ if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c);
+ if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c);
+ if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c);
+ }
+ return rTextures;
+ }
+
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java
new file mode 100644
index 0000000000..ed3101f309
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java
@@ -0,0 +1,435 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE5;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GregtechMetaTileEntity_LargerTurbineBase;
+
+@SuppressWarnings("deprecation")
+public class GT_MetaTileEntity_Hatch_Turbine extends GT_MetaTileEntity_Hatch {
+
+ public boolean mHasController = false;
+ public boolean mUsingAnimation = true;
+ private String mControllerLocation;
+ public int mEUt = 0;
+
+ public GT_MetaTileEntity_Hatch_Turbine(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 16, "Turbine Rotor holder for XL Turbines");
+ }
+
+ public GT_MetaTileEntity_Hatch_Turbine(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Turbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription[0], aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Right Click with a soldering iron to reset controller link",
+ "Right Click with a wrench to remove turbine",
+ "Right Click with a screwdriver for technical information",
+ "Sneak + Right Click with a wrench to rotate",
+ "Sneak + Right Click with a screwdriver to disable animations",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, getFrontFacingTurbineTexture() };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, getFrontFacingTurbineTexture() };
+ }
+
+ public int getEU() {
+ return this.mEUt;
+ }
+
+ public void setEU(int aEU) {
+ this.mEUt = aEU;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ public boolean hasTurbine() {
+ ItemStack aStack = this.mInventory[0];
+ boolean aIsValid = GregtechMetaTileEntity_LargerTurbineBase.isValidTurbine(aStack);
+ return aIsValid;
+ }
+
+ public ItemStack getTurbine() {
+ if (hasTurbine()) {
+ return this.mInventory[0];
+ }
+ return null;
+ }
+
+ public boolean canWork() {
+ return hasTurbine();
+ }
+
+ public boolean insertTurbine(ItemStack aTurbine) {
+ if (GregtechMetaTileEntity_LargerTurbineBase.isValidTurbine(aTurbine)) {
+ this.mInventory[0] = aTurbine;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Turbine(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ public void damageTurbine(int aEUt, int damageFactorLow, float damageFactorHigh) {
+ damageTurbine((long) aEUt, damageFactorLow, damageFactorHigh);
+ }
+
+ public void damageTurbine(long aEUt, int damageFactorLow, float damageFactorHigh) {
+ if (hasTurbine() && MathUtils.randInt(0, 1) == 0) {
+ ItemStack aTurbine = getTurbine();
+ ((GT_MetaGenerated_Tool) aTurbine.getItem()).doDamage(
+ aTurbine,
+ (long) getDamageToComponent(aTurbine)
+ * (long) Math.min((float) aEUt / (float) damageFactorLow, Math.pow(aEUt, damageFactorHigh)));
+ }
+ }
+
+ private int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mHasController", mHasController);
+ aNBT.setBoolean("mUsingAnimation", mUsingAnimation);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mHasController = aNBT.getBoolean("mHasController");
+ mUsingAnimation = aNBT.getBoolean("mUsingAnimation");
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.mHasController) {
+ if (aTick % 20 == 0) {
+ if (isControllerActive()) {
+ this.getBaseMetaTileEntity()
+ .setActive(true);
+ } else {
+ this.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+ } else if (!this.mHasController && this.mControllerLocation != null) {
+ // Weird Invalid State
+ if (setController(BlockPos.generateBlockPos(mControllerLocation))) {
+ // Valid
+ }
+ } else {
+ // No Controller
+ }
+ if (this.mInventory[0] != null && this.mInventory[0].stackSize <= 0) this.mInventory[0] = null;
+ }
+
+ public boolean isControllerActive() {
+ GregtechMetaTileEntity_LargerTurbineBase x = getController();
+ if (x != null) {
+ // Logger.INFO("Checking Status of Controller. Running? "+(x.mEUt > 0));
+ return x.lEUt > 0;
+ }
+ // Logger.INFO("Status of Controller failed, controller is null.");
+ return false;
+ }
+
+ public GregtechMetaTileEntity_LargerTurbineBase getController() {
+ if (this.mHasController && this.mControllerLocation != null && this.mControllerLocation.length() > 0) {
+ BlockPos p = BlockPos.generateBlockPos(mControllerLocation);
+ if (p != null) {
+ // Logger.INFO(p.getLocationString());
+ IGregTechTileEntity tTileEntity = getBaseMetaTileEntity()
+ .getIGregTechTileEntity(p.xPos, p.yPos, p.zPos);
+ if (tTileEntity != null
+ && tTileEntity.getMetaTileEntity() instanceof GregtechMetaTileEntity_LargerTurbineBase) {
+ return (GregtechMetaTileEntity_LargerTurbineBase) tTileEntity.getMetaTileEntity();
+ } else {
+ if (tTileEntity == null) {
+ Logger.INFO("Controller MTE is null, somehow?");
+ } else {
+ Logger.INFO("Controller is a different MTE to expected");
+ }
+ }
+ }
+ }
+ // Logger.INFO("Failed to Get Controller.");
+ return null;
+ }
+
+ public boolean canSetNewController() {
+ if ((mControllerLocation != null && mControllerLocation.length() > 0) || this.mHasController) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean setController(BlockPos aPos) {
+ clearController();
+ if (canSetNewController()) {
+ mControllerLocation = aPos.getUniqueIdentifier();
+ mHasController = true;
+ Logger.INFO("Successfully injected controller into this Turbine Assembly Hatch.");
+ }
+ return mHasController;
+ }
+
+ public void clearController() {
+ this.mControllerLocation = null;
+ this.mHasController = false;
+ }
+
+ public boolean usingAnimations() {
+ return mUsingAnimation;
+ }
+
+ private ITexture getFrontFacingTurbineTexture() {
+ if (!mHasController) {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? new GT_RenderedTexture(LARGETURBINE_ST_ACTIVE5)
+ : new GT_RenderedTexture(LARGETURBINE_ST5);
+ } else {
+ if (usingAnimations()) {
+ if (isControllerActive()) {
+ return getController().frontFaceActive;
+ }
+ }
+ return getController().frontFace;
+ }
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return false;
+ }
+
+ public void setActive(boolean b) {
+ this.getBaseMetaTileEntity()
+ .setActive(b);
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!aPlayer.isSneaking()) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animations? " + usingAnimations());
+ PlayerUtils.messagePlayer(aPlayer, "Has Controller? " + this.mHasController);
+ if (mHasController) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Controller Location: " + BlockPos.generateBlockPos(mControllerLocation)
+ .getLocationString());
+ PlayerUtils.messagePlayer(aPlayer, "Controller Active? " + this.isControllerActive());
+ }
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Active? " + this.getBaseMetaTileEntity()
+ .isActive());
+ PlayerUtils.messagePlayer(aPlayer, "Has Turbine inserted? " + this.hasTurbine());
+ if (this.hasTurbine()) {
+ Materials aMat = GT_MetaGenerated_Tool.getPrimaryMaterial(getTurbine());
+ String aSize = GregtechMetaTileEntity_LargerTurbineBase
+ .getTurbineSizeString(GregtechMetaTileEntity_LargerTurbineBase.getTurbineSize(getTurbine()));
+ PlayerUtils.messagePlayer(aPlayer, "Using: " + aMat.mLocalizedName + " " + aSize);
+ }
+ } else {
+ this.mUsingAnimation = !mUsingAnimation;
+ if (this.mUsingAnimation) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animated Turbine Texture.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Using Static Turbine Texture.");
+ }
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide() && !aPlayer.isSneaking()) {
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ return onToolClick(tCurrentItem, aPlayer, wrenchingSide);
+ }
+ }
+ }
+ return super.onWrenchRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ return onToolClick(tCurrentItem, aPlayer, wrenchingSide);
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean onToolClick(ItemStack tCurrentItem, EntityPlayer aPlayer, ForgeDirection side) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) {
+ boolean aHasTurbine = this.hasTurbine();
+ if (aPlayer.inventory.getFirstEmptyStack() >= 0 && aHasTurbine) {
+ if (PlayerUtils.isCreative(aPlayer)
+ || GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ aPlayer.inventory.addItemStackToInventory((this.getTurbine()));
+ this.mInventory[0] = null;
+ GT_Utility.sendChatToPlayer(aPlayer, "Removed turbine with wrench.");
+ return true;
+ }
+ } else {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ aHasTurbine ? "Cannot remove turbine, no free inventory space." : "No turbine to remove.");
+ }
+ } else if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) {
+ if (mControllerLocation != null && mControllerLocation.length() > 0) {
+ if (setController(BlockPos.generateBlockPos(mControllerLocation))) {
+ if (PlayerUtils.isCreative(aPlayer)
+ || GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ String tChat = "Trying to Reset linked Controller";
+ IGregTechTileEntity g = this.getBaseMetaTileEntity();
+ GT_Utility.sendChatToPlayer(aPlayer, tChat);
+ GT_Utility.sendSoundToPlayers(
+ g.getWorld(),
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1,
+ g.getXCoord(),
+ g.getYCoord(),
+ g.getZCoord());
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(GregtechMetaTileEntity_LargerTurbineBase::isValidTurbine)
+ .setAccess(false, true)
+ .setPos(79, 34));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java
new file mode 100644
index 0000000000..e9626a310c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java
@@ -0,0 +1,221 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GregtechMetaTileEntity_LargerTurbineBase;
+
+public class GT_MetaTileEntity_Hatch_TurbineProvider extends GT_MetaTileEntity_Hatch_InputBus {
+
+ public GT_MetaTileEntity_Hatch_TurbineProvider(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_TurbineProvider(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_TurbineProvider(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "An automation port for Large Turbines",
+ "Will attempt once per 1200 ticks to fill the turbine slot of it's parent turbine",
+ "You may adjust this with a screwdriver", "Hold shift to adjust in finer amounts",
+ "Hold control to adjust direction", "Left Click with Screwdriver to reset",
+ "This module assumes the entire turbine is in the same Chunk", CORE.GT_Tooltip.get() };
+ }
+
+ private GT_MetaTileEntity_LargeTurbine mParent = null;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ if (aTimer % mRefreshTime == 0 && this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ tryRefillTurbine();
+ }
+ }
+
+ private void tryFindParentTurbine() {
+ Logger.INFO("This turbine housing has no parent, searching world.");
+ IGregTechTileEntity T = this.getBaseMetaTileEntity();
+ World W = T.getWorld();
+ Chunk C = W.getChunkFromBlockCoords(T.getXCoord(), T.getZCoord());
+ for (Object o : C.chunkTileEntityMap.values()) {
+ if (o instanceof IGregTechTileEntity G) {
+ final IMetaTileEntity aMetaTileEntity = G.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ continue;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_LargeTurbine aTurb) {
+ for (GT_MetaTileEntity_Hatch_InputBus ee : aTurb.mInputBusses) {
+ if (ee.equals(this)) {
+ mParent = aTurb;
+ Logger.INFO("Found a Parent to attach to this housing.");
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void tryRefillTurbine() {
+ if (mParent == null) {
+ tryFindParentTurbine();
+ }
+ if (mParent != null && mParent.mInventory[1] == null) {
+ for (ItemStack aStack : this.mInventory) {
+ if (isItemStackTurbine(aStack)) {
+ setGUIItemStack(aStack);
+ }
+ }
+ }
+ }
+
+ protected boolean setGUIItemStack(ItemStack aNewGuiSlotContents) {
+ boolean result = false;
+ if (mParent.mInventory[1] == null) {
+ mParent.mInventory[1] = aNewGuiSlotContents != null ? aNewGuiSlotContents.copy() : null;
+ mParent.depleteInput(aNewGuiSlotContents);
+ mParent.updateSlots();
+ this.updateSlots();
+ result = true;
+ }
+ return result;
+ }
+
+ public boolean isItemStackTurbine(ItemStack aStack) {
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool) {
+ if (aStack.getItemDamage() >= 170 && aStack.getItemDamage() <= 176) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isItemStackScrewdriver(ItemStack aStack) {
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool) {
+ if (aStack.getItemDamage() == 22 || aStack.getItemDamage() == 150) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return isItemStackTurbine(aStack);
+ }
+
+ private int mRefreshTime = 1200;
+ private boolean mDescending = true;
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mRefreshTime", mRefreshTime);
+ aNBT.setBoolean("mDescending", mDescending);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mRefreshTime = aNBT.getInteger("mRefreshTime");
+ mDescending = aNBT.getBoolean("mDescending");
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer != null) {
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ mDescending = !mDescending;
+ PlayerUtils.messagePlayer(aPlayer, "Direction: " + (mDescending ? "DOWN" : "UP"));
+ } else {
+ int aAmount = 0;
+ if (KeyboardUtils.isShiftKeyDown()) {
+ aAmount = 10;
+ } else {
+ aAmount = 100;
+ }
+ if (mDescending) {
+ mRefreshTime -= aAmount;
+ if (mRefreshTime < 0) {
+ mRefreshTime = 1200;
+ }
+ } else {
+ mRefreshTime += aAmount;
+ if (mRefreshTime > 1200) {
+ mRefreshTime = 0;
+ }
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Set check time to be every " + mRefreshTime + " ticks.");
+ }
+ }
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ boolean aDidScrewdriver = false;
+ if (aPlayer != null) {
+ if (aPlayer.getHeldItem() != null) {
+ if (isItemStackScrewdriver(aPlayer.getHeldItem())) {
+ aDidScrewdriver = true;
+ mRefreshTime = 1200;
+ PlayerUtils.messagePlayer(aPlayer, "Reset check time to " + mRefreshTime + " ticks.");
+ }
+ }
+ }
+ if (!aDidScrewdriver) {
+ super.onLeftclick(aBaseMetaTileEntity, aPlayer);
+ }
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return false;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(GregtechMetaTileEntity_LargerTurbineBase::isValidTurbine)
+ .setAccess(false, true)
+ .setPos(79, 34));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java
new file mode 100644
index 0000000000..5794e6adf8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SuperBus_Input extends GT_MetaTileEntity_Hatch_InputBus {
+
+ public GT_MetaTileEntity_SuperBus_Input(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier) + 1);
+ }
+
+ public GT_MetaTileEntity_SuperBus_Input(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, getSlots(aTier) + 1, aDescription, aTextures);
+ }
+
+ /**
+ * Returns a factor of 16 based on tier.
+ *
+ * @param aTier The tier of this bus.
+ * @return (1 + aTier) * 16
+ */
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperBus_Input(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Item Input for Multiblocks", "" + getSlots(this.mTier) + " Slots",
+ CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return getSlots(mTier);
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, row * 4 + column).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+ }
+ }
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java
new file mode 100644
index 0000000000..aee6235ab9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.inventory.IInventory;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SuperBus_Output extends GT_MetaTileEntity_Hatch_OutputBus {
+
+ public GT_MetaTileEntity_SuperBus_Output(int id, String name, String nameRegional, int tier) {
+ super(id, name, nameRegional, tier, getSlots(tier));
+ }
+
+ public GT_MetaTileEntity_SuperBus_Output(String name, int tier, String[] description, ITexture[][][] textures) {
+ super(name, tier, getSlots(tier), description, textures);
+ }
+
+ /**
+ * Returns a factor of 16 based on tier.
+ *
+ * @param aTier The tier of this bus.
+ * @return (1 + aTier) * 16
+ */
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperBus_Output(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ this.fillStacksIntoFirstSlots();
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < this.mInventory.length; ++i) {
+ if (this.mInventory[i] != null && this.mInventory[i].stackSize <= 0) {
+ this.mInventory[i] = null;
+ }
+ }
+ this.fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < this.mInventory.length; ++i) {
+ for (int j = i + 1; j < this.mInventory.length; ++j) {
+ if (this.mInventory[j] != null && (this.mInventory[i] == null
+ || GT_Utility.areStacksEqual(this.mInventory[i], this.mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ (IInventory) this.getBaseMetaTileEntity(),
+ (IInventory) this.getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] aDesc = new String[] { "Item Output for Multiblocks", "" + getSlots(this.mTier) + " Slots",
+ CORE.GT_Tooltip.get() };
+ return aDesc;
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, row * 4 + column).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+ }
+ }
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java
new file mode 100644
index 0000000000..e9f9a2dda4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.render.TextureFactory;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechMetaPipeEntityFluid extends GT_MetaPipeEntity_Fluid {
+
+ public final GT_Materials mMaterial;
+
+ public GregtechMetaPipeEntityFluid(int aID, String aName, String aNameRegional, float aThickNess,
+ GT_Materials aMaterial, int aCapacity, int aHeatResistance, boolean aGasProof) {
+ this(aID, aName, aNameRegional, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GregtechMetaPipeEntityFluid(final String aName, final float aThickNess, final GT_Materials aMaterial,
+ final int aCapacity, final int aHeatResistance, final boolean aGasProof) {
+ this(aName, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GregtechMetaPipeEntityFluid(int aID, String aName, String aNameRegional, float aThickNess,
+ GT_Materials aMaterial, int aCapacity, int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aID, aName, aNameRegional, aThickNess, null, aCapacity, aHeatResistance, aGasProof, aFluidTypes);
+ this.mLastReceivedFrom = 0;
+ this.oLastReceivedFrom = 0;
+ this.mMaterial = aMaterial;
+ }
+
+ public GregtechMetaPipeEntityFluid(String aName, float aThickNess, GT_Materials aMaterial, int aCapacity,
+ int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aName, aThickNess, null, aCapacity, aHeatResistance, aGasProof, aFluidTypes);
+ this.mLastReceivedFrom = 0;
+ this.oLastReceivedFrom = 0;
+ this.mMaterial = aMaterial;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return this.mMaterial == null ? 4
+ : (byte) ((this.mMaterial.contains(SubTag.WOOD) ? 12 : 4)
+ + Math.max(0, Math.min(3, this.mMaterial.mToolQuality)));
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPipeEntityFluid(
+ this.mName,
+ this.mThickNess,
+ this.mMaterial,
+ this.mCapacity,
+ this.mHeatResistance,
+ this.mGasProof);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+ float tThickNess = getThickNess();
+ if (mDisableInput == 0)
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, aColorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ int tMask = 0;
+ int[][] sRestrictionArray = { { 2, 3, 5, 4 }, { 2, 3, 5, 4 }, { 1, 0, 5, 4 }, { 1, 0, 4, 5 }, { 1, 0, 2, 3 },
+ { 1, 0, 2, 3 } };
+ if (side != ForgeDirection.UNKNOWN) {
+ for (int i = 0; i < 4; i++)
+ if (isInputDisabledAtSide(ForgeDirection.getOrientation(sRestrictionArray[side.ordinal()][i])))
+ tMask |= 1 << i;
+ // Full block size renderer flips side 5 and 2 textures, flip restrictor textures to compensate
+ if (side == ForgeDirection.EAST || side == ForgeDirection.UP)
+ if (tMask > 3 && tMask < 12) tMask = (tMask ^ 12);
+ }
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, aColorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)),
+ getRestrictorTexture(tMask) };
+ }
+
+ protected static ITexture getBaseTexture(float aThickNess, int aPipeAmount, GT_Materials aMaterial,
+ int aColorIndex) {
+ if (aPipeAmount >= 9) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeNonuple.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aPipeAmount >= 4) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeQuadruple.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.124F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.374F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.499F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.749F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.874F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java
new file mode 100644
index 0000000000..9b1408ba51
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+
+public class GregtechMetaPipeEntity_Cable extends GT_MetaPipeEntity_Cable implements IMetaTileEntityCable {
+
+ private static Textures.BlockIcons INSULATION_MEDIUM_PLUS;
+
+ static {
+ try {
+ INSULATION_MEDIUM_PLUS = (Textures.BlockIcons) GT_Utility
+ .getField(Textures.BlockIcons.class, "INSULATION_MEDIUM_PLUS")
+ .get(null);
+ } catch (IllegalAccessException | NullPointerException e) {
+ throw new Error(e);
+ }
+ }
+
+ private short[] vRGB = null;
+
+ public GregtechMetaPipeEntity_Cable(final int aID, final String aName, final String aNameRegional,
+ final float aThickNess, final Materials aMaterial, final long aCableLossPerMeter, final long aAmperage,
+ final long aVoltage, final boolean aInsulated, final boolean aCanShock, final short[] aRGB) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aThickNess,
+ aMaterial,
+ aCableLossPerMeter,
+ aAmperage,
+ aVoltage,
+ aInsulated,
+ aCanShock);
+ this.vRGB = aRGB == null || aRGB.length != 4 ? Materials.Iron.mRGBa : aRGB;
+ }
+
+ public GregtechMetaPipeEntity_Cable(final String aName, final float aThickNess, final Materials aMaterial,
+ final long aCableLossPerMeter, final long aAmperage, final long aVoltage, final boolean aInsulated,
+ final boolean aCanShock, final short[] aRGB) {
+ super(aName, aThickNess, aMaterial, aCableLossPerMeter, aAmperage, aVoltage, aInsulated, aCanShock);
+ this.vRGB = aRGB == null || aRGB.length != 4 ? Materials.Iron.mRGBa : aRGB;
+ }
+
+ public GregtechMetaPipeEntity_Cable(final int aID, final String aName, final String aNameRegional,
+ final float aThickNess, final long aCableLossPerMeter, final long aAmperage, final long aVoltage,
+ final boolean aInsulated, final boolean aCanShock, final short[] aRGB) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aThickNess,
+ null,
+ aCableLossPerMeter,
+ aAmperage,
+ aVoltage,
+ aInsulated,
+ aCanShock,
+ aRGB);
+ }
+
+ public GregtechMetaPipeEntity_Cable(final String aName, final float aThickNess, final long aCableLossPerMeter,
+ final long aAmperage, final long aVoltage, final boolean aInsulated, final boolean aCanShock,
+ final short[] aRGB) {
+ this(aName, aThickNess, null, aCableLossPerMeter, aAmperage, aVoltage, aInsulated, aCanShock, aRGB);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPipeEntity_Cable(
+ this.mName,
+ this.mThickNess,
+ this.mMaterial,
+ this.mCableLossPerMeter,
+ this.mAmperage,
+ this.mVoltage,
+ this.mInsulated,
+ this.mCanShock,
+ this.vRGB);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+ return getTextureGTNH(aBaseMetaTileEntity, side, aConnections, aColorIndex, aConnected, aRedstone);
+ }
+
+ private ITexture[] getTextureGTNH(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection aSide, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+
+ Materials wireMaterial = mMaterial;
+ if (wireMaterial == null) {
+ wireMaterial = Materials.Iron;
+ }
+
+ if (!mInsulated) return new ITexture[] { new GT_RenderedTexture(
+ wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire],
+ Dyes.getModulation(aColorIndex, vRGB)) };
+ if (aConnected) {
+ float tThickNess = getThickNess();
+ if (tThickNess < 0.124F) return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_FULL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.374F) // 0.375 x1
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_TINY,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.499F) // 0.500 x2
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_SMALL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.624F) // 0.625 x4
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_MEDIUM,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.749F) // 0.750 x8
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ INSULATION_MEDIUM_PLUS,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.874F) // 0.825 x12
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_LARGE,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_HUGE,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_FULL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java
new file mode 100644
index 0000000000..0aaaa75584
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.machines.GregtechMetaTreeFarmerBase;
+
+public class GregtechMetaTreeFarmerStructural extends GregtechMetaTreeFarmerBase {
+
+ public GregtechMetaTreeFarmerStructural(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "Structural Blocks for the Tree Farmer.");
+ }
+
+ public GregtechMetaTreeFarmerStructural(final String aName, final int aTier, final int aInvSlotCount,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTreeFarmerStructural(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return new GT_RenderedTexture(Textures.BlockIcons.VOID);
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound paramNBTTagCompound) {}
+
+ @Override
+ public void loadNBTData(final NBTTagCompound paramNBTTagCompound) {}
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java
new file mode 100644
index 0000000000..6a85c06c1b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java
@@ -0,0 +1,214 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class GT_MetaTileEntity_Hatch_CustomFluidBase extends GT_MetaTileEntity_Hatch {
+
+ public final Fluid mLockedFluid;
+ public final int mFluidCapacity;
+ protected FluidStack mLockedStack = null;
+ protected String mTempMod = null;
+
+ public GT_MetaTileEntity_Hatch_CustomFluidBase(Fluid aFluid, int aAmount, final int aID, final String aName,
+ final String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ 6,
+ 3,
+ new String[] { "Fluid Input for Multiblocks", "Capacity: " + GT_Utility.formatNumbers(aAmount) + "L" });
+ this.mLockedFluid = aFluid;
+ this.mFluidCapacity = aAmount;
+ }
+
+ public GT_MetaTileEntity_Hatch_CustomFluidBase(Fluid aFluid, int aAmount, final String aName,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, 6, 3, aDescription[0], aTextures);
+ this.mLockedFluid = aFluid;
+ this.mFluidCapacity = aAmount;
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ if (side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0) {
+ FluidStack fs = GT_Utility.getFluidForFilledItem(aStack, true);
+ return fs != null && fs.getFluid() == this.mLockedFluid;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ // return true;
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ public void updateSlots() {
+ if (mInventory[getInputSlot()] != null && mInventory[getInputSlot()].stackSize <= 0)
+ mInventory[getInputSlot()] = null;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public int getCapacity() {
+ return this.mFluidCapacity;
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (mLockedStack == null) {
+ mLockedStack = FluidUtils.getFluidStack(mLockedFluid, 1);
+ }
+ int aFluidTemp = 0;
+ boolean isSteam = false;
+ if (mLockedFluid != null) {
+ aFluidTemp = mLockedFluid.getTemperature();
+ mTempMod = mLockedFluid.getName();
+ }
+ if (mTempMod.equalsIgnoreCase("steam")) {
+ isSteam = true;
+ }
+
+ EnumChatFormatting aColour = EnumChatFormatting.BLUE;
+ if (aFluidTemp <= -3000) {
+ aColour = EnumChatFormatting.DARK_PURPLE;
+ } else if (aFluidTemp >= -2999 && aFluidTemp <= -500) {
+ aColour = EnumChatFormatting.DARK_BLUE;
+ } else if (aFluidTemp >= -499 && aFluidTemp <= -50) {
+ aColour = EnumChatFormatting.BLUE;
+ } else if (aFluidTemp >= 30 && aFluidTemp <= 300) {
+ aColour = EnumChatFormatting.AQUA;
+ } else if (aFluidTemp >= 301 && aFluidTemp <= 800) {
+ aColour = EnumChatFormatting.YELLOW;
+ } else if (aFluidTemp >= 801 && aFluidTemp <= 1500) {
+ aColour = EnumChatFormatting.GOLD;
+ } else if (aFluidTemp >= 1501) {
+ aColour = EnumChatFormatting.RED;
+ }
+ String aFluidName = "Accepted Fluid: " + aColour
+ + (mLockedStack != null ? mLockedStack.getLocalizedName() : "Empty")
+ + EnumChatFormatting.RESET;
+ return new String[] { "Fluid Input for " + (isSteam ? "Steam " : "") + "Multiblocks",
+ "Capacity: " + getCapacity() + "L", aFluidName, CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return this.mLockedFluid.getName()
+ .equals(
+ aFluid.getFluid()
+ .getName());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ this.mLockedFluid,
+ this.mFluidCapacity,
+ this.mName,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ protected FluidSlotWidget createFluidSlot() {
+ return super.createFluidSlot().setFilter(f -> f == mLockedFluid);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java
new file mode 100644
index 0000000000..e260347ca5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java
@@ -0,0 +1,74 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.GT_Values.GT;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public abstract class GregtechMetaTileEntity extends MetaTileEntity {
+
+ /**
+ * Value between [0 - 9] to describe the Tier of this Machine.
+ */
+ protected byte mTier;
+
+ /**
+ * A simple Description.
+ */
+ protected final String mDescription;
+
+ /**
+ * Contains all Textures used by this Block.
+ */
+ public final ITexture[][][] mTextures;
+
+ public GregtechMetaTileEntity(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final int aInvSlotCount, final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aInvSlotCount);
+ this.mTier = (byte) Math.max(0, Math.min(aTier, 9));
+ this.mDescription = aDescription;
+
+ // must always be the last call!
+ if (GT.isClientSide()) {
+ this.mTextures = this.getTextureSet(aTextures);
+ } else {
+ this.mTextures = null;
+ }
+ }
+
+ public GregtechMetaTileEntity(final String aName, final int aTier, final int aInvSlotCount,
+ final String aDescription, final ITexture[][][] aTextures) {
+ super(aName, aInvSlotCount);
+ this.mTier = (byte) aTier;
+ this.mDescription = aDescription;
+ this.mTextures = aTextures;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (Math.min(3, this.mTier <= 0 ? 0 : 1 + ((this.mTier - 1) / 4)));
+ }
+
+ @Override
+ public long getInputTier() {
+ return this.mTier;
+ }
+
+ @Override
+ public long getOutputTier() {
+ return this.mTier;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription };
+ }
+
+ /**
+ * Used Client Side to get a Texture Set for this Block. Called after setting the Tier and the Description so that
+ * those two are accessible.
+ *
+ * @param aTextures is the optional Array you can give to the Constructor.
+ */
+ public abstract ITexture[][][] getTextureSet(ITexture[] aTextures);
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java
new file mode 100644
index 0000000000..c6a088fb1c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class GregtechMetaTransformerHiAmp extends GT_MetaTileEntity_Transformer {
+
+ private boolean mHalfMode = false;
+
+ public GregtechMetaTransformerHiAmp(int aID, String aName, String aNameRegional, int aTier, String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GregtechMetaTransformerHiAmp(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return ((512L + gregtech.api.enums.GT_Values.V[(this.mTier + 1)] * 2L) * 8);
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ if (this.mHalfMode) {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 8L : 2L);
+ }
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 16L : 4L);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ if (this.mHalfMode) {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 2L : 8L);
+ }
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 4L : 16L);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[12][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTransformerHiAmp(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Accepts 4A and outputs 16A",
+ "Toggle 2A/8A half-mode with Screwdriver",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mHalfMode", this.mHalfMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mHalfMode = aNBT.getBoolean("mHalfMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ this.mHalfMode = !mHalfMode;
+ if (this.mHalfMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Transformer is now running at 2A:8A in/out Ratio.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Transformer is now running at 4A:16A in/out Ratio.");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java
new file mode 100644
index 0000000000..e756a92343
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java
@@ -0,0 +1,1799 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiConsumer;
+import java.util.function.BiPredicate;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.GTplusplus.INIT_PHASE;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+
+// Glee8e - 11/12/21 - 2:15pm
+// Yeah, now I see what's wrong. Someone inherited from GregtechMeta_MultiBlockBase instead of
+// GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialDehydrator> as it should have been
+// so any method in GregtechMetaTileEntity_IndustrialDehydrator would see generic field declared in
+// GregtechMeta_MultiBlockBase without generic parameter
+
+public abstract class GregtechMeta_MultiBlockBase<T extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T>>
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T> {
+
+ public static final boolean DEBUG_DISABLE_CORES_TEMPORARILY = true;
+
+ public GT_Recipe mLastRecipe;
+ protected long mTotalRunTime = 0;
+
+ /**
+ * Don't use this for recipe input check, otherwise you'll get duplicated fluids
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch_AirIntake> mAirIntakes = new ArrayList<>();
+
+ public ArrayList<GT_MetaTileEntity_Hatch_InputBattery> mChargeHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_OutputBattery> mDischargeHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch> mAllEnergyHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch> mAllDynamoHatches = new ArrayList<>();
+
+ public GregtechMeta_MultiBlockBase(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMeta_MultiBlockBase(final String aName) {
+ super(aName);
+ }
+
+ private static int toStackCount(Entry<ItemStack, Integer> e) {
+ int tMaxStackSize = e.getKey()
+ .getMaxStackSize();
+ int tStackSize = e.getValue();
+ return (tStackSize + tMaxStackSize - 1) / tMaxStackSize;
+ }
+
+ public long getTotalRuntimeInTicks() {
+ return this.mTotalRunTime;
+ }
+
+ public abstract String getMachineType();
+
+ public String getMachineTooltip() {
+ return "Machine Type: " + EnumChatFormatting.YELLOW + getMachineType() + EnumChatFormatting.RESET;
+ }
+
+ public String[] getExtraInfoData() {
+ return new String[0];
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> mInfo = new ArrayList<>();
+ if (!this.getMetaName()
+ .equals("")) {
+ mInfo.add(this.getMetaName());
+ }
+
+ String[] extra = getExtraInfoData();
+
+ if (extra == null) {
+ extra = new String[0];
+ }
+ if (extra.length > 0) {
+ for (String s : extra) {
+ mInfo.add(s);
+ }
+ }
+
+ long seconds = (this.mTotalRunTime / 20);
+ int weeks = (int) (TimeUnit.SECONDS.toDays(seconds) / 7);
+ int days = (int) (TimeUnit.SECONDS.toDays(seconds) - 7 * weeks);
+ long hours = TimeUnit.SECONDS.toHours(seconds) - TimeUnit.DAYS.toHours(days)
+ - TimeUnit.DAYS.toHours(7L * weeks);
+ long minutes = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds) * 60);
+ long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) * 60);
+
+ mInfo.add(getMachineTooltip());
+
+ // Lets borrow the GTNH handling
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.progress") + ": "
+ + EnumChatFormatting.GREEN
+ + mProgresstime / 20
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + mMaxProgresstime / 20
+ + EnumChatFormatting.RESET
+ + " s");
+
+ if (!this.mAllEnergyHatches.isEmpty()) {
+ long storedEnergy = getStoredEnergyInAllEnergyHatches();
+ long maxEnergy = getMaxEnergyStorageOfAllEnergyHatches();
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.energy") + ":");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + Long.toString(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + Long.toString(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU"));
+
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.mei") + ":");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.YELLOW
+ + Long.toString(getMaxInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET));;
+ }
+ if (!this.mAllDynamoHatches.isEmpty()) {
+ long storedEnergy = getStoredEnergyInAllDynamoHatches();
+ long maxEnergy = getMaxEnergyStorageOfAllDynamoHatches();
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.energy") + " In Dynamos:");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + Long.toString(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + Long.toString(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU"));
+ }
+
+ if (-lEUt > 0) {
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.usage") + ":");
+ mInfo.add(
+ StatCollector
+ .translateToLocal("" + EnumChatFormatting.RED + (-lEUt) + EnumChatFormatting.RESET + " EU/t"));
+ } else {
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.generation") + ":");
+ mInfo.add(
+ StatCollector
+ .translateToLocal("" + EnumChatFormatting.GREEN + lEUt + EnumChatFormatting.RESET + " EU/t"));
+ }
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GTPP.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + Float.toString(mEfficiency / 100.0F)
+ + EnumChatFormatting.RESET
+ + " %");
+
+ if (this.getPollutionPerSecond(null) > 0) {
+ int mPollutionReduction = getPollutionReductionForAllMufflers();
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.pollution") + ": "
+ + EnumChatFormatting.RED
+ + this.getPollutionPerSecond(null)
+ + EnumChatFormatting.RESET
+ + "/sec");
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.pollutionreduced") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %");
+ }
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.CC.parallel") + ": "
+ + EnumChatFormatting.GREEN
+ + (getMaxParallelRecipes())
+ + EnumChatFormatting.RESET);
+
+ mInfo.add(
+ "Total Time Since Built: " + EnumChatFormatting.DARK_GREEN
+ + Integer.toString(weeks)
+ + EnumChatFormatting.RESET
+ + " Weeks, "
+ + EnumChatFormatting.DARK_GREEN
+ + Integer.toString(days)
+ + EnumChatFormatting.RESET
+ + " Days, ");
+ mInfo.add(
+ EnumChatFormatting.DARK_GREEN + Long.toString(hours)
+ + EnumChatFormatting.RESET
+ + " Hours, "
+ + EnumChatFormatting.DARK_GREEN
+ + Long.toString(minutes)
+ + EnumChatFormatting.RESET
+ + " Minutes, "
+ + EnumChatFormatting.DARK_GREEN
+ + Long.toString(second)
+ + EnumChatFormatting.RESET
+ + " Seconds.");
+ mInfo.add("Total Time in ticks: " + EnumChatFormatting.DARK_GREEN + Long.toString(this.mTotalRunTime));
+
+ String[] mInfo2 = mInfo.toArray(new String[mInfo.size()]);
+ return mInfo2;
+ }
+
+ public int getPollutionReductionForAllMufflers() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(calculatePollutionReductionForHatch(tHatch, 100), mPollutionReduction);
+ }
+ return mPollutionReduction;
+ }
+
+ public long getStoredEnergyInAllEnergyHatches() {
+ long storedEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ }
+ return storedEnergy;
+ }
+
+ public long getMaxEnergyStorageOfAllEnergyHatches() {
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllEnergyHatches)) {
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ return maxEnergy;
+ }
+
+ public long getStoredEnergyInAllDynamoHatches() {
+ long storedEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ }
+ return storedEnergy;
+ }
+
+ public long getMaxEnergyStorageOfAllDynamoHatches() {
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllDynamoHatches)) {
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ return maxEnergy;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ private String[] aCachedToolTip;
+
+ /*
+ * private final String aRequiresMuffler = "1x Muffler Hatch"; private final String aRequiresCoreModule =
+ * "1x Core Module"; private final String aRequiresMaint = "1x Maintanence Hatch";
+ */
+
+ public static final String TAG_HIDE_HATCHES = "TAG_HIDE_HATCHES";
+ public static final String TAG_HIDE_MAINT = "TAG_HIDE_MAINT";
+ public static final String TAG_HIDE_POLLUTION = "TAG_HIDE_POLLUTION";
+ public static final String TAG_HIDE_MACHINE_TYPE = "TAG_HIDE_MACHINE_TYPE";
+
+ public abstract int getMaxParallelRecipes();
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack paramItemStack) {
+ return true;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack paramItemStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack p0) {
+ return false;
+ }
+
+ /**
+ * A Static {@link Method} object which holds the current status of logging.
+ */
+ public static Method aLogger = null;
+
+ public void log(String s) {
+ if (!AsmConfig.disableAllLogging) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ Logger.INFO(s);
+ } else {
+ Logger.MACHINE_INFO(s);
+ }
+ }
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage()));
+ logic.setAvailableAmperage(1L);
+ }
+
+ public long getMaxInputEnergy() {
+ long rEnergy = 0;
+ if (mEnergyHatches.size() == 1) // so it only takes 1 amp is only 1 hatch is present so it works like most gt
+ // multies
+ return mEnergyHatches.get(0)
+ .getBaseMetaTileEntity()
+ .getInputVoltage();
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches))
+ rEnergy += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage()
+ * tHatch.getBaseMetaTileEntity()
+ .getInputAmperage();
+ return rEnergy;
+ }
+
+ public boolean isMachineRunning() {
+ boolean aRunning = this.getBaseMetaTileEntity()
+ .isActive();
+ // log("Queried Multiblock is currently running: "+aRunning);
+ return aRunning;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+
+ // Time Counter
+ if (aBaseMetaTileEntity.isServerSide()) {
+ this.mTotalRunTime++;
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mChargeHatches.clear();
+ this.mDischargeHatches.clear();
+ this.mAirIntakes.clear();
+ this.mTecTechEnergyHatches.clear();
+ this.mTecTechDynamoHatches.clear();
+ this.mAllEnergyHatches.clear();
+ this.mAllDynamoHatches.clear();
+ }
+ }
+
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ MetaTileEntity tTileEntity;
+ for (final Iterator<GT_MetaTileEntity_Hatch_InputBattery> localIterator = this.mChargeHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch_OutputBattery> localIterator = this.mDischargeHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch> localIterator = this.mTecTechDynamoHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch> localIterator = this.mTecTechEnergyHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+
+ super.explodeMultiblock();
+ }
+
+ protected boolean setGUIItemStack(ItemStack aNewGuiSlotContents) {
+ boolean result = false;
+ if (this.mInventory[1] == null) {
+ this.mInventory[1] = aNewGuiSlotContents != null ? aNewGuiSlotContents.copy() : null;
+ this.depleteInput(aNewGuiSlotContents);
+ this.updateSlots();
+ result = true;
+ }
+ return result;
+ }
+
+ public ItemStack findItemInInventory(Item aSearchStack) {
+ return findItemInInventory(aSearchStack, 0);
+ }
+
+ public ItemStack findItemInInventory(Item aSearchStack, int aMeta) {
+ return findItemInInventory(ItemUtils.simpleMetaStack(aSearchStack, aMeta, 1));
+ }
+
+ public ItemStack findItemInInventory(ItemStack aSearchStack) {
+ if (aSearchStack != null && this.mInputBusses.size() > 0) {
+ for (GT_MetaTileEntity_Hatch_InputBus bus : this.mInputBusses) {
+ if (bus != null) {
+ for (ItemStack uStack : bus.mInventory) {
+ if (uStack != null) {
+ if (aSearchStack.getClass()
+ .isInstance(uStack.getItem())) {
+ return uStack;
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Deplete fluid input from a set of restricted hatches. This assumes these hatches can store nothing else but your
+ * expected fluid
+ */
+ protected boolean depleteInputFromRestrictedHatches(Collection<GT_MetaTileEntity_Hatch_CustomFluidBase> aHatches,
+ int aAmount) {
+ for (final GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(aHatches)) {
+ FluidStack tLiquid = tHatch.getFluid();
+ if (tLiquid == null || tLiquid.amount < aAmount) {
+ continue;
+ }
+ tLiquid = tHatch.drain(aAmount, false);
+ if (tLiquid != null && tLiquid.amount >= aAmount) {
+ tLiquid = tHatch.drain(aAmount, true);
+ return tLiquid != null && tLiquid.amount >= aAmount;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (final GT_MetaTileEntity_Hatch_InputBattery tHatch : filterValidMTEs(this.mChargeHatches)) {
+ tHatch.updateSlots();
+ }
+ for (final GT_MetaTileEntity_Hatch_OutputBattery tHatch : filterValidMTEs(this.mDischargeHatches)) {
+ tHatch.updateSlots();
+ }
+ super.updateSlots();
+ }
+
+ /**
+ * Causes a Random Maint. Issue.
+ *
+ * @return {@link boolean} - Returns whether or not an issue was caused, should always be true.
+ */
+ public boolean causeMaintenanceIssue() {
+ boolean b = false;
+ switch (this.getBaseMetaTileEntity()
+ .getRandomNumber(6)) {
+ case 0 -> {
+ this.mWrench = false;
+ b = true;
+ }
+ case 1 -> {
+ this.mScrewdriver = false;
+ b = true;
+ }
+ case 2 -> {
+ this.mSoftHammer = false;
+ b = true;
+ }
+ case 3 -> {
+ this.mHardHammer = false;
+ b = true;
+ }
+ case 4 -> {
+ this.mSolderingTool = false;
+ b = true;
+ }
+ case 5 -> {
+ this.mCrowbar = false;
+ b = true;
+ }
+ }
+ return b;
+ }
+
+ public void fixAllMaintenanceIssue() {
+ this.mCrowbar = true;
+ this.mWrench = true;
+ this.mHardHammer = true;
+ this.mSoftHammer = true;
+ this.mSolderingTool = true;
+ this.mScrewdriver = true;
+ }
+
+ public boolean checkHatch() {
+ return mMaintenanceHatches.size() <= 1
+ && (this.getPollutionPerSecond(null) > 0 ? !mMufflerHatches.isEmpty() : true);
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ this.mChargeHatches.clear();
+ this.mDischargeHatches.clear();
+ this.mAirIntakes.clear();
+ this.mTecTechEnergyHatches.clear();
+ this.mTecTechDynamoHatches.clear();
+ this.mAllEnergyHatches.clear();
+ this.mAllDynamoHatches.clear();
+ }
+
+ public <E> boolean addToMachineListInternal(ArrayList<E> aList, final IGregTechTileEntity aTileEntity,
+ final int aBaseCasingIndex) {
+ return addToMachineListInternal(aList, getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public <E> boolean addToMachineListInternal(ArrayList<E> aList, final IMetaTileEntity aTileEntity,
+ final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+
+ // Check type
+ /*
+ * Class <?> aHatchType = ReflectionUtils.getTypeOfGenericObject(aList); if
+ * (!aHatchType.isInstance(aTileEntity)) { return false; }
+ */
+
+ // Try setRecipeMap
+
+ try {
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aTileEntity, getRecipeMap());
+ }
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aTileEntity, getRecipeMap());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ if (aList.isEmpty()) {
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log(
+ "Adding " + aTileEntity.getInventoryName()
+ + " at "
+ + new BlockPos(aTileEntity.getBaseMetaTileEntity()).getLocationString());
+ }
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ return aList.add((E) aTileEntity);
+ }
+ } else {
+ IGregTechTileEntity aCur = aTileEntity.getBaseMetaTileEntity();
+ if (aList.contains(aTileEntity)) {
+ log(
+ "Found Duplicate " + aTileEntity.getInventoryName()
+ + " @ "
+ + new BlockPos(aCur).getLocationString());
+ return false;
+ }
+ BlockPos aCurPos = new BlockPos(aCur);
+ boolean aExists = false;
+ for (E m : aList) {
+ IGregTechTileEntity b = ((IMetaTileEntity) m).getBaseMetaTileEntity();
+ if (b != null) {
+ BlockPos aPos = new BlockPos(b);
+ if (aPos != null) {
+ if (aCurPos.equals(aPos)) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log("Found Duplicate " + b.getInventoryName() + " at " + aPos.getLocationString());
+ }
+ return false;
+ }
+ }
+ }
+ }
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log("Adding " + aCur.getInventoryName() + " at " + aCurPos.getLocationString());
+ }
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ return aList.add((E) aTileEntity);
+ }
+ }
+ return false;
+ }
+
+ private IMetaTileEntity getMetaTileEntity(final IGregTechTileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ return aMetaTileEntity;
+ }
+
+ @Override
+ public boolean addToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ return addToMachineList(getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public boolean addToMachineList(final IMetaTileEntity aMetaTileEntity, final int aBaseCasingIndex) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+
+ // Use this to determine the correct value, then update the hatch texture after.
+ boolean aDidAdd = false;
+
+ // Handle Custom Hatches
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBattery) {
+ log("Found GT_MetaTileEntity_Hatch_InputBattery");
+ aDidAdd = addToMachineListInternal(mChargeHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBattery) {
+ log("Found GT_MetaTileEntity_Hatch_OutputBattery");
+ aDidAdd = addToMachineListInternal(mDischargeHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_AirIntake) {
+ aDidAdd = addToMachineListInternal(mAirIntakes, aMetaTileEntity, aBaseCasingIndex)
+ && addToMachineListInternal(mInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+
+ // Handle TT Multi-A Energy Hatches
+ else if (TecTech.isModLoaded() && isThisHatchMultiEnergy(aMetaTileEntity)) {
+ log("Found isThisHatchMultiEnergy");
+ aDidAdd = addToMachineListInternal(mTecTechEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterEnergyHatchList(aMetaTileEntity);
+ }
+
+ // Handle TT Multi-A Dynamos
+ else if (TecTech.isModLoaded() && isThisHatchMultiDynamo(aMetaTileEntity)) {
+ log("Found isThisHatchMultiDynamo");
+ aDidAdd = addToMachineListInternal(mTecTechDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterDynamoHatchList(aMetaTileEntity);
+ }
+
+ // Handle Fluid Hatches using seperate logic
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input)
+ aDidAdd = addToMachineListInternal(mInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output)
+ aDidAdd = addToMachineListInternal(mOutputHatches, aMetaTileEntity, aBaseCasingIndex);
+
+ // Process Remaining hatches using Vanilla GT Logic
+ else if (aMetaTileEntity instanceof IDualInputHatch hatch) {
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ aDidAdd = addToMachineListInternal(mDualInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus)
+ aDidAdd = addToMachineListInternal(mInputBusses, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus)
+ aDidAdd = addToMachineListInternal(mOutputBusses, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ aDidAdd = addToMachineListInternal(mEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterEnergyHatchList(aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ aDidAdd = addToMachineListInternal(mDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterDynamoHatchList(aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance)
+ aDidAdd = addToMachineListInternal(mMaintenanceHatches, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler)
+ aDidAdd = addToMachineListInternal(mMufflerHatches, aMetaTileEntity, aBaseCasingIndex);
+
+ // return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ return aDidAdd;
+ }
+
+ @Override
+ public boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean addAirIntakeToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_AirIntake) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean addFluidInputToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ return addFluidInputToMachineList(getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public boolean addFluidInputToMachineList(final IMetaTileEntity aMetaTileEntity, final int aBaseCasingIndex) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean clearRecipeMapForAllInputHatches() {
+ return resetRecipeMapForAllInputHatches(null);
+ }
+
+ public boolean resetRecipeMapForAllInputHatches() {
+ return resetRecipeMapForAllInputHatches(this.getRecipeMap());
+ }
+
+ public boolean resetRecipeMapForAllInputHatches(RecipeMap<?> aMap) {
+ int cleared = 0;
+ for (GT_MetaTileEntity_Hatch_Input g : this.mInputHatches) {
+ if (resetRecipeMapForHatch(g, aMap)) {
+ cleared++;
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_InputBus g : this.mInputBusses) {
+ if (resetRecipeMapForHatch(g, aMap)) {
+ cleared++;
+ }
+ }
+ return cleared > 0;
+ }
+
+ public boolean resetRecipeMapForHatch(IGregTechTileEntity aTileEntity, RecipeMap<?> aMap) {
+ try {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ return resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aMetaTileEntity, aMap);
+ } else {
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return false;
+ }
+ }
+
+ public boolean resetRecipeMapForHatch(GT_MetaTileEntity_Hatch aTileEntity, RecipeMap<?> aMap) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Hatch to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Hatch.");
+ }
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Bus to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Bus.");
+ }
+ } else {
+ ((GT_MetaTileEntity_Hatch_Steam_BusInput) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_Steam_BusInput) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Bus to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Bus.");
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ clearRecipeMapForAllInputHatches();
+ onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ resetRecipeMapForAllInputHatches();
+ }
+
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ /**
+ * Enable Texture Casing Support if found in GT 5.09
+ */
+ public boolean updateTexture(final IGregTechTileEntity aTileEntity, int aCasingID) {
+ return updateTexture(getMetaTileEntity(aTileEntity), aCasingID);
+ }
+
+ /**
+ * Enable Texture Casing Support if found in GT 5.09
+ */
+ public boolean updateTexture(final IMetaTileEntity aTileEntity, int aCasingID) {
+ try { // gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch.updateTexture(int)
+
+ final IMetaTileEntity aMetaTileEntity = aTileEntity;
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ Method mProper = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ if (mProper != null) {
+ if (GT_MetaTileEntity_Hatch.class.isInstance(aMetaTileEntity)) {
+ mProper.setAccessible(true);
+ mProper.invoke(aMetaTileEntity, aCasingID);
+ // log("Good Method Call for updateTexture.");
+ return true;
+ }
+ } else {
+ log("Bad Method Call for updateTexture.");
+ if (GT_MetaTileEntity_Hatch.class.isInstance(aMetaTileEntity)) {
+ if (aCasingID <= Byte.MAX_VALUE) {
+ ((GT_MetaTileEntity_Hatch) aTileEntity).updateTexture(aCasingID);
+ log(
+ "Good Method Call for updateTexture. Used fallback method of setting mMachineBlock as casing id was <= 128.");
+ return true;
+ } else {
+ log("updateTexture returning false. 1.2");
+ }
+ } else {
+ log("updateTexture returning false. 1.3");
+ }
+ }
+ log("updateTexture returning false. 1");
+ return false;
+ } catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ log("updateTexture returning false.");
+ log("updateTexture returning false. 2");
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * TecTech Support
+ */
+
+ /**
+ * This is the array Used to Store the Tectech Multi-Amp Dynamo hatches.
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch> mTecTechDynamoHatches = new ArrayList<>();
+
+ /**
+ * This is the array Used to Store the Tectech Multi-Amp Energy hatches.
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch> mTecTechEnergyHatches = new ArrayList<>();
+
+ /**
+ * TecTech Multi-Amp Dynamo Support
+ *
+ * @param aTileEntity - The Dynamo Hatch
+ * @param aBaseCasingIndex - Casing Texture
+ * @return
+ */
+ public boolean addMultiAmpDynamoToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (isThisHatchMultiDynamo(aTileEntity)) {
+ return addToMachineListInternal(mTecTechDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean isThisHatchMultiDynamo(IGregTechTileEntity aTileEntity) {
+ return isThisHatchMultiDynamo(getMetaTileEntity(aTileEntity));
+ }
+
+ public boolean isThisHatchMultiDynamo(IMetaTileEntity aMetaTileEntity) {
+ Class<?> mDynamoClass;
+ mDynamoClass = ReflectionUtils
+ .getClass("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti");
+ if (mDynamoClass != null) {
+ if (mDynamoClass.isInstance(aMetaTileEntity)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo || isThisHatchMultiDynamo(aMetaTileEntity)) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ private boolean updateMasterDynamoHatchList(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch aHatch) {
+ return mAllDynamoHatches.add(aHatch);
+ }
+ return false;
+ }
+
+ /**
+ * TecTech Multi-Amp Energy Hatch Support
+ *
+ * @param aTileEntity - The Energy Hatch
+ * @param aBaseCasingIndex - Casing Texture
+ * @return
+ */
+ public boolean addMultiAmpEnergyToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineListInternal(mTecTechEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean isThisHatchMultiEnergy(IGregTechTileEntity aTileEntity) {
+ return isThisHatchMultiEnergy(getMetaTileEntity(aTileEntity));
+ }
+
+ public boolean isThisHatchMultiEnergy(IMetaTileEntity aMetaTileEntity) {
+ Class<?> mDynamoClass;
+ mDynamoClass = ReflectionUtils
+ .getClass("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti");
+ if (mDynamoClass != null) {
+ if (mDynamoClass.isInstance(aMetaTileEntity)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy || isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ private boolean updateMasterEnergyHatchList(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch aHatch) {
+ return mAllEnergyHatches.add(aHatch);
+ }
+ return false;
+ }
+
+ /**
+ * Pollution Management
+ */
+ public int calculatePollutionReductionForHatch(GT_MetaTileEntity_Hatch_Muffler hatch, int poll) {
+ return hatch.calculatePollutionReduction(poll);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setLong("mTotalRunTime", this.mTotalRunTime);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mTotalRunTime = aNBT.getLong("mTotalRunTime");
+ if (aNBT.hasKey("mVoidExcess")) {
+ // backward compatibility
+ voidingMode = aNBT.getBoolean("mVoidExcess") ? VoidingMode.VOID_ALL : VoidingMode.VOID_NONE;
+ }
+ if (aNBT.hasKey("mUseMultiparallelMode")) {
+ // backward compatibility
+ batchMode = aNBT.getBoolean("mUseMultiparallelMode");
+ }
+ }
+
+ /**
+ * Custom Tool Handling
+ */
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ // Do Things
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Logger.INFO("Right Clicked Controller.");
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ // Logger.INFO("Holding Item.");
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ // Logger.INFO("Is GT_MetaGenerated_Tool.");
+ int[] aOreID = OreDictionary.getOreIDs(tCurrentItem);
+ for (int id : aOreID) {
+ // Plunger
+ if (OreDictionary.getOreName(id)
+ .equals("craftingToolPlunger")) {
+ // Logger.INFO("Is Plunger.");
+ return onPlungerRightClick(aPlayer, side, aX, aY, aZ);
+ }
+ }
+ }
+ }
+ }
+ // Do Super
+ boolean aSuper = super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ return aSuper;
+ }
+
+ public boolean onPlungerRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ int aHatchIndex = 0;
+ PlayerUtils.messagePlayer(aPlayer, "Trying to clear " + mOutputHatches.size() + " output hatches.");
+ for (GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) {
+ if (hatch.mFluid != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Clearing " + hatch.mFluid.amount
+ + "L of "
+ + hatch.mFluid.getLocalizedName()
+ + " from hatch "
+ + aHatchIndex
+ + ".");
+ hatch.mFluid = null;
+ }
+ aHatchIndex++;
+ }
+ return aHatchIndex > 0;
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (supportsVoidProtection() && wrenchingSide == getBaseMetaTileEntity().getFrontFacing()) {
+ Set<VoidingMode> allowed = getAllowedVoidingModes();
+ setVoidingMode(getVoidingMode().nextInCollection(allowed));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.gui.button.voiding_mode") + " "
+ + StatCollector.translateToLocal(getVoidingMode().getTransKey()));
+ return true;
+ } else return super.onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void onServerStart() {
+ super.onServerStart();
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ super.onCreated(aStack, aWorld, aPlayer);
+ tryTickWaitTimerDown();
+ }
+
+ private void tryTickWaitTimerDown() {
+ /*
+ * if (mStartUpCheck > 10) { mStartUpCheck = 10; }
+ */
+ }
+
+ // Only support to use meta to tier
+
+ /**
+ * accept meta [0, maxMeta)
+ *
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiConsumer<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int maxMeta) {
+ return addTieredBlock(aBlock, (t, i) -> {
+ aSetTheMeta.accept(t, i);
+ return true;
+ }, aGetTheMeta, 0, maxMeta);
+ }
+
+ /**
+ *
+ * @param minMeta inclusive
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiConsumer<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int minMeta, int maxMeta) {
+ return addTieredBlock(aBlock, (t, i) -> {
+ aSetTheMeta.accept(t, i);
+ return true;
+ }, aGetTheMeta, minMeta, maxMeta);
+ }
+
+ /**
+ *
+ * @param minMeta inclusive
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiPredicate<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int minMeta, int maxMeta) {
+
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ Block tBlock = world.getBlock(x, y, z);
+ if (aBlock == tBlock) {
+ Integer currentMeta = aGetTheMeta.apply(t);
+ int newMeta = tBlock.getDamageValue(world, x, y, z) + 1;
+ if (newMeta > maxMeta || newMeta < minMeta + 1) return false;
+ if (currentMeta == 0) {
+ return aSetTheMeta.test(t, newMeta);
+ } else {
+ return currentMeta == newMeta;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aBlock, getMeta(trigger));
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ return world.setBlock(x, y, z, aBlock, getMeta(trigger), 3);
+ }
+
+ private int getMeta(ItemStack trigger) {
+ int meta = trigger.stackSize;
+ if (meta <= 0) meta = minMeta;
+ if (meta + minMeta >= maxMeta) meta = maxMeta - 1 - minMeta;
+ return meta + minMeta;
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(aBlock, getMeta(trigger));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (world.getBlock(x, y, z) == aBlock) {
+ if (world.getBlockMetadata(x, y, z) == getMeta(trigger)) {
+ return PlaceResult.SKIP;
+ }
+ return PlaceResult.REJECT;
+ }
+ return StructureUtility.survivalPlaceBlock(
+ aBlock,
+ getMeta(trigger),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getActiveOverlay())
+ .extFacing()
+ .build() };
+ return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getInactiveOverlay())
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { getCasingTexture() };
+ }
+
+ protected IIconContainer getActiveOverlay() {
+ return null;
+ }
+
+ protected IIconContainer getInactiveOverlay() {
+ return null;
+ }
+
+ protected ITexture getCasingTexture() {
+ return Textures.BlockIcons.getCasingTextureForId(getCasingTextureId());
+ }
+
+ protected int getCasingTextureId() {
+ return 0;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (doesBindPlayerInventory()) {
+ super.addUIWidgets(builder, buildContext);
+ } else {
+ addNoPlayerInventoryUI(builder, buildContext);
+ }
+ }
+
+ private static final Materials GOOD = Materials.Uranium;
+ private static final Materials BAD = Materials.Plutonium;
+ private static final ConcurrentHashMap<String, ItemStack> mToolStacks = new ConcurrentHashMap<>();
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ protected void addNoPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(3, 4)
+ .setSize(152, 159));
+ for (int i = 0; i < 9; i++) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.BUTTON_STANDARD)
+ .setPos(155, 3 + i * 18)
+ .setSize(18, 18));
+ }
+
+ DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTextsNoPlayerInventory(screenElements);
+ builder.widget(screenElements);
+
+ setupToolDisplay();
+
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mWrench + "WRENCH")).asWidget()
+ .setPos(156, 58))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mCrowbar + "CROWBAR")).asWidget()
+ .setPos(156, 76))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mHardHammer + "HARDHAMMER")).asWidget()
+ .setPos(156, 94))
+ .widget(
+ new TextWidget("H").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(167, 103))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mSoftHammer + "SOFTHAMMER")).asWidget()
+ .setPos(156, 112))
+ .widget(
+ new TextWidget("M").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(167, 121))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mScrewdriver + "SCREWDRIVER")).asWidget()
+ .setPos(156, 130))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mSolderingTool + "SOLDERING_IRON_LV")).asWidget()
+ .setPos(156, 148))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(getBaseMetaTileEntity().isActive() + "GLASS")).asWidget()
+ .setPos(156, 22))
+ .widget(
+ TextWidget.dynamicString(() -> getBaseMetaTileEntity().isActive() ? "On" : "Off")
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(157, 31))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ }
+
+ protected void drawTextsNoPlayerInventory(DynamicPositionedColumn screenElements) {
+ screenElements.setSynced(false)
+ .setSpace(0)
+ .setPos(6, 7);
+
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mMachine))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.machines.input") + " "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Values.VOLTAGE_NAMES[(int) getInputTier()])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getInputTier() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.machines.output") + " "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Values.VOLTAGE_NAMES[(int) getOutputTier()])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getOutputTier() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.progress") + ": "
+ + EnumChatFormatting.GREEN
+ + getBaseMetaTileEntity().getProgress() / 20
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + getBaseMetaTileEntity().getMaxProgress() / 20
+ + EnumChatFormatting.RESET
+ + " s")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.energy") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + getStoredEnergyInAllEnergyHatches()
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + getMaxEnergyStorageOfAllEnergyHatches()
+ + EnumChatFormatting.RESET
+ + " EU"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.usage") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() > 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget.dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.RED + -getLastRecipeEU() + EnumChatFormatting.RESET + " EU/t/parallel"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() > 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget.dynamicString(() -> StatCollector.translateToLocal("GTPP.multiblock.generation") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() < 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + getLastRecipeEU()
+ + EnumChatFormatting.RESET
+ + " EU/t/parallel"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() < 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.duration") + ": "
+ + EnumChatFormatting.RED
+ + getLastRecipeDuration()
+ + EnumChatFormatting.RESET
+ + " ticks")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() != 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.specialvalue") + ": "
+ + EnumChatFormatting.RED
+ + getLastRecipeEU()
+ + EnumChatFormatting.RESET
+ + "")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> mMachine && getLastRecipeEU() != 0
+ && getLastRecipeDuration() > 0
+ && (mLastRecipe != null ? mLastRecipe.mSpecialValue : 0) > 0))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.mei") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.YELLOW
+ + getMaxInputVoltage()
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100.0F)
+ + EnumChatFormatting.RESET
+ + " %")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.pollution") + ": "
+ + EnumChatFormatting.RED
+ + (getPollutionPerTick(null) * 20)
+ + EnumChatFormatting.RESET
+ + "/sec")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.pollutionreduced") + ": "
+ + EnumChatFormatting.GREEN
+ + getPollutionReductionForAllMufflers()
+ + EnumChatFormatting.RESET
+ + " %")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget("Total Time Since Built: ").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeWeeksDisplay()
+ + EnumChatFormatting.RESET
+ + " Weeks,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeDaysDisplay()
+ + EnumChatFormatting.RESET
+ + " Days,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeHoursDisplay()
+ + EnumChatFormatting.RESET
+ + " Hours,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeMinutesDisplay()
+ + EnumChatFormatting.RESET
+ + " Minutes,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeSecondsDisplay()
+ + EnumChatFormatting.RESET
+ + " Seconds")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine));
+ }
+
+ protected int getLastRecipeEU() {
+ return mLastRecipe != null ? mLastRecipe.mEUt : 0;
+ }
+
+ protected int getLastRecipeDuration() {
+ return mLastRecipe != null ? mLastRecipe.mDuration : 0;
+ }
+
+ protected long getRuntimeSeconds() {
+ return getTotalRuntimeInTicks() / 20;
+ }
+
+ protected long getRuntimeWeeksDisplay() {
+ return TimeUnit.SECONDS.toDays(getRuntimeSeconds()) / 7;
+ }
+
+ protected long getRuntimeDaysDisplay() {
+ return TimeUnit.SECONDS.toDays(getRuntimeSeconds()) - 7 * getRuntimeWeeksDisplay();
+ }
+
+ protected long getRuntimeHoursDisplay() {
+ return TimeUnit.SECONDS.toHours(getRuntimeSeconds()) - TimeUnit.DAYS.toHours(getRuntimeDaysDisplay())
+ - TimeUnit.DAYS.toHours(7 * getRuntimeWeeksDisplay());
+ }
+
+ protected long getRuntimeMinutesDisplay() {
+ return TimeUnit.SECONDS.toMinutes(getRuntimeSeconds()) - (TimeUnit.SECONDS.toHours(getRuntimeSeconds()) * 60);
+ }
+
+ protected long getRuntimeSecondsDisplay() {
+ return TimeUnit.SECONDS.toSeconds(getRuntimeSeconds()) - (TimeUnit.SECONDS.toMinutes(getRuntimeSeconds()) * 60);
+ }
+
+ protected void setupToolDisplay() {
+ if (!mToolStacks.isEmpty()) return;
+
+ mToolStacks.put(
+ true + "WRENCH",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "CROWBAR",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.CROWBAR, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "HARDHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.HARDHAMMER, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SOFTHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOFTMALLET, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SCREWDRIVER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SCREWDRIVER, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SOLDERING_IRON_LV",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV, 1, GOOD, Materials.Tungsten, null));
+
+ mToolStacks.put(
+ false + "WRENCH",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "CROWBAR",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.CROWBAR, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "HARDHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.HARDHAMMER, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SOFTHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOFTMALLET, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SCREWDRIVER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SCREWDRIVER, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SOLDERING_IRON_LV",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV, 1, BAD, Materials.Tungsten, null));
+
+ ItemStack aGlassPane1 = ItemUtils.getItemStackOfAmountFromOreDict("paneGlassRed", 1);
+ ItemStack aGlassPane2 = ItemUtils.getItemStackOfAmountFromOreDict("paneGlassLime", 1);
+ mToolStacks.put("falseGLASS", aGlassPane1);
+ mToolStacks.put("trueGLASS", aGlassPane2);
+ }
+
+ public enum GTPPHatchElement implements IHatchElement<GregtechMeta_MultiBlockBase<?>> {
+
+ AirIntake(GregtechMeta_MultiBlockBase::addAirIntakeToMachineList, GT_MetaTileEntity_Hatch_AirIntake.class) {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mAirIntakes.size();
+ }
+ },
+ TTDynamo(GregtechMeta_MultiBlockBase::addMultiAmpDynamoToMachineList,
+ "com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti") {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mTecTechDynamoHatches.size();
+ }
+ },
+ TTEnergy(GregtechMeta_MultiBlockBase::addMultiAmpEnergyToMachineList,
+ "com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti") {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mTecTechEnergyHatches.size();
+ }
+ },;
+
+ @SuppressWarnings("unchecked")
+ private static <T> Class<T> retype(Class<?> clazz) {
+ return (Class<T>) clazz;
+ }
+
+ private final List<? extends Class<? extends IMetaTileEntity>> mMteClasses;
+ private final IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> mAdder;
+
+ @SafeVarargs
+ GTPPHatchElement(IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> aAdder,
+ Class<? extends IMetaTileEntity>... aMteClasses) {
+ this.mMteClasses = Arrays.asList(aMteClasses);
+ this.mAdder = aAdder;
+ }
+
+ GTPPHatchElement(IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> aAdder, String... aClassNames) {
+ this.mMteClasses = Arrays.stream(aClassNames)
+ .map(ReflectionUtils::getClass)
+ .filter(Objects::nonNull)
+ .<Class<? extends IMetaTileEntity>>map(GTPPHatchElement::retype)
+ .collect(Collectors.toList());
+ this.mAdder = aAdder;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mMteClasses;
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> adder() {
+ return mAdder;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java
new file mode 100644
index 0000000000..6e501815f0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java
@@ -0,0 +1,428 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static mcp.mobius.waila.api.SpecialChars.GREEN;
+import static mcp.mobius.waila.api.SpecialChars.RED;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_HatchElementBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusOutput;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GregtechMeta_SteamMultiBase<T extends GregtechMeta_SteamMultiBase<T>>
+ extends GregtechMeta_MultiBlockBase<T> {
+
+ public ArrayList<GT_MetaTileEntity_Hatch_Steam_BusInput> mSteamInputs = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Steam_BusOutput> mSteamOutputs = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mSteamInputFluids = new ArrayList<>();
+
+ protected static final String TT_steaminputbus = StatCollector.translateToLocal("GTPP.MBTT.SteamInputBus");
+ protected static final String TT_steamoutputbus = StatCollector.translateToLocal("GTPP.MBTT.SteamOutputBus");
+ protected static final String TT_steamhatch = StatCollector.translateToLocal("GTPP.MBTT.SteamHatch");
+
+ public GregtechMeta_SteamMultiBase(String aName) {
+ super(aName);
+ }
+
+ public GregtechMeta_SteamMultiBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()),
+ aActive ? getFrontOverlayActive() : getFrontOverlay() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) };
+ }
+
+ protected abstract GT_RenderedTexture getFrontOverlay();
+
+ protected abstract GT_RenderedTexture getFrontOverlayActive();
+
+ private int getCasingTextureIndex() {
+ return 10;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(V[1]);
+ // We need to trick the GT_ParallelHelper we have enough amps for all recipe parallels.
+ logic.setAvailableAmperage(getMaxParallelRecipes());
+ logic.setAmperageOC(false);
+ }
+
+ public ArrayList<FluidStack> getAllSteamStacks() {
+ ArrayList<FluidStack> aFluids = new ArrayList<>();
+ FluidStack aSteam = FluidUtils.getSteam(1);
+ for (FluidStack aFluid : this.getStoredFluids()) {
+ if (aFluid.isFluidEqual(aSteam)) {
+ aFluids.add(aFluid);
+ }
+ }
+ return aFluids;
+ }
+
+ public int getTotalSteamStored() {
+ int aSteam = 0;
+ for (FluidStack aFluid : getAllSteamStacks()) {
+ aSteam += aFluid.amount;
+ }
+ return aSteam;
+ }
+
+ public boolean tryConsumeSteam(int aAmount) {
+ if (getTotalSteamStored() <= 0) {
+ return false;
+ } else {
+ return this.depleteInput(FluidUtils.getSteam(aAmount));
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack arg0) {
+ return 0;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mSteamInputs.clear();
+ this.mSteamOutputs.clear();
+ this.mSteamInputFluids.clear();
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ /**
+ * Called every tick the Machine runs
+ */
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ fixAllMaintenanceIssue();
+ if (lEUt < 0) {
+ long aSteamVal = ((-lEUt * 10000) / Math.max(1000, mEfficiency));
+ // Logger.INFO("Trying to drain "+aSteamVal+" steam per tick.");
+ if (!tryConsumeSteam((int) aSteamVal)) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ log("Invalid IGregTechTileEntity");
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ log("Invalid IMetaTileEntity");
+ return false;
+ }
+
+ // Use this to determine the correct value, then update the hatch texture after.
+ boolean aDidAdd = false;
+
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase) {
+ log("Adding Steam Input Hatch");
+ aDidAdd = addToMachineListInternal(mSteamInputFluids, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ log(
+ "Trying to set recipe map. Type: "
+ + (getRecipeMap() != null ? getRecipeMap().unlocalizedName : "Null"));
+ this.resetRecipeMapForHatch(aTileEntity, getRecipeMap());
+ log("Adding Steam Input Bus");
+ aDidAdd = addToMachineListInternal(mSteamInputs, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusOutput) {
+ log("Adding Steam Output Bus");
+ aDidAdd = addToMachineListInternal(mSteamOutputs, aMetaTileEntity, aBaseCasingIndex);
+ }
+
+ return aDidAdd;
+ }
+
+ /*
+ * Handle I/O with custom hatches
+ */
+
+ @Override
+ public boolean depleteInput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ FluidStack tLiquid = tHatch.getFluid();
+ if (tLiquid != null && tLiquid.isFluidEqual(aLiquid)) {
+ tLiquid = tHatch.drain(aLiquid.amount, false);
+ if (tLiquid != null && tLiquid.amount >= aLiquid.amount) {
+ tLiquid = tHatch.drain(aLiquid.amount, true);
+ return tLiquid != null && tLiquid.amount >= aLiquid.amount;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean depleteInput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ FluidStack aLiquid = GT_Utility.getFluidForFilledItem(aStack, true);
+ if (aLiquid != null) return depleteInput(aLiquid);
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(0, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(0, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ArrayList<FluidStack> getStoredFluids() {
+ ArrayList<FluidStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ if (tHatch.getFillableStack() != null) {
+ rList.add(tHatch.getFillableStack());
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i) != null) {
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public boolean addOutput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ aStack = GT_Utility.copy(aStack);
+ boolean outputSuccess = true;
+ while (outputSuccess && aStack.stackSize > 0) {
+ outputSuccess = false;
+ ItemStack single = aStack.splitStack(1);
+ for (GT_MetaTileEntity_Hatch_Steam_BusOutput tHatch : filterValidMTEs(mSteamOutputs)) {
+ if (!outputSuccess) {
+ for (int i = tHatch.getSizeInventory() - 1; i >= 0 && !outputSuccess; i--) {
+ if (tHatch.getBaseMetaTileEntity()
+ .addStackToSlot(i, single)) outputSuccess = true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(mOutputHatches)) {
+ if (!outputSuccess && tHatch.outputsItems()) {
+ if (tHatch.getBaseMetaTileEntity()
+ .addStackToSlot(1, single)) outputSuccess = true;
+ }
+ }
+ }
+ return outputSuccess;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredOutputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Steam_BusOutput tHatch : filterValidMTEs(mSteamOutputs)) {
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ List<ItemStack> ret = new ArrayList<>();
+ for (final GT_MetaTileEntity_Hatch tBus : filterValidMTEs(mSteamOutputs)) {
+ final IInventory tBusInv = tBus.getBaseMetaTileEntity();
+ for (int i = 0; i < tBusInv.getSizeInventory(); i++) {
+ ret.add(tBus.getStackInSlot(i));
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) tHatch.updateSlots();
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) tHatch.updateSlots();
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mSteamInputFluids.clear();
+ mSteamInputs.clear();
+ mSteamOutputs.clear();
+ }
+
+ @Override
+ public boolean resetRecipeMapForAllInputHatches(RecipeMap<?> aMap) {
+ boolean ret = super.resetRecipeMapForAllInputHatches(aMap);
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput hatch : mSteamInputs) {
+ if (resetRecipeMapForHatch(hatch, aMap)) {
+ ret = true;
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+
+ if (tag.getBoolean("incompleteStructure")) {
+ currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET);
+ }
+ currentTip.add(
+ (tag.getBoolean("hasProblems") ? (RED + "** HAS PROBLEMS **") : GREEN + "Running Fine") + RESET
+ + " Efficiency: "
+ + tag.getFloat("efficiency")
+ + "%");
+
+ boolean isActive = tag.getBoolean("isActive");
+ if (isActive) {
+ long actualEnergyUsage = tag.getLong("energyUsage");
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted("GTPP.waila.steam.use", formatNumbers(actualEnergyUsage)));
+ }
+ }
+ currentTip.add(
+ GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress")));
+ // Show ns on the tooltip
+ if (GT_Mod.gregtechproxy.wailaAverageNS && tag.hasKey("averageNS")) {
+ int tAverageTime = tag.getInteger("averageNS");
+ currentTip.add("Average CPU load of ~" + formatNumbers(tAverageTime) + " ns");
+ }
+ super.getMTEWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ protected static <T extends GregtechMeta_SteamMultiBase<T>> GT_HatchElementBuilder<T> buildSteamInput(
+ Class<T> typeToken) {
+ return buildHatchAdder(typeToken).adder(GregtechMeta_SteamMultiBase::addToMachineList)
+ .hatchIds(31040)
+ .shouldReject(t -> !t.mSteamInputFluids.isEmpty());
+ }
+
+ protected enum SteamHatchElement implements IHatchElement<GregtechMeta_SteamMultiBase<?>> {
+
+ InputBus_Steam {
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Steam_BusInput.class);
+ }
+
+ @Override
+ public long count(GregtechMeta_SteamMultiBase<?> t) {
+ return t.mSteamInputs.size();
+ }
+ },
+ OutputBus_Steam {
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Steam_BusOutput.class);
+ }
+
+ @Override
+ public long count(GregtechMeta_SteamMultiBase<?> t) {
+ return t.mSteamOutputs.size();
+ }
+ },;
+
+ @Override
+ public IGT_HatchAdder<? super GregtechMeta_SteamMultiBase<?>> adder() {
+ return GregtechMeta_SteamMultiBase::addToMachineList;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java
new file mode 100644
index 0000000000..3f0d8d1ec1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java
@@ -0,0 +1,361 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public abstract class GregtechMetaBoilerBase extends GT_MetaTileEntity_BasicTank {
+
+ public int mTemperature = 20;
+ public int mProcessingEnergy = 0;
+ public int mLossTimer = 0;
+ public FluidStack mSteam = null;
+ public boolean mHadNoWater = false;
+ public long RI = MathUtils.randLong(5L, 30L);
+
+ public GregtechMetaBoilerBase(final int aID, final String aName, final String aNameRegional,
+ final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures);
+ }
+
+ public GregtechMetaBoilerBase(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ ITexture[] tmp = this.mTextures[side.offsetY == 0 ? side != facing ? 2 : ((byte) (aActive ? 4 : 3))
+ : side.ordinal()][aColorIndex + 1];
+ if ((side != facing) && (tmp.length == 2)) {
+ tmp = new ITexture[] { tmp[0] };
+ }
+ return tmp;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isPneumatic() {
+ return false;
+ }
+
+ @Override
+ public boolean isSteampowered() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mTemperature;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 500;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ if (aPlayer != null) {
+ if (GT_Utility.areStacksEqual(aPlayer.getCurrentEquippedItem(), new ItemStack(Items.water_bucket, 1))) {
+ this.fill(Materials.Water.getFluid(1000 * aPlayer.getCurrentEquippedItem().stackSize), true);
+ aPlayer.getCurrentEquippedItem()
+ .func_150996_a(Items.bucket);
+ } else {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return GT_ModHandler.isWater(aFluid);
+ }
+
+ @Override
+ public FluidStack getDrainableStack() {
+ return this.mSteam;
+ }
+
+ @Override
+ public FluidStack setDrainableStack(final FluidStack aFluid) {
+ this.mSteam = aFluid;
+ return this.mSteam;
+ }
+
+ @Override
+ public boolean isDrainableStackSeparate() {
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(final ForgeDirection side, final GT_ItemStack aCover) {
+ return GregTech_API.getCoverBehaviorNew(aCover.toStack())
+ .isSimpleCover();
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mLossTimer", this.mLossTimer);
+ aNBT.setInteger("mTemperature", this.mTemperature);
+ aNBT.setInteger("mProcessingEnergy", this.mProcessingEnergy);
+ if (this.mSteam != null) {
+ try {
+ aNBT.setTag("mSteam", this.mSteam.writeToNBT(new NBTTagCompound()));
+ } catch (final Throwable e) {}
+ }
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mLossTimer = aNBT.getInteger("mLossTimer");
+ this.mTemperature = aNBT.getInteger("mTemperature");
+ this.mProcessingEnergy = aNBT.getInteger("mProcessingEnergy");
+ this.mSteam = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mSteam"));
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if ((aBaseMetaTileEntity.isServerSide()) && (aTick > 20L)) {
+ if (this.mTemperature <= 20) {
+ this.mTemperature = 20;
+ this.mLossTimer = 0;
+ }
+ if (++this.mLossTimer > 40) {
+ this.mTemperature -= 1;
+ this.mLossTimer = 0;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aBaseMetaTileEntity.getFrontFacing()) {
+ final IFluidHandler tTileEntity = aBaseMetaTileEntity.getITankContainerAtSide(side);
+ if (tTileEntity != null) {
+ final FluidStack tDrained = aBaseMetaTileEntity
+ .drain(side, Math.max(1, this.mSteam.amount / 2), false);
+ if (tDrained != null) {
+ final int tFilledAmount = tTileEntity.fill(side.getOpposite(), tDrained, false);
+ if (tFilledAmount > 0) {
+ tTileEntity.fill(
+ side.getOpposite(),
+ aBaseMetaTileEntity.drain(side, tFilledAmount, true),
+ true);
+ }
+ }
+ }
+ }
+ }
+ if ((aTick % 10L) == 0L) {
+ if (this.mTemperature > 100) {
+ if ((this.mFluid == null) || (!GT_ModHandler.isWater(this.mFluid)) || (this.mFluid.amount <= 0)) {
+ this.mHadNoWater = true;
+ } else {
+ if (this.mHadNoWater) {
+ aBaseMetaTileEntity.doExplosion(2048L);
+ return;
+ }
+ this.mFluid.amount -= 1;
+ if (this.mSteam == null) {
+ this.mSteam = GT_ModHandler.getSteam(150L);
+ } else if (GT_ModHandler.isSteam(this.mSteam)) {
+ this.mSteam.amount += 150;
+ } else {
+ this.mSteam = GT_ModHandler.getSteam(150L);
+ }
+ }
+ } else {
+ this.mHadNoWater = false;
+ }
+ }
+ if ((this.mSteam != null) && (this.mSteam.amount > getSteamCapacity())) {
+ this.sendSound((byte) 1);
+ this.mSteam.amount = getSteamCapacity() * 3 / 4;
+ }
+ if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && (this.mInventory[2] != null)) {
+ if ((GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dust.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dustImpure.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.crushed.get(Materials.Coal)))) {
+ this.mProcessingEnergy += 160;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(3) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ } else if (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Charcoal))) {
+ this.mProcessingEnergy += 160;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(3) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ }
+ } else if (GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelCoke")) {
+ this.mProcessingEnergy += 640;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(2) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ }
+ } else if ((GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dust.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dustImpure.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.crushed.get(Materials.Lignite)))) {
+ this.mProcessingEnergy += 40;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(8) == 0) {
+ aBaseMetaTileEntity.addStackToSlot(
+ 3,
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ }
+ }
+ if ((this.mTemperature < 1000) && (this.mProcessingEnergy > 0) && ((aTick % 12L) == 0L)) {
+ this.mProcessingEnergy -= 2;
+ this.mTemperature += 1;
+ }
+ aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
+ }
+ }
+
+ @Override
+ // Since this type of machine can have different water and steam capacities, we need to override getTankInfo() to
+ // support returning those different capacities.
+ public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
+ return new FluidTankInfo[] { new FluidTankInfo(this.mFluid, getCapacity()),
+ new FluidTankInfo(this.mSteam, getSteamCapacity()) };
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return (aIndex == 1) || (aIndex == 3);
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return aIndex == 2;
+ }
+
+ @Override
+ public void doSound(final byte aIndex, final double aX, final double aY, final double aZ) {
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 2, 1.0F, aX, aY, aZ);
+ for (int l = 0; l < 8; l++) {
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .spawnParticle(
+ "largesmoke",
+ (aX - 0.5D) + Math.random(),
+ aY,
+ (aZ - 0.5D) + Math.random(),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ // This type of machine can have different water and steam capacities.
+ public int getSteamCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java
new file mode 100644
index 0000000000..5e0588acfd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+
+public abstract class GregtechMetaSolarGenerator extends GT_MetaTileEntity_BasicTank {
+
+ public int mEfficiency;
+ public int mProcessingEnergy = 0;
+ public int mSolarCharge = 20;
+ public int mLossTimer = 0;
+ public static int sEnergyPerTick = 16;
+
+ public GregtechMetaSolarGenerator(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ }
+
+ public GregtechMetaSolarGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, "Efficiency: " + this.getEfficiency() + "%");
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return aIndex < 2;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return this.getBaseMetaTileEntity()
+ .isAllowedToWork() ? V[this.mTier] : 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(this.getEUVar(), (V[this.mTier] * 40) + this.getMinimumStoredEU());
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork()
+ && (aTick > 20L)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < (this.maxEUOutput() + aBaseMetaTileEntity.getEUCapacity()))) {
+
+ if (this.mSolarCharge <= 20) {
+ this.mSolarCharge = 20;
+ this.mLossTimer = 0;
+ }
+ if (++this.mLossTimer > 45) {
+ this.mSolarCharge -= 1;
+ this.mLossTimer = 0;
+ }
+
+ if ((aTick % 25L) == 0L) {
+ if (this.mSolarCharge > 100) {
+ if ((this.mProcessingEnergy > 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && ((aTick % 256L) == 0L)
+ && (!aBaseMetaTileEntity.getWorld()
+ .isThundering()
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < ((this.maxEUOutput() * 20) + this.getMinimumStoredEU())))) {
+ this.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits((sEnergyPerTick * this.getEfficiency()) / 10, false);
+ }
+ }
+ }
+
+ if ((this.mSolarCharge < 500) && (this.mProcessingEnergy > 0) && ((aTick % 12L) == 0L)) {
+ this.mProcessingEnergy -= 1;
+ this.mSolarCharge += 1;
+ }
+
+ if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && ((aTick % 256L) == 0L)
+ && (!aBaseMetaTileEntity.getWorld()
+ .isThundering())) {
+ final boolean bRain = aBaseMetaTileEntity.getWorld()
+ .isRaining() && (aBaseMetaTileEntity.getBiome().rainfall > 0.0F);
+ this.mProcessingEnergy += (bRain && (aBaseMetaTileEntity.getWorld().skylightSubtracted >= 4))
+ || !aBaseMetaTileEntity.getSkyAtSide(ForgeDirection.UP) ? 0
+ : !bRain && aBaseMetaTileEntity.getWorld()
+ .isDaytime() ? 8 : 1;
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork() && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ >= (this.maxEUOutput() + this.getMinimumStoredEU())));
+ }
+ }
+ }
+
+ public abstract int getEfficiency();
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java
new file mode 100644
index 0000000000..83745f393a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java
@@ -0,0 +1,338 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.Collection;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+
+public abstract class GregtechRocketFuelGeneratorBase extends GT_MetaTileEntity_BasicTank implements RecipeMapWorkable {
+
+ protected int pollMin, pollMax;
+
+ public GregtechRocketFuelGeneratorBase(final int aID, final String aName, final String aNameRegional,
+ final int aTier, final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ pollMin = (int) (CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ pollMax = (int) (CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ }
+
+ public GregtechRocketFuelGeneratorBase(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ pollMin = (int) (CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ pollMax = (int) (CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public String[] getDescription() {
+ String aPollution = "Causes between " + pollMin + " and " + pollMax + " Pollution per second";
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ aPollution,
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return aIndex < 2;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return this.getBaseMetaTileEntity()
+ .getFrontFacing() == side;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(this.getEUVar(), (V[this.mTier] * 500) + this.getMinimumStoredEU());
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return this.getFuelValue(aFluid) > 0;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && ((aTick % 10) == 0)) {
+ if (this.mFluid == null) {
+ if (aBaseMetaTileEntity.getUniversalEnergyStored() < (this.maxEUOutput() + this.getMinimumStoredEU())) {
+ this.mInventory[this.getStackDisplaySlot()] = null;
+ } else {
+ if (this.mInventory[this.getStackDisplaySlot()] == null) {
+ this.mInventory[this.getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1);
+ }
+ this.mInventory[this.getStackDisplaySlot()].setStackDisplayName(
+ "Generating: " + (aBaseMetaTileEntity.getUniversalEnergyStored() - this.getMinimumStoredEU())
+ + " EU");
+ }
+ } else {
+ final int tFuelValue = this.getFuelValue(this.mFluid),
+ tConsumed = this.consumedFluidPerOperation(this.mFluid);
+ if ((tFuelValue > 0) && (tConsumed > 0) && (this.mFluid.amount >= tConsumed)) {
+ final long tFluidAmountToUse = Math.min(
+ this.mFluid.amount / tConsumed,
+ (((this.maxEUOutput() * 20) + this.getMinimumStoredEU())
+ - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
+ if ((tFluidAmountToUse > 0)
+ && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) {
+ int aSafeFloor = (int) Math.max(((tFluidAmountToUse * tConsumed) / 3), 1);
+ this.mFluid.amount -= (int) aSafeFloor;
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), 10 * getPollution());
+ }
+ }
+ }
+ if ((this.mInventory[this.getInputSlot()] != null)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < ((this.maxEUOutput() * 20) + this.getMinimumStoredEU()))
+ && (GT_Utility.getFluidForFilledItem(this.mInventory[this.getInputSlot()], true) == null)) {
+ final int tFuelValue = this.getFuelValue(this.mInventory[this.getInputSlot()]);
+ if (tFuelValue > 0) {
+ final ItemStack tEmptyContainer = this.getEmptyContainer(this.mInventory[this.getInputSlot()]);
+ if (aBaseMetaTileEntity.addStackToSlot(this.getOutputSlot(), tEmptyContainer)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
+ aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1);
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), getPollution() / 2);
+ }
+ }
+ }
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork() && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ >= (this.maxEUOutput() + this.getMinimumStoredEU())));
+ }
+ }
+
+ public int getPollution() {
+ return MathUtils.randInt(pollMin, pollMax);
+ }
+
+ @Override
+ public abstract RecipeMap<?> getRecipeMap();
+
+ public abstract int getEfficiency();
+
+ public int consumedFluidPerOperation(final FluidStack aLiquid) {
+ return 1;
+ }
+
+ public int getFuelValue(final FluidStack aLiquid) {
+ if ((aLiquid == null) || (this.getRecipeMap() == null)) {
+ return 0;
+ }
+ FluidStack tLiquid;
+ final Collection<GT_Recipe> tRecipeList = this.getRecipeMap()
+ .getAllRecipes();
+ for (final GT_Recipe tFuel : tRecipeList) {
+ if ((tLiquid = tFuel.mFluidInputs[0]) != null) {
+ if (aLiquid.isFluidEqual(tLiquid)) {
+ int aperOp = this.consumedFluidPerOperation(tLiquid);
+ return (int) (((long) tFuel.mSpecialValue * this.getEfficiency() * aperOp) / 100);
+ }
+ }
+ }
+ return 0;
+ }
+
+ public int getFuelValue(final ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || (this.getRecipeMap() == null)) {
+ return 0;
+ }
+ final GT_Recipe tFuel = this.getRecipeMap()
+ .findRecipe(this.getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel != null) {
+ return (int) ((tFuel.mSpecialValue * 1000L * this.getEfficiency()) / 100);
+ }
+ return 0;
+ }
+
+ public ItemStack getEmptyContainer(final ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || (this.getRecipeMap() == null)) {
+ return null;
+ }
+ final GT_Recipe tFuel = this.getRecipeMap()
+ .findRecipe(this.getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel != null) {
+ return GT_Utility.copy(tFuel.getOutput(0));
+ }
+ return GT_Utility.getContainerItem(aStack, true);
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && ((this.getFuelValue(aStack) > 0)
+ || (this.getFuelValue(GT_Utility.getFluidForFilledItem(aStack, true)) > 0));
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java
new file mode 100644
index 0000000000..fe3253244a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java
@@ -0,0 +1,180 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.machines;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public abstract class GregtechMetaTreeFarmerBase extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public GregtechMetaTreeFarmerBase(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final int aInvSlotCount, final String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GregtechMetaTreeFarmerBase(final String aName, final int aTier, final int aInvSlotCount,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return !this.isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return this.getBaseMetaTileEntity()
+ .getBackFacing() == side;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return false;
+ }
+
+ public abstract ITexture getOverlayIcon();
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Acacia_Log) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Podzol) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java
new file mode 100644
index 0000000000..b53e540044
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Catalysts extends GT_MetaTileEntity_Hatch_NbtConsumable {
+
+ public GT_MetaTileEntity_Hatch_Catalysts(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0, 16, "Dedicated Catalyst Storage", false);
+ }
+
+ public GT_MetaTileEntity_Hatch_Catalysts(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 0, 16, aDescription, false, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Catalyst) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Catalyst) };
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Catalysts(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String getNameGUI() {
+ return "Catalyst Container";
+ }
+
+ @Override
+ public AutoMap<ItemStack> getItemsValidForUsageSlots() {
+ return new AutoMap<>();
+ }
+
+ @Override
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ return ItemUtils.isCatalyst(aStack);
+ }
+
+ @Override
+ public int getInputSlotCount() {
+ return 16;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java
new file mode 100644
index 0000000000..e3134f5812
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_MillingBalls extends GT_MetaTileEntity_Hatch_NbtConsumable {
+
+ public GT_MetaTileEntity_Hatch_MillingBalls(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 6, 4, "Dedicated Milling Ball Storage", false);
+ }
+
+ public GT_MetaTileEntity_Hatch_MillingBalls(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 6, 4, aDescription, false, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Milling_Balls) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Milling_Balls) };
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_MillingBalls(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String getNameGUI() {
+ return "Ball Housing";
+ }
+
+ @Override
+ public AutoMap<ItemStack> getItemsValidForUsageSlots() {
+ return new AutoMap<>();
+ }
+
+ @Override
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ return ItemUtils.isMillingBall(aStack);
+ }
+
+ @Override
+ public int getInputSlotCount() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java
new file mode 100644
index 0000000000..e81c9ed554
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java
@@ -0,0 +1,353 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class GT_MetaTileEntity_Hatch_NbtConsumable extends GT_MetaTileEntity_Hatch
+ implements IAddGregtechLogo {
+
+ private final int mInputslotCount;
+ private final int mTotalSlotCount;
+ private final boolean mAllowDuplicateUsageTypes;
+
+ public GT_MetaTileEntity_Hatch_NbtConsumable(int aID, String aName, String aNameRegional, int aTier,
+ int aInputSlots, String aDescription, boolean aAllowDuplicateTypes) {
+ super(aID, aName, aNameRegional, aTier, aInputSlots * 2, aDescription);
+ mInputslotCount = getInputSlotCount();
+ mTotalSlotCount = getInputSlotCount() * 2;
+ mAllowDuplicateUsageTypes = aAllowDuplicateTypes;
+ }
+
+ public GT_MetaTileEntity_Hatch_NbtConsumable(String aName, int aTier, int aInputSlots, String[] aDescription,
+ boolean aAllowDuplicateTypes, ITexture[][][] aTextures) {
+ super(aName, aTier, aInputSlots * 2, aDescription, aTextures);
+ mInputslotCount = getInputSlotCount();
+ mTotalSlotCount = getInputSlotCount() * 2;
+ mAllowDuplicateUsageTypes = aAllowDuplicateTypes;
+ }
+
+ @Override
+ public abstract ITexture[] getTexturesActive(ITexture aBaseTexture);
+
+ @Override
+ public abstract ITexture[] getTexturesInactive(ITexture aBaseTexture);
+
+ public abstract int getInputSlotCount();
+
+ @Override
+ public final boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public final boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public final boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity);
+
+ @Override
+ public final boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public abstract String getNameGUI();
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ validateUsageSlots();
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ tryFillUsageSlots();
+ }
+ }
+
+ public final void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) {
+ mInventory[i] = null;
+ }
+ // Only moves items in the first four slots
+ if (i <= getSlotID_LastInput()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+ }
+
+ protected void validateUsageSlots() {
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize < 1) {
+ mInventory[i] = null;
+ this.markDirty();
+ }
+ }
+ }
+
+ // Only moves items in the first four slots
+ protected final void fillStacksIntoFirstSlots() {
+ for (int i = 0; i <= getSlotID_LastInput(); i++) {
+ for (int j = i + 1; j <= getSlotID_LastInput(); j++) {
+ if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+ }
+ }
+
+ public final void tryFillUsageSlots() {
+ int aSlotSpace = (mInputslotCount - getContentUsageSlots().size());
+ if (aSlotSpace > 0) {
+ Logger.INFO("We have empty usage slots. " + aSlotSpace);
+ for (int i = getSlotID_FirstInput(); i <= getSlotID_LastInput(); i++) {
+ ItemStack aStackToTryMove = mInventory[i];
+ if (aStackToTryMove != null && isItemValidForUsageSlot(aStackToTryMove)) {
+ Logger.INFO("Trying to move stack from input slot " + i);
+ if (moveItemFromStockToUsageSlots(aStackToTryMove)) {
+ Logger.INFO("Updating Slots.");
+ updateSlots();
+ }
+ }
+ }
+ }
+ }
+
+ private int getSlotID_FirstInput() {
+ return 0;
+ }
+
+ private int getSlotID_LastInput() {
+ return mInputslotCount - 1;
+ }
+
+ private int getSlotID_FirstUsage() {
+ return mInputslotCount;
+ }
+
+ private int getSlotID_LastUsage() {
+ return mTotalSlotCount - 1;
+ }
+
+ public final AutoMap<ItemStack> getContentUsageSlots() {
+ AutoMap<ItemStack> aItems = new AutoMap<>();
+ for (int i = mInputslotCount; i < mTotalSlotCount; i++) {
+ if (mInventory[i] != null) {
+ aItems.add(mInventory[i]);
+ }
+ }
+ return aItems;
+ }
+
+ public final boolean moveItemFromStockToUsageSlots(ItemStack aStack) {
+ return moveItemFromStockToUsageSlots(aStack, mAllowDuplicateUsageTypes);
+ }
+
+ public final boolean moveItemFromStockToUsageSlots(ItemStack aStack, boolean aAllowMultiOfSameTypeInUsageSlots) {
+ if (aStack != null) {
+ if (aStack.stackSize > 0) {
+
+ if (!isItemValidForUsageSlot(aStack)) {
+ Logger.INFO("Stack not valid: " + ItemUtils.getItemName(aStack));
+ return false;
+ }
+
+ // Copy the input stack into a new object
+ ItemStack aStackToMove = aStack.copy();
+ // Set stack size of stack to move to 1.
+ aStackToMove.stackSize = 1;
+ // Did we set a stack in the usage slots?
+ boolean aDidSet = false;
+ // Did we find another of this item already in the usage slots?
+ boolean aFoundMatching = false;
+ // Continue processing with our new stack
+ // First check for duplicates
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] != null) {
+ if (GT_Utility.areStacksEqual(aStackToMove, mInventory[i], true)) {
+ Logger.INFO("Found matching stack in slot " + i + ".");
+ aFoundMatching = true;
+ break;
+ }
+ }
+ }
+ // Then Move stack to Usage slots
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] == null) {
+ if ((aFoundMatching && aAllowMultiOfSameTypeInUsageSlots) || !aFoundMatching) {
+ mInventory[i] = aStackToMove;
+ aDidSet = true;
+ Logger.INFO("Moving new stack to usage slots.");
+ break;
+ }
+ }
+ }
+ if (aDidSet) {
+ Logger.INFO("Depleting input stack size by 1.");
+ // Depleted one from the original input stack
+ aStack.stackSize--;
+ }
+ return aDidSet;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing() && isItemValidForUsageSlot(aStack)
+ && aIndex < mInputslotCount;
+ }
+
+ /**
+ * Items that get compared when checking for Usage Slot validity. Can return an empty map if
+ * isItemValidForUsageSlot() is overridden.
+ *
+ * @return
+ */
+ public abstract AutoMap<ItemStack> getItemsValidForUsageSlots();
+
+ /**
+ * Checks if the given item is valid for Usage Slots. Can be overridden for easier handling if you already have
+ * methods to check this.
+ *
+ * @param aStack
+ * @return
+ */
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ if (aStack != null) {
+ for (ItemStack aValid : getItemsValidForUsageSlots()) {
+ if (GT_Utility.areStacksEqual(aStack, aValid, true)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ switch (mTotalSlotCount) {
+ case 8, 18 -> builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ case 32 -> builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(79, 35));
+ }
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTotalSlotCount) {
+ case 8 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(0)
+ .endAtSlot(3)
+ .build()
+ .setPos(25, 25));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(4)
+ .endAtSlot(7)
+ .canInsert(false)
+ .build()
+ .setPos(115, 25));
+ builder.widget(
+ new TextWidget("Stock").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(25, 16))
+ .widget(
+ new TextWidget("Active").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(115, 16));
+ }
+ case 18 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .build()
+ .setPos(25, 19));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(9)
+ .endAtSlot(17)
+ .canInsert(false)
+ .build()
+ .setPos(97, 19));
+ builder.widget(
+ new TextWidget("Stock").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(25, 14))
+ .widget(
+ new TextWidget("Active").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(15, 14));
+ }
+ case 32 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .build()
+ .setPos(7, 7));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(16)
+ .endAtSlot(31)
+ .canInsert(false)
+ .build()
+ .setPos(96, 7));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java
new file mode 100644
index 0000000000..6a780d227c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+
+/**
+ * Made this to get rid of deprecation warnings <i>everywhere</i>.
+ *
+ * @author Alkalus
+ *
+ */
+@SuppressWarnings("deprecation")
+public class GTPP_CopiedBlockTexture extends GT_CopiedBlockTexture {
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta, short[] aRGBa, boolean aAllowAlpha) {
+ super(aBlock, aMeta, aMeta, aRGBa, aAllowAlpha);
+ }
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta, short[] aRGBa) {
+ this(aBlock, aSide, aMeta, aRGBa, true);
+ }
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta) {
+ this(aBlock, aSide, aMeta, Dyes._NULL.mRGBa);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java
new file mode 100644
index 0000000000..0da0136193
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java
@@ -0,0 +1,27 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Made this to get rid of deprecation warnings <i>everywhere</i>.
+ *
+ * @author Alkalus
+ *
+ */
+@SuppressWarnings("deprecation")
+public class GTPP_RenderedTexture extends GT_RenderedTexture {
+
+ public GTPP_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) {
+ super(aIcon, aRGBa, aAllowAlpha);
+ }
+
+ public GTPP_RenderedTexture(IIconContainer aIcon, short[] aRGBa) {
+ this(aIcon, aRGBa, true);
+ }
+
+ public GTPP_RenderedTexture(IIconContainer aIcon) {
+ this(aIcon, Dyes._NULL.mRGBa);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java
new file mode 100644
index 0000000000..967d3ae916
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.objects.GT_ArrayList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechItemData {
+
+ private static final GregtechMaterialStack[] EMPTY_GT_MaterialStack_ARRAY = new GregtechMaterialStack[0];
+
+ public final List<Object> mExtraData = new GT_ArrayList<>(false, 1);
+ public final GregtechOrePrefixes mPrefix;
+ public final GregtechMaterialStack mMaterial;
+ public final GregtechMaterialStack[] mByProducts;
+ public boolean mBlackListed = false;
+ public ItemStack mUnificationTarget = null;
+
+ public GregtechItemData(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial,
+ final boolean aBlackListed) {
+ this.mPrefix = aPrefix;
+ this.mMaterial = aMaterial == null ? null : new GregtechMaterialStack(aMaterial, aPrefix.mMaterialAmount);
+ this.mBlackListed = aBlackListed;
+ this.mByProducts = (aPrefix.mSecondaryMaterial == null) || (aPrefix.mSecondaryMaterial.mMaterial == null)
+ ? EMPTY_GT_MaterialStack_ARRAY
+ : new GregtechMaterialStack[] { aPrefix.mSecondaryMaterial.clone() };
+ }
+
+ public GregtechItemData(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial) {
+ this(aPrefix, aMaterial, false);
+ }
+
+ public GregtechItemData(final GregtechMaterialStack aMaterial, final GregtechMaterialStack... aByProducts) {
+ this.mPrefix = null;
+ this.mMaterial = aMaterial.mMaterial == null ? null : aMaterial.clone();
+ this.mBlackListed = true;
+ if (aByProducts == null) {
+ this.mByProducts = EMPTY_GT_MaterialStack_ARRAY;
+ } else {
+ final GregtechMaterialStack[] tByProducts = aByProducts.length < 1 ? EMPTY_GT_MaterialStack_ARRAY
+ : new GregtechMaterialStack[aByProducts.length];
+ int j = 0;
+ for (GregtechMaterialStack aByProduct : aByProducts) {
+ if ((aByProduct != null) && (aByProduct.mMaterial != null)) {
+ tByProducts[j++] = aByProduct.clone();
+ }
+ }
+ this.mByProducts = j > 0 ? new GregtechMaterialStack[j] : EMPTY_GT_MaterialStack_ARRAY;
+ for (int i = 0; i < this.mByProducts.length; i++) {
+ this.mByProducts[i] = tByProducts[i];
+ }
+ }
+ }
+
+ public GregtechItemData(final GT_Materials aMaterial, final long aAmount,
+ final GregtechMaterialStack... aByProducts) {
+ this(new GregtechMaterialStack(aMaterial, aAmount), aByProducts);
+ }
+
+ public GregtechItemData(final GT_Materials aMaterial, final long aAmount, final GT_Materials aByProduct,
+ final long aByProductAmount) {
+ this(new GregtechMaterialStack(aMaterial, aAmount), new GregtechMaterialStack(aByProduct, aByProductAmount));
+ }
+
+ public GregtechItemData(final GregtechItemData... aData) {
+ this.mPrefix = null;
+ this.mBlackListed = true;
+
+ final ArrayList<GregtechMaterialStack> aList = new ArrayList<>(), rList = new ArrayList<>();
+
+ for (final GregtechItemData tData : aData) {
+ if (tData != null) {
+ if (tData.hasValidMaterialData() && (tData.mMaterial.mAmount > 0)) {
+ aList.add(tData.mMaterial.clone());
+ }
+ for (final GregtechMaterialStack tMaterial : tData.mByProducts) {
+ if (tMaterial.mAmount > 0) {
+ aList.add(tMaterial.clone());
+ }
+ }
+ }
+ }
+
+ for (final GregtechMaterialStack aMaterial : aList) {
+ boolean temp = true;
+ for (final GregtechMaterialStack tMaterial : rList) {
+ if (aMaterial.mMaterial == tMaterial.mMaterial) {
+ tMaterial.mAmount += aMaterial.mAmount;
+ temp = false;
+ break;
+ }
+ }
+ if (temp) {
+ rList.add(aMaterial.clone());
+ }
+ }
+
+ rList.sort((a, b) -> Long.compare(b.mAmount, a.mAmount));
+
+ if (rList.isEmpty()) {
+ this.mMaterial = null;
+ } else {
+ this.mMaterial = rList.get(0);
+ rList.remove(0);
+ }
+
+ this.mByProducts = rList.toArray(new GregtechMaterialStack[0]);
+ }
+
+ public boolean hasValidPrefixMaterialData() {
+ return (this.mPrefix != null) && (this.mMaterial != null) && (this.mMaterial.mMaterial != null);
+ }
+
+ public boolean hasValidPrefixData() {
+ return this.mPrefix != null;
+ }
+
+ public boolean hasValidMaterialData() {
+ return (this.mMaterial != null) && (this.mMaterial.mMaterial != null);
+ }
+
+ public ArrayList<GregtechMaterialStack> getAllGT_MaterialStacks() {
+ final ArrayList<GregtechMaterialStack> rList = new ArrayList<>();
+ if (this.hasValidMaterialData()) {
+ rList.add(this.mMaterial);
+ }
+ rList.addAll(Arrays.asList(this.mByProducts));
+ return rList;
+ }
+
+ public GregtechMaterialStack getByProduct(final int aIndex) {
+ return (aIndex >= 0) && (aIndex < this.mByProducts.length) ? this.mByProducts[aIndex] : null;
+ }
+
+ @Override
+ public String toString() {
+ if ((this.mPrefix == null) || (this.mMaterial == null) || (this.mMaterial.mMaterial == null)) {
+ return "";
+ }
+ return this.mPrefix.name() + this.mMaterial.mMaterial.name();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java
new file mode 100644
index 0000000000..d1ee02f480
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java
@@ -0,0 +1,55 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechMaterialStack implements Cloneable {
+
+ public long mAmount;
+ public GT_Materials mMaterial;
+
+ public GregtechMaterialStack(final GT_Materials aMaterial, final long aAmount) {
+ this.mMaterial = aMaterial == null ? GT_Materials._NULL : aMaterial;
+ this.mAmount = aAmount;
+ }
+
+ public GregtechMaterialStack copy(final long aAmount) {
+ return new GregtechMaterialStack(this.mMaterial, aAmount);
+ }
+
+ @Override
+ public GregtechMaterialStack clone() {
+ return new GregtechMaterialStack(this.mMaterial, this.mAmount);
+ }
+
+ @Override
+ public boolean equals(final Object aObject) {
+ if (aObject == this) {
+ return true;
+ }
+ if (aObject == null) {
+ return false;
+ }
+ if (aObject instanceof GT_Materials) {
+ return aObject == this.mMaterial;
+ }
+ if (aObject instanceof GregtechMaterialStack) {
+ return (((GregtechMaterialStack) aObject).mMaterial == this.mMaterial)
+ && ((this.mAmount < 0) || (((GregtechMaterialStack) aObject).mAmount < 0)
+ || (((GregtechMaterialStack) aObject).mAmount == this.mAmount));
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return ((this.mMaterial.mMaterialList.size() > 1) && (this.mAmount > 1) ? "(" : "")
+ + this.mMaterial.getToolTip(true)
+ + ((this.mMaterial.mMaterialList.size() > 1) && (this.mAmount > 1) ? ")" : "")
+ + (this.mAmount > 1 ? this.mAmount : "");
+ }
+
+ @Override
+ public int hashCode() {
+ return this.mMaterial.hashCode();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java
new file mode 100644
index 0000000000..65beea207a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java
@@ -0,0 +1,123 @@
+package gtPlusPlus.xmod.gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GTPP_Config implements Runnable {
+
+ public static boolean troll = false;
+
+ public static Configuration sConfigFileIDs;
+ public final Configuration mConfig;
+
+ public GTPP_Config(Configuration aConfig) {
+ mConfig = aConfig;
+ mConfig.load();
+ mConfig.save();
+ }
+
+ public static int addIDConfig(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = sConfigFileIDs.get(
+ aCategory.toString()
+ .replaceAll("\\|", "."),
+ aName.replaceAll("\\|", "."),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) sConfigFileIDs.save();
+ return rResult;
+ }
+
+ public static String getStackConfigName(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return E;
+ Object rName = GT_OreDictUnificator.getAssociation(aStack);
+ if (rName != null) return rName.toString();
+ try {
+ if (GT_Utility.isStringValid(rName = aStack.getUnlocalizedName())) return rName.toString();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ String sName = aStack.getItem()
+ .toString();
+ String[] tmp = sName.split("@");
+ if (tmp.length > 0) sName = tmp[0];
+ return sName + "." + aStack.getItemDamage();
+ }
+
+ public boolean get(Object aCategory, ItemStack aStack, boolean aDefault) {
+ String aName = getStackConfigName(aStack);
+ return get(aCategory, aName, aDefault);
+ }
+
+ public boolean get(Object aCategory, String aName, boolean aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ boolean rResult = tProperty.getBoolean(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public int get(Object aCategory, ItemStack aStack, int aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public int get(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public double get(Object aCategory, ItemStack aStack, double aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public double get(Object aCategory, String aName, double aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ double rResult = tProperty.getDouble(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public String get(Object aCategory, ItemStack aStack, String aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public String get(Object aCategory, String aName, String aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ String rResult = tProperty.getString();
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ @Override
+ public void run() {
+ mConfig.save();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java
new file mode 100644
index 0000000000..df95b7de2b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.xmod.gregtech.api.util;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.util.GT_Utility;
+
+public class SpecialBehaviourTooltipHandler {
+
+ private static final HashMap<ItemStack, String> mTooltipCache = new HashMap<>();
+
+ public static void addTooltipForItem(ItemStack aStack, String aTooltip) {
+ mTooltipCache.put(aStack, aTooltip);
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent event) {
+ if (event != null) {
+ if (event.itemStack != null) {
+ for (ItemStack aKey : mTooltipCache.keySet()) {
+ if (GT_Utility.areStacksEqual(aKey, event.itemStack, false)) {
+ String s = mTooltipCache.get(aKey);
+ if (s != null && s.length() > 0) {
+ event.toolTip.add(EnumChatFormatting.RED + s);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
new file mode 100644
index 0000000000..c53e217560
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.common;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.AchievementHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.LangUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.common.covers.CoverManager;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class Meta_GT_Proxy {
+
+ public static AchievementHandler mAssemblyAchievements;
+
+ public Meta_GT_Proxy() {}
+
+ public static void preInit() {
+ fixIC2FluidNames();
+ CoverManager.generateCustomCovers();
+ }
+
+ public static void init() {
+ PollutionUtils.setPollutionFluids();
+ fixIC2FluidNames();
+ }
+
+ public static void postInit() {
+ mAssemblyAchievements = new AchievementHandler();
+ fixIC2FluidNames();
+
+ // Finalise TAE
+ TAE.finalizeTAE();
+ }
+
+ @SuppressWarnings("deprecation")
+ public static void fixIC2FluidNames() {
+ // Fix IC2 Hot Water name
+ try {
+ String aNewHeatedWaterName = "Heated Water";
+ Logger.INFO("Renaming [IC2 Hotspring Water] --> [" + aNewHeatedWaterName + "].");
+ LanguageRegistry.instance()
+ .addStringLocalization("fluidHotWater", "Heated Water");
+ LanguageRegistry.instance()
+ .addStringLocalization("fluidHotWater", aNewHeatedWaterName);
+ LanguageRegistry.instance()
+ .addStringLocalization("ic2.fluidHotWater", aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization("fluidHotWater", aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization("ic2.fluidHotWater", aNewHeatedWaterName);
+
+ Block b = BlocksItems.getFluidBlock(InternalName.fluidHotWater);
+ if (b != null) {
+ LanguageRegistry.addName(ItemUtils.getSimpleStack(b), aNewHeatedWaterName);
+ LanguageRegistry.instance()
+ .addStringLocalization(b.getUnlocalizedName(), aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization(b.getUnlocalizedName(), aNewHeatedWaterName);
+ }
+ Fluid f = BlocksItems.getFluid(InternalName.fluidHotWater);
+ if (f != null) {
+ LanguageRegistry.instance()
+ .addStringLocalization(f.getUnlocalizedName(), aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization(f.getUnlocalizedName(), aNewHeatedWaterName);
+ int aDam = FluidRegistry.getFluidID(f);
+ ItemStack s = ItemList.Display_Fluid.getWithDamage(1, aDam);
+ if (s != null) {
+ LanguageRegistry.addName(s, aNewHeatedWaterName);
+ }
+ }
+
+ String[] aLangs = new String[] { "de_DE", "en_US", "en_GB", "en_IC", "es_AR", "es_ES", "es_MX", "es_UY",
+ "es_VE", "fr_CA", "fr_FR", "it_IT", "ko_KR", "pt_BR", "pt_PT", "ru_RU", "sv_SE", "tr_TR", "zh_CN",
+ "zh_TW", };
+ String[] aLangValues = new String[] { "Erhitztes Wasser", "Heated Water", "Heated Water", "Heated Water",
+ "Agua caliente", "Agua caliente", "Agua caliente", "Agua caliente", "Agua caliente", "Eau chauffée",
+ "Eau chauffée", "Acqua riscaldata", "온수", "Água aquecida", "Água aquecida", "Вода с подогревом",
+ "Uppvärmt vatten", "Isıtılmış Su", "热水", "热水", };
+ for (int i = 0; i < aLangs.length; i++) {
+ Logger
+ .REFLECTION("Trying to inject new lang data for " + aLangs[i] + ", using value: " + aLangValues[i]);
+ LangUtils.rewriteEntryForLanguageRegistry(aLangs[i], "fluidHotWater", aLangValues[i]);
+ LangUtils.rewriteEntryForLanguageRegistry(aLangs[i], "ic2.fluidHotWater", aLangValues[i]);
+ }
+ } catch (Throwable t) {
+
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java
new file mode 100644
index 0000000000..ee0d040394
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler;
+
+public class GregtechMetaCasingBlocks extends GregtechMetaCasingBlocksAbstract {
+
+ CasingTextureHandler TextureHandler = new CasingTextureHandler();
+
+ public GregtechMetaCasingBlocks() {
+ super(GregtechMetaCasingItems.class, "miscutils.blockcasings", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 2 || i == 3 || i == 4) {
+ continue;
+ }
+ TAE.registerTexture(0, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Centrifuge Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Structural Coke Oven Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Heat Resistant Coke Oven Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Heat Proof Coke Oven Casing"); // 60
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Material Press Machine Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Electrolyzer Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Wire Factory Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Maceration Stack Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Matter Generation Coil"); // 65
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Matter Fabricator Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Iron Plated Bricks");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Multitank Exterior Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Hastelloy-N Reactor Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Zeron-100 Reactor Shielding");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".14.name", "Blast Smelter Heat Containment Coil ");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Blast Smelter Casing Block");
+ GregtechItemList.Casing_Centrifuge1.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_CokeOven.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_CokeOven_Coil1.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_CokeOven_Coil2.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_MaterialPress.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Electrolyzer.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_WireFactory.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_MacerationStack.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_MatterGen.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_MatterFab.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_IronPlatedBricks.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_MultitankExterior.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Reactor_I.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Reactor_II.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_Coil_BlastSmelter.set(new ItemStack(this, 1, 14));
+ GregtechItemList.Casing_BlastSmelter.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ return CasingTextureHandler.getIcon(ordinalSide, aMeta);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final GregtechMetaCasingBlocks i = this;
+ return CasingTextureHandler
+ .handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(ordinalSide), i);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java
new file mode 100644
index 0000000000..9d53c281a2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler2;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechMetaCasingBlocks2 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ aList.add(new ItemStack(aItem, 1, 2));
+ aList.add(new ItemStack(aItem, 1, 3));
+ aList.add(new ItemStack(aItem, 1, 4));
+ aList.add(new ItemStack(aItem, 1, 5));
+ aList.add(new ItemStack(aItem, 1, 6));
+ aList.add(new ItemStack(aItem, 1, 7));
+ aList.add(new ItemStack(aItem, 1, 8));
+ aList.add(new ItemStack(aItem, 1, 9));
+ aList.add(new ItemStack(aItem, 1, 10));
+ aList.add(new ItemStack(aItem, 1, 11));
+ aList.add(new ItemStack(aItem, 1, 12));
+ aList.add(new ItemStack(aItem, 1, 13));
+
+ aList.add(new ItemStack(aItem, 1, 15));
+
+ }
+
+ public static class GregtechMetaCasingItemBlocks2 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks2(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int meta = aStack.getItemDamage();
+ int tier = GregtechMetaTileEntity_PowerSubStationController.getCellTier(field_150939_a, meta);
+ if (meta == 7 && tier > 0) {
+ long capacity = GregtechMetaTileEntity_PowerSubStationController.getCapacityFromCellTier(tier);
+ aList.add("Energy Storage: " + GT_Utility.formatNumbers(capacity));
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks2() {
+ super(GregtechMetaCasingItemBlocks2.class, "gtplusplus.blockcasings.2", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 4 || i == 10 || i == 11 || i == 12 || i == 14) {
+ continue;
+ }
+ TAE.registerTexture(1, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Thermal Processing Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Hastelloy-N Sealant Block");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Hastelloy-X Structural Block");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Incoloy-DS Fluid Containment Block");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Wash Plant Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Industrial Sieve Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Large Sieve Grate");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".7.name", "Vanadium Redox Power Cell (EV)");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Sub-Station External Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Cyclotron Coil");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Cyclotron Outer Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Thermal Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Bulk Production Frame");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Cutting Factory Frame");
+
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Sterile Farm Casing");
+
+ GregtechItemList.Casing_ThermalCentrifuge.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Refinery_External.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Refinery_Structural.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Refinery_Internal.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_WashPlant.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Sifter.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_SifterGrate.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_Vanadium_Redox.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_Power_SubStation.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_Cyclotron_Coil.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_Cyclotron_External.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_ThermalContainment.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Autocrafter.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_CuttingFactoryFrame.set(new ItemStack(this, 1, 13));
+
+ GregtechItemList.Casing_PLACEHOLDER_TreeFarmer.set(new ItemStack(this, 1, 15)); // Tree Farmer Textures
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler2.getIcon(ordinalSide, aMeta);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java
new file mode 100644
index 0000000000..76fb077de1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java
@@ -0,0 +1,379 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler3;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechMetaCasingBlocks3 extends GregtechMetaCasingBlocksAbstract {
+
+ public static boolean mConnectedMachineTextures = false;
+ CasingTextureHandler3 TextureHandler = new CasingTextureHandler3();
+
+ public static class GregtechMetaCasingItemBlocks3 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks3(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int meta = aStack.getItemDamage();
+ int tier = GregtechMetaTileEntity_PowerSubStationController.getCellTier(field_150939_a, meta);
+ if (tier > 0) {
+ long capacity = GregtechMetaTileEntity_PowerSubStationController.getCapacityFromCellTier(tier);
+ aList.add("Energy Storage: " + GT_Utility.formatNumbers(capacity));
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks3() {
+ super(GregtechMetaCasingItemBlocks3.class, "gtplusplus.blockcasings.3", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // Free up Redox casing in TAE
+ if (i >= 4 && i <= 8) {
+ continue;
+ }
+ TAE.registerTexture(2, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Aquatic Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Inconel Reinforced Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Multi-Use Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Trinium Plated Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Vanadium Redox Power Cell (IV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".5.name", "Vanadium Redox Power Cell (LuV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".6.name", "Vanadium Redox Power Cell (ZPM)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".7.name", "Vanadium Redox Power Cell (UV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".8.name", "Vanadium Redox Power Cell (UHV)");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Supply Depot Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Advanced Cryogenic Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Volcanus Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "Fusion Machine Casing MK III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Advanced Fusion Coil");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "Unnamed"); // Can Use, don't
+ // change texture
+ // (Used for Fusion
+ // MK4)
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Containment Casing");
+ GregtechItemList.Casing_FishPond.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Extruder.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Multi_Use.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_BedrockMiner.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Vanadium_Redox_IV.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Vanadium_Redox_LuV.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_Vanadium_Redox_ZPM.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_Vanadium_Redox_UV.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_Vanadium_Redox_MAX.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_AmazonWarehouse.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_AdvancedVacuum.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_Adv_BlastFurnace.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Fusion_External.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Fusion_Internal.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_Containment.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler3.getIcon(ordinalSide, aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final Block thisBlock = aWorld.getBlock(xCoord, yCoord, zCoord);
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ if ((tMeta != 12) || !GregtechMetaCasingBlocks3.mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+ final int tStartIndex = 0;
+ if (tMeta == 12) {
+ final boolean[] tConnectedSides = {
+ aWorld.getBlock(xCoord, yCoord - 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord - 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord + 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord + 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord + 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord + 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord + 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord + 1) == tMeta,
+ aWorld.getBlock(xCoord - 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord - 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord - 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord - 1) == tMeta };
+ switch (ordinalSide) {
+ case 0: {
+ if (tConnectedSides[0]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[5] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 1: {
+ if (tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 2: {
+ if (tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 3: {
+ if (tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 4: {
+ if (tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ }
+ case 5: {
+ if (tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ break;
+ }
+ }
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ return CasingTextureHandler3.getIcon(ordinalSide, tMeta);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java
new file mode 100644
index 0000000000..a150d7e828
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks4 extends GregtechMetaCasingBlocksAbstract {
+
+ public GregtechMetaCasingBlocks4() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.4", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 2 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 12 || i == 13 || i == 14 || i == 15) {
+ continue;
+ }
+ TAE.registerTexture(3, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Naquadah Reactor Base");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Reactor Piping");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Naquadah Containment Chamber");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Tempered Arc Furnace Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Quantum Force Transformer Coil Casings");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Vacuum Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Turbodyne Casing");
+
+ GregtechItemList.Casing_Naq_Reactor_A.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Naq_Reactor_B.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Naq_Reactor_C.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Industrial_Arc_Furnace.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Vacuum_Furnace.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_RocketEngine.set(new ItemStack(this, 1, 11));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final byte aSide, final byte aMeta) {
+ // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.Casing_Trinium_Titanium.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.TEXTURE_TECH_C.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.TEXTURE_ORGANIC_PANEL_A_GLOWING.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.TEXTURE_METAL_PANEL_A.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Coil_QFT.getIcon();
+ }
+ case 5 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 6 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 7 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 8 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 9 -> {
+ return TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ }
+ case 10 -> {
+ if (aSide < 2) {
+ return TexturesGtBlock.TEXTURE_STONE_RED_B.getIcon();
+ } else {
+ return TexturesGtBlock.TEXTURE_STONE_RED_A.getIcon();
+ }
+ }
+ case 11 -> {
+ return TexturesGtBlock.TEXTURE_CASING_ROCKETDYNE.getIcon();
+ }
+ case 12 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 13 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 14 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 15 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ default -> {
+ return TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ }
+ }
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ aList.add(new ItemStack(aItem, 1, 2));
+ aList.add(new ItemStack(aItem, 1, 3));
+ aList.add(new ItemStack(aItem, 1, 4));
+
+ aList.add(new ItemStack(aItem, 1, 10));
+ aList.add(new ItemStack(aItem, 1, 11));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java
new file mode 100644
index 0000000000..cc573cd188
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGrinderMultiblock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks5 extends GregtechMetaCasingBlocksAbstract {
+
+ // Free Indexes within TAE: 91, 92, 94, 100, 101, 102, 103, 104, 114, 116, 117, 118, 119, 120, 121, 124, 125, 126,
+ // 127
+ // 19 Free Indexes
+ private static final TexturesGrinderMultiblock mGrinderOverlayHandler = new TexturesGrinderMultiblock();
+
+ public GregtechMetaCasingBlocks5() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.5", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "IsaMill Exterior Casing"); // IsaMill
+ // Casing
+ TAE.registerTexture(0, 2, new GTPP_CopiedBlockTexture(this, 6, 0));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "IsaMill Piping"); // IsaMill
+ // Pipe
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "IsaMill Gearbox"); // IsaMill
+ // Gearbox
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Elemental Confinement Shell"); // Duplicator
+ // Casing
+ TAE.registerTexture(0, 3, new GTPP_CopiedBlockTexture(this, 6, 3));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Sparge Tower Exterior Casing"); // Sparge
+ // Tower
+ // Casing
+ TAE.registerTexture(0, 4, new GTPP_CopiedBlockTexture(this, 6, 4));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Sturdy Printer Casing"); // Unused
+ TAE.registerTexture(1, 10, new GTPP_CopiedBlockTexture(this, 6, 5));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Forge Casing"); // Forge Hammer
+ // Casing
+ TAE.registerTexture(1, 11, new GTPP_CopiedBlockTexture(this, 6, 6));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Neutron Pulse Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Cosmic Fabric Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Infinity Infused Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "SpaceTime Continuum Ripper");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Neutron Shielding Core");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "Cosmic Fabric Shielding Core");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".13.name", "Infinity Infused Shielding Core");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "SpaceTime Bending Core");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Force Field Glass");
+
+ GregtechItemList.Casing_IsaMill_Casing.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_IsaMill_Pipe.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_IsaMill_Gearbox.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_ElementalDuplicator.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Sparge_Tower_Exterior.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_IndustrialAutoChisel.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_IndustrialForgeHammer.set(new ItemStack(this, 1, 6));
+ GregtechItemList.NeutronPulseManipulator.set(new ItemStack(this, 1, 7));
+ GregtechItemList.CosmicFabricManipulator.set(new ItemStack(this, 1, 8));
+ GregtechItemList.InfinityInfusedManipulator.set(new ItemStack(this, 1, 9));
+ GregtechItemList.SpaceTimeContinuumRipper.set(new ItemStack(this, 1, 10));
+ GregtechItemList.NeutronShieldingCore.set(new ItemStack(this, 1, 11));
+ GregtechItemList.CosmicFabricShieldingCore.set(new ItemStack(this, 1, 12));
+ GregtechItemList.InfinityInfusedShieldingCore.set(new ItemStack(this, 1, 13));
+ GregtechItemList.SpaceTimeBendingCore.set(new ItemStack(this, 1, 14));
+ GregtechItemList.ForceFieldGlass.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon(ordinalSide, aMeta);
+ }
+
+ public static IIcon getStaticIcon(final int ordinalSide, final int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.TEXTURE_PIPE_GRINDING_MILL.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.TEXTURE_CASING_GRINDING_MILL.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.TEXTURE_GEARBOX_GRINDING_MILL.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.TEXTURE_TECH_PANEL_D.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_H.getIcon();
+ }
+ case 5 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_I.getIcon();
+ }
+ case 6 -> {
+ return TexturesGtBlock.TEXTURE_TECH_PANEL_H.getIcon();
+ }
+ case 7 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.NeutronPulseManipulator.getIcon();
+ }
+ case 8 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.CosmicFabricManipulator.getIcon();
+ }
+ case 9 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.InfinityInfusedManipulator.getIcon();
+ }
+ case 10 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.SpaceTimeContinuumRipper.getIcon();
+ }
+ case 11 -> {
+ return TexturesGtBlock.NeutronShieldingCore.getIcon();
+ }
+ case 12 -> {
+ return TexturesGtBlock.CosmicFabricShieldingCore.getIcon();
+ }
+ case 13 -> {
+ return TexturesGtBlock.InfinityInfusedShieldingCore.getIcon();
+ }
+ case 14 -> {
+ return TexturesGtBlock.SpaceTimeBendingCore.getIcon();
+ }
+ case 15 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Blank.getIcon();
+ }
+ return TexturesGtBlock.ForceFieldGlass.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final GregtechMetaCasingBlocks5 i = this;
+ return mGrinderOverlayHandler.handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ordinalSide, i);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java
new file mode 100644
index 0000000000..d257078461
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java
@@ -0,0 +1,341 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler6;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks6 extends GregtechMetaCasingBlocksAbstract {
+
+ public static boolean mConnectedMachineTextures = false;
+ CasingTextureHandler6 TextureHandler = new CasingTextureHandler6();
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 3; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class GregtechMetaCasingItemBlocks3 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks3(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks6() {
+ super(GregtechMetaCasingItemBlocks3.class, "gtplusplus.blockcasings.6", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Fusion Machine Casing MK IV");
+ TAE.registerTexture(3, 4, new GTPP_CopiedBlockTexture(this, 6, 0));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Advanced Fusion Coil II");
+ TAE.registerTexture(3, 5, new GTPP_CopiedBlockTexture(this, 6, 1));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Unnamed");
+ TAE.registerTexture(3, 6, new GTPP_CopiedBlockTexture(this, 6, 2));
+ GregtechItemList.Casing_Fusion_External2.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Fusion_Internal2.set(new ItemStack(this, 1, 1));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler6.getIcon(ordinalSide, aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final Block thisBlock = aWorld.getBlock(xCoord, yCoord, zCoord);
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ if ((tMeta != 0) || !GregtechMetaCasingBlocks6.mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+ final int tStartIndex = 0;
+ if (tMeta == 0) {
+ final boolean[] tConnectedSides = {
+ aWorld.getBlock(xCoord, yCoord - 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord - 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord + 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord + 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord + 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord + 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord + 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord + 1) == tMeta,
+ aWorld.getBlock(xCoord - 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord - 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord - 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord - 1) == tMeta };
+ switch (ordinalSide) {
+ case 0: {
+ if (tConnectedSides[0]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[5] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 1: {
+ if (tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 2: {
+ if (tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 3: {
+ if (tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 4: {
+ if (tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ }
+ case 5: {
+ if (tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ break;
+ }
+ }
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ return CasingTextureHandler6.getIcon(ordinalSide, tMeta);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java
new file mode 100644
index 0000000000..a87f6c92b3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java
@@ -0,0 +1,151 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public abstract class GregtechMetaCasingBlocksAbstract extends GT_Block_Casings_Abstract {
+
+ public GregtechMetaCasingBlocksAbstract(final Class<? extends ItemBlock> aItemClass, final String aName,
+ final Material aMaterial) {
+ super(aItemClass, aName, aMaterial);
+ this.setStepSound(soundTypeMetal);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GregTech_API.registerMachineBlock(this, -1);
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this");
+ }
+
+ @Override
+ public String getHarvestTool(final int aMeta) {
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(final int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(final World aWorld, final int aX, final int aY, final int aZ) {
+ return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(final Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded(final World aWorld, final int aX, final int aY, final int aZ) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(final IBlockAccess aWorld, final int aX, final int aY, final int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(final IBlockAccess aWorld, final int aX, final int aY, final int aZ) {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public void breakBlock(final World aWorld, final int aX, final int aY, final int aZ, final Block aBlock,
+ final int aMetaData) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(final int par1) {
+ return par1;
+ }
+
+ @Override
+ public int getDamageValue(final World par1World, final int par2, final int par3, final int par4) {
+ return par1World.getBlockMetadata(par2, par3, par4);
+ }
+
+ @Override
+ public int quantityDropped(final Random par1Random) {
+ return 1;
+ }
+
+ @Override
+ public Item getItemDropped(final int par1, final Random par2Random, final int par3) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(final Item aItem, final CreativeTabs par2CreativeTabs, final List aList) {
+ for (int i = 0; i < 16; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java
new file mode 100644
index 0000000000..ad2b11f924
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.HashMap;
+
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocksPipeGearbox extends GregtechMetaCasingBlocksAbstract {
+
+ private static HashMap<Integer, Integer> sMaterialMapping = new HashMap<>();
+
+ public GregtechMetaCasingBlocksPipeGearbox() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.pipesgears", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Eglin Steel Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Inconel-792 Gear Box Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Incoloy MA956 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Nitinol-60 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Zeron-100 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Pikyonium Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Titansteel Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Abyssal Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Babbit Alloy Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Inconel-690 Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Stellite Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Nitinol-60 Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Lafium Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Cinobite Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "Titansteel Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Abyssal Pipe Casing");
+
+ int aMappingID = 0;
+ sMaterialMapping.put(aMappingID++, ALLOY.EGLIN_STEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCONEL_792.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCOLOY_MA956.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.NITINOL_60.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ZERON_100.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.PIKYONIUM.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.TITANSTEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ABYSSAL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.BABBIT_ALLOY.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCONEL_690.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.STELLITE.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.NITINOL_60.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.LAFIUM.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.CINOBITE.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.TITANSTEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ABYSSAL.getRgbAsHex());
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ if ((meta >= 0) && (meta < 16)) {
+ switch (meta) {
+ case 0, 1, 2, 3, 4, 5, 6, 7 -> {
+ return TexturesGtBlock.TEXTURE_GEARBOX_GENERIC.getIcon();
+ }
+ case 8, 9, 10, 11, 12, 13, 14, 15 -> {
+ return TexturesGtBlock.TEXTURE_PIPE_GENERIC.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return sMaterialMapping.get(par1IBlockAccess.getBlockMetadata(par2, par3, par4));
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return sMaterialMapping.get(aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int getBlockColor() {
+ return super.getBlockColor();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java
new file mode 100644
index 0000000000..f86c6af265
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+public class GregtechMetaCasingItems extends GregtechMetaItemCasingsAbstract {
+
+ public GregtechMetaCasingItems(final Block par1) {
+ super(par1);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java
new file mode 100644
index 0000000000..23d9ab5007
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+
+public abstract class GregtechMetaItemCasingsAbstract extends ItemBlock {
+
+ protected final String mCasing_Centrifuge = GT_LanguageManager
+ .addStringLocalization("mu.centrifugecasing", "Warning! Standing in the Centrifuge not recommended");
+ protected final String mCasing_CokeOven = GT_LanguageManager
+ .addStringLocalization("mu.cokeoven", "Sturdy and Strong");
+ protected final String mCasing_CokeCoil1 = GT_LanguageManager
+ .addStringLocalization("mu.coil01tooltip", "Base Heating Capacity = 1350 Kelvin");
+ protected final String mCasing_CokeCoil2 = GT_LanguageManager
+ .addStringLocalization("mu.coil02tooltip", "Base Heating Capacity = 2275 Kelvin");
+ protected final String mNoMobsToolTip = GT_LanguageManager
+ .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
+ protected final String mNoTileEntityToolTip = GT_LanguageManager
+ .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!");
+
+ public GregtechMetaItemCasingsAbstract(final Block par1) {
+ super(par1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ // setCreativeTab(AddToCreativeTab.tabMachines);
+ }
+
+ @Override
+ public int getMetadata(final int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + this.getDamage(aStack);
+ }
+
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, final List aList,
+ final boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ switch (this.getDamage(aStack)) {
+ case 0:
+ // aList.add(this.mCasing_Centrifuge);
+ break;
+ case 1:
+ // aList.add(this.mCasing_CokeOven);
+ break;
+ case 2:
+ // aList.add(this.mCasing_CokeCoil1);
+ break;
+ case 3:
+ // aList.add(this.mCasing_CokeCoil2);
+ break;
+ default:
+ break;
+ }
+ aList.add(this.mNoMobsToolTip);
+ aList.add(this.mNoTileEntityToolTip);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java
new file mode 100644
index 0000000000..473c13f3da
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaSpecialMachineCasings extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 4; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ // aList.add("Tier: "+GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMachineCasings() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.2", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // TAE.registerTextures(new GT_CopiedBlockTexture(this, 6, i));
+ // Don't register these Textures, They already exist within vanilla GT. (May not exist in 5.08)
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Strong Bronze Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".1.name", "Sturdy Aluminium Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Vigorous Laurenium Machine Casing");
+ TAE.registerTexture(84, new GTPP_CopiedBlockTexture(this, 6, 2));
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Rugged Botmium Machine Casing");
+
+ GregtechItemList.Casing_Machine_Custom_1.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Machine_Custom_2.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Machine_Custom_3.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Machine_Custom_4.set(new ItemStack(this, 1, 3));
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_FROST_PROOF.getIcon();
+ case 2 -> TexturesGtBlock.Casing_Material_Laurenium.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_HEATPROOFCASING.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java
new file mode 100644
index 0000000000..1d7c853e71
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java
@@ -0,0 +1,120 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.turbine.LargeTurbineTextureHandler;
+
+public class GregtechMetaSpecialMultiCasings extends GregtechMetaCasingBlocksAbstract {
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ // aList.add("Tier: "+GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMultiCasings() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.1", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Turbine Shaft");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".1.name", "Reinforced Steam Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Reinforced HP Steam Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Reinforced Gas Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Reinforced Plasma Turbine Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Tesla Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Structural Solar Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Salt Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Thermally Insulated Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Flotation Cell Casings");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Reinforced Engine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".11.name", "Molecular Containment Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "High Voltage Current Capacitor");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Particle Containment Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".14.name", "Reinforced Heat Exchanger Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".15.name", "Reinforced SC Turbine Casing");
+ TAE.registerTexture(1, 12, new GTPP_CopiedBlockTexture(this, 6, 14));
+
+ GregtechItemList.Casing_Turbine_Shaft.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Turbine_LP.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Turbine_HP.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Turbine_Gas.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Turbine_Plasma.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_SolarTower_Structural.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_SolarTower_SaltContainment.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_SolarTower_HeatContainment.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_Flotation_Cell.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_Reinforced_Engine_Casing.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_Molecular_Transformer_1.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Molecular_Transformer_2.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Molecular_Transformer_3.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_XL_HeatExchanger.set(new ItemStack(this, 1, 14));
+ GregtechItemList.Casing_Turbine_SC.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ return LargeTurbineTextureHandler
+ .handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(ordinalSide), this);
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final int ordinalSide, final byte aMeta) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.Casing_Redox_1.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_TURBINE.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ case 5 -> TexturesGtBlock.Casing_Material_RedSteel.getIcon();
+ case 6 -> TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ case 7 -> TexturesGtBlock.Casing_Material_Stellite.getIcon();
+ case 8 -> TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ case 9 -> TexturesGtBlock.TEXTURE_CASING_FLOTATION.getIcon();
+ case 10 -> TexturesGtBlock.Casing_Material_Talonite.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon();
+ case 12 -> TexturesGtBlock.Casing_Redox_5.getIcon();
+ case 13 -> TexturesGtBlock.TEXTURE_MAGIC_PANEL_B.getIcon();
+ case 14 -> TexturesGtBlock.Casing_Material_Talonite.getIcon();
+ case 15 -> TexturesGtBlock.Turbine_SC_Material_Casing.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java
new file mode 100644
index 0000000000..9a2912c2c5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java
@@ -0,0 +1,99 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaSpecialMultiCasings2 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 8; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 4) {
+ aList.add("Provides quantum stability");
+ }
+ if (aMeta >= 4 && aMeta < 8) {
+ aList.add("Provides quantum modulation");
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMultiCasings2() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.3", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // TAE.registerTextures(new GT_CopiedBlockTexture(this, 6, i));
+ // Don't register these Textures, They already exist within vanilla GT. (May not exist in 5.08)
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Resonance Chamber I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Resonance Chamber II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Resonance Chamber III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Resonance Chamber IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Modulator I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Modulator II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Modulator III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Modulator IV");
+
+ GregtechItemList.ResonanceChamber_I.set(new ItemStack(this, 1, 0));
+ GregtechItemList.ResonanceChamber_II.set(new ItemStack(this, 1, 1));
+ GregtechItemList.ResonanceChamber_III.set(new ItemStack(this, 1, 2));
+ GregtechItemList.ResonanceChamber_IV.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Modulator_I.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Modulator_II.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Modulator_III.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Modulator_IV.set(new ItemStack(this, 1, 7));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ return getStaticIcon((byte) ordinalSide, (byte) aWorld.getBlockMetadata(xCoord, yCoord, zCoord));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final byte aSide, final byte aMeta) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.Casing_Resonance_1.getIcon();
+ case 1 -> TexturesGtBlock.Casing_Resonance_2.getIcon();
+ case 2 -> TexturesGtBlock.Casing_Resonance_3.getIcon();
+ case 3 -> TexturesGtBlock.Casing_Resonance_4.getIcon();
+ case 4 -> TexturesGtBlock.Casing_Modulator_1.getIcon();
+ case 5 -> TexturesGtBlock.Casing_Modulator_2.getIcon();
+ case 6 -> TexturesGtBlock.Casing_Modulator_3.getIcon();
+ case 7 -> TexturesGtBlock.Casing_Modulator_4.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java
new file mode 100644
index 0000000000..7ddab1c471
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTieredCasingBlocks1 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 10; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class TieredCasingItemBlock extends GregtechMetaCasingItems {
+
+ public TieredCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ aList.add("Tier: " + GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaTieredCasingBlocks1() {
+ super(TieredCasingItemBlock.class, "gtplusplus.blocktieredcasings.1", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Integral Encasement I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Integral Encasement II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Integral Encasement III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Integral Encasement IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Integral Encasement V");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Integral Framework I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Integral Framework II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Integral Framework III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Integral Framework IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Integral Framework V");
+
+ GregtechItemList.GTPP_Casing_ULV.set(new ItemStack(this, 1, 0));
+ GregtechItemList.GTPP_Casing_LV.set(new ItemStack(this, 1, 1));
+ GregtechItemList.GTPP_Casing_MV.set(new ItemStack(this, 1, 2));
+ GregtechItemList.GTPP_Casing_HV.set(new ItemStack(this, 1, 3));
+ GregtechItemList.GTPP_Casing_EV.set(new ItemStack(this, 1, 4));
+ GregtechItemList.GTPP_Casing_IV.set(new ItemStack(this, 1, 5));
+ GregtechItemList.GTPP_Casing_LuV.set(new ItemStack(this, 1, 6));
+ GregtechItemList.GTPP_Casing_ZPM.set(new ItemStack(this, 1, 7));
+ GregtechItemList.GTPP_Casing_UV.set(new ItemStack(this, 1, 8));
+ GregtechItemList.GTPP_Casing_UHV.set(new ItemStack(this, 1, 9));
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if (aMeta < 10) {
+ return TexturesGtBlock.TIERED_MACHINE_HULLS[aMeta].getIcon();
+ }
+ return switch (aMeta) {
+ case 10 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 11 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 12 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 13 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 14 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 15 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java
new file mode 100644
index 0000000000..e478bf5c18
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java
@@ -0,0 +1,146 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.fluid;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechFluidHandler {
+
+ protected static int cellID = 0;
+
+ public static void run() {
+ start();
+ }
+
+ private static void start() {
+ Logger.INFO("Adding in our own GT versions of Thermal Foundation Fluids if they do not already exist.");
+ if (!FluidRegistry.isFluidRegistered("cryotheum")) {
+ FluidUtils.addGtFluid(
+ "cryotheum",
+ "Gelid Cryotheum",
+ GT_Materials.Cryotheum,
+ 4,
+ -1200,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Cryotheum, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ if (!FluidRegistry.isFluidRegistered("pyrotheum")) {
+ FluidUtils.addGtFluid(
+ "pyrotheum",
+ "Blazing Pyrotheum",
+ GT_Materials.Pyrotheum,
+ 4,
+ 4000,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Pyrotheum, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ if (!FluidRegistry.isFluidRegistered("ender")) {
+ FluidUtils.addGtFluid(
+ "ender",
+ "Resonant Ender",
+ GT_Materials.Ender,
+ 4,
+ 4000,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Ender, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ Logger.INFO("Adding in GT Fluids for various nuclear related content.");
+
+ FluidUtils.addGtFluid(
+ "hydrofluoricAcid",
+ "Industrial Strength Hydrofluoric Acid",
+ GT_Materials.HydrofluoricAcid,
+ 1,
+ 120,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.HydrofluoricAcid, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("HydrofluoricAcid");
+
+ FluidUtils.generateFluidNoPrefix(
+ "SulfurDioxide",
+ "High Quality Sulfur Dioxide",
+ 263,
+ GT_Materials.SulfurDioxide.mRGBa);
+
+ FluidUtils.addGtFluid(
+ "sulfurousAcid",
+ "Sulfurous Acid",
+ GT_Materials.SulfurousAcid,
+ 4,
+ 75,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfurousAcid, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfurousAcid");
+
+ FluidUtils.addGtFluid(
+ "sulfuricApatite",
+ "Sulfuric Apatite Mix",
+ GT_Materials.SulfuricApatite,
+ 4,
+ 500,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfuricApatite, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfuricApatite");
+
+ // Check for Hydrogen Chloride
+ if (FluidUtils.getFluidStack("hydrogenchloride", 1) == null) {
+ FluidUtils.addGtFluid(
+ "hydrogenChloride",
+ "Industrial Strength Hydrogen Chloride",
+ GT_Materials.HydrogenChloride,
+ 4,
+ 75,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.HydrogenChloride, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("HydrogenChloride");
+ }
+
+ FluidUtils.addGtFluid(
+ "sulfuricLithium",
+ "Sulfuric Lithium Mix",
+ GT_Materials.SulfuricLithium,
+ 4,
+ 280,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfuricLithium, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfuricLithium");
+
+ FluidUtils.addGtFluid(
+ "lithiumHydroxide",
+ "Lithium Hydroxide",
+ GT_Materials.LithiumHydroxide,
+ 4,
+ 500,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.LithiumHydroxide, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("LithiumHydroxide");
+ }
+
+ private static ItemStack generateIC2FluidCell(final String fluidNameWithCaps) {
+ Logger.INFO("Adding a Cell for " + fluidNameWithCaps);
+ return Utils.createInternalNameAndFluidCell(fluidNameWithCaps);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java
new file mode 100644
index 0000000000..c85bac7115
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+
+public class CasingTextureHandler {
+
+ private static final TexturesCentrifugeMultiblock gregtechX = new TexturesCentrifugeMultiblock();
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ // Centrifuge
+ case 0 -> TexturesGtBlock.Casing_Material_Centrifuge.getIcon();
+ // Coke Oven Frame
+ case 1 -> TexturesGtBlock.Casing_Material_Tantalloy61.getIcon();
+ // Coke Oven Casing Tier 1
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_FIREBOX_BRONZE.getIcon();
+ // Coke Oven Casing Tier 2
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_FIREBOX_STEEL.getIcon();
+ // Material Press Casings
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ // Electrolyzer Casings
+ case 5 -> TexturesGtBlock.Casing_Material_Potin.getIcon();
+ // Broken Blue Fusion Casings
+ case 6 -> TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ // Maceration Stack Casings
+ case 7 -> TexturesGtBlock.Casing_Material_Tumbaga.getIcon();
+ // Broken Pink Fusion Casings
+ case 8 -> TexturesGtBlock.TEXTURE_ORGANIC_PANEL_A_GLOWING.getIcon();
+ // Matter Fabricator Casings
+ case 9 -> TexturesGtBlock.TEXTURE_METAL_PANEL_F.getIcon();
+ // Iron Blast Fuance Textures
+ case 10 -> TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ // Multitank Exterior Casing
+ case 11 -> TexturesGtBlock.Casing_Material_Grisium.getIcon();
+ // Reactor Casing I
+ case 12 -> TexturesGtBlock.Casing_Material_Stellite.getIcon();
+ // Reactor Casing II
+ case 13 -> TexturesGtBlock.Casing_Material_Zeron100.getIcon();
+ case 14 -> TexturesGtBlock.Casing_Staballoy_Firebox.getIcon();
+ case 15 -> TexturesGtBlock.Casing_Material_ZirconiumCarbide.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_RADIOACTIVEHAZARD.getIcon();
+ };
+ }
+ return Textures.BlockIcons.MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.getIcon();
+ }
+
+ public static IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ return gregtechX.handleCasingsGT(aWorld, xCoord, yCoord, zCoord, side, thisBlock);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java
new file mode 100644
index 0000000000..1da572fb35
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.Textures;
+
+public class CasingTextureHandler2 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.Casing_Material_RedSteel.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.Casing_Material_HastelloyX.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.Casing_Material_HastelloyN.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.Casing_Material_Fluid_IncoloyDS.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Material_Grisium.getIcon();
+ }
+ case 5 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Panel_A.getIcon();
+ }
+ case 6 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Grate_A.getIcon();
+ }
+ case 7 -> {
+ return TexturesGtBlock.Casing_Redox_1.getIcon();
+ }
+ case 8 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_A.getIcon();
+ }
+ case 9 -> {
+ return TexturesGtBlock.Overlay_Machine_Cyber_A.getIcon();
+ }
+ case 10 -> {
+ return Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon();
+ }
+ case 11 -> {
+ return TexturesGtBlock.Casing_Material_Tantalloy61.getIcon();
+ }
+ case 12 -> {
+ return TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ }
+ case 13 -> {
+ if (ordinalSide < 2) {
+ return TexturesGtBlock.TEXTURE_TECH_A.getIcon();
+ } else {
+ return TexturesGtBlock.TEXTURE_TECH_B.getIcon();
+ }
+ }
+ case 14 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 15 -> {
+ return TexturesGtBlock.Casing_Machine_Acacia_Log.getIcon();
+ }
+ default -> {
+ return TexturesGtBlock.Overlay_UU_Matter.getIcon();
+ }
+ }
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java
new file mode 100644
index 0000000000..6b2627ec39
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks3;
+
+public class CasingTextureHandler3 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ case 0 ->
+ // Aquatic Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_B.getIcon();
+ case 1 ->
+ // Inconel Reinforced Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_D.getIcon();
+ case 2 ->
+ // Multi-Use Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_C.getIcon();
+ case 3 ->
+ // Trinium Plated Mining Platform Casing
+ TexturesGtBlock.Casing_Trinium_Naquadah_Vent.getIcon();
+ case 4 ->
+ // Vanadium Redox IV
+ TexturesGtBlock.Casing_Redox_2.getIcon();
+ case 5 ->
+ // Vanadium Redox LuV
+ TexturesGtBlock.Casing_Redox_3.getIcon();
+ case 6 ->
+ // Vanadium Redox ZPM
+ TexturesGtBlock.Casing_Redox_4.getIcon();
+ case 7 ->
+ // Vanadium Redox UV
+ TexturesGtBlock.Casing_Redox_5.getIcon();
+ case 8 ->
+ // Vanadium Redox MAX
+ TexturesGtBlock.Casing_Redox_6.getIcon();
+ case 9 ->
+ // Amazon Warehouse Casing
+ TexturesGtBlock.TEXTURE_CASING_AMAZON.getIcon();
+ case 10 ->
+ // Adv. Vac. Freezer
+ TexturesGtBlock.TEXTURE_CASING_ADVANCED_CRYOGENIC.getIcon();
+ case 11 ->
+ // Adv. EBF
+ TexturesGtBlock.TEXTURE_CASING_ADVANCED_VOLCNUS.getIcon();
+ case 12 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_II.getIcon();
+ case 13 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_II_INNER.getIcon();
+ case 14 -> TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_ULTRA.getIcon();
+ case 15 -> TexturesGtBlock.TEXTURE_MAGIC_PANEL_A.getIcon();
+ default -> TexturesGtBlock._PlaceHolder.getIcon();
+ };
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ static {
+ GregtechMetaCasingBlocks3.mConnectedMachineTextures = true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java
new file mode 100644
index 0000000000..b8d5a024df
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks6;
+
+public class CasingTextureHandler6 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_III.getIcon();
+ case 1 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_III_INNER.getIcon();
+ case 2 -> TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_HYPER.getIcon();
+ default -> TexturesGtBlock._PlaceHolder.getIcon();
+ };
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ static {
+ GregtechMetaCasingBlocks6.mConnectedMachineTextures = true;
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java
new file mode 100644
index 0000000000..058d2a7f1e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java
@@ -0,0 +1,151 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCentrifuge;
+
+public class TexturesCentrifugeMultiblock {
+
+ private static CustomIcon GT8_1_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE1");
+ private static CustomIcon GT8_1 = new CustomIcon("iconsets/LARGECENTRIFUGE1");
+ private static CustomIcon GT8_2_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE2");
+ private static CustomIcon GT8_2 = new CustomIcon("iconsets/LARGECENTRIFUGE2");
+ private static CustomIcon GT8_3_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE3");
+ private static CustomIcon GT8_3 = new CustomIcon("iconsets/LARGECENTRIFUGE3");
+ private static CustomIcon GT8_4_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE4");
+ private static CustomIcon GT8_4 = new CustomIcon("iconsets/LARGECENTRIFUGE4");
+ private static CustomIcon GT8_5_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE5");
+ private static CustomIcon GT8_5 = new CustomIcon("iconsets/LARGECENTRIFUGE5");
+ private static CustomIcon GT8_6_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE6");
+ private static CustomIcon GT8_6 = new CustomIcon("iconsets/LARGECENTRIFUGE6");
+ private static CustomIcon GT8_7_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE7");
+ private static CustomIcon GT8_7 = new CustomIcon("iconsets/LARGECENTRIFUGE7");
+ private static CustomIcon GT8_8_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE8");
+ private static CustomIcon GT8_8 = new CustomIcon("iconsets/LARGECENTRIFUGE8");
+ private static CustomIcon GT8_9_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE9");
+ private static CustomIcon GT8_9 = new CustomIcon("iconsets/LARGECENTRIFUGE9");
+
+ private static CustomIcon frontFace_0 = (GT8_1);
+ private static CustomIcon frontFaceActive_0 = (GT8_1_Active);
+ private static CustomIcon frontFace_1 = (GT8_2);
+ private static CustomIcon frontFaceActive_1 = (GT8_2_Active);
+ private static CustomIcon frontFace_2 = (GT8_3);
+ private static CustomIcon frontFaceActive_2 = (GT8_3_Active);
+ private static CustomIcon frontFace_3 = (GT8_4);
+ private static CustomIcon frontFaceActive_3 = (GT8_4_Active);
+ private static CustomIcon frontFace_4 = (GT8_5);
+ private static CustomIcon frontFaceActive_4 = (GT8_5_Active);
+ private static CustomIcon frontFace_5 = (GT8_6);
+ private static CustomIcon frontFaceActive_5 = (GT8_6_Active);
+ private static CustomIcon frontFace_6 = (GT8_7);
+ private static CustomIcon frontFaceActive_6 = (GT8_7_Active);
+ private static CustomIcon frontFace_7 = (GT8_8);
+ private static CustomIcon frontFaceActive_7 = (GT8_8_Active);
+ private static CustomIcon frontFace_8 = (GT8_9);
+ private static CustomIcon frontFaceActive_8 = (GT8_9_Active);
+
+ CustomIcon[] CENTRIFUGE = new CustomIcon[] { frontFace_0, frontFace_1, frontFace_2, frontFace_3, frontFace_4,
+ frontFace_5, frontFace_6, frontFace_7, frontFace_8 };
+
+ CustomIcon[] CENTRIFUGE_ACTIVE = new CustomIcon[] { frontFaceActive_0, frontFaceActive_1, frontFaceActive_2,
+ frontFaceActive_3, frontFaceActive_4, frontFaceActive_5, frontFaceActive_6, frontFaceActive_7,
+ frontFaceActive_8 };
+
+ public IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ return this.handleCasingsGT58(aWorld, xCoord, yCoord, zCoord, side, thisBlock);
+ }
+
+ private static int isCentrifugeControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ,
+ ForgeDirection side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GregtechMetaTileEntity_IndustrialCentrifuge
+ && tTile.getFrontFacing() == side) return tTile.isActive() ? 1 : 2;
+ return 0;
+ }
+
+ public IIcon handleCasingsGT58(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ final int ordinalSide = side.ordinal();
+ if (tMeta != 0) {
+ return CasingTextureHandler.getIcon(ordinalSide, tMeta);
+ }
+
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord, zCoord + i)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 - i * 3 - j);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord + i, zCoord)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 - j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord, yCoord + i, zCoord + j)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 + j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ }
+ return TexturesGtBlock.Casing_Material_Centrifuge.getIcon();
+ }
+
+ public boolean isCentrifugeRunning(IMetaTileEntity aTile) {
+ if (aTile == null) {
+ return false;
+ } else {
+ return aTile.getBaseMetaTileEntity()
+ .isActive();
+ }
+ }
+
+ public boolean isUsingAnimatedTexture(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity != null) {
+ if (aMetaTileEntity instanceof GregtechMetaTileEntity_IndustrialCentrifuge) {
+ return ((GregtechMetaTileEntity_IndustrialCentrifuge) aMetaTileEntity).usingAnimations();
+ }
+ }
+ return false;
+ }
+
+ public IIcon getIconByIndex(IMetaTileEntity aMetaTileEntity, int aIndex) {
+ if (isUsingAnimatedTexture(aMetaTileEntity)) {
+ if (isCentrifugeRunning(aMetaTileEntity)) {
+ return this.CENTRIFUGE_ACTIVE[aIndex].getIcon();
+ }
+ }
+ return this.CENTRIFUGE[aIndex].getIcon();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java
new file mode 100644
index 0000000000..e7d09bd308
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks5;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IsaMill;
+
+public class TexturesGrinderMultiblock {
+
+ private static CustomIcon GT8_1_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE1");
+ private static CustomIcon GT8_1 = new CustomIcon("iconsets/Grinder/GRINDER1");
+ private static CustomIcon GT8_2_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE2");
+ private static CustomIcon GT8_2 = new CustomIcon("iconsets/Grinder/GRINDER2");
+ private static CustomIcon GT8_3_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE3");
+ private static CustomIcon GT8_3 = new CustomIcon("iconsets/Grinder/GRINDER3");
+ private static CustomIcon GT8_4_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE4");
+ private static CustomIcon GT8_4 = new CustomIcon("iconsets/Grinder/GRINDER4");
+ private static CustomIcon GT8_5_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE5");
+ private static CustomIcon GT8_5 = new CustomIcon("iconsets/Grinder/GRINDER5");
+ private static CustomIcon GT8_6_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE6");
+ private static CustomIcon GT8_6 = new CustomIcon("iconsets/Grinder/GRINDER6");
+ private static CustomIcon GT8_7_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE7");
+ private static CustomIcon GT8_7 = new CustomIcon("iconsets/Grinder/GRINDER7");
+ private static CustomIcon GT8_8_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE8");
+ private static CustomIcon GT8_8 = new CustomIcon("iconsets/Grinder/GRINDER8");
+ private static CustomIcon GT8_9_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE9");
+ private static CustomIcon GT8_9 = new CustomIcon("iconsets/Grinder/GRINDER9");
+
+ private static CustomIcon frontFace_0 = (GT8_1);
+ private static CustomIcon frontFaceActive_0 = (GT8_1_Active);
+ private static CustomIcon frontFace_1 = (GT8_2);
+ private static CustomIcon frontFaceActive_1 = (GT8_2_Active);
+ private static CustomIcon frontFace_2 = (GT8_3);
+ private static CustomIcon frontFaceActive_2 = (GT8_3_Active);
+ private static CustomIcon frontFace_3 = (GT8_4);
+ private static CustomIcon frontFaceActive_3 = (GT8_4_Active);
+ private static CustomIcon frontFace_4 = (GT8_5);
+ private static CustomIcon frontFaceActive_4 = (GT8_5_Active);
+ private static CustomIcon frontFace_5 = (GT8_6);
+ private static CustomIcon frontFaceActive_5 = (GT8_6_Active);
+ private static CustomIcon frontFace_6 = (GT8_7);
+ private static CustomIcon frontFaceActive_6 = (GT8_7_Active);
+ private static CustomIcon frontFace_7 = (GT8_8);
+ private static CustomIcon frontFaceActive_7 = (GT8_8_Active);
+ private static CustomIcon frontFace_8 = (GT8_9);
+ private static CustomIcon frontFaceActive_8 = (GT8_9_Active);
+
+ CustomIcon[] GRINDER = new CustomIcon[] { frontFace_0, frontFace_1, frontFace_2, frontFace_3, frontFace_4,
+ frontFace_5, frontFace_6, frontFace_7, frontFace_8 };
+
+ CustomIcon[] GRINDER_ACTIVE = new CustomIcon[] { frontFaceActive_0, frontFaceActive_1, frontFaceActive_2,
+ frontFaceActive_3, frontFaceActive_4, frontFaceActive_5, frontFaceActive_6, frontFaceActive_7,
+ frontFaceActive_8 };
+
+ private static int isIsaControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GregtechMetaTileEntity_IsaMill && tTile.getFrontFacing() == side)
+ return tTile.isActive() ? 1 : 2;
+ return 0;
+ }
+
+ public IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide, final GregtechMetaCasingBlocks5 ii) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ if (tMeta != 1) {
+ return GregtechMetaCasingBlocks5.getStaticIcon(ordinalSide, tMeta);
+ }
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord, zCoord + i)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 - i * 3 - j);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord + i, zCoord)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 - j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord, yCoord + i, zCoord + j)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 + j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ }
+ return TexturesGtBlock.TEXTURE_CASING_GRINDING_MILL.getIcon();
+ }
+
+ public boolean isCentrifugeRunning(IMetaTileEntity aTile) {
+ if (aTile == null) {
+ return false;
+ } else {
+ return aTile.getBaseMetaTileEntity()
+ .isActive();
+ }
+ }
+
+ public IIcon getIconByIndex(IMetaTileEntity aMetaTileEntity, int aIndex) {
+ if (isCentrifugeRunning(aMetaTileEntity)) {
+ return this.GRINDER_ACTIVE[aIndex].getIcon();
+ }
+
+ return this.GRINDER[aIndex].getIcon();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java
new file mode 100644
index 0000000000..743cd0b85b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java
@@ -0,0 +1,486 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+
+public class TexturesGtBlock {
+
+ private static boolean mAnimated = CORE.ConfigSwitches.enableAnimatedTextures;
+
+ private static AutoMap<Runnable> mCustomiconMap = new AutoMap<>();
+
+ /*
+ * Handles Custom Textures.
+ */
+
+ public static class CustomIcon implements IIconContainer, Runnable {
+
+ protected IIcon mIcon;
+ protected String mIconName;
+ protected String mModID;
+
+ public CustomIcon(final String aIconName) {
+ this(GTPlusPlus.ID, aIconName);
+ }
+
+ public CustomIcon(final String aModID, final String aIconName) {
+ this.mIconName = aIconName;
+ this.mModID = aModID;
+ mCustomiconMap.put(this);
+ Logger.WARNING("Constructing a Custom Texture. " + this.mIconName);
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return this.mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public void run() {
+ this.mIcon = GregTech_API.sBlockIcons.registerIcon(this.mModID + ":" + this.mIconName);
+ Logger.WARNING(
+ "FIND ME _ Processing texture: " + this.getTextureFile()
+ .getResourcePath());
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+ }
+
+ /*
+ * Add Some Custom Textures below. I am not sure whether or not I need to declare them as such, but better to be
+ * safe than sorry. Right?
+ */
+
+ // PlaceHolder Texture
+ private static final CustomIcon Internal_PlaceHolder = new CustomIcon("TileEntities/_PlaceHolder");
+ public static final CustomIcon _PlaceHolder = Internal_PlaceHolder;
+
+ public static final CustomIcon OVERLAY_ENERGY_OUT_MULTI_BUFFER = new CustomIcon(
+ "iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER");
+
+ // Machine Casings
+ // Simple
+ private static final CustomIcon Internal_Casing_Machine_Simple_Top = new CustomIcon("TileEntities/machine_top");
+ public static final CustomIcon Casing_Machine_Simple_Top = Internal_Casing_Machine_Simple_Top;
+ private static final CustomIcon Internal_Casing_Machine_Simple_Bottom = new CustomIcon(
+ "TileEntities/machine_bottom");
+ public static final CustomIcon Casing_Machine_Simple_Bottom = Internal_Casing_Machine_Simple_Bottom;
+ // Advanced and Ultra
+ private static final CustomIcon Internal_Casing_Machine_Advanced = new CustomIcon("TileEntities/high_adv_machine");
+ public static final CustomIcon Casing_Machine_Advanced = Internal_Casing_Machine_Advanced;
+ private static final CustomIcon Internal_Casing_Machine_Ultra = new CustomIcon("TileEntities/adv_machine_lesu");
+ public static final CustomIcon Casing_Machine_Ultra = Internal_Casing_Machine_Ultra;
+ // Dimensional - Non Overlay
+ private static final CustomIcon Internal_Casing_Machine_Dimensional = new CustomIcon(
+ "TileEntities/adv_machine_dimensional");
+ public static final CustomIcon Casing_Machine_Dimensional = Internal_Casing_Machine_Dimensional;
+
+ // Material Casings
+ private static final CustomIcon Internal_Casing_Tantalloy61 = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TANTALLOY61");
+ public static final CustomIcon Casing_Material_Tantalloy61 = Internal_Casing_Tantalloy61;
+ private static final CustomIcon Internal_Casing_MaragingSteel = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL");
+ public static final CustomIcon Casing_Material_MaragingSteel = Internal_Casing_MaragingSteel;
+ private static final CustomIcon Internal_Casing_Stellite = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_STELLITE");
+ public static final CustomIcon Casing_Material_Stellite = Internal_Casing_Stellite;
+ private static final CustomIcon Internal_Casing_Talonite = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TALONITE");
+ public static final CustomIcon Casing_Material_Talonite = Internal_Casing_Talonite;
+ private static final CustomIcon Internal_Turbine_SC_Casing = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE");
+ public static final CustomIcon Turbine_SC_Material_Casing = Internal_Turbine_SC_Casing;
+ private static final CustomIcon Internal_Casing_Tumbaga = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TUMBAGA");
+ public static final CustomIcon Casing_Material_Tumbaga = Internal_Casing_Tumbaga;
+ private static final CustomIcon Internal_Casing_Zeron100 = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_ZERON100");
+ public static final CustomIcon Casing_Material_Zeron100 = Internal_Casing_Zeron100;
+ private static final CustomIcon Internal_Casing_Potin = new CustomIcon("TileEntities/MACHINE_CASING_STABLE_POTIN");
+ public static final CustomIcon Casing_Material_Potin = Internal_Casing_Potin;
+
+ private static final CustomIcon Internal_Casing_Grisium = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_GRISIUM");
+ public static final CustomIcon Casing_Material_Grisium = Internal_Casing_Grisium;
+ private static final CustomIcon Internal_Casing_RedSteel = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_RED_STEEL");
+ public static final CustomIcon Casing_Material_RedSteel = Internal_Casing_RedSteel;
+ private static final CustomIcon Internal_Casing_ZirconiumCarbide = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE");
+ public static final CustomIcon Casing_Material_ZirconiumCarbide = Internal_Casing_ZirconiumCarbide;
+
+ private static final CustomIcon Internal_Casing_HastelloyX = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X");
+ public static final CustomIcon Casing_Material_HastelloyX = Internal_Casing_HastelloyX;
+ private static final CustomIcon Internal_Casing_HastelloyN = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N");
+ public static final CustomIcon Casing_Material_HastelloyN = Internal_Casing_HastelloyN;
+ private static final CustomIcon Internal_Casing_Fluid_IncoloyDS = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS");
+ public static final CustomIcon Casing_Material_Fluid_IncoloyDS = Internal_Casing_Fluid_IncoloyDS;
+
+ private static final CustomIcon Internal_Casing_Laurenium = new CustomIcon("TileEntities/MACHINE_CASING_LAURENIUM");
+ public static final CustomIcon Casing_Material_Laurenium = Internal_Casing_Laurenium;
+
+ // Trinium Alloys
+ public static final CustomIcon Casing_Trinium_Titanium = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM");
+ public static final CustomIcon Casing_Trinium_Naquadah_Vent = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT");
+
+ // Material Machine/Firebox Casings
+ private static final CustomIcon Internal_Casing_Staballoy_Firebox = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FIREBOX_STABALLOY");
+ public static final CustomIcon Casing_Staballoy_Firebox = Internal_Casing_Staballoy_Firebox;
+
+ // Misc Casings
+ private static final CustomIcon Internal_Casing_Machine_Redstone_Off = new CustomIcon(
+ "TileEntities/cover_redstone_conductor");
+ public static final CustomIcon Casing_Machine_Redstone_Off = Internal_Casing_Machine_Redstone_Off;
+ private static final CustomIcon Internal_Casing_Machine_Redstone_On = new CustomIcon(
+ "TileEntities/cover_redstone_emitter");
+ public static final CustomIcon Casing_Machine_Redstone_On = Internal_Casing_Machine_Redstone_On;
+
+ // Redox Cells
+ public static final CustomIcon Casing_Redox_1 = new CustomIcon("redox/redox1");
+ public static final CustomIcon Casing_Redox_2 = new CustomIcon("redox/redox2");
+ public static final CustomIcon Casing_Redox_3 = new CustomIcon("redox/redox3");
+ public static final CustomIcon Casing_Redox_4 = new CustomIcon("redox/redox4");
+ public static final CustomIcon Casing_Redox_5 = new CustomIcon("redox/redox5");
+ public static final CustomIcon Casing_Redox_6 = new CustomIcon("redox/redox6");
+
+ // Special Block 2
+ public static final CustomIcon Casing_Resonance_1 = new CustomIcon("special/block_1");
+ public static final CustomIcon Casing_Resonance_2 = new CustomIcon("special/block_2");
+ public static final CustomIcon Casing_Resonance_3 = new CustomIcon("special/block_3");
+ public static final CustomIcon Casing_Resonance_4 = new CustomIcon("special/block_4");
+ public static final CustomIcon Casing_Modulator_1 = new CustomIcon("special/block_5");
+ public static final CustomIcon Casing_Modulator_2 = new CustomIcon("special/block_6");
+ public static final CustomIcon Casing_Modulator_3 = new CustomIcon("special/block_7");
+ public static final CustomIcon Casing_Modulator_4 = new CustomIcon("special/block_8");
+
+ // Centrifuge Casing
+ private static final CustomIcon Internal_Casing_Centrifuge = new CustomIcon(
+ "TileEntities/MACHINE_CASING_CENTRIFUGE");
+ public static final CustomIcon Casing_Material_Centrifuge = Internal_Casing_Centrifuge;
+
+ // Quantum Force Transformer Casing
+ // spotless:off
+ private static final CustomIcon Internal_Casing_QFT = new CustomIcon("TileEntities/MACHINE_CASING_QFT_COIL");
+ public static final CustomIcon Casing_Coil_QFT = Internal_Casing_QFT;
+ public static final CustomIcon NeutronPulseManipulator = mAnimated ? new CustomIcon("NeutronPulseManipulator") : new CustomIcon("NeutronPulseManipulatorStatic");
+ public static final CustomIcon CosmicFabricManipulator = mAnimated ? new CustomIcon("CosmicFabricManipulator") : new CustomIcon("CosmicFabricManipulatorStatic");
+ public static final CustomIcon InfinityInfusedManipulator = mAnimated ? new CustomIcon("InfinityInfusedManipulator") : new CustomIcon("InfinityInfusedManipulatorStatic");
+ public static final CustomIcon SpaceTimeContinuumRipper = mAnimated ? new CustomIcon("SpaceTimeContinuumRipper") : new CustomIcon("SpaceTimeContinuumRipperStatic");
+ public static final CustomIcon Manipulator_Top = new CustomIcon("Manipulator_Top");
+ public static final CustomIcon NeutronShieldingCore = mAnimated ? new CustomIcon("NeutronShieldingCore") : new CustomIcon("NeutronShieldingCoreStatic");
+ public static final CustomIcon CosmicFabricShieldingCore = mAnimated ? new CustomIcon("CosmicFabricShieldingCore") : new CustomIcon("CosmicFabricShieldingCoreStatic");
+ public static final CustomIcon InfinityInfusedShieldingCore = mAnimated ? new CustomIcon("InfinityInfusedShieldingCore") : new CustomIcon("InfinityInfusedShieldingCoreStatic");
+ public static final CustomIcon SpaceTimeBendingCore = mAnimated ? new CustomIcon("SpaceTimeBendingCore") : new CustomIcon("SpaceTimeBendingCoreStatic");
+ public static final CustomIcon ForceFieldGlass = new CustomIcon("ForceFieldGlass");
+ public static final CustomIcon ForceField = new CustomIcon("rendering/ForceField");
+ public static final CustomIcon Blank = new CustomIcon("Blank");
+ //spotless:on
+
+ // MACHINE_CASING_FARM_MANAGER_STRUCTURAL
+ // Farm Manager Casings
+ private static final CustomIcon Internal_Casing_Machine_Farm_Manager = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ public static final CustomIcon Casing_Machine_Farm_Manager = Internal_Casing_Machine_Farm_Manager;
+ // Acacia_Log
+ private static final CustomIcon Internal_Casing_Machine_Acacia_Log = new CustomIcon("TileEntities/log_acacia_top");
+ public static final CustomIcon Casing_Machine_Acacia_Log = Internal_Casing_Machine_Acacia_Log;
+ // Podzol Top
+ private static final CustomIcon Internal_Casing_Machine_Podzol = new CustomIcon("TileEntities/dirt_podzol_top");
+ public static final CustomIcon Casing_Machine_Podzol = Internal_Casing_Machine_Podzol;
+
+ // Structural Blocks
+ private static final CustomIcon Internal_Casing_Machine_Metal_Grate_A = new CustomIcon("chrono/MetalGrate");
+ public static final CustomIcon Casing_Machine_Metal_Grate_A = Internal_Casing_Machine_Metal_Grate_A;
+
+ private static final CustomIcon Internal_Casing_Machine_Metal_Panel_A = new CustomIcon("chrono/MetalPanel");
+ public static final CustomIcon Casing_Machine_Metal_Panel_A = Internal_Casing_Machine_Metal_Panel_A;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_A = new CustomIcon("chrono/MetalSheet");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_A = Internal_Casing_Machine_Metal_Sheet_A;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_H = new CustomIcon("chrono/MetalSheet8");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_H = Internal_Casing_Machine_Metal_Sheet_H;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_I = new CustomIcon("chrono/MetalSheet9");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_I = Internal_Casing_Machine_Metal_Sheet_I;
+ private static final CustomIcon Internal_Overlay_Machine_Cyber_A = new CustomIcon("chrono/CyberPanel");
+ public static final CustomIcon Overlay_Machine_Cyber_A = Internal_Overlay_Machine_Cyber_A;
+
+ public static final CustomIcon TEXTURE_CASING_AMAZON = new CustomIcon("TileEntities/CASING_AMAZON");
+ public static final CustomIcon TEXTURE_CASING_ADVANCED_CRYOGENIC = new CustomIcon(
+ "TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC");
+ public static final CustomIcon TEXTURE_CASING_ADVANCED_VOLCNUS = new CustomIcon(
+ "TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS");
+ public static final CustomIcon TEXTURE_CASING_ROCKETDYNE = new CustomIcon("TileEntities/MACHINE_CASING_ROCKETDYNE");
+ public static final CustomIcon TEXTURE_CASING_GRINDING_MILL = new CustomIcon(
+ "TileEntities/MACHINE_CASING_GRINDING_FACTORY");
+ public static final CustomIcon TEXTURE_CASING_FLOTATION = new CustomIcon("TileEntities/MACHINE_CASING_FLOTATION");
+
+ // Custom Pipes
+ public static final CustomIcon TEXTURE_PIPE_GRINDING_MILL = new CustomIcon("TileEntities/MACHINE_CASING_PIPE_T1");
+ public static final CustomIcon TEXTURE_PIPE_GENERIC = new CustomIcon("iconsets/MACHINE_CASING_PIPE_GENERIC");
+
+ // Custom Gearboxes
+ public static final CustomIcon TEXTURE_GEARBOX_GRINDING_MILL = new CustomIcon(
+ "TileEntities/MACHINE_CASING_GEARBOX_T1");
+ public static final CustomIcon TEXTURE_GEARBOX_GENERIC = new CustomIcon("iconsets/MACHINE_CASING_GEARBOX_GENERIC");
+
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II = new CustomIcon("iconsets/MACHINE_CASING_FUSION_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_INNER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_COIL_II");
+ public static final CustomIcon TEXTURE_CASING_FUSION_CASING_ULTRA = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA");
+
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III = new CustomIcon("iconsets/MACHINE_CASING_FUSION_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_INNER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_COIL_III");
+ public static final CustomIcon TEXTURE_CASING_FUSION_CASING_HYPER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_GLASS_HYPER");
+ //
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_1 = new CustomIcon("iconsets/FUSIONIII_1");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_2 = new CustomIcon("iconsets/FUSIONIII_2");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_3 = new CustomIcon("iconsets/FUSIONIII_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_4 = new CustomIcon("iconsets/FUSIONIII_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_5 = new CustomIcon("iconsets/FUSIONIII_5");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_6 = new CustomIcon("iconsets/FUSIONIII_6");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_7 = new CustomIcon("iconsets/FUSIONIII_7");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_8 = new CustomIcon("iconsets/FUSIONIII_8");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_9 = new CustomIcon("iconsets/FUSIONIII_9");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_10 = new CustomIcon("iconsets/FUSIONIII_10");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_11 = new CustomIcon("iconsets/FUSIONIII_11");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_12 = new CustomIcon("iconsets/FUSIONIII_12");
+
+ // MK5 Fusion casings
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_1 = new CustomIcon("iconsets/FUSIONIV_1");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_2 = new CustomIcon("iconsets/FUSIONIV_2");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_3 = new CustomIcon("iconsets/FUSIONIV_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_4 = new CustomIcon("iconsets/FUSIONIV_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_5 = new CustomIcon("iconsets/FUSIONIV_5");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_6 = new CustomIcon("iconsets/FUSIONIV_6");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_7 = new CustomIcon("iconsets/FUSIONIV_7");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_8 = new CustomIcon("iconsets/FUSIONIV_8");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_9 = new CustomIcon("iconsets/FUSIONIV_9");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_10 = new CustomIcon("iconsets/FUSIONIV_10");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_11 = new CustomIcon("iconsets/FUSIONIV_11");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_12 = new CustomIcon("iconsets/FUSIONIV_12");
+
+ // Overlays
+ // Fan Textures
+ private static final CustomIcon Internal_Overlay_Machine_Vent = new CustomIcon(
+ "TileEntities/machine_top_vent_rotating");
+ public static final CustomIcon Overlay_Machine_Vent = Internal_Overlay_Machine_Vent;
+ private static final CustomIcon Internal_Overlay_Machine_Vent_Fast = new CustomIcon(
+ "TileEntities/machine_top_vent_rotating_fast");
+ public static final CustomIcon Overlay_Machine_Vent_Fast = Internal_Overlay_Machine_Vent_Fast;
+ private static final CustomIcon Internal_Overlay_Machine_Vent_Adv = new CustomIcon(
+ "TileEntities/adv_machine_vent_rotating");
+ // Diesel Engines
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Vertical = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor");
+ public static final CustomIcon Overlay_Machine_Diesel_Vertical = Internal_Overlay_Machine_Diesel_Vertical;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Horizontal = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor2");
+ public static final CustomIcon Overlay_Machine_Diesel_Horizontal = Internal_Overlay_Machine_Diesel_Horizontal;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Vertical_Active = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor_active");
+ public static final CustomIcon Overlay_Machine_Diesel_Vertical_Active = Internal_Overlay_Machine_Diesel_Vertical_Active;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Horizontal_Active = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor2_active");
+ public static final CustomIcon Overlay_Machine_Diesel_Horizontal_Active = Internal_Overlay_Machine_Diesel_Horizontal_Active;
+ // Computer Screens
+ private static final CustomIcon Internal_Casing_Machine_Screen_1 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random1");
+ public static final CustomIcon Casing_Machine_Screen_1 = Internal_Casing_Machine_Screen_1;
+ private static final CustomIcon Internal_Casing_Machine_Screen_2 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random2");
+ public static final CustomIcon Casing_Machine_Screen_2 = Internal_Casing_Machine_Screen_2;
+ private static final CustomIcon Internal_Casing_Machine_Screen_3 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random3");
+ public static final CustomIcon Casing_Machine_Screen_3 = Internal_Casing_Machine_Screen_3;
+
+ private static final CustomIcon Internal_Casing_Machine_Screen_Rainbow = new CustomIcon(
+ "TileEntities/overlay_rainbowscreen");
+ public static final CustomIcon Casing_Machine_Screen_Rainbow = Internal_Casing_Machine_Screen_Rainbow;
+ private static final CustomIcon Internal_Casing_Machine_Screen_Frequency = new CustomIcon(
+ "TileEntities/adv_machine_screen_frequency");
+ public static final CustomIcon Casing_Machine_Screen_Frequency = Internal_Casing_Machine_Screen_Frequency;
+ private static final CustomIcon Internal_Overlay_Machine_Screen_Logo = new CustomIcon(
+ "TileEntities/adv_machine_screen_logo");
+ public static final CustomIcon Overlay_Machine_Screen_Logo = Internal_Overlay_Machine_Screen_Logo;
+
+ // Machine Controller Overlays
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Default = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED");
+ public static final CustomIcon Overlay_Machine_Controller_Default = Internal_Overlay_Machine_Controller_Default;
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Default_Active = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE");
+ public static final CustomIcon Overlay_Machine_Controller_Default_Active = Internal_Overlay_Machine_Controller_Default_Active;
+
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Advanced = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED");
+ public static final CustomIcon Overlay_Machine_Controller_Advanced = Internal_Overlay_Machine_Controller_Advanced;
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Advanced_Active = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE");
+ public static final CustomIcon Overlay_Machine_Controller_Advanced_Active = Internal_Overlay_Machine_Controller_Advanced_Active;
+
+ // Crafting Overlays
+ public static final CustomIcon Casing_Adv_Workbench_Crafting_Overlay = new CustomIcon(
+ "TileEntities/gt4/machine_top_crafting");
+
+ public static final CustomIcon Casing_CropHarvester_Cutter = new CustomIcon("TileEntities/gt4/OVERLAY_CROP");
+ public static final CustomIcon Casing_CropHarvester_Boxes = new CustomIcon("TileEntities/gt4/OVERLAY_BOXES");
+
+ // Covers
+ private static final CustomIcon Internal_Overlay_Overflow_Valve = new CustomIcon("iconsets/OVERLAY_OVERFLOW_VALVE");
+ public static final CustomIcon Overlay_Overflow_Valve = Internal_Overlay_Overflow_Valve;
+
+ // Hatch Overlays
+ // Charger Texture
+ private static final CustomIcon Internal_Overlay_Hatch_Charger = new CustomIcon("TileEntities/cover_charger");
+ public static final CustomIcon Overlay_Hatch_Charger = Internal_Overlay_Hatch_Charger;
+ // Discharger Texture
+ private static final CustomIcon Internal_Overlay_Hatch_Discharger = new CustomIcon("TileEntities/cover_discharge");
+ public static final CustomIcon Overlay_Hatch_Discharger = Internal_Overlay_Hatch_Discharger;
+ // Advanced Muffler
+ private static final CustomIcon Internal_Overlay_Hatch_Muffler_Adv = new CustomIcon("iconsets/OVERLAY_MUFFLER_ADV");
+ public static final CustomIcon Overlay_Hatch_Muffler_Adv = Internal_Overlay_Hatch_Muffler_Adv;
+ // Milling Ball Bus
+ private static final CustomIcon Internal_Overlay_Bus_Milling_Balls = new CustomIcon(
+ "iconsets/OVERLAY_MILLING_BALL_BUS");
+ public static final CustomIcon Overlay_Bus_Milling_Balls = Internal_Overlay_Bus_Milling_Balls;
+ // Catalyst Bus
+ private static final CustomIcon Internal_Overlay_Bus_Catalyst = new CustomIcon("iconsets/OVERLAY_CATALYSTS");
+ public static final CustomIcon Overlay_Bus_Catalyst = Internal_Overlay_Bus_Catalyst;
+
+ // Data Orb Hatch
+ public static final CustomIcon Overlay_Hatch_Data_Orb = new CustomIcon("iconsets/OVERLAY_DATA_ORB");
+
+ // Dimensional
+ private static final CustomIcon Internal_Overlay_Machine_Dimensional_Orange = new CustomIcon(
+ "TileEntities/adv_machine_dimensional_cover_orange");
+ public static final CustomIcon Overlay_Machine_Dimensional_Orange = Internal_Overlay_Machine_Dimensional_Orange;
+ // Icons
+ private static final CustomIcon Internal_Overlay_MatterFab = new CustomIcon("TileEntities/adv_machine_matterfab");
+ public static final CustomIcon Overlay_MatterFab = Internal_Overlay_MatterFab;
+ private static final CustomIcon Internal_Overlay_MatterFab_Active = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_active");
+ public static final CustomIcon Overlay_MatterFab_Active = Internal_Overlay_MatterFab_Active;
+
+ private static final CustomIcon Internal_Overlay_MatterFab_Animated = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_animated");
+ public static final CustomIcon Overlay_MatterFab_Animated = Internal_Overlay_MatterFab_Animated;
+ private static final CustomIcon Internal_Overlay_MatterFab_Active_Animated = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_active_animated");
+ public static final CustomIcon Overlay_MatterFab_Active_Animated = Internal_Overlay_MatterFab_Active_Animated;
+
+ private static final CustomIcon Internal_Overlay_Water = new CustomIcon("TileEntities/adv_machine_water");
+ public static final CustomIcon Overlay_Water = Internal_Overlay_Water;
+ private static final CustomIcon Internal_Overlay_UU_Matter = new CustomIcon("TileEntities/adv_machine_uum");
+ public static final CustomIcon Overlay_UU_Matter = Internal_Overlay_UU_Matter;
+
+ // GT++ Tiered Hulls
+ public static final CustomIcon TEXTURE_CASING_TIERED_ULV = new CustomIcon("iconsets/TieredHulls/CASING_ULV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_LV = new CustomIcon("iconsets/TieredHulls/CASING_LV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_MV = new CustomIcon("iconsets/TieredHulls/CASING_MV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_HV = new CustomIcon("iconsets/TieredHulls/CASING_HV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_EV = new CustomIcon("iconsets/TieredHulls/CASING_EV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_IV = new CustomIcon("iconsets/TieredHulls/CASING_IV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_LuV = new CustomIcon("iconsets/TieredHulls/CASING_LuV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_ZPM = new CustomIcon("iconsets/TieredHulls/CASING_ZPM");
+ public static final CustomIcon TEXTURE_CASING_TIERED_UV = new CustomIcon("iconsets/TieredHulls/CASING_UV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_MAX = new CustomIcon("iconsets/TieredHulls/CASING_MAX");
+
+ // Metroid related
+ public static final CustomIcon TEXTURE_METAL_PANEL_A = new CustomIcon("metro/TEXTURE_METAL_PANEL_A");
+ public static final CustomIcon TEXTURE_METAL_PANEL_B = new CustomIcon("metro/TEXTURE_METAL_PANEL_B");
+ public static final CustomIcon TEXTURE_METAL_PANEL_C = new CustomIcon("metro/TEXTURE_METAL_PANEL_C");
+ public static final CustomIcon TEXTURE_METAL_PANEL_D = new CustomIcon("metro/TEXTURE_METAL_PANEL_D");
+ public static final CustomIcon TEXTURE_METAL_PANEL_F = new CustomIcon("metro/TEXTURE_METAL_PANEL_F");
+
+ public static final CustomIcon TEXTURE_MAGIC_PANEL_A = new CustomIcon("metro/TEXTURE_MAGIC_A");
+ public static final CustomIcon TEXTURE_MAGIC_PANEL_B = new CustomIcon("metro/TEXTURE_MAGIC_B");
+
+ public static final CustomIcon TEXTURE_ORGANIC_PANEL_A_GLOWING = new CustomIcon(
+ "metro/TEXTURE_ORGANIC_PANEL_A_GLOWING");
+
+ public static final CustomIcon TEXTURE_STONE_RED_A = new CustomIcon("metro/TEXTURE_STONE_RED_A");
+ public static final CustomIcon TEXTURE_STONE_RED_B = new CustomIcon("metro/TEXTURE_STONE_RED_B");
+
+ public static final CustomIcon OVERLAY_SC_TURBINE1 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL1");
+ public static final CustomIcon OVERLAY_SC_TURBINE2 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL2");
+ public static final CustomIcon OVERLAY_SC_TURBINE3 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL3");
+ public static final CustomIcon OVERLAY_SC_TURBINE4 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL4");
+ public static final CustomIcon OVERLAY_SC_TURBINE5 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL5");
+ public static final CustomIcon OVERLAY_SC_TURBINE6 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL6");
+ public static final CustomIcon OVERLAY_SC_TURBINE7 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL7");
+ public static final CustomIcon OVERLAY_SC_TURBINE8 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL8");
+ public static final CustomIcon OVERLAY_SC_TURBINE9 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL9");
+
+ public static final CustomIcon OVERLAY_SC_TURBINE1_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE1");
+ public static final CustomIcon OVERLAY_SC_TURBINE2_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE2");
+ public static final CustomIcon OVERLAY_SC_TURBINE3_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE3");
+ public static final CustomIcon OVERLAY_SC_TURBINE4_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE4");
+ public static final CustomIcon OVERLAY_SC_TURBINE5_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE5");
+ public static final CustomIcon OVERLAY_SC_TURBINE6_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE6");
+ public static final CustomIcon OVERLAY_SC_TURBINE7_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE7");
+ public static final CustomIcon OVERLAY_SC_TURBINE8_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE8");
+ public static final CustomIcon OVERLAY_SC_TURBINE9_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE9");
+ public static final CustomIcon TEXTURE_TECH_A = new CustomIcon("metro/TEXTURE_TECH_A");
+ public static final CustomIcon TEXTURE_TECH_B = new CustomIcon("metro/TEXTURE_TECH_B");
+ public static final CustomIcon TEXTURE_TECH_C = new CustomIcon("metro/TEXTURE_TECH_C");
+
+ public static final CustomIcon TEXTURE_TECH_PANEL_D = new CustomIcon("metro/TEXTURE_TECH_PANEL_D");
+ public static final CustomIcon TEXTURE_TECH_PANEL_H = new CustomIcon("metro/TEXTURE_TECH_PANEL_H");
+
+ public static ITexture[] OVERLAYS_ENERGY_OUT_MULTI_BUFFER = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }) };
+
+ public static IIconContainer[] CONNECTED_FUSION_HULLS = new IIconContainer[] { TEXTURE_CASING_FUSION_COIL_II_1,
+ TEXTURE_CASING_FUSION_COIL_II_2, TEXTURE_CASING_FUSION_COIL_II_3, TEXTURE_CASING_FUSION_COIL_II_4,
+ TEXTURE_CASING_FUSION_COIL_II_5, TEXTURE_CASING_FUSION_COIL_II_6, TEXTURE_CASING_FUSION_COIL_II_7,
+ TEXTURE_CASING_FUSION_COIL_II_8, TEXTURE_CASING_FUSION_COIL_II_9, TEXTURE_CASING_FUSION_COIL_II_10,
+ TEXTURE_CASING_FUSION_COIL_II_11, TEXTURE_CASING_FUSION_COIL_II_12 };
+
+ public static IIconContainer[] CONNECTED_FUSION_HULLS_MK4 = new IIconContainer[] { TEXTURE_CASING_FUSION_COIL_III_1,
+ TEXTURE_CASING_FUSION_COIL_III_2, TEXTURE_CASING_FUSION_COIL_III_3, TEXTURE_CASING_FUSION_COIL_III_4,
+ TEXTURE_CASING_FUSION_COIL_III_5, TEXTURE_CASING_FUSION_COIL_III_6, TEXTURE_CASING_FUSION_COIL_III_7,
+ TEXTURE_CASING_FUSION_COIL_III_8, TEXTURE_CASING_FUSION_COIL_III_9, TEXTURE_CASING_FUSION_COIL_III_10,
+ TEXTURE_CASING_FUSION_COIL_III_11, TEXTURE_CASING_FUSION_COIL_III_12 };
+
+ public static IIconContainer[] TIERED_MACHINE_HULLS = new IIconContainer[] { TEXTURE_CASING_TIERED_ULV,
+ TEXTURE_CASING_TIERED_LV, TEXTURE_CASING_TIERED_MV, TEXTURE_CASING_TIERED_HV, TEXTURE_CASING_TIERED_EV,
+ TEXTURE_CASING_TIERED_IV, TEXTURE_CASING_TIERED_LuV, TEXTURE_CASING_TIERED_ZPM, TEXTURE_CASING_TIERED_UV,
+ TEXTURE_CASING_TIERED_MAX };
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java
new file mode 100644
index 0000000000..a9f74cd75d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java
@@ -0,0 +1,51 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gtPlusPlus.api.objects.Logger;
+
+public final class TexturesGtTools {
+
+ public static final CustomIcon ANGLE_GRINDER = new CustomIcon("iconsets/ANGLE_GRINDER");
+ public static final CustomIcon ELECTRIC_SNIPS = new CustomIcon("iconsets/ELECTRIC_SNIPS");
+
+ public static final class CustomIcon implements IIconContainer, Runnable {
+
+ private IIcon mIcon, mOverlay;
+ private final String mIconName;
+
+ public CustomIcon(final String aIconName) {
+ this.mIconName = aIconName;
+ Logger.INFO("Constructing a Custom Texture. " + this.mIconName);
+ GregTech_API.sGTItemIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return this.mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return this.mOverlay;
+ }
+
+ @Override
+ public void run() {
+ this.mIcon = GregTech_API.sItemIcons.registerIcon(GTPlusPlus.ID + ":" + this.mIconName);
+ // Utils.LOG_INFO("Registering a Custom Texture. "+mIcon.g);
+ this.mOverlay = GregTech_API.sItemIcons.registerIcon(GTPlusPlus.ID + ":" + this.mIconName + "_OVERLAY");
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationItemsTexture;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java
new file mode 100644
index 0000000000..c983044319
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java
@@ -0,0 +1,410 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures.turbine;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE9;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE1;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE1_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE2;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE2_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE3;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE3_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE4;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE4_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE5;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE5_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE6;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE6_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE7;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE7_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE8;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE8_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE9;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE9_ACTIVE;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings;
+
+public class LargeTurbineTextureHandler {
+
+ /**
+ * LP Turbines
+ */
+ public static IIcon[] OVERLAY_LP_TURBINE = new IIcon[] { LARGETURBINE_ST1.getIcon(), LARGETURBINE_ST2.getIcon(),
+ LARGETURBINE_ST3.getIcon(), LARGETURBINE_ST4.getIcon(), LARGETURBINE_ST5.getIcon(), LARGETURBINE_ST6.getIcon(),
+ LARGETURBINE_ST7.getIcon(), LARGETURBINE_ST8.getIcon(), LARGETURBINE_ST9.getIcon(), };
+
+ public static IIcon[] OVERLAY_LP_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_ST_ACTIVE1.getIcon(),
+ LARGETURBINE_ST_ACTIVE2.getIcon(), LARGETURBINE_ST_ACTIVE3.getIcon(), LARGETURBINE_ST_ACTIVE4.getIcon(),
+ LARGETURBINE_ST_ACTIVE5.getIcon(), LARGETURBINE_ST_ACTIVE6.getIcon(), LARGETURBINE_ST_ACTIVE7.getIcon(),
+ LARGETURBINE_ST_ACTIVE8.getIcon(), LARGETURBINE_ST_ACTIVE9.getIcon(), };
+
+ /**
+ * HP Turbines
+ */
+ public static IIcon[] OVERLAY_HP_TURBINE = new IIcon[] { LARGETURBINE_TI1.getIcon(), LARGETURBINE_TI2.getIcon(),
+ LARGETURBINE_TI3.getIcon(), LARGETURBINE_TI4.getIcon(), LARGETURBINE_TI5.getIcon(), LARGETURBINE_TI6.getIcon(),
+ LARGETURBINE_TI7.getIcon(), LARGETURBINE_TI8.getIcon(), LARGETURBINE_TI9.getIcon(), };
+
+ public static IIcon[] OVERLAY_HP_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_TI_ACTIVE1.getIcon(),
+ LARGETURBINE_TI_ACTIVE2.getIcon(), LARGETURBINE_TI_ACTIVE3.getIcon(), LARGETURBINE_TI_ACTIVE4.getIcon(),
+ LARGETURBINE_TI_ACTIVE5.getIcon(), LARGETURBINE_TI_ACTIVE6.getIcon(), LARGETURBINE_TI_ACTIVE7.getIcon(),
+ LARGETURBINE_TI_ACTIVE8.getIcon(), LARGETURBINE_TI_ACTIVE9.getIcon(), };
+
+ /**
+ * Gas Turbines
+ */
+ public static IIcon[] OVERLAY_GAS_TURBINE = new IIcon[] { LARGETURBINE_SS1.getIcon(), LARGETURBINE_SS2.getIcon(),
+ LARGETURBINE_SS3.getIcon(), LARGETURBINE_SS4.getIcon(), LARGETURBINE_SS5.getIcon(), LARGETURBINE_SS6.getIcon(),
+ LARGETURBINE_SS7.getIcon(), LARGETURBINE_SS8.getIcon(), LARGETURBINE_SS9.getIcon(), };
+
+ public static IIcon[] OVERLAY_GAS_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_SS_ACTIVE1.getIcon(),
+ LARGETURBINE_SS_ACTIVE2.getIcon(), LARGETURBINE_SS_ACTIVE3.getIcon(), LARGETURBINE_SS_ACTIVE4.getIcon(),
+ LARGETURBINE_SS_ACTIVE5.getIcon(), LARGETURBINE_SS_ACTIVE6.getIcon(), LARGETURBINE_SS_ACTIVE7.getIcon(),
+ LARGETURBINE_SS_ACTIVE8.getIcon(), LARGETURBINE_SS_ACTIVE9.getIcon(), };
+
+ /**
+ * Plasma Turbines
+ */
+ public static IIcon[] OVERLAY_PLASMA_TURBINE = new IIcon[] { LARGETURBINE_TU1.getIcon(), LARGETURBINE_TU2.getIcon(),
+ LARGETURBINE_TU3.getIcon(), LARGETURBINE_TU4.getIcon(), LARGETURBINE_TU5.getIcon(), LARGETURBINE_TU6.getIcon(),
+ LARGETURBINE_TU7.getIcon(), LARGETURBINE_TU8.getIcon(), LARGETURBINE_TU9.getIcon(), };
+
+ public static IIcon[] OVERLAY_PLASMA_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_TU_ACTIVE1.getIcon(),
+ LARGETURBINE_TU_ACTIVE2.getIcon(), LARGETURBINE_TU_ACTIVE3.getIcon(), LARGETURBINE_TU_ACTIVE4.getIcon(),
+ LARGETURBINE_TU_ACTIVE5.getIcon(), LARGETURBINE_TU_ACTIVE6.getIcon(), LARGETURBINE_TU_ACTIVE7.getIcon(),
+ LARGETURBINE_TU_ACTIVE8.getIcon(), LARGETURBINE_TU_ACTIVE9.getIcon(), };
+
+ public static IIcon[] OVERLAY_SC_TURBINE = new IIcon[] { OVERLAY_SC_TURBINE1.getIcon(),
+ OVERLAY_SC_TURBINE2.getIcon(), OVERLAY_SC_TURBINE3.getIcon(), OVERLAY_SC_TURBINE4.getIcon(),
+ OVERLAY_SC_TURBINE5.getIcon(), OVERLAY_SC_TURBINE6.getIcon(), OVERLAY_SC_TURBINE7.getIcon(),
+ OVERLAY_SC_TURBINE8.getIcon(), OVERLAY_SC_TURBINE9.getIcon(), };
+
+ public static IIcon[] OVERLAY_SC_TURBINE_ACTIVE = new IIcon[] { OVERLAY_SC_TURBINE1_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE2_ACTIVE.getIcon(), OVERLAY_SC_TURBINE3_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE4_ACTIVE.getIcon(), OVERLAY_SC_TURBINE5_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE6_ACTIVE.getIcon(), OVERLAY_SC_TURBINE7_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE8_ACTIVE.getIcon(), OVERLAY_SC_TURBINE9_ACTIVE.getIcon(), };
+
+ public static IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaSpecialMultiCasings i) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+
+ // 0 shaft
+ // 1 LP
+ // 2 HP
+ // 3 Gas
+ // 4 Plasma
+
+ IIcon[] mGetCurrentTextureSet = null;
+ IIcon[] mGetCurrentTextureSet_ACTIVE = null;
+
+ if ((tMeta <= 0 || tMeta >= 5) && tMeta != 15) {
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ } else {
+ if (tMeta == 1) {
+ mGetCurrentTextureSet = OVERLAY_LP_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_LP_TURBINE_ACTIVE;
+ } else if (tMeta == 2) {
+ mGetCurrentTextureSet = OVERLAY_HP_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_HP_TURBINE_ACTIVE;
+ } else if (tMeta == 3) {
+ mGetCurrentTextureSet = OVERLAY_GAS_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_GAS_TURBINE_ACTIVE;
+ } else if (tMeta == 4) {
+ mGetCurrentTextureSet = OVERLAY_PLASMA_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_PLASMA_TURBINE_ACTIVE;
+ } else {
+ mGetCurrentTextureSet = OVERLAY_SC_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_SC_TURBINE_ACTIVE;
+ }
+ if (mGetCurrentTextureSet == null || mGetCurrentTextureSet_ACTIVE == null) {
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ }
+
+ if ((side == ForgeDirection.NORTH) || (side == ForgeDirection.SOUTH)) {
+ TileEntity tTileEntity;
+ IMetaTileEntity tMetaTileEntity;
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[0];
+ }
+ return mGetCurrentTextureSet[0];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[3];
+ }
+ return mGetCurrentTextureSet[3];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[6];
+ }
+ return mGetCurrentTextureSet[6];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[1];
+ }
+ return mGetCurrentTextureSet[1];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[7];
+ }
+ return mGetCurrentTextureSet[7];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[8];
+ }
+ return mGetCurrentTextureSet[8];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[5];
+ }
+ return mGetCurrentTextureSet[5];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[2];
+ }
+ return mGetCurrentTextureSet[2];
+ }
+ } else if ((side == ForgeDirection.WEST) || (side == ForgeDirection.EAST)) {
+ TileEntity tTileEntity;
+ Object tMetaTileEntity;
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord - 1, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[0];
+ }
+ return mGetCurrentTextureSet[0];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[3];
+ }
+ return mGetCurrentTextureSet[3];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord + 1, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[6];
+ }
+ return mGetCurrentTextureSet[6];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[1];
+ }
+ return mGetCurrentTextureSet[1];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[7];
+ }
+ return mGetCurrentTextureSet[7];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord + 1, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[8];
+ }
+ return mGetCurrentTextureSet[8];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[5];
+ }
+ return mGetCurrentTextureSet[5];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord - 1, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[2];
+ }
+ return mGetCurrentTextureSet[2];
+ }
+ }
+ }
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ }
+
+ public static boolean isUsingAnimatedTexture(TileEntity tTileEntity) {
+ boolean aVal = true;
+ IGregTechTileEntity aTile;
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ aTile = (IGregTechTileEntity) tTileEntity;
+ if (aTile != null) {
+ final IMetaTileEntity aMetaTileEntity = aTile.getMetaTileEntity();
+ if (aMetaTileEntity != null && aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine) {
+ aVal = ((GT_MetaTileEntity_Hatch_Turbine) aMetaTileEntity).getBaseMetaTileEntity()
+ .isActive();
+ // Logger.INFO("Returning "+aVal+" as Rotor Assembly controller status");
+ }
+ }
+ }
+ return aVal;
+ }
+
+ public static GT_MetaTileEntity_Hatch_Turbine isTurbineHatch(final IGregTechTileEntity aTileEntity) {
+ if (aTileEntity != null) {
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity != null && aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine) {
+ return (GT_MetaTileEntity_Hatch_Turbine) aMetaTileEntity;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java
new file mode 100644
index 0000000000..c1f87ef041
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import gtPlusPlus.xmod.gregtech.common.items.covers.MetaItemCoverCasings;
+
+public class CoverManager {
+
+ // GT
+ public static MetaItemCoverCasings Cover_Gt_Machine_Casing;
+
+ public static void generateCustomCovers() {
+
+ // GT Machine Casings
+ Cover_Gt_Machine_Casing = new MetaItemCoverCasings();
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java
new file mode 100644
index 0000000000..8b75f4f156
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java
@@ -0,0 +1,203 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+
+public class GTPP_Cover_Overflow extends GT_CoverBehavior {
+
+ public final int mTransferRate;
+ public final int mInitialTransferRate;
+ public final int mMaxTransferRate;
+
+ public GTPP_Cover_Overflow(int aTransferRate) {
+ this.mTransferRate = aTransferRate * 1000 / 10;
+ this.mInitialTransferRate = aTransferRate;
+ this.mMaxTransferRate = aTransferRate * 1000;
+ }
+
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (aCoverVariable == 0) {
+ return aCoverVariable;
+ }
+ if ((aTileEntity instanceof IFluidHandler)) {
+ // Logger.INFO("Trying to Void via Overflow.");
+ IFluidHandler tTank1;
+ ForgeDirection directionFrom;
+ directionFrom = ForgeDirection.UNKNOWN;
+ tTank1 = (IFluidHandler) aTileEntity;
+ if (tTank1 != null) {
+ FluidStack aTankStack = tTank1.getTankInfo(directionFrom)[0].fluid;
+ if (aTankStack != null) {
+ // Logger.INFO("Found Fluid inside self - "+aTankStack.getLocalizedName()+", overflow point set at
+ // "+aCoverVariable+"L and we have "+aTankStack.amount+"L inside.");
+ if (aTankStack.amount > aCoverVariable) {
+ int aAmountToDrain = aTankStack.amount - aCoverVariable;
+ // Logger.INFO("There is "+aAmountToDrain+" more fluid in the tank than we would like.");
+ if (aAmountToDrain > 0) {
+ FluidStack tLiquid = tTank1.drain(directionFrom, Math.abs(aAmountToDrain), true);
+ if (tLiquid != null) {
+ // Logger.INFO("Drained "+aAmountToDrain+"L.");
+ }
+ }
+ }
+ } else {
+ // Logger.INFO("Could not simulate drain on self.");
+ }
+ }
+ }
+ return aCoverVariable;
+ }
+
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ aCoverVariable += (mMaxTransferRate * (aPlayer.isSneaking() ? 0.1f : 0.01f));
+ } else {
+ aCoverVariable -= (mMaxTransferRate * (aPlayer.isSneaking() ? 0.1f : 0.01f));
+ }
+ if (aCoverVariable > mMaxTransferRate) {
+ aCoverVariable = mInitialTransferRate;
+ }
+ if (aCoverVariable <= 0) {
+ aCoverVariable = mMaxTransferRate;
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("322", "Overflow point: ") + aCoverVariable + GT_Utility.trans("323", "L"));
+ return aCoverVariable;
+ }
+
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ boolean aShift = aPlayer.isSneaking();
+ int aAmount = aShift ? 128 : 8;
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ aCoverVariable += aAmount;
+ } else {
+ aCoverVariable -= aAmount;
+ }
+ if (aCoverVariable > mMaxTransferRate) {
+ aCoverVariable = mInitialTransferRate;
+ }
+ if (aCoverVariable <= 0) {
+ aCoverVariable = mMaxTransferRate;
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("322", "Overflow point: ") + aCoverVariable + GT_Utility.trans("323", "L"));
+ aTileEntity.setCoverDataAtSide(side, new ISerializableObject.LegacyCoverData(aCoverVariable));
+ return true;
+ }
+
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 5;
+ }
+
+ // GUI
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new OverflowUIFactory(buildContext).createWindow();
+ }
+
+ private class OverflowUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public OverflowUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ AtomicBoolean warn = new AtomicBoolean(false);
+
+ builder
+ .widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GTPP_Cover_Overflow.this)
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) convert(coverData),
+ (coverData, state) -> new ISerializableObject.LegacyCoverData(state.intValue()),
+ widget -> widget.setBounds(0, mMaxTransferRate)
+ .setScrollValues(1000, 144, 100000)
+ .setFocusOnGuiOpen(true)
+ .setPos(startX + spaceX * 0, startY + spaceY * 1 + 8)
+ .setSize(spaceX * 4 - 3, 12)))
+ .widget(
+ new TextWidget(GT_Utility.trans("322", "Overflow point: ")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX, 4 + startY + spaceY * 0 + 8));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java
new file mode 100644
index 0000000000..42ab793c9c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class GTPP_Cover_ToggleVisual extends GT_CoverBehavior {
+
+ private static final Map<String, Integer> sConnectionStateForEntityMap = new ConcurrentHashMap<>();
+ private static final Map<String, String> sPrefixMap = new ConcurrentHashMap<>();
+ private static final int VALUE_OFF = 0;
+ private static final int VALUE_ON = 1;
+
+ public static String generateUniqueKey(ForgeDirection side, ICoverable aEntity) {
+ try {
+ BlockPos aPos = new BlockPos(
+ aEntity.getIGregTechTileEntity(aEntity.getXCoord(), aEntity.getYCoord(), aEntity.getZCoord()));
+
+ String s = aEntity.getInventoryName() + "." + aPos.getUniqueIdentifier() + side.name();
+ return s;
+ } catch (Throwable t) {}
+ XSTR x = new XSTR();
+ return "ERROR." + x.getSeed() + x.hashCode() + x.nextDouble() + ".ID";
+ }
+
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ PlayerUtils
+ .messagePlayer(aPlayer, GT_Utility.trans("756", "Connectable: ") + getConnectionState(aCoverVariable));
+ return super.onCoverRightclick(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return super.onCoverScrewdriverclick(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ try {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ Integer b = sConnectionStateForEntityMap.get(aKey);
+ // Logger.INFO("Val: "+aCoverVariable);
+ if (b != null && aCoverVariable != b) {
+ aCoverVariable = b;
+ }
+ if (b == null) {
+ b = aCoverVariable;
+ sConnectionStateForEntityMap.put(aKey, b);
+ trySetState(side, b == VALUE_ON ? VALUE_ON : VALUE_OFF, aTileEntity);
+ }
+ } catch (Throwable t) {
+
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return super.alwaysLookConnected(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ if (!getConnectionState(aCoverVariable)) {
+ return 0;
+ }
+ return super.getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ boolean state = getCoverConnections(aCover);
+ sPrefixMap.put(aKey, aCover.getUnlocalizedName());
+ Logger.INFO("Mapping key " + aKey + " to " + state);
+ sConnectionStateForEntityMap.put(aKey, state ? VALUE_ON : VALUE_OFF);
+ Logger.INFO("Key Value: " + (state ? VALUE_ON : VALUE_OFF));
+ // Try set cover state directly
+ // trySetState(aSide, state ? VALUE_ON : VALUE_OFF, aTileEntity);
+ super.placeCover(side, aCover, aTileEntity);
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ sConnectionStateForEntityMap.remove(aKey);
+ // Logger.INFO("Unmapping key "+aKey+".");
+ return true;
+ }
+
+ public static boolean getConnectionState(int aCoverVar) {
+ return aCoverVar == VALUE_ON;
+ }
+
+ private static void trySetState(ForgeDirection side, int aState, ICoverable aTile) {
+ // Try set cover state directly
+ if (aTile instanceof IGregTechTileEntity gTileEntity) {
+ gTileEntity.setCoverDataAtSide(side, new ISerializableObject.LegacyCoverData(aState));
+ }
+ }
+
+ public static boolean getConnectionState(ForgeDirection side, ICoverable aTile) {
+ String aKey = generateUniqueKey(side, aTile);
+ return getConnectionState(aKey);
+ }
+
+ public static boolean getConnectionState(String aKey) {
+ Integer b = sConnectionStateForEntityMap.get(aKey);
+ // Logger.INFO("Get State: "+b+" | "+aKey);
+ return b != null ? b == VALUE_ON : false;
+ }
+
+ public static final boolean getCoverConnections(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getBoolean("AllowConnections");
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java
new file mode 100644
index 0000000000..924484e098
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java
@@ -0,0 +1,346 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import static gregtech.api.GregTech_API.mEUtoRF;
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.api.enums.Mods.COFHCore;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+import baubles.api.BaublesApi;
+import cofh.api.energy.IEnergyContainerItem;
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gregtech.common.items.GT_MetaGenerated_Item_02;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class ChargingHelper {
+
+ private static final Map<String, Pair<GregtechMetaWirelessCharger, Byte>> mValidPlayers = new HashMap<>();
+ protected static Map<BlockPos, GregtechMetaWirelessCharger> mChargerMap = new HashMap<>();
+ private int mTickTimer = 0;
+ private static final int mTickMultiplier = 20;
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onServerTick(ServerTickEvent event) {
+ if (++mTickTimer % mTickMultiplier == 0) {
+ if (Utils.isServer()) {
+ for (EntityPlayer mPlayerMan : PlayerUtils.getOnlinePlayers()) {
+ doPlayerChargeTick(mPlayerMan);
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void doPlayerChargeTick(EntityPlayer mPlayerMan) {
+ try {
+ long mVoltage;
+ long mEuStored;
+
+ if (!mChargerMap.isEmpty() && mValidPlayers.containsKey(mPlayerMan.getDisplayName())) {
+ InventoryPlayer mPlayerInventory = mPlayerMan.inventory;
+ ItemStack[] mArmourContents = mPlayerInventory.armorInventory.clone();
+ ItemStack[] mInventoryContents = mPlayerInventory.mainInventory.clone();
+ ItemStack[] baubleSlots = null;
+ if (Baubles.isModLoaded()) {
+ IInventory baubleInv = BaublesApi.getBaubles(mPlayerMan);
+ if (baubleInv != null) {
+ baubleSlots = new ItemStack[baubleInv.getSizeInventory()];
+ for (int i = 0; i < baubleInv.getSizeInventory(); i++) {
+ baubleSlots[i] = baubleInv.getStackInSlot(i);
+ }
+ }
+ }
+
+ for (GregtechMetaWirelessCharger mEntityTemp : mChargerMap.values()) {
+ if (mEntityTemp != null) {
+ if (mEntityTemp.getBaseMetaTileEntity() == null || !mEntityTemp.getBaseMetaTileEntity()
+ .isAllowedToWork()) continue;
+ if (mPlayerMan.getEntityWorld().provider.dimensionId == mEntityTemp.getDimensionID()) {
+ mVoltage = mEntityTemp.maxEUInput();
+ mEuStored = mEntityTemp.getEUVar();
+ if (mVoltage > 0 && mEuStored >= mVoltage) {
+ Map<String, UUID> LR = mEntityTemp.getLongRangeMap();
+ Map<String, UUID> LO = mEntityTemp.getLocalMap();
+
+ long mStartingEu = mEntityTemp.getEUVar();
+ if (canCharge(mEntityTemp, mPlayerMan, LR, LO)) {
+ chargeItems(mEntityTemp, mArmourContents);
+ chargeItems(mEntityTemp, mInventoryContents);
+ chargeItems(mEntityTemp, baubleSlots);
+ }
+
+ if (mStartingEu - mEntityTemp.getEUVar() <= 0) {
+ long mMaxDistance;
+ if (mEntityTemp.getMode() == 0) {
+ mMaxDistance = (4 * GT_Values.V[mEntityTemp.getTier()]);
+ } else if (mEntityTemp.getMode() == 1) {
+ mMaxDistance = (mEntityTemp.getTier() * 10L);
+ } else {
+ mMaxDistance = (4 * GT_Values.V[mEntityTemp.getTier()] / 2);
+ }
+ double mDistance = calculateDistance(mEntityTemp, mPlayerMan);
+ long mVoltageCost = MathUtils.findPercentageOfInt(mMaxDistance, (float) mDistance);
+
+ if (mVoltageCost > 0) {
+ if (mVoltageCost > mEntityTemp.maxEUInput()) {
+ mEntityTemp.setEUVar((mEntityTemp.getEUVar() - mEntityTemp.maxEUInput()));
+ } else {
+ mEntityTemp.setEUVar((mEntityTemp.getEUVar() - mVoltageCost));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+ if (!mChargerMap.isEmpty()) {
+ for (BlockPos aPos : mChargerMap.keySet()) {
+ GregtechMetaWirelessCharger r = mChargerMap.get(aPos);
+ if (r == null || r.getBaseMetaTileEntity()
+ .isInvalidTileEntity()) {
+ mChargerMap.remove(aPos);
+ }
+ }
+ }
+ }
+ }
+
+ public static GregtechMetaWirelessCharger getEntry(BlockPos mPos) {
+ return mChargerMap.get(mPos);
+ }
+
+ public static boolean addEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ mChargerMap.put(mPos, mEntity);
+ return true;
+ }
+
+ public static boolean removeEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mChargerMap.containsKey(mPos)) {
+ return mChargerMap.remove(mPos, mEntity);
+ } else {
+ return false;
+ }
+ }
+
+ public static boolean addValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mValidPlayers.containsKey(mPlayer.getDisplayName())) {
+ return false;
+ } else {
+ Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<>(mEntity, (byte) mEntity.getMode());
+ return mValidPlayers.put(mPlayer.getDisplayName(), mEntry) == null;
+ }
+ }
+
+ public static boolean removeValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mValidPlayers.containsKey(mPlayer.getDisplayName())) {
+ Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<>(mEntity, (byte) mEntity.getMode());
+ return mValidPlayers.remove(mPlayer.getDisplayName(), mEntry);
+ } else {
+ return false;
+ }
+ }
+
+ private boolean canCharge(GregtechMetaWirelessCharger charger, EntityPlayer chargeablePlayer,
+ Map<String, UUID> longRangeChargers, Map<String, UUID> shortRangeChargers) {
+ if (charger.getMode() == 0) {
+ return !longRangeChargers.isEmpty() && longRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ } else if (charger.getMode() == 1) {
+ return !shortRangeChargers.isEmpty() && shortRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ } else {
+ if (!longRangeChargers.isEmpty() && longRangeChargers.containsKey(chargeablePlayer.getDisplayName())) {
+ return true;
+ }
+ return !shortRangeChargers.isEmpty() && shortRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ }
+ }
+
+ private double calculateDistance(GregtechMetaWirelessCharger mEntityTemp, EntityPlayer mPlayerMan) {
+ if (mEntityTemp == null || mPlayerMan == null) {
+ return 0;
+ }
+ return mEntityTemp.getDistanceBetweenTwoPositions(
+ mEntityTemp.getTileEntityPosition(),
+ mEntityTemp.getPositionOfEntity(mPlayerMan));
+ }
+
+ private void chargeItems(@Nonnull GregtechMetaWirelessCharger mEntity, ItemStack[] mItems) {
+ if (mItems == null || mItems.length == 0) {
+ return;
+ }
+ chargeItemsEx(mEntity, mItems);
+ }
+
+ private void chargeItemsEx(@Nonnull GregtechMetaWirelessCharger mEntity, ItemStack[] mItems) {
+ // Bad Inventory
+ if (mItems == null || mItems.length == 0) {
+ return;
+ }
+ // Set Variables to Charge
+ final long mVoltage = mEntity.maxEUInput();
+ long mEuStored = mEntity.getEUVar();
+ // For Inventory Contents
+
+ for (ItemStack mTemp : mItems) {
+ // Is item Electrical
+ if (isItemValid(mTemp)) {
+ // Transfer Limit
+ double mItemEuTLimit = ((IElectricItem) mTemp.getItem()).getTransferLimit(mTemp);
+ // Check if Tile has more or equal EU to what can be transferred into the item.
+ if (mEuStored >= mItemEuTLimit) {
+
+ double mItemMaxCharge = ((IElectricItem) mTemp.getItem()).getMaxCharge(mTemp);
+ double mitemCurrentCharge = ElectricItem.manager.getCharge(mTemp);
+
+ if (mitemCurrentCharge >= mItemMaxCharge) {
+ continue;
+ }
+
+ // Try to get charge direct from NBT for GT and IC2 stacks
+ if (mTemp.getItem() instanceof GT_MetaGenerated_Tool_01
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_01
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_02
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_03
+ || mTemp.getItem()
+ .getClass()
+ .getName()
+ .equalsIgnoreCase(GT_MetaGenerated_Tool_01.class.getName())) {
+ if (!NBTUtils.hasKey(mTemp, "GT.ItemCharge")) {
+ if (!mTemp.getDisplayName()
+ .toLowerCase()
+ .contains("battery")) {
+ if (!GT_ModHandler.isElectricItem(mTemp)) {
+ continue;
+ }
+ } else {
+ mitemCurrentCharge = 0;
+ }
+ } else {
+ mitemCurrentCharge = NBTUtils.getLong(mTemp, "GT.ItemCharge");
+ }
+ } else if (mTemp.getItem() instanceof IElectricItem) {
+ mitemCurrentCharge = NBTUtils.getLong(mTemp, "charge");
+ }
+
+ double mVoltageIncrease;
+ if (mItemEuTLimit >= mVoltage) {
+ mVoltageIncrease = mVoltage;
+ } else if (mItemEuTLimit < mVoltage) {
+ mVoltageIncrease = mItemEuTLimit;
+ } else {
+ mVoltageIncrease = mItemEuTLimit;
+ }
+
+ int mMulti;
+ if ((mitemCurrentCharge + (mVoltageIncrease * 20)) <= (mItemMaxCharge - (mVoltageIncrease * 20))) {
+ mMulti = 20;
+ } else if ((mitemCurrentCharge + (mVoltageIncrease * 10))
+ <= (mItemMaxCharge - (mVoltageIncrease * 10))) {
+ mMulti = 10;
+ } else if ((mitemCurrentCharge + (mVoltageIncrease * 5))
+ <= (mItemMaxCharge - (mVoltageIncrease * 5))) {
+ mMulti = 5;
+ } else {
+ mMulti = 1;
+ }
+
+ int mMultiVoltage = (int) (mMulti * mVoltageIncrease);
+
+ if ((mitemCurrentCharge + mMultiVoltage) <= mItemMaxCharge) {
+ if (GT_ModHandler.chargeElectricItem(mTemp, mMultiVoltage, Integer.MAX_VALUE, true, false)
+ > 0) {
+ for (int i = 0; i < mMulti; i++) {
+ ElectricItem.manager.charge(mTemp, mVoltageIncrease, Integer.MAX_VALUE, false, false);
+ }
+ }
+ if (ElectricItem.manager.getCharge(mTemp) > mitemCurrentCharge) {
+ mEntity.setEUVar(mEuStored - (mVoltage * mMulti));
+ mEuStored = mEntity.getEUVar();
+ }
+ }
+
+ // Try top up Item Chrage
+ mitemCurrentCharge = ElectricItem.manager.getCharge(mTemp);
+ if (mitemCurrentCharge < mItemMaxCharge && mitemCurrentCharge >= (mItemMaxCharge - mVoltage)) {
+ int xDif = (int) (mItemMaxCharge - mitemCurrentCharge);
+ if (GT_ModHandler.chargeElectricItem(mTemp, xDif, Integer.MAX_VALUE, true, false) >= 0) {
+ if (ElectricItem.manager.getCharge(mTemp) >= mItemMaxCharge) {
+ mEntity.setEUVar(mEntity.getEUVar() - (xDif));
+ mEuStored = mEntity.getEUVar();
+ }
+ }
+ }
+ }
+ } else if (isItemValidRF(mTemp)) {
+ try {
+ IEnergyContainerItem rfItem = (IEnergyContainerItem) mTemp.getItem();
+ if (rfItem != null) {
+ long chargedPower = Math.min(
+ rfItem.getMaxEnergyStored(mTemp) - rfItem.getEnergyStored(mTemp),
+ mEntity.getEUVar() * mEUtoRF / 100L);
+ chargedPower = rfItem.receiveEnergy(
+ mTemp,
+ chargedPower > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) chargedPower,
+ false);
+ chargedPower = chargedPower * 100L / mEUtoRF;
+ mEntity.setEUVar(Math.max(mEntity.getEUVar() - chargedPower, 0));
+ mEuStored = mEntity.getEUVar();
+ }
+ } catch (Exception ignored) {
+
+ }
+ }
+ }
+ }
+
+ public static boolean isItemValid(final ItemStack itemstack) {
+ if (itemstack == null) {
+ return false;
+ }
+ if (GT_ModHandler.isElectricItem(itemstack)) {
+ return true;
+ }
+ return itemstack.getItem() instanceof IElectricItem;
+ }
+
+ private static boolean isItemValidRF(final ItemStack itemStack) {
+ return itemStack != null && COFHCore.isModLoaded() && itemStack.getItem() instanceof IEnergyContainerItem;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java
new file mode 100644
index 0000000000..8cbb473a42
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+
+public class FlotationRecipeHandler {
+
+ private static final HashMap<String, Material> sMaterialMap = new HashMap<>();
+ private static final HashMap<String, ItemStack> sMilledMap = new HashMap<>();
+
+ public static boolean registerOreType(Material aMaterial) {
+ String aMaterialKey = aMaterial.getUnlocalizedName();
+ if (sMaterialMap.containsKey(aMaterialKey)) {
+ Logger.WARNING("Tried to register a Flotation material already in use. Material: " + aMaterialKey);
+ return false;
+ } else {
+ sMaterialMap.put(aMaterialKey, aMaterial);
+ sMilledMap.put(aMaterialKey, aMaterial.getMilled(1));
+ }
+ return true;
+ }
+
+ public static Material getMaterialOfMilledProduct(ItemStack aMilled) {
+ for (String aKey : sMilledMap.keySet()) {
+ ItemStack aTempMilledStack = sMilledMap.get(aKey);
+ if (GT_Utility.areStacksEqual(aTempMilledStack, aMilled, true)) {
+ return sMaterialMap.get(aKey);
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack findMilledStack(GT_Recipe aRecipe) {
+ if (aRecipe == null || aRecipe.mInputs == null || aRecipe.mInputs.length <= 0) {
+ return null;
+ }
+ return findMilledStack(aRecipe.mInputs);
+ }
+
+ public static ItemStack findMilledStack(ItemStack[] aInputs) {
+ if (aInputs == null || aInputs.length <= 0) {
+ return null;
+ }
+ for (ItemStack aStack : aInputs) {
+ for (int oredictID : OreDictionary.getOreIDs(aStack)) {
+ String oredict = OreDictionary.getOreName(oredictID);
+ if (oredict.startsWith(OrePrefixes.milled.toString())) {
+ return aStack;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java
new file mode 100644
index 0000000000..ced9b46c3e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java
@@ -0,0 +1,19 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+
+public class GT_MethodHelper {
+
+ public static ITexture[] getTexture(TileEntity tTileEntity, Block aBlock, ForgeDirection side) {
+ if (tTileEntity instanceof ITexturedTileEntity) {
+ return ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, side);
+ }
+ return BlockIcons.ERROR_RENDERING;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java
new file mode 100644
index 0000000000..2b0e2a7a4d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java
@@ -0,0 +1,125 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_VolumetricFlask;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class VolumetricFlaskHelper {
+
+ public static ItemStack getVolumetricFlask(int aAmount) {
+ return ItemList.VOLUMETRIC_FLASK.get(aAmount);
+ }
+
+ public static ItemStack getLargeVolumetricFlask(int aAmount) {
+ return GregtechItemList.VOLUMETRIC_FLASK_8k.get(aAmount);
+ }
+
+ public static ItemStack getGiganticVolumetricFlask(int aAmount) {
+ return GregtechItemList.VOLUMETRIC_FLASK_32k.get(aAmount);
+ }
+
+ public static boolean isVolumetricFlask(ItemStack aStack) {
+ return isNormalVolumetricFlask(aStack) || isLargeVolumetricFlask(aStack) || isGiganticVolumetricFlask(aStack);
+ }
+
+ public static boolean isNormalVolumetricFlask(ItemStack aStack) {
+ return aStack.getItem() == ItemList.VOLUMETRIC_FLASK.getItem();
+ }
+
+ public static boolean isLargeVolumetricFlask(ItemStack aStack) {
+ return GregtechItemList.VOLUMETRIC_FLASK_8k.getItem() == aStack.getItem();
+ }
+
+ public static boolean isGiganticVolumetricFlask(ItemStack aStack) {
+ return GregtechItemList.VOLUMETRIC_FLASK_32k.getItem() == aStack.getItem();
+ }
+
+ public static int getMaxFlaskCapacity(ItemStack aStack) {
+ if (aStack != null) {
+ Item aItem = aStack.getItem();
+ if (aItem instanceof GT_VolumetricFlask) {
+ return ((GT_VolumetricFlask) aItem).getMaxCapacity();
+ }
+ }
+ return 0;
+ }
+
+ public static boolean isFlaskEmpty(ItemStack aStack) {
+ return getFlaskFluid(aStack) == null;
+ }
+
+ public static FluidStack getFlaskFluid(ItemStack aStack) {
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt.hasKey("Fluid", 10)) return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid"));
+ }
+ return null;
+ }
+
+ public static void setFluid(ItemStack stack, FluidStack fluidStack) {
+ boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0);
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ if (removeFluid) return;
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ if (removeFluid) {
+ nbt.removeTag("Fluid");
+ if (nbt.hasNoTags()) {
+ stack.setTagCompound(null);
+ }
+ } else {
+ nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ public static int getFlaskCapacity(ItemStack aStack) {
+ int capacity = 1000;
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt.hasKey("Capacity", 3)) capacity = nbt.getInteger("Capacity");
+ }
+ return Math.min(getMaxFlaskCapacity(aStack), capacity);
+ }
+
+ public static boolean setNewFlaskCapacity(ItemStack aStack, int aCapacity) {
+ if (aStack == null || aCapacity <= 0) {
+ return false;
+ }
+ aCapacity = Math.min(aCapacity, getMaxFlaskCapacity(aStack));
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt == null) {
+ aStack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ nbt.setInteger("Capacity", aCapacity);
+ return true;
+ }
+
+ public static int fillFlask(ItemStack stack, FluidStack resource, boolean doFill) {
+ if (stack.stackSize != 1) return 0;
+ if ((resource == null) || (resource.amount <= 0)) {
+ return 0;
+ }
+ FluidStack fluidStack = getFlaskFluid(stack);
+ if (fluidStack == null) {
+ fluidStack = new FluidStack(resource, 0);
+ } else if (!fluidStack.isFluidEqual(resource)) {
+ return 0;
+ }
+ int amount = Math.min(getMaxFlaskCapacity(stack) - fluidStack.amount, resource.amount);
+ if ((doFill) && (amount > 0)) {
+ fluidStack.amount += amount;
+ setFluid(stack, fluidStack);
+ }
+ return amount;
+ }
+
+ public static Item generateNewFlask(String unlocalized, String english, int maxCapacity) {
+ return new GT_VolumetricFlask(unlocalized, english, maxCapacity);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java
new file mode 100644
index 0000000000..3717f17554
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java
@@ -0,0 +1,256 @@
+package gtPlusPlus.xmod.gregtech.common.helpers.tesseract;
+
+import static gtPlusPlus.core.lib.CORE.sTesseractGeneratorOwnershipMap;
+import static gtPlusPlus.core.lib.CORE.sTesseractTerminalOwnershipMap;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+
+public class TesseractHelper {
+
+ /**
+ * Tesseract Generator Helpers
+ *
+ * @param player
+ * @return
+ */
+
+ // Checks if a Generator is owned by a player.
+ public static final boolean isGeneratorOwnedByPlayer(EntityPlayer player,
+ GT_MetaTileEntity_TesseractGenerator generator) {
+ if (player == null) {
+ Logger.WARNING("Failed. [isGeneratorOwnedByPlayer]");
+ return false;
+ }
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 1");
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 2");
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> generators = getGeneratorOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractGenerator>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractGenerator> current : players) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 3");
+ if (current.getValue()
+ .equals(generator)) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 4");
+ return true;
+ }
+ }
+ }
+ Logger.WARNING("Failed. [isGeneratorOwnedByPlayer]");
+ return false;
+ }
+
+ // Saves A Generator to the Players UUID map along with the Freq.
+ public static final boolean setGeneratorOwnershipByPlayer(EntityPlayer player, int freq,
+ GT_MetaTileEntity_TesseractGenerator generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Setting Generator on " + freq + " for " + player.getDisplayName() + ".");
+ if (playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> playerOwned = sTesseractGeneratorOwnershipMap
+ .get(playerIdentifier);
+ if (playerOwned == null || playerOwned.isEmpty()) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> newOwnershipMap = new HashMap<>();
+ newOwnershipMap.put(freq, generator);
+ sTesseractGeneratorOwnershipMap.put(playerIdentifier, newOwnershipMap);
+ Logger.WARNING("Success! [Empty Map]");
+ return true;
+ } else if (sTesseractGeneratorOwnershipMap.containsKey(playerIdentifier)) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> ownershipMap = sTesseractGeneratorOwnershipMap
+ .get(playerIdentifier);
+ if (!ownershipMap.containsKey(freq)) {
+ ownershipMap.put(freq, generator);
+ }
+ ownershipMap.put(freq, generator);
+ sTesseractGeneratorOwnershipMap.put(playerIdentifier, ownershipMap);
+ Logger.WARNING("Success!");
+ return true;
+ }
+ }
+ Logger.WARNING("Failed. [setGeneratorOwnershipByPlayer]");
+ return false;
+ }
+
+ // Gets Generator based on Frequency.
+ public static final GT_MetaTileEntity_TesseractGenerator getGeneratorByFrequency(EntityPlayer player, int freq) {
+ if (player == null) {
+ return null;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Getting Generator on " + freq + " for " + player.getDisplayName() + ".");
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 1");
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> generators = getGeneratorOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractGenerator>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractGenerator> current : players) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 2");
+ if (current.getKey()
+ .equals(freq)) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 3");
+ Logger.WARNING("Success!");
+ return current.getValue();
+ }
+ }
+ }
+ Logger.WARNING("Failed. [getGeneratorByFrequency]");
+ return null;
+ }
+
+ // Remove Tesseract Generator
+ public static final boolean removeGenerator(EntityPlayer player, int frequency) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ sTesseractGeneratorOwnershipMap.get(playerIdentifier)
+ .remove(frequency);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * Tesseract Terminal Helpers
+ *
+ * @param player
+ * @return
+ */
+
+ // Checks if a Terminal is owned by a player.
+ public static final boolean isTerminalOwnedByPlayer(EntityPlayer player,
+ GT_MetaTileEntity_TesseractTerminal generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> generators = getTerminalOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractTerminal>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractTerminal> current : players) {
+ if (current.getValue()
+ .equals(generator)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ // Saves A Terminal to the Players UUID map along with the Freq.
+ public static final boolean setTerminalOwnershipByPlayer(EntityPlayer player, int freq,
+ GT_MetaTileEntity_TesseractTerminal generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (playerIdentifier != null) {
+ Logger.WARNING("Setting Terminal on " + freq + " for " + player.getDisplayName() + ".");
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> playerOwned = sTesseractTerminalOwnershipMap
+ .get(playerIdentifier);
+ if (playerOwned == null || playerOwned.isEmpty()) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> newOwnershipMap = new HashMap<>();
+ newOwnershipMap.put(freq, generator);
+ sTesseractTerminalOwnershipMap.put(playerIdentifier, newOwnershipMap);
+ Logger.WARNING("Success! [Empty Map]");
+ return true;
+ } else if (sTesseractTerminalOwnershipMap.containsKey(playerIdentifier)) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> ownershipMap = sTesseractTerminalOwnershipMap
+ .get(playerIdentifier);
+ if (!ownershipMap.containsKey(freq)) {
+ ownershipMap.put(freq, generator);
+ }
+ sTesseractTerminalOwnershipMap.put(playerIdentifier, ownershipMap);
+ Logger.WARNING("Success!");
+ return true;
+ }
+ }
+ Logger.WARNING("Failed. [setTerminalOwnershipByPlayer]");
+ return false;
+ }
+
+ // Gets Terminal based on Frequency.
+ public static final GT_MetaTileEntity_TesseractTerminal getTerminalByFrequency(EntityPlayer player, int freq) {
+ if (player == null) {
+ return null;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Getting Terminal on " + freq + " for " + player.getDisplayName() + ".");
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> generators = getTerminalOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractTerminal>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractTerminal> current : players) {
+ if (current.getKey()
+ .equals(freq)) {
+ Logger.WARNING("Success!");
+ return current.getValue();
+ }
+ }
+ }
+ Logger.WARNING("Failed. [getTerminalByFrequency]");
+ return null;
+ }
+
+ // Remove Tesseract Terminal
+ public static final boolean removeTerminal(EntityPlayer player, int frequency) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ sTesseractTerminalOwnershipMap.get(playerIdentifier)
+ .remove(frequency);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * Internal Methods
+ *
+ */
+ private static Map<Integer, GT_MetaTileEntity_TesseractGenerator> getGeneratorOwnershipByPlayer(
+ EntityPlayer player) {
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Set<Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>>> players = sTesseractGeneratorOwnershipMap
+ .entrySet();
+ for (Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>> current : players) {
+ if (current.getKey()
+ .compareTo(playerIdentifier) == 0) {
+ return current.getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Map<Integer, GT_MetaTileEntity_TesseractTerminal> getTerminalOwnershipByPlayer(EntityPlayer player) {
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Set<Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>>> players = sTesseractTerminalOwnershipMap
+ .entrySet();
+ for (Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>> current : players) {
+ if (current.getKey()
+ .compareTo(playerIdentifier) == 0) {
+ return current.getValue();
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java
new file mode 100644
index 0000000000..8edb8c2cf9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.StringUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.objects.GT_MultiTexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.covers.GTPP_Cover_ToggleVisual;
+
+public class MetaCustomCoverItem extends Item {
+
+ protected final IIcon[] icons;
+ private final String mModID;
+ private final String mTextureSetName;
+ protected final IIconContainer[] mTextures;
+ private final short[][] mRGB;
+
+ public MetaCustomCoverItem(String aModId, int aTextureCount, String aTextureSetName, IIconContainer[] aTextures,
+ short[][] aRGB) {
+ super();
+ icons = new IIcon[aTextureCount];
+ mModID = aModId;
+ mTextureSetName = Utils.sanitizeString(aTextureSetName);
+ mTextures = aTextures;
+ mRGB = aRGB;
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemPlate");
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemCustomMetaCover." + mModID + "." + mTextureSetName;
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ registerCover();
+ Logger.INFO(
+ "[Covers] Generated Custom covers for " + mModID
+ + " using "
+ + aTextureCount
+ + " textures from "
+ + mTextureSetName
+ + ".");
+ }
+
+ public boolean hide() {
+ return true;
+ }
+
+ private void registerCover() {
+ // CommonProxy.registerItemRendererGlobal(this, new CustomItemBlockRenderer());
+ for (int i = 0; i < icons.length; i++) {
+ ItemStack thisStack = ItemUtils.simpleMetaStack(this, i, 1);
+ if (i > 0 && hide()) {
+ ItemUtils.hideItemFromNEI(thisStack);
+ }
+ GregTech_API.registerCover(
+ thisStack,
+ new GT_MultiTexture(new ITexture[] { new GT_RenderedTexture(mTextures[i]) }),
+ new GTPP_Cover_ToggleVisual());
+ }
+ }
+
+ /*
+ * @Override public void registerIcons(IIconRegister reg) { for (int i = 0; i < icons.length; i++) { this.icons[i] =
+ * mTextures[i].getIcon(); } }
+ * @Override public IIcon getIconFromDamage(int meta) { return this.icons[meta]; }
+ */
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < icons.length; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StringUtils.capitalize(mTextureSetName) + " (" + tItem.getItemDamage() + ")"; // super.getItemStackDisplayName(tItem);
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setBoolean("AllowConnections", false);
+ tagMain.setTag("CustomCoverMeta", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getCoverDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setCoverDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static final boolean getCoverConnections(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getBoolean("AllowConnections");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return false;
+ }
+
+ public static final boolean setCoverConnections(final ItemStack aStack, final boolean aConnections) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ aNBT.setBoolean("AllowConnections", aConnections);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getCoverDamage(stack);
+ double meta = stack.getItemDamage() == 0 ? 50 : 2500;
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ if (KeyboardUtils.isShiftKeyDown()) {
+ boolean con = getCoverConnections(stack);
+ if (con) {
+ setCoverConnections(stack, false);
+ } else {
+ setCoverConnections(stack, true);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ boolean cons = getCoverConnections(stack);
+ list.add(EnumChatFormatting.GRAY + "Allows Connections: " + cons);
+ list.add(EnumChatFormatting.GRAY + "Shift Rmb to change state before applying");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public Item setFull3D() {
+ // TODO Auto-generated method stub
+ return super.setFull3D();
+ }
+
+ @Override
+ public boolean isFull3D() {
+ // TODO Auto-generated method stub
+ return super.isFull3D();
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.mRGB == null) {
+ return super.getColorFromItemStack(stack, HEX_OxFFFFFF);
+ }
+ int aMeta = stack.getItemDamage();
+ return Utils.rgbtoHexValue(mRGB[aMeta][0], mRGB[aMeta][1], mRGB[aMeta][2]);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java
new file mode 100644
index 0000000000..8173a868aa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java
@@ -0,0 +1,292 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+import static gtPlusPlus.core.util.Utils.getTcAspectStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_MultiTexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaItem_X32;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.covers.GTPP_Cover_Overflow;
+
+public class MetaGeneratedGregtechItems extends Gregtech_MetaItem_X32 {
+
+ public static final MetaGeneratedGregtechItems INSTANCE;
+
+ static {
+ INSTANCE = new MetaGeneratedGregtechItems();
+ }
+
+ public MetaGeneratedGregtechItems() {
+ super("MU-metaitem.01", new OrePrefixes[] { null });
+ }
+
+ public void generateMetaItems() {
+ int tLastID = 0;
+
+ // Extruder Shape
+ GregtechItemList.Shape_Extruder_WindmillShaft
+ .set(this.addItem(40, "Extruder Shape (Shaft)", "Extruder Shape for making Windmill Shafts"));
+
+ // Batteries
+ GregtechItemList.Battery_RE_EV_Sodium.set(
+ this.addItem(
+ tLastID = 50,
+ "Quad Cell Sodium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L)));
+ this.setElectricStats(32000 + tLastID, 3200000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Sodium.get(1), EV);
+
+ GregtechItemList.Battery_RE_EV_Cadmium.set(
+ this.addItem(
+ tLastID = 52,
+ "Quad Cell Cadmium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.METALLUM, 1L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 1L)));
+ this.setElectricStats(32000 + tLastID, 4800000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Cadmium.get(1), EV);
+
+ GregtechItemList.Battery_RE_EV_Lithium.set(
+ this.addItem(
+ tLastID = 54,
+ "Quad Cell Lithium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 3L),
+ getTcAspectStack(TC_Aspects.METALLUM, 3L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 3L)));
+ this.setElectricStats(32000 + tLastID, 6400000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Lithium.get(1), EV);
+
+ /**
+ * Power Gems
+ */
+ GregtechItemList.Battery_Gem_1.set(
+ this.addItem(
+ tLastID = 66,
+ "Proton Cell",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 8L),
+ getTcAspectStack(TC_Aspects.METALLUM, 24L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 16L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[6] * 20 * 300 / 4, GT_Values.V[6], 6L, -3L, false);
+ GregtechItemList.Battery_Gem_2.set(
+ this.addItem(
+ tLastID = 68,
+ "Electron Cell",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 16L),
+ getTcAspectStack(TC_Aspects.METALLUM, 32L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 32L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[7] * 20 * 300 / 4, GT_Values.V[7], 7L, -3L, false);
+ GregtechItemList.Battery_Gem_3.set(
+ this.addItem(
+ tLastID = 70,
+ "Quark Entanglement",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 32L),
+ getTcAspectStack(TC_Aspects.METALLUM, 48L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 64L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[8] * 20 * 300 / 4, GT_Values.V[8], 8L, -3L, false);
+
+ // RTG Pellet
+ GregtechItemList.Pellet_RTG_PU238.set(
+ this.addItem(
+ 41,
+ StringUtils.superscript("238") + "Pu Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_SR90.set(
+ this.addItem(
+ 42,
+ StringUtils.superscript("90") + "Sr Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_PO210.set(
+ this.addItem(
+ 43,
+ StringUtils.superscript("210") + "Po Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_AM241.set(
+ this.addItem(
+ 44,
+ StringUtils.superscript("241") + "Am Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_PU238.get(1), MathUtils.roundToClosestInt(87.7f), 64);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_SR90.get(1), MathUtils.roundToClosestInt(28.8f), 32);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_PO210.get(1), 1, 512);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_AM241.get(1), 216, 16);
+ CORE.RA.addFuelForRTG(GT_ModHandler.getIC2Item("RTGPellets", 1), MathUtils.roundToClosestInt(2.6f), 8);
+
+ // Computer Cube
+ GregtechItemList.Gregtech_Computer_Cube.set(
+ this.addItem(
+ tLastID = 55,
+ "Gregtech Computer Cube",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 8L),
+ getTcAspectStack(TC_Aspects.METALLUM, 8L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 8L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[6] * 10 * 60 * 20, GT_Values.V[5], 5L, -3L, false);
+
+ GregtechItemList.Cover_Overflow_LV.set(
+ this.addItem(
+ 72,
+ "Overflow Valve (LV)",
+ "Maximum void amount: 64,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_MV.set(
+ this.addItem(
+ 73,
+ "Overflow Valve (MV)",
+ "Maximum void amount: 512,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_HV.set(
+ this.addItem(
+ 74,
+ "Overflow Valve (HV)",
+ "Maximum void amount: 4,096,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_EV.set(
+ this.addItem(
+ 75,
+ "Overflow Valve (EV)",
+ "Maximum void amount: 32,768,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_IV.set(
+ this.addItem(
+ 76,
+ "Overflow Valve (IV)",
+ "Maximum void amount: 262,144,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_LV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[4][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(64));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_MV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[5][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(512));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_HV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[5][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(4096));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_EV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[8][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(32768));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_IV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[8][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(262144));
+
+ // Fusion Reactor MK4 Singularity
+ GregtechItemList.Compressed_Fusion_Reactor.set(
+ this.addItem(
+ 100,
+ "Hypervisor Matrix (Fusion)",
+ "A memory unit containing an RI (Restricted Intelligence)"));
+
+ GregtechItemList.Laser_Lens_Special
+ .set(this.addItem(105, "Quantum Anomaly", "Probably should shoot it with lasers"));
+
+ GregtechItemList.Battery_Casing_Gem_1.set(this.addItem(106, "Containment Unit I", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_2.set(this.addItem(107, "Containment Unit II", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_3.set(this.addItem(108, "Advanced Containment Unit", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_4.set(this.addItem(109, "Exotic Containment Unit", "Used in crafting"));
+
+ GregtechItemList.Battery_Gem_4.set(
+ this.addItem(
+ tLastID = 110,
+ "Graviton Anomaly",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 64L),
+ getTcAspectStack(TC_Aspects.METALLUM, 64L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 64L)));
+ this.setElectricStats(32000 + tLastID, (64000000000L * 16), GT_Values.V[9], 9L, -3L, false);
+
+ /*
+ * High Tier 'Saws' for the tree Farm
+ */
+
+ GregtechItemList.Laser_Lens_WoodsGlass.set(
+ this.addItem(140, "Wood's Glass Lens", "Allows UV & IF to pass through, blocks visible light spectrums"));
+
+ // 141 now unused, was the ulv transmission component
+ int aStartID = 142;
+ GregtechItemList[] aTransParts = new GregtechItemList[] { GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ for (int tier = 1; tier < aTransParts.length + 1; tier++) {
+ aTransParts[tier - 1].set(
+ this.addItem(
+ aStartID++,
+ "Transmission Component (" + GT_Values.VN[tier] + ")",
+ "",
+ getTcAspectStack(TC_Aspects.ELECTRUM, tier),
+ getTcAspectStack(TC_Aspects.MACHINA, tier),
+ getTcAspectStack(TC_Aspects.MAGNETO, tier)));
+ }
+
+ // Distillus Chip
+ GregtechItemList.Distillus_Upgrade_Chip
+ .set(this.addItem(151, "Distillus Upgrade Chip", "Used to upgrade Distillus to Tier 2"));
+ GregtechItemList.Maceration_Upgrade_Chip
+ .set(this.addItem(152, "Maceration Upgrade Chip", "Used to upgrade Maceration Stack to Tier 2"));
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java
new file mode 100644
index 0000000000..30250a46f3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java
@@ -0,0 +1,54 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechToolDictNames;
+import gtPlusPlus.xmod.gregtech.common.tools.TOOL_Gregtech_AngleGrinder;
+import gtPlusPlus.xmod.gregtech.common.tools.TOOL_Gregtech_ElectricSnips;
+
+public class MetaGeneratedGregtechTools extends GT_MetaGenerated_Tool {
+
+ public static final short ANGLE_GRINDER = 7834;
+ public static final short ELECTRIC_SNIPS = 7934;
+ public static GT_MetaGenerated_Tool INSTANCE;
+
+ static {
+ INSTANCE = new MetaGeneratedGregtechTools();
+ }
+
+ public static GT_MetaGenerated_Tool getInstance() {
+ return INSTANCE;
+ }
+
+ private MetaGeneratedGregtechTools() {
+ super("plusplus.metatool.01");
+
+ // Electric File
+ this.addTool(
+ ANGLE_GRINDER,
+ "Angle Grinder",
+ "Hand-held electric filing device",
+ new TOOL_Gregtech_AngleGrinder(),
+ GregtechToolDictNames.craftingToolAngleGrinder,
+ ToolDictNames.craftingToolFile,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L));
+
+ // Electric Wire Cutter
+ GregTech_API.registerWireCutter(
+ this.addTool(
+ ELECTRIC_SNIPS,
+ "Automatic Snips",
+ "Hand-held electric wire cutter",
+ new TOOL_Gregtech_ElectricSnips(),
+ GregtechToolDictNames.craftingToolElectricSnips,
+ ToolDictNames.craftingToolWireCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 4L)));
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java
new file mode 100644
index 0000000000..f85822750d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gregtech.common.items.behaviors.Behaviour_Wrench;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class Behaviour_Choocher extends Behaviour_None {
+
+ private boolean isWrench = true;
+ private final Behaviour_Wrench wrench = new Behaviour_Wrench(150);
+ private final Behaviour_Prospecting_Ex prospecting = new Behaviour_Prospecting_Ex(10, 1250);
+ private final String mTooltip1 = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.choochering1", "Current tool mode: ");
+ private final String mTooltip2 = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.choochering2", "Change tool mode using Shift+Rightclick.");
+ private final String mTooltipH = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.prospectingEx", "Usable for Prospecting large areas.");
+ private final String mTooltipW = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.wrench", "Rotates Blocks on Rightclick.");
+
+ public Behaviour_Choocher() {}
+
+ @Override
+ public boolean onItemUseFirst(final GT_MetaBase_Item aItem, final ItemStack aStack, final EntityPlayer aPlayer,
+ final World aWorld, final int aX, final int aY, final int aZ, final ForgeDirection side, final float hitX,
+ final float hitY, final float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+
+ boolean inWrenchMode;
+ if (NBTUtils.hasKey(aStack, "aMode")) {
+ inWrenchMode = NBTUtils.getBoolean(aStack, "aMode");
+ } else {
+ aStack.getTagCompound()
+ .setBoolean("aMode", true);
+ inWrenchMode = true;
+ }
+
+ if (aPlayer.isSneaking()) {
+ boolean aModeNew = !inWrenchMode;
+ aStack.getTagCompound()
+ .setBoolean("aMode", aModeNew);
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + (aModeNew ? "Wrench" : "Hammer"));
+ return true;
+ } else {
+ if (inWrenchMode) {
+ return this.wrench.onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitZ, hitZ, hitZ);
+ } else {
+ return this.prospecting
+ .onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ);
+ }
+ }
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(final GT_MetaBase_Item aItem, final List<String> aList,
+ final ItemStack aStack) {
+
+ boolean inWrenchMode;
+ if (NBTUtils.hasKey(aStack, "aMode")) {
+ inWrenchMode = NBTUtils.getBoolean(aStack, "aMode");
+ } else {
+ NBTUtils.setBoolean(aStack, "aMode", true);
+ aStack.getTagCompound()
+ .setBoolean("aMode", true);
+ inWrenchMode = true;
+ }
+
+ if (inWrenchMode) {
+ aList.add(this.mTooltip1 + "Wrench");
+ aList.add(this.mTooltipW);
+ } else {
+ aList.add(this.mTooltip1 + "Prospecting");
+ aList.add(this.mTooltipH);
+ }
+ aList.add(this.mTooltip2);
+
+ return aList;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java
new file mode 100644
index 0000000000..f3d7f87a86
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import codechicken.lib.math.MathHelper;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import ic2.api.item.IElectricItemManager;
+
+public class Behaviour_Electric_Lighter extends Behaviour_None {
+
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire");
+ private final String mTooltipUses = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:");
+ private final String mTooltipUnstackable = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!");
+
+ public Behaviour_Electric_Lighter() {}
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if (!aPlayer.worldObj.isRemote && aStack != null && aStack.stackSize == 1) {
+ boolean rOutput = false;
+ if (aEntity instanceof EntityCreeper) {
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ GT_Utility.sendSoundToPlayers(
+ aPlayer.worldObj,
+ SoundResource.FIRE_IGNITE,
+ 1.0F,
+ 1.0F,
+ MathHelper.floor_double(aEntity.posX),
+ MathHelper.floor_double(aEntity.posY),
+ MathHelper.floor_double(aEntity.posZ));
+ ((EntityCreeper) aEntity).func_146079_cb();
+ rOutput = true;
+ }
+ }
+ return rOutput;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if (!aWorld.isRemote && aStack != null && aStack.stackSize == 1) {
+ if (aPlayer.isSneaking()) {
+ Logger.INFO("Changing Mode");
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ Logger.INFO("Is currently in Fireball mode? " + aCurrentMode);
+ boolean aNewMode = !aCurrentMode;
+ Logger.INFO("Is now set to Fireball mode? " + aNewMode);
+ aStack.getTagCompound()
+ .setBoolean("aFireballMod", aNewMode);
+ // NBTUtils.setBoolean(aStack, "aFireballMode", aNewMode);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Current Mode: " + EnumChatFormatting.RED + (aNewMode ? "Projectile" : "Fire Starter"));
+ } else {
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ if (aCurrentMode) {
+ // Shoot Lightning Attack
+ aWorld
+ .playSoundAtEntity(aPlayer, "random.bow", 0.5F, 0.4F / (CORE.RANDOM.nextFloat() * 0.4F + 0.8F));
+ if (!aWorld.isRemote) {
+ aWorld.spawnEntityInWorld(new EntityLightningAttack(aWorld, aPlayer, hitX, hitY, hitZ));
+ }
+ } else {
+ // Lights Fires Mode
+ Logger.WARNING("Preparing Lighter a");
+ boolean rOutput = false;
+ ForgeDirection tDirection = ForgeDirection.getOrientation(ordinalSide);
+ aX += tDirection.offsetX;
+ aY += tDirection.offsetY;
+ aZ += tDirection.offsetZ;
+ if (GT_Utility.isBlockAir(aWorld, aX, aY, aZ)
+ && aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) {
+ Logger.WARNING("Preparing Lighter b");
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ Logger.WARNING("Preparing Lighter c");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ);
+ aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ rOutput = true;
+ // ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ return rOutput;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter z");
+ return false;
+ }
+
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if (!aWorld.isRemote && aStack != null && aStack.stackSize == 1) {
+ if (aPlayer.isSneaking()) {
+ Logger.INFO("Changing Mode");
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ Logger.INFO("Is currently in Fireball mode? " + aCurrentMode);
+ boolean aNewMode = !aCurrentMode;
+ Logger.INFO("Is now set to Fireball mode? " + aNewMode);
+ aStack.getTagCompound()
+ .setBoolean("aFireballMode", aNewMode);
+ // NBTUtils.setBoolean(aStack, "aFireballMode", aNewMode);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Current Mode: " + EnumChatFormatting.RED + (aNewMode ? "Projectile" : "Fire Starter"));
+ } else {
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ if (aCurrentMode) {
+ // Shoot Lightning Attack
+ aWorld
+ .playSoundAtEntity(aPlayer, "random.bow", 0.5F, 0.4F / (CORE.RANDOM.nextFloat() * 0.4F + 0.8F));
+ if (!aWorld.isRemote) {
+ aWorld.spawnEntityInWorld(new EntityLightningAttack(aWorld, aPlayer, hitX, hitY, hitZ));
+ }
+ } else {
+ // Lights Fires Mode
+ Logger.WARNING("Preparing Lighter a");
+ boolean rOutput = false;
+ ForgeDirection tDirection = ForgeDirection.getOrientation(ordinalSide);
+ aX += tDirection.offsetX;
+ aY += tDirection.offsetY;
+ aZ += tDirection.offsetZ;
+ if (GT_Utility.isBlockAir(aWorld, aX, aY, aZ)
+ && aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) {
+ Logger.WARNING("Preparing Lighter b");
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ Logger.WARNING("Preparing Lighter c");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ);
+ aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ rOutput = true;
+ // ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ return rOutput;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter z");
+ return false;
+ }
+
+ private boolean prepare(ItemStack aStack) {
+ if (aStack != null) {
+ Logger.WARNING("Preparing Lighter 1");
+ if (aStack.getItem() instanceof MetaGeneratedGregtechTools) {
+ Logger.WARNING("Preparing Lighter 2");
+ if (ChargingHelper.isItemValid(aStack)) {
+ Logger.WARNING("Preparing Lighter 3");
+ if (aStack.getItem() instanceof IElectricItemManager aItemElec) {
+ Logger.WARNING("Preparing Lighter 4");
+ double aCharge = aItemElec.getCharge(aStack);
+ long aEuCost = 4096 * 2;
+ if (aCharge >= aEuCost) {
+ Logger.WARNING("Preparing Lighter 5");
+ aItemElec.discharge(aStack, aEuCost, 3, true, true, false);
+ return true;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter 0");
+ return false;
+ }
+
+ private void useUp(ItemStack aStack) {}
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ int aUses = 0;
+ if (aStack != null) {
+ if (aStack.getItem() instanceof MetaGeneratedGregtechTools) {
+ if (ChargingHelper.isItemValid(aStack)) {
+ if (aStack.getItem() instanceof IElectricItemManager aItemElec) {
+ double aCharge = aItemElec.getCharge(aStack);
+ long aEuCost = 4096 * 2;
+ aUses = (int) (aCharge / aEuCost);
+ }
+ }
+ boolean aCurrentMode;
+ if (!NBTUtils.hasTagCompound(aStack)) {
+ NBTUtils.createEmptyTagCompound(aStack);
+ }
+ if (NBTUtils.hasKey(aStack, "aFireballMode")) {
+ aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ } else {
+ aStack.getTagCompound()
+ .setBoolean("aFireballMode", false);
+ aCurrentMode = false;
+ }
+ aList.add("Current Mode: " + EnumChatFormatting.RED + (aCurrentMode ? "Projectile" : "Fire Starter"));
+ }
+ }
+
+ aList.add(this.mTooltipUses + " " + aUses);
+ aList.add(this.mTooltipUnstackable);
+ return aList;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java
new file mode 100644
index 0000000000..5749204296
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java
@@ -0,0 +1,140 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidBlock;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gregtech.common.items.behaviors.Behaviour_Prospecting;
+
+public class Behaviour_Prospecting_Ex extends Behaviour_Prospecting {
+
+ private final int mVanillaCosts;
+ private final int mEUCosts;
+
+ public Behaviour_Prospecting_Ex(final int aVanillaCosts, final int aEUCosts) {
+ super(aVanillaCosts, aEUCosts);
+ this.mVanillaCosts = aVanillaCosts;
+ this.mEUCosts = aEUCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(final GT_MetaBase_Item aItem, final ItemStack aStack, final EntityPlayer aPlayer,
+ final World aWorld, final int aX, final int aY, final int aZ, final ForgeDirection side, final float hitX,
+ final float hitY, final float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ final byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+
+ ItemData tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta));
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString()
+ .startsWith("ore"))) {
+ GT_Utility
+ .sendChatToPlayer(aPlayer, "This is " + tAssotiation.mMaterial.mMaterial.mDefaultLocalName + " Ore.");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ return true;
+ }
+ if ((aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.dirt))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.grass))) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ int tX = aX;
+ int tY = aY;
+ int tZ = aZ;
+ int tMetaID = 0;
+ final int tQuality = ((aItem instanceof GT_MetaGenerated_Tool)
+ ? ((GT_MetaGenerated_Tool) aItem).getHarvestLevel(aStack, "")
+ : 0) * 3;
+
+ int i = 0;
+ for (final int j = 6 + tQuality; i < j; i++) {
+ tX -= side.offsetX;
+ tY -= side.offsetY;
+ tZ -= side.offsetZ;
+
+ final Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if ((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava)) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is Lava behind this Block.");
+ break;
+ }
+ if ((tBlock == Blocks.water) || (tBlock == Blocks.flowing_water)
+ || ((tBlock instanceof IFluidBlock))) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is a Liquid behind this Block.");
+ break;
+ }
+ if ((tBlock == Blocks.monster_egg) || (!GT_Utility.hasBlockHitBox(aWorld, tX, tY, tZ))) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is an Air Pocket behind this Block.");
+ break;
+ }
+ if (tBlock != aBlock) {
+ if (i >= 4) {
+ break;
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "Material is changing behind this Block.");
+ break;
+ }
+ }
+ final Random tRandom = new Random(aX ^ aY ^ aZ ^ side.ordinal());
+ i = 0;
+ for (final int j = 9 + (2 * tQuality); i < j; i++) {
+ tX = (aX - 4 - tQuality) + tRandom.nextInt(j);
+ tY = (aY - 4 - tQuality) + tRandom.nextInt(j);
+ tZ = (aZ - 4 - tQuality) + tRandom.nextInt(j);
+ final Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if ((tBlock instanceof GT_Block_Ores)) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[(((GT_TileEntity_Ores) tTileEntity).mMetaData
+ % 1000)];
+ if ((tMaterial != null) && (tMaterial != Materials._NULL)) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Found traces of " + tMaterial.mDefaultLocalName + " Ore.");
+ return true;
+ }
+ }
+ } else {
+ tMetaID = aWorld.getBlockMetadata(tX, tY, tZ);
+ tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID));
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString()
+ .startsWith("ore"))) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Found traces of " + tAssotiation.mMaterial.mMaterial.mDefaultLocalName + " Ore.");
+ return true;
+ }
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "No Ores found.");
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java
new file mode 100644
index 0000000000..987924952a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.gregtech.common.items.covers;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.items.MetaCustomCoverItem;
+
+public class MetaItemCoverCasings extends MetaCustomCoverItem {
+
+ public MetaItemCoverCasings() {
+ super(
+ GTPlusPlus.ID,
+ Textures.BlockIcons.MACHINECASINGS_SIDE.length,
+ "Gt Machine Casings",
+ Textures.BlockIcons.MACHINECASINGS_SIDE,
+ null);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < icons.length; i++) {
+ this.icons[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "covers/" + i);
+ }
+ }
+
+ @Override
+ public boolean hide() {
+ return false;
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[MathUtils.balance(meta, 0, 15)];
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return EnumChatFormatting.LIGHT_PURPLE + StatCollector.translateToLocalFormatted(
+ "item.itemCustomMetaCover.miscutils.GtMachineCasings",
+ GT_Values.VOLTAGE_NAMES[MathUtils.balance(tItem.getItemDamage(), 0, GT_Values.VOLTAGE_NAMES.length - 1)]); // super.getItemStackDisplayName(tItem);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java
new file mode 100644
index 0000000000..a281a205d2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java
@@ -0,0 +1,500 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ForkJoinPool;
+
+import net.minecraft.client.entity.AbstractClientPlayer;
+import net.minecraft.client.model.ModelBiped;
+import net.minecraft.client.renderer.entity.RenderManager;
+import net.minecraft.client.renderer.entity.RenderPlayer;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.event.RenderPlayerEvent;
+
+import org.apache.commons.io.IOUtils;
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.proxy.ClientProxy;
+import gtPlusPlus.core.util.data.AES;
+import gtPlusPlus.core.util.data.FileUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class GTPP_CapeRenderer extends RenderPlayer {
+
+ private static final ResourceLocation[] mCapes = { new ResourceLocation("miscutils:textures/OrangeHD.png"),
+ new ResourceLocation("miscutils:textures/FancyCapeHD.png"),
+ new ResourceLocation("miscutils:textures/TesterCapeHD.png"),
+ new ResourceLocation("miscutils:textures/PatreonCapeHD.png"),
+ new ResourceLocation("miscutils:textures/DevCapeHD.png"), };
+
+ private final boolean mInit;
+
+ public GTPP_CapeRenderer() {
+ mInit = init();
+ }
+
+ private boolean init() {
+ if (mInit) {
+ return false;
+ }
+ return CapeUtils.init();
+ }
+
+ private static boolean hasResourceChecked = false;
+ private static boolean hasSetRenderer = false;
+ private boolean hasCape = false;
+ private ResourceLocation tResource = null;
+
+ public synchronized void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) {
+
+ // Check we have set Render Manager
+ if (this.renderManager == null) {
+ hasSetRenderer = false;
+ }
+
+ // Set Render Manager
+ if (!hasSetRenderer) {
+ if (RenderManager.instance != null) {
+ setRenderManager(RenderManager.instance);
+ hasSetRenderer = true;
+ }
+ }
+
+ // Actually Render
+ if (hasSetRenderer) {
+
+ // We have capes turned off, so let's not render.
+ if (!ConfigSwitches.enableCustomCapes) {
+ return;
+ }
+
+ if (!CapeUtils.mapsPopulated) {
+ if (!CapeUtils.cacheReady) {
+ return;
+ }
+ CapeUtils.writeCacheToMaps();
+ CapeUtils.mapsPopulated = true;
+ }
+
+ // We have already checked if this player has a cape, but since they do not, we best not render.
+ if (hasResourceChecked) {
+ if (!hasCape && !CORE.DEVENV) {
+ return;
+ }
+ }
+
+ // Allocate client player object
+ AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.entityPlayer;
+
+ // Make sure we don't keep checking on clients who dont have capes.
+ if (!hasResourceChecked) {
+
+ // Get players UUID
+ String aPlayerUUID = aPlayer != null ? aPlayer.getGameProfile()
+ .getId()
+ .toString() : "BAD";
+
+ // If for whatever reason this fails, we just exit early.
+ if (aPlayerUUID.equals("BAD")) {
+ return;
+ }
+
+ // Automatically allocate a Dev cape while in Dev mode.
+ if (tResource == null && CORE.DEVENV) {
+ tResource = mCapes[4];
+ hasCape = true;
+ }
+
+ String aPlayerName = ClientProxy.playerName;
+
+ // Check cape lists for the cape this player owns.
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mOrangeCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[0];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mMiscCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[1];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mBetaTestCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[2];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mPatreonCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[3];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mDevCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[4];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ hasResourceChecked = true;
+ }
+
+ if (hasResourceChecked) {
+ // We have met all the conditions, let's render that cape.
+ renderCapeOnPlayer(aEvent, aPlayer);
+ }
+ }
+ }
+
+ private boolean renderCapeOnPlayer(RenderPlayerEvent.Specials.Pre aEvent, AbstractClientPlayer aPlayer) {
+ float aPartialTicks = aEvent.partialRenderTick;
+ try {
+ if (tResource == null && CORE.DEVENV) {
+ tResource = mCapes[3];
+ }
+
+ // If player is invisible, don't render.
+ if (GT_Utility.getFullInvisibility(aPlayer) || aPlayer.isInvisible()
+ || GT_Utility.getPotion(aPlayer, Integer.valueOf(Potion.invisibility.id))) {
+ aEvent.setCanceled(true);
+ return false;
+ }
+
+ if ((tResource != null) && (!aPlayer.getHideCape())) {
+ bindTexture(tResource);
+ GL11.glPushMatrix();
+ GL11.glTranslatef(0.0F, 0.0F, 0.125F);
+ double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks
+ - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks);
+ double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks
+ - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks);
+ double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks
+ - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks);
+ float f6 = aPlayer.prevRenderYawOffset
+ + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks;
+ double d3 = MathHelper.sin(f6 * CORE.PI / 180.0F);
+ double d4 = -MathHelper.cos(f6 * CORE.PI / 180.0F);
+ float f7 = (float) d1 * 10.0F;
+ float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F;
+ float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F;
+ if (f7 < -6.0F) {
+ f7 = -6.0F;
+ }
+ if (f7 > 32.0F) {
+ f7 = 32.0F;
+ }
+ if (f8 < 0.0F) {
+ f8 = 0.0F;
+ }
+ float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks;
+ f7 += MathHelper.sin(
+ (aPlayer.prevDistanceWalkedModified
+ + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F)
+ * 32.0F
+ * f10;
+ if (aPlayer.isSneaking()) {
+ f7 += 25.0F;
+ }
+ GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ ((ModelBiped) this.mainModel).renderCloak(0.0625F);
+ GL11.glPopMatrix();
+ return true;
+ }
+ } catch (Throwable e) {
+
+ }
+ return false;
+ }
+
+ private static class CapeUtils {
+
+ private static char SPLIT_CHARACTER = '§';
+ private static AES sAES;
+ private static volatile boolean cacheReady = false;
+ private static boolean mapsPopulated = false;
+
+ // UUID - Username
+ private static final AutoMap<Pair<String, String>> mOrangeCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mMiscCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mBetaTestCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mPatreonCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mDevCapes = new AutoMap<>();
+
+ private static boolean init() {
+ CapeUtils.handleOldCapeCache();
+ if (CORE.DEVENV) {
+ return true;
+ }
+ ForkJoinPool.commonPool()
+ .execute(() -> {
+ try {
+ if (shouldDownloadCapeList()) {
+ downloadCapeList();
+ }
+ } catch (Exception ignored) {}
+ cacheReady = true;
+ });
+ return true;
+ }
+
+ private static boolean shouldDownloadCapeList() {
+ if (!doesCapeCacheExistLocally()) {
+ return true;
+ }
+ if (isCapeCacheWeekOld()) {
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isCapeCacheWeekOld() {
+ if (!doesCapeCacheExistLocally()) {
+ return true;
+ } else {
+ File dat = CapeUtils.getCapeCache();
+ Date dateLastMod = new Date(dat.lastModified());
+ Date dateNow = new Date(System.currentTimeMillis() - (7l * 24 * 60 * 60 * 1000));
+ if (dateLastMod.before(dateNow)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static void downloadCapeList() {
+ try {
+ File dat = getCapeCache();
+ File temp = allocateTempFile();
+ InputStream inputStream = new URL("https://alkcorp.overminddl1.com/CapeCache.dat").openStream();
+ FileOutputStream fileOS = new FileOutputStream(temp);
+ IOUtils.copy(inputStream, fileOS);
+ if (isDownloadedCapeListBigger(temp)) {
+ fileOS = new FileOutputStream(dat);
+ IOUtils.copy(inputStream, fileOS);
+ }
+ } catch (Throwable t) {
+ Logger.INFO("Unable to download GT++ cape list.");
+ }
+ }
+
+ private static boolean isDownloadedCapeListBigger(File aFile) {
+ double aExistingFileSize = (doesCapeCacheExistLocally() ? getCapeCache().length() : 0);
+ double aNewFileSize = aFile.length();
+ if (aNewFileSize > aExistingFileSize) {
+ return true;
+ }
+ return false;
+ }
+
+ private static void handleOldCapeCache() {
+ File aCacheFile = FileUtils.getFile("GTPP", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ aCacheFile.delete();
+ }
+ }
+
+ private static boolean doesCapeCacheExistLocally() {
+ File aCacheFile = FileUtils.getFile("CapeCache", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static File getCapeCache() {
+ File aCacheFile = FileUtils.getFile("CapeCache", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ FileUtils.createFile(aCacheFile);
+ }
+ return aCacheFile;
+ }
+
+ public static final List<String> getDataFromCache() {
+ File aCacheFile = getCapeCache();
+ List<String> aCache = FileUtils.readLines(aCacheFile);
+ if (aCache != null && !aCache.isEmpty()) {
+ return aCache;
+ }
+ return new AutoMap<>();
+ }
+
+ private static File allocateTempFile() {
+ File tempFile = null;
+ try {
+ tempFile = File.createTempFile("gtpp-", null);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ if (tempFile == null) {
+ tempFile = FileUtils
+ .createFile("", "gtpp-" + MathUtils.randInt(Short.MAX_VALUE, (Integer.MAX_VALUE / 2)), "tmp");
+ }
+ tempFile.deleteOnExit();
+ return tempFile;
+ }
+
+ public static final void writeCacheToMaps() {
+ List<String> aCacheData = getDataFromCache();
+ if (aCacheData != null && !aCacheData.isEmpty()) {
+ if (sAES == null) {
+ sAES = new AES();
+ }
+ AutoMap<String> aDecodedData = new AutoMap<>();
+ for (String aToDecode : aCacheData) {
+ aDecodedData.put(sAES.decode(aToDecode));
+ }
+ if (!aDecodedData.isEmpty()) {
+ AutoMap<Pair<String, String>> aCapeType1 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType2 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType3 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType4 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType5 = new AutoMap<>();
+ boolean didProcessStringData = false;
+ Logger.INFO("Decoded String Count: " + aDecodedData.size());
+ for (String aToSplit : aDecodedData) {
+ String[] aSplitData = aToSplit.split("" + SPLIT_CHARACTER);
+ if (aSplitData != null && aSplitData.length >= 2) {
+ if (aSplitData[0] != null) {
+ Integer aCapeTypeID2 = Integer.parseInt(aSplitData[0]);
+ if (aCapeTypeID2 != null) {
+ int aCapeTypeID = aCapeTypeID2;
+ Pair<String, String> aFinalString = new Pair<>(
+ "UUID: " + aSplitData[1],
+ "Username: "
+ + (aSplitData[2] != null && aSplitData[0].length() > 0 ? aSplitData[2]
+ : "Not Specified"));
+ Logger.INFO("Cape Type: " + aCapeTypeID);
+ switch (aCapeTypeID) {
+ case 0 -> {
+ aCapeType1.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType1.size()
+ + " users.");
+ }
+ case 1 -> {
+ aCapeType2.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType2.size()
+ + " users.");
+ }
+ case 2 -> {
+ aCapeType3.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType3.size()
+ + " users.");
+ }
+ case 3 -> {
+ aCapeType4.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType4.size()
+ + " users.");
+ }
+ case 4 -> {
+ aCapeType5.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType5.size()
+ + " users.");
+ }
+ default -> {}
+ }
+ }
+ }
+ }
+ }
+ if (!aCapeType1.isEmpty() || !aCapeType2.isEmpty()
+ || !aCapeType3.isEmpty()
+ || !aCapeType4.isEmpty()
+ || !aCapeType5.isEmpty()) {
+ didProcessStringData = true;
+ } else {
+ // did not process any data
+ }
+ if (didProcessStringData) {
+ if (!aCapeType1.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType1) {
+ Logger.INFO("Adding Generic cape for " + aUser.getKey());
+ mOrangeCapes.add(aUser);
+ }
+ }
+ if (!aCapeType2.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType2) {
+ Logger.INFO("Adding Blue cape for " + aUser.getKey());
+ mMiscCapes.add(aUser);
+ }
+ }
+ if (!aCapeType3.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType3) {
+ Logger.INFO("Adding Beta cape for " + aUser.getKey());
+ mBetaTestCapes.add(aUser);
+ }
+ }
+ if (!aCapeType4.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType4) {
+ Logger.INFO("Adding Patreon cape for " + aUser.getKey());
+ mPatreonCapes.add(aUser);
+ }
+ }
+ if (!aCapeType5.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType5) {
+ Logger.INFO("Adding Dev cape for " + aUser.getKey());
+ mDevCapes.add(aUser);
+ }
+ }
+ }
+ } else {
+ // No data decoded
+ }
+ } else {
+ // Nothing was cached?
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java
new file mode 100644
index 0000000000..0c9e59e2f2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java
@@ -0,0 +1,107 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.common.items.GT_VolumetricFlask;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import ic2.core.util.DrawUtil;
+
+@SideOnly(cpw.mods.fml.relauncher.Side.CLIENT)
+public final class GTPP_FlaskRenderer implements net.minecraftforge.client.IItemRenderer {
+
+ public GTPP_FlaskRenderer() {
+ MinecraftForgeClient.registerItemRenderer(GregtechItemList.VOLUMETRIC_FLASK_8k.getItem(), this);
+ MinecraftForgeClient.registerItemRenderer(GregtechItemList.VOLUMETRIC_FLASK_32k.getItem(), this);
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type != ItemRenderType.FIRST_PERSON_MAP;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, IItemRenderer.ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ GT_VolumetricFlask cell = (GT_VolumetricFlask) item.getItem();
+
+ int aType = cell.getMaxCapacity() == 8000 ? 0 : 1;
+ IIcon icon = item.getIconIndex();
+ GL11.glEnable(3042);
+ GL11.glEnable(3008);
+ if (type.equals(ItemRenderType.ENTITY)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glRotated(90.0D, 0.0D, 1.0D, 0.0D);
+ GL11.glTranslated(-0.5D, -0.6D, 0.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON)) {
+ GL11.glTranslated(1.0D, 1.0D, 0.0D);
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glTranslated(-1.0D, -1.0D, 0.0D);
+ }
+
+ FluidStack fs = cell.getFluid(item);
+ if (fs != null) {
+ IIcon iconWindow = cell.iconWindow;
+ IIcon fluidicon = fs.getFluid()
+ .getIcon(fs);
+ int fluidColor = fs.getFluid()
+ .getColor(fs);
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(0, 1);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(iconWindow, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+ GL11.glBlendFunc(770, 771);
+ GL11.glDepthFunc(514);
+ GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(fluidicon, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
+ GL11.glDepthFunc(515);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(770, 771);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ } else {
+ ItemRenderer.renderItemIn2D(
+ Tessellator.instance,
+ icon.getMaxU(),
+ icon.getMinV(),
+ icon.getMinU(),
+ icon.getMaxV(),
+ icon.getIconWidth(),
+ icon.getIconHeight(),
+ 0.0625F);
+ }
+ GL11.glDisable(3008);
+ GL11.glDisable(3042);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java
new file mode 100644
index 0000000000..bfd16b4cc5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java
@@ -0,0 +1,1250 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_SOUTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_UP;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_WEST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_FOAM;
+import static gregtech.api.interfaces.metatileentity.IConnectable.NO_CONNECTION;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.EnumMap;
+import java.util.EnumSet;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.common.blocks.GT_Block_Machines;
+import gregtech.common.render.GT_Renderer_Block;
+import gtPlusPlus.xmod.gregtech.common.helpers.GT_MethodHelper;
+
+public class GTPP_Render_MachineBlock extends GT_Renderer_Block {
+
+ public static GTPP_Render_MachineBlock INSTANCE;
+ public final int mRenderID = RenderingRegistry.getNextAvailableRenderId();
+
+ public GTPP_Render_MachineBlock() {
+ INSTANCE = this;
+ RenderingRegistry.registerBlockHandler(this);
+ }
+
+ private static ITexture[] getTexture(IMetaTileEntity tile, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean active, boolean arg5) {
+ final IGregTechTileEntity gtTile = tile.getBaseMetaTileEntity();
+ return tile.getTexture(gtTile, side, facing, (byte) colorIndex, active, arg5);
+ }
+
+ private static ITexture[] getTexture(IMetaTileEntity tile, ForgeDirection side, int facingMask, int colorIndex,
+ boolean active, boolean arg5) {
+ final MetaPipeEntity gtTile = (MetaPipeEntity) tile.getBaseMetaTileEntity();
+ return gtTile.getTexture((IGregTechTileEntity) tile, side, facingMask, colorIndex, active, arg5);
+ }
+
+ private static void renderNormalInventoryMetaTileEntity(Block aBlock, int aMeta, RenderBlocks aRenderer) {
+ if (aMeta > 0 && aMeta < GregTech_API.METATILEENTITIES.length) {
+ IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta];
+ if (tMetaTileEntity != null) {
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ if (tMetaTileEntity.getBaseMetaTileEntity() instanceof IPipeRenderedTileEntity pipeRenderedTile) {
+ float tThickness = pipeRenderedTile.getThickNess();
+ float sp = (1.0F - tThickness) / 2.0F;
+ aBlock.setBlockBounds(0.0F, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, DOWN, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, UP, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.NORTH, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.SOUTH, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.WEST, 0b001001, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.EAST, 0b001001, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ } else {
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, DOWN, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, UP, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.NORTH, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.SOUTH, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.WEST, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.EAST, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ }
+
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+ }
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+
+ return tTileEntity instanceof ITexturedTileEntity
+ ? renderStandardBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ aRenderer,
+ new ITexture[][] { GT_MethodHelper.getTexture(tTileEntity, aBlock, DOWN),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, UP),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.NORTH),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.SOUTH),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.WEST),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.EAST) })
+ : false;
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer, ITexture[][] aTextures) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[DOWN.ordinal()], true);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[UP.ordinal()], true);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.NORTH.ordinal()], true);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.SOUTH.ordinal()], true);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.WEST.ordinal()], true);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.EAST.ordinal()], true);
+ return true;
+ }
+
+ public boolean renderPipeBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ IPipeRenderedTileEntity aTileEntity, RenderBlocks aRenderer) {
+ final int aConnections = aTileEntity.getConnections();
+ if ((aConnections & HAS_FOAM) != 0) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ float tThickness = aTileEntity.getThickNess();
+ if (tThickness >= 0.99F) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ float sp = (1.0F - tThickness) / 2.0F;
+ int connexionSidesBits = 0;
+
+ for (int ordinalSide = 0; ordinalSide < 6; ++ordinalSide) {
+ if ((aConnections & 1 << ordinalSide) != 0) {
+ connexionSidesBits = connexionSidesBits | 1 << (ordinalSide + 2) % 6;
+ }
+ }
+
+ final EnumSet<ForgeDirection> coveredSides = EnumSet.noneOf(ForgeDirection.class);
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aTileEntity.getCoverIDAtSide(side) != 0) coveredSides.add(side);
+ }
+
+ if (coveredSides.containsAll(EnumSet.of(DOWN, UP, NORTH, SOUTH, WEST, EAST))) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ final EnumMap<ForgeDirection, ITexture[]> texture = new EnumMap<>(ForgeDirection.class);
+ final EnumMap<ForgeDirection, ITexture[]> textureUncovered = new EnumMap<>(ForgeDirection.class);
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ texture.put(side, GT_MethodHelper.getTexture((TileEntity) aTileEntity, aBlock, side));
+ textureUncovered.put(side, aTileEntity.getTextureUncovered(side));
+ }
+
+ switch (connexionSidesBits) {
+ case NO_CONNECTION -> {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ case (CONNECTED_DOWN | CONNECTED_UP) -> {
+ aBlock.setBlockBounds(0.0F, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ }
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ }
+ case (CONNECTED_NORTH | CONNECTED_SOUTH) -> {
+ aBlock.setBlockBounds(sp, 0.0F, sp, sp + tThickness, 1.0F, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ }
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ }
+ }
+ case (CONNECTED_WEST | CONNECTED_EAST) -> {
+ aBlock.setBlockBounds(sp, sp, 0.0F, sp + tThickness, sp + tThickness, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ }
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ }
+ }
+ default -> {
+ if ((connexionSidesBits & CONNECTED_DOWN) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ } else {
+ aBlock.setBlockBounds(0.0F, sp, sp, sp, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_UP) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp + tThickness, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_NORTH) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, 0.0F, sp, sp + tThickness, sp, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_SOUTH) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp + tThickness, sp, sp + tThickness, 1.0F, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_WEST) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp, 0.0F, sp + tThickness, sp + tThickness, sp);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_EAST) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp, sp + tThickness, sp + tThickness, sp + tThickness, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ }
+ }
+ }
+ }
+
+ if (coveredSides.contains(DOWN)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+ }
+
+ if (coveredSides.contains(UP)) {
+ aBlock.setBlockBounds(0.0F, 0.875F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+ }
+
+ if (coveredSides.contains(NORTH)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+ }
+
+ if (coveredSides.contains(SOUTH)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+ }
+
+ if (coveredSides.contains(WEST)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (coveredSides.contains(EAST)) {
+ aBlock.setBlockBounds(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ return true;
+ }
+ }
+ }
+ }
+
+ public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ));
+ }
+
+ aRenderer.flipTexture = !aFullBlock;
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ));
+ }
+
+ aRenderer.flipTexture = !aFullBlock;
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ @Override
+ public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) {
+ aMeta += 30400;
+ if (aBlock instanceof GT_Block_Machines) {
+ if (aMeta > 0 && aMeta < GregTech_API.METATILEENTITIES.length
+ && GregTech_API.METATILEENTITIES[aMeta] != null
+ && !GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer)) {
+ renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer);
+ }
+ }
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID,
+ RenderBlocks aRenderer) {
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity == null ? false
+ : (aTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) aTileEntity).getMetaTileEntity() != null
+ && ((IGregTechTileEntity) aTileEntity).getMetaTileEntity()
+ .renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)
+ ? true
+ : (aTileEntity instanceof IPipeRenderedTileEntity
+ ? renderPipeBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ (IPipeRenderedTileEntity) aTileEntity,
+ aRenderer)
+ : renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)));
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int aModel) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return this.mRenderID;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java
new file mode 100644
index 0000000000..87ae66b2ad
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java
@@ -0,0 +1,873 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_ElectricAutoWorkbench extends GT_MetaTileEntity_BasicTank implements IAddGregtechLogo {
+
+ public int mMode = 0, mCurrentSlot = 0, mThroughPut = 0, mTicksUntilNextUpdate = 20;
+ public boolean mLastCraftSuccessful = false;
+ protected String mLocalName;
+
+ private static final int MAX_MODES = 10;
+ private static final int MAX_THROUGHPUT = 4;
+
+ public GT_MetaTileEntity_ElectricAutoWorkbench(final int aID, final int aTier, final String aDescription) {
+ super(
+ aID,
+ "basicmachine.automation.autoworkbench.0" + aTier,
+ "Auto Workbench (" + GT_Values.VN[aTier] + ")",
+ aTier,
+ 30,
+ aDescription);
+ mLocalName = "Auto Workbench (" + GT_Values.VN[aTier] + ")";
+ }
+
+ public GT_MetaTileEntity_ElectricAutoWorkbench(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 30, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < 19;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return !isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getBackFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return mThroughPut % 2 == 0 ? GT_Values.V[mTier] : 0;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(2048L, GT_Values.V[this.mTier] * (this.mTier * GT_Values.V[this.mTier]));
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 30;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ElectricAutoWorkbench(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mMode", mMode);
+ aNBT.setInteger("mThroughPut", mThroughPut);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mMode = aNBT.getInteger("mMode");
+ mThroughPut = aNBT.getInteger("mThroughPut");
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing() && side != getBaseMetaTileEntity().getBackFacing();
+ }
+
+ private void switchMode() {
+ mInventory[28] = null;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (getBaseMetaTileEntity().isAllowedToWork() && getBaseMetaTileEntity().isServerSide()
+ && getBaseMetaTileEntity().getUniversalEnergyStored() >= (mMode == 5 || mMode == 6 ? 128 : 2048)
+ && (getBaseMetaTileEntity().hasWorkJustBeenEnabled() || --mTicksUntilNextUpdate < 1)) {
+ mTicksUntilNextUpdate = 32;
+
+ for (byte i = 19; i < 28; i++) {
+ if (mInventory[i] != null && mInventory[i].isItemStackDamageable()
+ && mInventory[i].getItem()
+ .hasContainerItem(mInventory[i])) {
+ mInventory[i].setItemDamage(OreDictionary.WILDCARD_VALUE);
+ }
+ }
+
+ if (mInventory[18] == null) {
+ for (byte i = 0; i < 18 && mFluid != null; i++) {
+ ItemStack tOutput = GT_Utility.fillFluidContainer(mFluid, mInventory[i], false, true);
+ if (tOutput != null) {
+ for (byte j = 0; j < 9; j++) {
+ if (mInventory[j] == null || (GT_Utility.areStacksEqual(tOutput, mInventory[j])
+ && mInventory[j].stackSize + tOutput.stackSize <= tOutput.getMaxStackSize())) {
+ mFluid.amount -= GT_Utility.getFluidForFilledItem(tOutput, true).amount
+ * tOutput.stackSize;
+ getBaseMetaTileEntity().decrStackSize(i, 1);
+ if (mInventory[j] == null) {
+ mInventory[j] = tOutput;
+ } else {
+ mInventory[j].stackSize++;
+ }
+ if (mFluid.amount <= 0) mFluid = null;
+ break;
+ }
+ }
+ }
+ }
+
+ ItemStack[] tRecipe = new ItemStack[9];
+ ItemStack tTempStack = null, tOutput = null;
+
+ if (mInventory[17] != null && mThroughPut < 2 && mMode != 0) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[17];
+ mInventory[17] = null;
+ }
+ } else {
+ if (!mLastCraftSuccessful) {
+ mCurrentSlot = (mCurrentSlot + 1) % 18;
+ for (int i = 0; i < 17 && mInventory[mCurrentSlot] == null; i++)
+ mCurrentSlot = (mCurrentSlot + 1) % 18;
+ }
+ switch (mMode) {
+ case 0 -> {
+ if (mInventory[mCurrentSlot] != null
+ && !isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2 && mCurrentSlot < 8) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ for (int i = 0; i < 9; i++) {
+ tRecipe[i] = mInventory[i + 19];
+ if (tRecipe[i] != null) {
+ tRecipe[i] = GT_Utility.copy(tRecipe[i]);
+ tRecipe[i].stackSize = 1;
+ }
+ }
+ }
+ case 1 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ } else break;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ tRecipe[2] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ } else break;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 2 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 3 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 4 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 5 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tOutput = GT_OreDictUnificator.get(true, tTempStack);
+ if (tOutput != null && GT_Utility.areStacksEqual(tOutput, tTempStack)) tOutput = null;
+ if (tOutput == null) {
+ tRecipe[0] = null;
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 6 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ } else if (OrePrefixes.dustSmall.contains(mInventory[mCurrentSlot])) {
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ } else if (OrePrefixes.dustTiny.contains(mInventory[mCurrentSlot])) {
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ } else {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 7 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])
+ || !OrePrefixes.nugget.contains(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 8 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])
+ || mInventory[mCurrentSlot].getItemDamage() <= 0
+ || !mInventory[mCurrentSlot].getItem()
+ .isRepairable()) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ for (int i = mCurrentSlot + 1; i < 18; i++) {
+ if (mInventory[i] != null && mInventory[i].getItem() == tTempStack.getItem()
+ && mInventory[mCurrentSlot].getItemDamage() + mInventory[i].getItemDamage()
+ > tTempStack.getMaxDamage()) {
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = GT_Utility.copy(mInventory[i]);
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ break;
+ }
+ }
+ }
+ case 9 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ for (byte i = 0, j = 0; i < 18 && j < 9
+ && (j < 2
+ || GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null); i++) {
+ tRecipe[j] = mInventory[(mCurrentSlot + i) % 18];
+ if (tRecipe[j] != null) {
+ tRecipe[j] = GT_Utility.copy(tRecipe[j]);
+ tRecipe[j].stackSize = 1;
+ j++;
+ }
+ }
+ if (tRecipe[1] == null) tRecipe[0] = null;
+ }
+ }
+ }
+
+ if (tOutput == null)
+ tOutput = GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe);
+
+ if (tOutput != null || mMode == 0) mInventory[28] = tOutput;
+
+ if (tOutput == null) {
+ mLastCraftSuccessful = false;
+ } else {
+ if ((tTempStack = GT_OreDictUnificator.get(true, tOutput)) != null) {
+ tTempStack.stackSize = tOutput.stackSize;
+ tOutput = tTempStack;
+ }
+
+ mInventory[28] = GT_Utility.copy(tOutput);
+ ArrayList<ItemStack> tList = recipeContent(tRecipe), tContent = benchContent();
+ if (tList.size() > 0 && tContent.size() > 0) {
+
+ boolean success = (mMode == 6 || mMode == 7 || mInventory[17] == null);
+ for (byte i = 0; i < tList.size() && success; i++) {
+ success = false;
+ for (byte j = 0; j < tContent.size() && !success; j++) {
+ if (GT_Utility.areStacksEqual(tList.get(i), tContent.get(j))) {
+ if (tList.get(i).stackSize <= tContent.get(j).stackSize) {
+ success = true;
+ }
+ }
+ }
+ }
+
+ if (success) {
+ mLastCraftSuccessful = true;
+
+ for (byte i = 8; i > -1; i--) {
+ for (byte j = 17; j > -1; j--) {
+ if (tRecipe[i] != null && mInventory[j] != null) {
+ if (GT_Utility.areStacksEqual(tRecipe[i], mInventory[j])) {
+ ItemStack tStack = GT_Utility.getContainerItem(mInventory[j], true);
+ if (tStack != null) {
+ getBaseMetaTileEntity().decrStackSize(j, 1);
+ if (!tStack.isItemStackDamageable()
+ || tStack.getItemDamage() < tStack.getMaxDamage()) {
+ for (byte k = 9; k < 18; k++) {
+ if (mInventory[k] == null) {
+ mInventory[k] = GT_Utility.copy(tStack);
+ break;
+ } else if (GT_Utility.areStacksEqual(mInventory[k], tStack)
+ && mInventory[k].stackSize + tStack.stackSize
+ <= tStack.getMaxStackSize()) {
+ mInventory[k].stackSize += tStack.stackSize;
+ break;
+ }
+ }
+ }
+ } else {
+ getBaseMetaTileEntity().decrStackSize(j, 1);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ mInventory[18] = GT_Utility.copy(tOutput);
+ getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(mMode == 5 || mMode == 6 || mMode == 7 ? 128 : 2048, true);
+ mTicksUntilNextUpdate = 1;
+ } else {
+ mLastCraftSuccessful = false;
+ if (mInventory[mMode == 0 ? 8 : 17] != null && mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mMode == 0 ? 8 : 17];
+ mInventory[mMode == 0 ? 8 : 17] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+
+ if (mInventory[18] == null && mThroughPut < 2) {
+ for (byte i = 0; i < 8; i++) {
+ for (byte j = i; ++j < 9;) {
+ if (GT_Utility.areStacksEqual(mInventory[i], mInventory[j])
+ && mInventory[i].getMaxStackSize() > 8) {
+ mInventory[18] = mInventory[j];
+ mInventory[j] = null;
+ mTicksUntilNextUpdate = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (mThroughPut < 2) {
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(
+ GT_Utility.moveOneItemStack(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity().getIInventoryAtSide(getBaseMetaTileEntity().getBackFacing()),
+ getBaseMetaTileEntity().getBackFacing(),
+ getBaseMetaTileEntity().getFrontFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1) * 10,
+ true);
+ }
+ }
+ }
+
+ private boolean isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(ItemStack aStack) {
+ if (aStack == null) return true;
+ for (byte i = 19; i < 28; i++) {
+ if (mInventory[i] != null) {
+ if (GT_Utility.areStacksEqual(mInventory[i], aStack)) return true;
+ if (GT_Utility.areStacksEqual(GT_Utility.getContainerForFilledItem(mInventory[i], true), aStack))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private ArrayList<ItemStack> recipeContent(ItemStack[] tRecipe) {
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (byte i = 0; i < 9; i++) {
+ if (tRecipe[i] != null) {
+ boolean temp = false;
+ for (ItemStack itemStack : tList) {
+ if (GT_Utility.areStacksEqual(tRecipe[i], itemStack)) {
+ itemStack.stackSize++;
+ temp = true;
+ break;
+ }
+ }
+ if (!temp) tList.add(GT_Utility.copy(1, tRecipe[i]));
+ }
+ }
+ return tList;
+ }
+
+ private ArrayList<ItemStack> benchContent() {
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (byte i = 0; i < 18; i++) {
+ if (mInventory[i] != null) {
+ boolean temp = false;
+ for (byte j = 0; j < tList.size(); j++) {
+ if (GT_Utility.areStacksEqual(mInventory[i], mInventory[j])) {
+ tList.get(j).stackSize += mInventory[i].stackSize;
+ temp = true;
+ break;
+ }
+ }
+ if (!temp) tList.add(GT_Utility.copy(mInventory[i]));
+ }
+ }
+ return tList;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mMode == 0 ? aIndex >= 10 : aIndex >= 18;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mMode == 0 ? aIndex < 9 : aIndex < 18;
+ }
+
+ /*
+ * @Override public int getTextureIndex(byte aSide, byte aFacing, boolean aActive, boolean aRedstone) { if (aSide ==
+ * aFacing) return 112; if (GT_Utility.getOppositeSide(aSide) == aFacing) return 113; return 114; }
+ */
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Automatic Crafting Table Mk III",
+ // this.mDescription,
+ CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFront(i);
+ rTextures[6][i + 1] = this.getBack(i);
+ rTextures[7][i + 1] = this.getBottom(i);
+ rTextures[8][i + 1] = this.getTop(i);
+ rTextures[9][i + 1] = this.getSides(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return this.mTextures[0][aColorIndex + 1];
+ } else if (side.getOpposite() == facing) {
+ return this.mTextures[1][aColorIndex + 1];
+ } else {
+ return this.mTextures[4][aColorIndex + 1];
+ }
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_PIPE) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1], };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(118, 22));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .endAtSlot(8)
+ .build()
+ .setPos(7, 4))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 9)
+ .startFromSlot(9)
+ .endAtSlot(17)
+ .canInsert(false)
+ .background(GT_UITextures.SLOT_DARK_GRAY)
+ .applyForWidget(SlotWidget::disableShiftInsert)
+ .build()
+ .setPos(7, 59))
+ .widget(
+ new SlotWidget(inventoryHandler, 18).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(151, 40))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3)
+ .setPos(62, 4)
+ .setSize(54, 54))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(19)
+ .endAtSlot(27)
+ .phantom(true)
+ .background(GT_UITextures.TRANSPARENT)
+ .build()
+ .setPos(62, 4))
+ .widget(
+ SlotWidget.phantom(inventoryHandler, 28)
+ .disableInteraction()
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_ARROW_4)
+ .setPos(151, 4));
+ builder.widget(
+ new CycleButtonWidget().setGetter(() -> mThroughPut)
+ .setSetter(val -> mThroughPut = val)
+ .setLength(MAX_THROUGHPUT)
+ .setTextureGetter(i -> GTPP_UITextures.OVERLAY_BUTTON_THROUGHPUT[i])
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(120, 4)
+ .setSize(18, 18));
+ String[] mModeText = new String[] { "Normal Crafting Table", "???", "1x1", "2x2", "3x3", "Unifier", "Dust",
+ "???", "Hammer?", "Circle" };
+ CycleButtonWidget modeButton = new CycleButtonWidget().setGetter(() -> mMode)
+ .setSetter(val -> {
+ mMode = val;
+ switchMode();
+ })
+ .setLength(MAX_MODES)
+ .setTextureGetter(i -> GTPP_UITextures.OVERLAY_BUTTON_MODE[i]);
+ for (int i = 0; i < MAX_MODES; i++) {
+ modeButton.addTooltip(i, "Mode: " + mModeText[i]);
+ }
+ builder.widget(
+ modeButton.setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(120, 40)
+ .setSize(18, 18));
+ builder.widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_WORKBENCH_CIRCLE)
+ .setPos(136, 23)
+ .setSize(16, 16))
+ .widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_ARROW_WHITE_DOWN)
+ .setPos(155, 23)
+ .setSize(10, 16));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java
new file mode 100644
index 0000000000..7fc2b50f68
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java
@@ -0,0 +1,834 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import static gtPlusPlus.core.lib.CORE.sTesseractGeneratorOwnershipMap;
+import static gtPlusPlus.core.lib.CORE.sTesseractTerminalOwnershipMap;
+
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IDigitalChest;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.tesseract.TesseractHelper;
+
+public class GT_MetaTileEntity_TesseractGenerator extends GT_MetaTileEntity_BasicTank {
+
+ public static int TESSERACT_ENERGY_COST_DIMENSIONAL = 512;
+ public static int TESSERACT_ENERGY_COST = 128;
+ public byte isWorking = 0;
+ public int oFrequency = 0;
+ public int mNeededEnergy = 0;
+ public int mFrequency = 0;
+ public UUID mOwner;
+
+ public GT_MetaTileEntity_TesseractGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 3, "");
+ }
+
+ public GT_MetaTileEntity_TesseractGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TesseractGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getBackFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return this.getBaseMetaTileEntity()
+ .getEUCapacity() / 2;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 512;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 * 32;
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return this.maxEUStore();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean ownerControl() {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (TesseractHelper.getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency)
+ == this) && (this.isWorking >= 20) ? 999 : 0;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mFrequency", this.mFrequency);
+ if (mOwner != null) aNBT.setString("mOwner", mOwner.toString());
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mFrequency = aNBT.getInteger("mFrequency");
+ try {
+ this.mOwner = UUID.fromString(aNBT.getString("mOnwer"));
+ } catch (IllegalArgumentException i) {
+
+ }
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ int J = 4;
+ TESSERACT_ENERGY_COST = 128 * J;
+ TESSERACT_ENERGY_COST_DIMENSIONAL = 512 * J;
+ }
+
+ @Override
+ public void onServerStart() {
+ sTesseractGeneratorOwnershipMap.clear();
+ sTesseractTerminalOwnershipMap.clear();
+ }
+
+ public void onServerStop() {
+ sTesseractGeneratorOwnershipMap.clear();
+ sTesseractTerminalOwnershipMap.clear();
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer,
+ final ForgeDirection side, final float aX, final float aY, final float aZ) {
+
+ if (this.mOwner == null) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .toLowerCase()
+ .equals(
+ aPlayer.getDisplayName()
+ .toLowerCase())) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ }
+
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0:
+ Logger.WARNING("Freq. -1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 1;
+
+ break;
+ case 1:
+ Logger.WARNING("Freq. +1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 1;
+ default:
+ // Utils.LOG_WARNING("Did not click the correct place.");
+ break;
+ }
+ if (getGeneratorEntity(this.mFrequency) != null && getGeneratorEntity(this.mFrequency) != this) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency + EnumChatFormatting.RED + " (Occupied)");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Frequency: " + this.mFrequency);
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Generator to configure.");
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(final ForgeDirection side, final EntityPlayer aPlayer, final float aX,
+ final float aY, final float aZ) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 64;
+ }
+ case 1 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 64;
+ }
+ case 2 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 512;
+ }
+ case 3 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 512;
+ }
+ }
+ if (getGeneratorEntity(this.mFrequency) != null && getGeneratorEntity(this.mFrequency) != this) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency + EnumChatFormatting.RED + " (Occupied)");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Frequency: " + this.mFrequency);
+ }
+ }
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Generator to configure.");
+ }
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && ((tTileEntity instanceof IGregTechDeviceInformation))
+ && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) {
+ return ((IGregTechDeviceInformation) tTileEntity).getInfoData();
+ }
+ return new String[] { "Tesseract Generator", "Freqency:", "" + this.mFrequency,
+ (getGeneratorEntity() == this) && (this.isWorking >= 20) ? "Active" : "Inactive" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ public boolean isSendingInformation() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IGregTechDeviceInformation))) {
+ return ((IGregTechDeviceInformation) tTileEntity).isGivingInformation();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).isDigitalChest();
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).getStoredItemData();
+ }
+ return new ItemStack[] {};
+ }
+
+ @Override
+ public void setItemCount(final int aCount) {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ ((IDigitalChest) tTileEntity).setItemCount(aCount);
+ }
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).getMaxItemCount();
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int aIndex, final ItemStack aStack) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new int[0];
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).getAccessibleSlotsFromSide(ordinalSide);
+ }
+ final int[] rArray = new int[this.getSizeInventory()];
+ for (int i = 0; i < this.getSizeInventory(); i++) {
+ rArray[i] = i;
+ }
+ return rArray;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).canInsertItem(aIndex, aStack, ordinalSide);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).canExtractItem(aIndex, aStack, ordinalSide);
+ }
+ return true;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int aIndex) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int aIndex, final ItemStack aStack) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setInventorySlotContents(aIndex, aStack);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int aIndex, final int aAmount) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.decrStackSize(aIndex, aAmount);
+ }
+
+ @Override
+ public String getInventoryName() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return "";
+ }
+ return tTileEntity.getInventoryName();
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean canFill(final ForgeDirection aSide, final Fluid aFluid) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canFill(aSide, aFluid);
+ }
+
+ @Override
+ public boolean canDrain(final ForgeDirection aSide, final Fluid aFluid) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canDrain(aSide, aFluid);
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(final ForgeDirection aSide) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new FluidTankInfo[0];
+ }
+ return tTileEntity.getTankInfo(aSide);
+ }
+
+ @Override
+ public int fill_default(final ForgeDirection aDirection, final FluidStack aFluid, final boolean doFill) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.fill(aDirection, aFluid, doFill);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aDirection, final int maxDrain, final boolean doDrain) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aDirection, maxDrain, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aSide, final FluidStack aFluid, final boolean doDrain) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aSide, aFluid, doDrain);
+ }
+
+ public boolean addEnergyConsumption(final GT_MetaTileEntity_TesseractTerminal aTerminal) {
+ if (!this.getBaseMetaTileEntity()
+ .isAllowedToWork()) {
+ return false;
+ }
+ int J = (aTerminal.getBaseMetaTileEntity()
+ .getWorld()
+ == this.getBaseMetaTileEntity()
+ .getWorld() ? TESSERACT_ENERGY_COST : TESSERACT_ENERGY_COST_DIMENSIONAL);
+
+ J *= 4;
+
+ this.mNeededEnergy += J;
+
+ return true;
+ }
+
+ public boolean isValidTesseractGenerator(final String aOwnerName, final boolean aWorkIrrelevant) {
+ return (this.getBaseMetaTileEntity() != null) && (!this.getBaseMetaTileEntity()
+ .isInvalidTileEntity())
+ && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && ((aOwnerName == null) || (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals(aOwnerName)))
+ && ((aWorkIrrelevant) || (this.isWorking >= 20));
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ // TODO Auto-generated method stub
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ // Utils.LOG_WARNING("Ticking Generator. 0");
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Utils.LOG_WARNING("Ticking Generator.");
+ // Set owner
+ if (PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName())
+ != null) {
+ if (this.mOwner == null) {
+ Logger.WARNING("Setting Generators Owner. 1");
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+
+ if (this.mFrequency != this.oFrequency) {
+
+ Logger.WARNING("mFreq != oFreq");
+
+ if (getGeneratorEntity() == this) {
+ getGeneratorEntity(this.oFrequency);
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ Logger.WARNING("this Gen == oFreq on map - do block update");
+ }
+ Logger.WARNING("mFreq will be set to oFreq");
+ this.oFrequency = this.mFrequency;
+ }
+ if ((this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && (this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(this.mNeededEnergy, false))) {
+ // Utils.LOG_WARNING("Can Work & Has Energy");
+ if ((getGeneratorEntity(Integer.valueOf(this.mFrequency)) == null)
+ || (!getGeneratorEntity(Integer.valueOf(this.mFrequency)).isValidTesseractGenerator(null, true))) {
+ // Utils.LOG_WARNING("storing TE I think to mFreq map?");
+ TesseractHelper.setGeneratorOwnershipByPlayer(
+ PlayerUtils.getPlayerOnServerFromUUID(mOwner),
+ this.mFrequency,
+ this);
+ }
+ } else {
+ if (getGeneratorEntity(Integer.valueOf(this.mFrequency)) == this) {
+ Logger.WARNING("this gen == mFreq on map - do block update");
+ TesseractHelper.removeGenerator(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency);
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ }
+ this.isWorking = 0;
+ }
+ if (getGeneratorEntity(Integer.valueOf(this.mFrequency)) == this) {
+ // Utils.LOG_WARNING("mFreq == this - do work related things");
+ if (this.isWorking < 20) {
+ this.isWorking = ((byte) (this.isWorking + 1));
+ }
+ if (this.isWorking == 20) {
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ this.isWorking = ((byte) (this.isWorking + 1));
+ }
+ } else {
+ this.isWorking = 0;
+ }
+ this.mNeededEnergy = 0;
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Generates a Tesseract for the attached Inventory",
+ "Connect with pipes to insert items",
+ "Consumes " + TESSERACT_ENERGY_COST + "EU/t for same dimension transfers",
+ "Consumes " + TESSERACT_ENERGY_COST_DIMENSIONAL + "EU/t for cross dimensional transfers",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ // To-Do?
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ private GT_MetaTileEntity_TesseractGenerator getGeneratorEntity() {
+ GT_MetaTileEntity_TesseractGenerator thisGenerator = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency);
+ if (thisGenerator != null) {
+ return thisGenerator;
+ }
+ return null;
+ }
+
+ private GT_MetaTileEntity_TesseractGenerator getGeneratorEntity(int frequency) {
+ GT_MetaTileEntity_TesseractGenerator thisGenerator = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), frequency);
+ if (thisGenerator != null) {
+ return thisGenerator;
+ }
+ return null;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ Logger.WARNING("Setting Generators Owner. 2");
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public void onRemoval() {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ super.onRemoval();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java
new file mode 100644
index 0000000000..659f34e0d8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java
@@ -0,0 +1,644 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.tesseract.TesseractHelper;
+
+public class GT_MetaTileEntity_TesseractTerminal extends GT_MetaTileEntity_BasicTank {
+
+ public int mFrequency = 0;
+ public UUID mOwner;
+ public boolean mDidWork = false;
+ public static boolean sInterDimensionalTesseractAllowed = true;
+ private static int TESSERACT_ENERGY_COST = 128;
+ private static int TESSERACT_ENERGY_COST_DIMENSIONAL = 512;
+
+ public GT_MetaTileEntity_TesseractTerminal(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 3, "");
+ }
+
+ public GT_MetaTileEntity_TesseractTerminal(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TesseractTerminal(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getBackFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return (this.getBaseMetaTileEntity()
+ .getEUCapacity() / 100);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return TESSERACT_ENERGY_COST_DIMENSIONAL;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return TESSERACT_ENERGY_COST_DIMENSIONAL * 8 * 32;
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return this.maxEUStore();
+ }
+
+ @Override
+ public boolean ownerControl() {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.getTesseract(this.mFrequency, false) != null ? 999 : 0;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mFrequency", this.mFrequency);
+ aNBT.setString("mOwner", mOwner.toString());
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mFrequency = aNBT.getInteger("mFrequency");
+ this.mOwner = UUID.fromString(aNBT.getString("mOnwer"));
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ sInterDimensionalTesseractAllowed = true;
+ TESSERACT_ENERGY_COST = 512;
+ TESSERACT_ENERGY_COST_DIMENSIONAL = 2048;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer,
+ final ForgeDirection side, final float aX, final float aY, final float aZ) {
+
+ if (this.mOwner == null) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .toLowerCase()
+ .equals(
+ aPlayer.getDisplayName()
+ .toLowerCase())) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ }
+
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0:
+ // Utils.LOG_WARNING("Freq. -1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 1;
+ break;
+ case 1:
+ // Utils.LOG_WARNING("Freq. +1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 1;
+ default:
+ // Utils.LOG_WARNING("Did not click the correct place.");
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ break;
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Frequency: " + this.mFrequency);
+ if (this.getTesseract(this.mFrequency, false) != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ new StringBuilder().append(EnumChatFormatting.GREEN)
+ .append(" (Connected)")
+ .toString());
+ }
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Terminal to configure.");
+ }
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(final ForgeDirection side, final EntityPlayer aPlayer, final float aX,
+ final float aY, final float aZ) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 64;
+ }
+ case 1 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 64;
+ }
+ case 2 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 512;
+ }
+ case 3 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 512;
+ }
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency
+ + (this.getTesseract(this.mFrequency, false) == null ? ""
+ : new StringBuilder().append(EnumChatFormatting.GREEN)
+ .append(" (Connected)")
+ .toString()));
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Terminal to configure.");
+ }
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ public GT_MetaTileEntity_TesseractGenerator getTesseract(final int aFrequency, final boolean aWorkIrrelevant) {
+ final GT_MetaTileEntity_TesseractGenerator rTesseract = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), aFrequency);
+ if (rTesseract == null) {
+ return null;
+ }
+ if (!TesseractHelper.isGeneratorOwnedByPlayer(PlayerUtils.getPlayerOnServerFromUUID(mOwner), rTesseract)) {
+ return null;
+ }
+ if (rTesseract.mFrequency != aFrequency) {
+ TesseractHelper.setTerminalOwnershipByPlayer(
+ PlayerUtils.getPlayerOnServerFromUUID(mOwner),
+ Integer.valueOf(aFrequency),
+ null);
+ return null;
+ }
+ if (!rTesseract.isValidTesseractGenerator(
+ this.getBaseMetaTileEntity()
+ .getOwnerName(),
+ aWorkIrrelevant)) {
+ return null;
+ }
+ if ((!sInterDimensionalTesseractAllowed) && (rTesseract.getBaseMetaTileEntity()
+ .getWorld()
+ != this.getBaseMetaTileEntity()
+ .getWorld())) {
+ return null;
+ }
+ return rTesseract;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && (tTileEntity.isSendingInformation())) {
+ return tTileEntity.getInfoData();
+ }
+ return new String[] { "Tesseract Generator", "Freqency:", "" + this.mFrequency,
+ this.getTesseract(this.mFrequency, false) != null ? "Active" : "Inactive" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isDigitalChest();
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStoredItemData();
+ }
+
+ @Override
+ public void setItemCount(final int aCount) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setItemCount(aCount);
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getMaxItemCount();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int aIndex, final ItemStack aStack) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new int[0];
+ }
+ return tTileEntity.getAccessibleSlotsFromSide(ordinalSide);
+ }
+
+ @Override
+ public boolean canInsertItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean canExtractItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canExtractItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int aIndex) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int aIndex, final ItemStack aStack) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setInventorySlotContents(aIndex, aStack);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int aIndex, final int aAmount) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.decrStackSize(aIndex, aAmount);
+ }
+
+ @Override
+ public String getInventoryName() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return "";
+ }
+ return tTileEntity.getInventoryName();
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean canFill(final ForgeDirection aSide, final Fluid aFluid) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canFill(aSide, aFluid);
+ }
+
+ @Override
+ public boolean canDrain(final ForgeDirection aSide, final Fluid aFluid) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canDrain(aSide, aFluid);
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(final ForgeDirection aSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new FluidTankInfo[0];
+ }
+ return tTileEntity.getTankInfo(aSide);
+ }
+
+ @Override
+ public int fill_default(final ForgeDirection aDirection, final FluidStack aFluid, final boolean doFill) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.fill(aDirection, aFluid, doFill);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aDirection, final int maxDrain, final boolean doDrain) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aDirection, maxDrain, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aSide, final FluidStack aFluid, final boolean doDrain) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aSide, aFluid, doDrain);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if ((this.getBaseMetaTileEntity()
+ .isServerSide())
+ && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ // Set owner
+ if (PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName())
+ != null) {
+ if (this.mOwner == null) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, true);
+ if (tTileEntity != null) {
+ tTileEntity.addEnergyConsumption(this);
+ if ((!this.mDidWork) && (this.getTesseract(this.mFrequency, false) != null)) {
+ this.mDidWork = true;
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(128, false);
+ }
+ } else if (this.mDidWork == true) {
+ this.mDidWork = false;
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ }
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Accesses Tesseract Generators remotely",
+ "Connect with pipes to extract items or fluids",
+ "Outputs from the back face",
+ "Consumes " + TESSERACT_ENERGY_COST + "EU/t for same dimension transfers",
+ "Consumes " + TESSERACT_ENERGY_COST_DIMENSIONAL + "EU/t for cross dimensional transfers",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ // To-Do?
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public void onRemoval() {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ super.onRemoval();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java
new file mode 100644
index 0000000000..b27c1a759a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java
@@ -0,0 +1,333 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+
+public class GT_MetaTileEntity_Boiler_Base extends GT_MetaTileEntity_Boiler {
+
+ private final int steamPerSecond;
+ private final int tier;
+
+ public GT_MetaTileEntity_Boiler_Base(int aID, String aNameRegional, int tier) {
+ super(
+ aID,
+ "electricboiler." + tier + ".tier.single",
+ aNameRegional,
+ "Produces " + (CORE.ConfigSwitches.boilerSteamPerSecond * tier) + "L of Steam per second");
+ this.steamPerSecond = (CORE.ConfigSwitches.boilerSteamPerSecond * tier);
+ this.tier = tier;
+ }
+
+ public GT_MetaTileEntity_Boiler_Base(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.steamPerSecond = (CORE.ConfigSwitches.boilerSteamPerSecond * aTier);
+ this.tier = aTier;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + getPollution() + " pollution/sec",
+ "Consumes fuel only when temperature is less than 100C",
+ "Fuel with burn time greater than 500 is more efficient.",
+ "Doesn't explode if there's no water",
+ CORE.GT_Tooltip.get());
+ }
+
+ public ITexture getOverlayIcon() {
+ return new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ protected GT_RenderedTexture getCasingTexture() {
+ if (this.tier == 1) {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_LV_SIDE);
+ } else if (this.tier == 2) {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_MV_SIDE);
+ } else {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_HV_SIDE);
+ }
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.tier][aColor + 1], this.getCasingTexture() };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.tier][aColor + 1], this.getCasingTexture() };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ // Please find out what I do.
+ // I do stuff within the GUI.
+ // this.mTemperature = Math.min(54, Math.max(0, this.mTemperature * 54 / (((GT_MetaTileEntity_Boiler)
+ // this.mTileEntity.getMetaTileEntity()).maxProgresstime() - 10)));
+ @Override
+ public int maxProgresstime() {
+ return 1000 + (250 * tier);
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public int getCapacity() {
+ return (16000 + (16000 * tier));
+ }
+
+ // This type of machine can have different water and steam capacities.
+ @Override
+ public int getSteamCapacity() {
+ return 2 * getCapacity();
+ }
+
+ @Override
+ protected int getProductionPerSecond() {
+ return steamPerSecond;
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return maxProgresstime();
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ return 2;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return 40;
+ }
+
+ @Override
+ protected int getHeatUpRate() {
+ return 10;
+ }
+
+ @Override
+ protected void updateFuel(IGregTechTileEntity tile, long ticks) {
+ ItemStack fuelStack = this.mInventory[2];
+ if (fuelStack == null) return;
+
+ int burnTime = getBurnTime(fuelStack);
+ if (burnTime > 0 && this.mTemperature <= 101) {
+ consumeFuel(tile, fuelStack, burnTime);
+ }
+ }
+
+ @Override
+ // Since this type of machine can have different water and steam capacities, we need to override getTankInfo() to
+ // support returning those different capacities.
+ public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
+ return new FluidTankInfo[] { new FluidTankInfo(this.mFluid, getCapacity()),
+ new FluidTankInfo(this.mSteam, getSteamCapacity()) };
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 1 || aIndex == 3;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 2;
+ }
+
+ @Override
+ protected int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondBoiler
+ * CORE.ConfigSwitches.pollutionReleasedByTierBoiler[this.tier]);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Base(this.mName, tier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected void onDangerousWaterLack(IGregTechTileEntity tile, long ticks) {
+ // Smart boilers don't explode!
+ }
+
+ /**
+ * Returns burn time if the stack is a valid fuel, otherwise return 0.
+ */
+ private static int getBurnTime(ItemStack stack) {
+ int burnTime = GameRegistry.getFuelValue(stack);
+ if (burnTime <= 0) {
+ burnTime = TileEntityFurnace.getItemBurnTime(stack);
+ }
+
+ return burnTime;
+ }
+
+ public void consumeFuel(IGregTechTileEntity tile, ItemStack fuel, int burnTime) {
+ this.mProcessingEnergy += burnTime / 10;
+ this.mTemperature += burnTime / 500; // will add bonus temperature points if the burn time is pretty high
+
+ tile.decrStackSize(2, 1);
+ if (tile.getRandomNumber(3) == 0) {
+ if (fuel.getDisplayName()
+ .toLowerCase()
+ .contains("charcoal")
+ || fuel.getDisplayName()
+ .toLowerCase()
+ .contains("coke")) {
+ tile.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ } else {
+ tile.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ }
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ @Override
+ protected IDrawable[] getFuelSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_COAL };
+ }
+
+ @Override
+ protected IDrawable[] getAshSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_DUST };
+ }
+
+ @Override
+ public int getTitleColor() {
+ return COLOR_TITLE.get();
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotIn() {
+ return GT_UITextures.OVERLAY_SLOT_IN;
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotOut() {
+ return GT_UITextures.OVERLAY_SLOT_OUT;
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotCanister() {
+ return GTPP_UITextures.OVERLAY_SLOT_CANISTER_DARK;
+ }
+
+ @Override
+ protected UITexture getProgressbarEmpty() {
+ return GTPP_UITextures.PROGRESSBAR_BOILER_EMPTY;
+ }
+
+ @Override
+ protected UITexture getProgressbarFuel() {
+ return GTPP_UITextures.PROGRESSBAR_FUEL;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java
new file mode 100644
index 0000000000..e77915aa01
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_HV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_HV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_HV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_HV(this.mName, 3, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_HV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Talonite) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java
new file mode 100644
index 0000000000..23abfe1e3f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_LV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_LV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_LV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_LV(this.mName, 1, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_LV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Potin) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java
new file mode 100644
index 0000000000..379f67b55d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_MV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_MV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_MV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_MV(this.mName, 2, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_MV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Tumbaga) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java
new file mode 100644
index 0000000000..993b0e9035
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SemiFluidGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_SemiFluidGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires semi-fluid Fuel", new ITexture[0]);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_SemiFluidGenerator(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondSemiFluidGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierSemiFluidGenerator[this.mTier]);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "SemiFluidGenerator.efficiency.tier." + this.mTier,
+ 100 - (this.mTier * 5));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SemiFluidGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Logger.WARNING("Fuel Count: "+Gregtech_Recipe_Map.sSemiFluidLiquidFuels.mRecipeList.size());
+ return GTPPRecipeMaps.semiFluidFuels;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + (this.getPollution()) + " pollution/sec",
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return (side == getBaseMetaTileEntity().getFrontFacing());
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ @Override
+ public int getFuelValue(ItemStack aStack) {
+ if ((GT_Utility.isStackInvalid(aStack)) || (getRecipeMap() == null)) {
+ Logger.WARNING("Bad Fuel?");
+ return 0;
+ }
+ int rValue = Math.max(GT_ModHandler.getFuelValue(aStack) * 6 / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ Logger.WARNING("Good Fuel: " + rValue);
+ return rValue;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_FRONT),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE) };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java
new file mode 100644
index 0000000000..e1f1c8a2e6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java
@@ -0,0 +1,176 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntityGeothermalGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GregtechMetaTileEntityGeothermalGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires Pahoehoe Lava or Normal Lava as Fuel", new ITexture[0]);
+ this.onConfigLoad();
+ }
+
+ public GregtechMetaTileEntityGeothermalGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.onConfigLoad();
+ }
+
+ @Override
+ public String[] getDescription() {
+ String aPollution = "Causes " + this.getPollution() + " Pollution per second";
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Generates power at " + this.getEfficiency() + "% Efficiency per tick",
+ aPollution,
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public int getCapacity() {
+ // return MathUtils.roundToClosestMultiple(32000*(this.mTier/2), 25000);
+ return 5000 * this.mTier;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "ThermalGenerator.efficiency.tier." + this.mTier,
+ (100 - (this.mTier * 7)));
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public int getFuelValue(final ItemStack aStack) {
+ int rValue = Math.max((GT_ModHandler.getFuelValue(aStack) * 6) / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ return rValue;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityGeothermalGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BACK),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Vertical) };
+ }
+
+ @Override
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER) };
+ }
+
+ @Override
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_LAVA_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Vertical_Active) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hotFuels;
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondGeothermalGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierGeothermalGenerator[mTier]);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java
new file mode 100644
index 0000000000..45d4177709
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators.GregtechRocketFuelGeneratorBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntityRocketFuelGenerator extends GregtechRocketFuelGeneratorBase {
+
+ public int mEfficiency;
+
+ public GregtechMetaTileEntityRocketFuelGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires GT++ Rocket Fuels", new ITexture[0]);
+ this.onConfigLoad();
+ }
+
+ public GregtechMetaTileEntityRocketFuelGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityRocketFuelGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rocketFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "RocketEngine.efficiency.tier." + this.mTier,
+ 80 - (10 * (this.mTier - 4)));
+ }
+
+ @Override
+ public int getEfficiency() {
+ int eff = 80 - (10 * (this.mTier - 4));
+ return eff;
+ }
+
+ @Override
+ public int getFuelValue(final ItemStack aStack) {
+ int rValue = Math.max((GT_ModHandler.getFuelValue(aStack) * 6) / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ return rValue;
+ }
+
+ private GT_RenderedTexture getCasingTexture() {
+ if (this.mTier <= 4) {
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top);
+ } else if (this.mTier == 5) {
+
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Advanced);
+ } else {
+
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Ultra);
+ }
+ // return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent) };
+ }
+
+ @Override
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Redstone_Off) };
+ }
+
+ @Override
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Horizontal) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent_Fast) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Redstone_On) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Horizontal_Active) };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java
new file mode 100644
index 0000000000..32cf3a92cc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java
@@ -0,0 +1,379 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GregtechMetaTileEntity_RTG extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+ private long mTicksToBurnFor;
+ private int mVoltage = 0;
+ private GT_Recipe mCurrentRecipe;
+ private int mDaysRemaining = 0;
+ private int mDayTick = 0;
+ private byte mNewTier = 0;
+
+ public int removeDayOfTime() {
+ if (this.mDaysRemaining > 0) {
+ return this.mDaysRemaining--;
+ }
+ return this.mDaysRemaining;
+ }
+
+ // Generates fuel value based on MC days
+ public static int convertDaysToTicks(float days) {
+ int value = 0;
+ value = MathUtils.roundToClosestInt(20 * 86400 * days);
+ return value;
+ }
+
+ public static long getTotalEUGenerated(int ticks, int voltage) {
+ return ticks * voltage;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("mTicksToBurnFor", this.mTicksToBurnFor);
+ aNBT.setInteger("mVoltage", this.mVoltage);
+ aNBT.setInteger("mDaysRemaining", this.mDaysRemaining);
+ aNBT.setInteger("mDayTick", this.mDayTick);
+ aNBT.setByte("mNewTier", this.mNewTier);
+
+ if (this.mCurrentRecipe != null) {
+ final NBTTagList list = new NBTTagList();
+ final ItemStack stack = this.mCurrentRecipe.mInputs[0];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("mSlot", 0);
+ list.appendTag(data);
+ }
+ aNBT.setTag("mRecipeItem", list);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mTicksToBurnFor = aNBT.getLong("mTicksToBurnFor");
+ this.mVoltage = aNBT.getInteger("mVoltage");
+ this.mDaysRemaining = aNBT.getInteger("mDaysRemaining");
+ this.mDayTick = aNBT.getInteger("mDayTick");
+ this.mNewTier = aNBT.getByte("mNewTier");
+
+ try {
+ ReflectionUtils.setByte(this, "mTier", this.mNewTier);
+ } catch (Exception e) {
+ if (this.getBaseMetaTileEntity() != null) {
+ IGregTechTileEntity thisTile = this.getBaseMetaTileEntity();
+ if (thisTile.isAllowedToWork() || thisTile.isActive()) {
+ thisTile.setActive(false);
+ }
+ }
+ }
+
+ final NBTTagList list = aNBT.getTagList("mRecipeItem", 10);
+ final NBTTagCompound data = list.getCompoundTagAt(0);
+ ItemStack lastUsedFuel = ItemStack.loadItemStackFromNBT(data);
+ if (lastUsedFuel != null) {
+ this.mCurrentRecipe = getRecipeMap().findRecipe(
+ getBaseMetaTileEntity(),
+ false,
+ 9223372036854775807L,
+ null,
+ new ItemStack[] { lastUsedFuel });
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mDayTick < 24000) {
+ this.mDayTick++;
+ } else if (this.mDayTick >= 24000) {
+ this.mDayTick = 0;
+ this.mDaysRemaining = this.removeDayOfTime();
+ }
+ }
+
+ if ((aBaseMetaTileEntity.isServerSide()) && (aBaseMetaTileEntity.isAllowedToWork()) && (aTick % 10L == 0L)) {
+ long tProducedEU = 0L;
+ if (this.mFluid == null) {
+ if (aBaseMetaTileEntity.getUniversalEnergyStored() < maxEUOutput() + getMinimumStoredEU()) {
+ this.mInventory[getStackDisplaySlot()] = null;
+ } else {
+ if (this.mInventory[getStackDisplaySlot()] == null)
+ this.mInventory[getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1);
+ this.mInventory[getStackDisplaySlot()].setStackDisplayName(
+ "Generating: "
+ + GT_Utility.formatNumbers(
+ aBaseMetaTileEntity.getUniversalEnergyStored() - getMinimumStoredEU())
+ + " EU");
+ }
+ } else {
+ int tFuelValue = getFuelValue(this.mFluid);
+ int tConsumed = consumedFluidPerOperation(this.mFluid);
+ if ((tFuelValue > 0) && (tConsumed > 0) && (this.mFluid.amount > tConsumed)) {
+ long tFluidAmountToUse = Math.min(
+ this.mFluid.amount / tConsumed,
+ (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
+ if ((tFluidAmountToUse > 0L)
+ && (aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true))) {
+ tProducedEU = tFluidAmountToUse * tFuelValue;
+ FluidStack tmp260_257 = this.mFluid;
+ tmp260_257.amount = (int) (tmp260_257.amount - (tFluidAmountToUse * tConsumed));
+ }
+ }
+ }
+ if ((this.mInventory[getInputSlot()] != null)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored() < maxEUOutput() * 20L + getMinimumStoredEU())
+ && (GT_Utility.getFluidForFilledItem(this.mInventory[getInputSlot()], true) == null)) {
+ int tFuelValue = getFuelValue(this.mInventory[getInputSlot()]);
+ if (tFuelValue > 0) {
+ ItemStack tEmptyContainer = getEmptyContainer(this.mInventory[getInputSlot()]);
+ if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ tProducedEU = tFuelValue;
+ }
+ }
+ }
+ if ((tProducedEU > 0L) && (getPollution() > 0)) {
+ PollutionUtils
+ .addPollution(aBaseMetaTileEntity, (int) (tProducedEU * getPollution() / 500 * this.mTier + 1L));
+ }
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) aBaseMetaTileEntity.setActive(
+ (aBaseMetaTileEntity.isAllowedToWork())
+ && (aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()));
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Fuel is measured in minecraft days (Check with Scanner)",
+ "RTG changes output voltage depending on fuel",
+ "Generates power at " + GT_Utility.formatNumbers(this.getEfficiency()) + "% Efficiency per tick",
+ "Output Voltage: " + GT_Utility.formatNumbers(this.getOutputTier()) + " EU/t",
+ CORE.GT_Tooltip.get());
+ }
+
+ public GregtechMetaTileEntity_RTG(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires RTG Pellets", new ITexture[0]);
+ }
+
+ private byte getTier() {
+ int voltage = this.mVoltage;
+ if (voltage >= 512) {
+ return 4;
+ } else if (voltage >= 128) {
+ return 3;
+ } else if (voltage >= 32) {
+ return 2;
+ } else if (voltage >= 8) {
+ return 1;
+ }
+ return 0;
+ }
+
+ public GregtechMetaTileEntity_RTG(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return ((side.offsetY == 0) && (side != getBaseMetaTileEntity().getFrontFacing())
+ && (side != getBaseMetaTileEntity().getBackFacing()));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_RTG(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rtgFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency = 100;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_MASSFAB) };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS[this.mTier][(0)],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[getTier()] };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS[this.mTier][(0)],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[getTier()] };
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(ItemStack aStack) {
+ if ((GT_Utility.isStackInvalid(aStack)) || (getRecipeMap() == null)) return 0;
+ GT_Recipe tFuel = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), false, 9223372036854775807L, null, new ItemStack[] { aStack });
+ if (tFuel != null) {
+ this.mCurrentRecipe = tFuel;
+ int voltage = tFuel.mEUt;
+ this.mVoltage = voltage;
+ // this.mDaysRemaining = tFuel.mSpecialValue*365;
+
+ // Do some voodoo.
+ byte mTier2;
+ // mTier2 = ReflectionUtils.getField(this.getClass(), "mTier");
+ try {
+ if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_AM241.get(1))) {
+ mTier2 = 1;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_PO210.get(1))) {
+ mTier2 = 3;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_PU238.get(1))) {
+ mTier2 = 2;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_SR90.get(1))) {
+ mTier2 = 1;
+ } else {
+ mTier2 = 0;
+ }
+ ReflectionUtils.setByte(this, "mTier", mTier2);
+ this.mNewTier = mTier2;
+ } catch (Exception e) {
+ Logger.WARNING("Failed setting mTier.");
+ e.printStackTrace();
+ }
+
+ this.mTicksToBurnFor = getTotalEUGenerated(convertDaysToTicks(tFuel.mSpecialValue), voltage);
+ if (mTicksToBurnFor >= Integer.MAX_VALUE) {
+ mTicksToBurnFor = Integer.MAX_VALUE;
+ Logger.WARNING("Fuel went over Int limit, setting to MAX_VALUE.");
+ }
+ this.mDaysRemaining = MathUtils.roundToClosestInt(mTicksToBurnFor / 20 / 60 / 3);
+ Logger.WARNING("step | " + (int) (mTicksToBurnFor * getEfficiency() / 100L));
+ return (int) (mTicksToBurnFor * getEfficiency() / 100L);
+ }
+ Logger.WARNING("Not sure");
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? this.mVoltage : 0L);
+ }
+
+ @Override
+ public long getOutputTier() {
+ if (this.mCurrentRecipe != null) {
+ return this.mVoltage = this.mCurrentRecipe.mEUt;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { "RTG - Running at tier " + this.mTier, "Active: " + this.getBaseMetaTileEntity()
+ .isActive(), "Current Output: " + GT_Utility.formatNumbers(mVoltage) + " EU/t",
+ "Days of Fuel remaining: " + GT_Utility.formatNumbers(mTicksToBurnFor / 20 / 60 / 20),
+ "Hours of Fuel remaining: " + GT_Utility.formatNumbers(mTicksToBurnFor / 20 / 60 / 60),
+ "Ticks of " + this.mVoltage + "v remaining: " + mTicksToBurnFor,
+ this.mCurrentRecipe.mInputs[0].getDisplayName() + " x1" };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java
new file mode 100644
index 0000000000..24770e9503
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators.ULV;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_DieselGenerator;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_ULV_CombustionGenerator extends GT_MetaTileEntity_DieselGenerator {
+
+ public GT_MetaTileEntity_ULV_CombustionGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_ULV_CombustionGenerator(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + (this.getPollution() * 20) + " pollution/sec",
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[1] * 80L + getMinimumStoredEU());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ULV_CombustionGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "DieselGenerator.efficiency.tier." + this.mTier, 95);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java
new file mode 100644
index 0000000000..26429b1486
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators.ULV;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_SteamTurbine;
+
+public class GT_MetaTileEntity_ULV_SteamTurbine extends GT_MetaTileEntity_SteamTurbine {
+
+ public GT_MetaTileEntity_ULV_SteamTurbine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0);
+ }
+
+ public GT_MetaTileEntity_ULV_SteamTurbine(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[1] * 80L + getMinimumStoredEU());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ULV_SteamTurbine(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "SteamTurbine.efficiency.tier." + this.mTier, 6 + 1);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java
new file mode 100644
index 0000000000..c592a68a40
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java
@@ -0,0 +1,716 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.ICropTile;
+import ic2.core.item.DamageHandler;
+
+public class GT_MetaTileEntity_CropHarvestor extends GT_MetaTileEntity_BasicTank {
+
+ private static final int SLOT_WEEDEX_1 = 1;
+ private static final int SLOT_WEEDEX_2 = 2;
+ private static final int SLOT_FERT_1 = 3;
+ private static final int SLOT_FERT_4 = 6;
+ private static final int SLOT_OUTPUT_START = 7;
+
+ public boolean mModeAlternative = false;
+ public boolean mHarvestEnabled = true;
+
+ public GT_MetaTileEntity_CropHarvestor(final int aID, final int aTier, final String aDescription) {
+ super(
+ aID,
+ "basicmachine.cropharvester.0" + aTier,
+ "Crop Manager (" + GT_Values.VN[aTier] + ")",
+ aTier,
+ 21,
+ aDescription);
+ }
+
+ public GT_MetaTileEntity_CropHarvestor(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 21, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 8;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return GT_Values.V[this.mTier] * (this.mTier * GT_Values.V[this.mTier]);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000 * this.mTier;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_CropHarvestor(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 21;
+ }
+
+ private static int getRange(int aTier) {
+ return switch (aTier) {
+ case 1 -> 1;
+ case 2 -> 5;
+ case 3 -> 9;
+ case 4 -> 13;
+ case 5 -> 17;
+ case 6 -> 21;
+ case 7 -> 25;
+ case 8 -> 29;
+ case 9 -> 33;
+ default -> 0;
+ };
+ }
+
+ private HashSet<ICropTile> mCropCache = new HashSet<>();
+ private boolean mInvalidCache = false;
+
+ public boolean doesInventoryHaveSpace() {
+ for (int i = SLOT_OUTPUT_START; i < this.getSizeInventory(); i++) {
+ if (this.mInventory[i] == null || this.mInventory[i].stackSize < 64) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public long powerUsage() {
+ return this.maxEUInput() / 8;
+ }
+
+ public long powerUsageSecondary() {
+ return this.maxEUInput() / 32;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (!getBaseMetaTileEntity().isServerSide() || !getBaseMetaTileEntity().isAllowedToWork()
+ || (!getBaseMetaTileEntity().hasWorkJustBeenEnabled() && aTick % 100 != 0)) return;
+
+ if (this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() < getMinimumStoredEU()) return;
+
+ int aTileX = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int aTileY = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int aTileZ = this.getBaseMetaTileEntity()
+ .getXCoord();
+
+ int aRadius = 10 + getRange(this.mTier);
+ int aSide = (aRadius - 1) / 2;
+ Map<ItemStack, Integer> aAllDrops = new ItemStackMap<>(true);
+
+ if (this.mCropCache.isEmpty() || aTick % 1200 == 0 || this.mInvalidCache) {
+ if (!this.mCropCache.isEmpty()) {
+ this.mCropCache.clear();
+ }
+ // Logger.INFO("Looking for crops.");
+ for (int y = -2; y <= 2; y++) {
+ for (int x = (-aSide); x <= aSide; x++) {
+ for (int z = (-aSide); z <= aSide; z++) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityOffset(x, y, z);
+ if (tTileEntity != null && tTileEntity instanceof ICropTile tCrop) {
+ this.mCropCache.add(tCrop);
+ }
+ }
+ }
+ }
+ }
+
+ // Process Cache
+ if (!doesInventoryHaveSpace()) return;
+
+ for (ICropTile tCrop : this.mCropCache) {
+ if (tCrop == null) {
+ this.mInvalidCache = true;
+ break;
+ }
+ CropCard aCrop = tCrop.getCrop();
+ if (aCrop == null) continue;
+
+ if (this.mModeAlternative) processSecondaryFunctions(tCrop);
+ if (!this.mHarvestEnabled) continue;
+
+ if (aCrop.canBeHarvested(tCrop) && tCrop.getSize() == aCrop.getOptimalHavestSize(tCrop)) {
+ if (!getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsage(), true)) continue;
+ ItemStack[] aHarvest = tCrop.harvest_automated(true);
+ if (aHarvest == null) continue;
+
+ for (ItemStack aStack : aHarvest) {
+ if (!ItemUtils.checkForInvalidItems(aStack)) continue;
+ if (this.mTier * 5 > MathUtils.randInt(1, 100)) {
+ aStack.stackSize += Math.floor(tCrop.getGain() / 10);
+ Logger.INFO("Bonus output given for " + aCrop.displayName());
+ }
+ Logger.INFO("Harvested " + aCrop.displayName());
+ aAllDrops.merge(aStack, aStack.stackSize, Integer::sum);
+ }
+ }
+ }
+
+ if (aAllDrops.isEmpty()) return;
+
+ Logger.INFO("Handling " + aAllDrops.size() + " Harvests");
+ for (int i = SLOT_OUTPUT_START; i < this.getSizeInventory() && !aAllDrops.isEmpty(); i++) {
+ ItemStack invStack = mInventory[i];
+ if (invStack == null || GT_Utility.isStackInvalid(invStack) || invStack.stackSize == 0) {
+ Iterator<Entry<ItemStack, Integer>> iter = aAllDrops.entrySet()
+ .iterator();
+ if (!iter.hasNext()) return;
+ Entry<ItemStack, Integer> e = iter.next();
+ int toAdd = e.getValue();
+ int toAddThisSlot = Math.min(
+ toAdd,
+ e.getKey()
+ .getMaxStackSize());
+ getBaseMetaTileEntity().setInventorySlotContents(i, GT_Utility.copyAmount(toAddThisSlot, e.getKey()));
+ toAdd -= toAddThisSlot;
+ if (toAdd <= toAddThisSlot) {
+ iter.remove();
+ } else {
+ e.setValue(toAdd);
+ }
+ } else {
+ Integer toAddMaybeNull = aAllDrops.get(invStack);
+ if (toAddMaybeNull != null) {
+ int toAdd = toAddMaybeNull;
+ int space = Math.min(invStack.getMaxStackSize(), getInventoryStackLimit()) - invStack.stackSize;
+ if (toAdd <= space) {
+ getBaseMetaTileEntity().addStackToSlot(i, invStack, toAdd);
+ aAllDrops.remove(invStack);
+ } else {
+ getBaseMetaTileEntity().addStackToSlot(i, invStack, space);
+ aAllDrops.put(invStack, toAdd - space);
+ }
+ }
+ }
+ }
+ }
+
+ public boolean hasFertilizer() {
+ for (int i = SLOT_FERT_1; i <= SLOT_FERT_4; i++) {
+ if (this.mInventory[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean consumeFertilizer(boolean aSimulate) {
+ if (hasFertilizer()) {
+ for (int i = SLOT_FERT_1; i <= SLOT_FERT_4; i++) {
+ if (this.mInventory[i] != null) {
+ consume(i, 1, aSimulate);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean hasWeedEX() {
+ for (int i = SLOT_WEEDEX_1; i <= SLOT_WEEDEX_2; i++) {
+ if (this.mInventory[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean consumeWeedEX(boolean aSimulate) {
+ if (hasWeedEX()) {
+ for (int i = SLOT_WEEDEX_1; i <= SLOT_WEEDEX_2; i++) {
+ if (this.mInventory[i] != null) {
+ damage(i, 1, aSimulate);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void processSecondaryFunctions(ICropTile aCrop) {
+ if (!this.mModeAlternative) {
+ return;
+ }
+ if (hasFertilizer() && consumeFertilizer(true)
+ && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyFertilizer(aCrop)) {
+ if (consumeFertilizer(false)) {
+ // Logger.INFO("Consumed Fert.");
+ }
+ }
+ if (this.getFluidAmount() > 0 && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyHydration(aCrop)) {
+ // Logger.INFO("Consumed Water.");
+ }
+ if (hasWeedEX() && consumeWeedEX(true)
+ && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyWeedEx(aCrop)) {
+ if (consumeWeedEX(false)) {
+ // Logger.INFO("Consumed Weed-EX.");
+ }
+ }
+ }
+
+ public boolean applyWeedEx(ICropTile aCrop) {
+ if (aCrop.getWeedExStorage() < 150) {
+ aCrop.setWeedExStorage(aCrop.getWeedExStorage() + 50);
+ boolean triggerDecline;
+ triggerDecline = aCrop.getWorld().rand.nextInt(3) == 0;
+ if (aCrop.getCrop() != null && aCrop.getCrop()
+ .isWeed(aCrop) && aCrop.getWeedExStorage() >= 75 && triggerDecline) {
+ switch (aCrop.getWorld().rand.nextInt(5)) {
+ case 0:
+ if (aCrop.getGrowth() > 0) {
+ aCrop.setGrowth((byte) (aCrop.getGrowth() - 1));
+ }
+ case 1:
+ if (aCrop.getGain() > 0) {
+ aCrop.setGain((byte) (aCrop.getGain() - 1));
+ }
+ default:
+ if (aCrop.getResistance() > 0) {
+ aCrop.setResistance((byte) (aCrop.getResistance() - 1));
+ }
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean applyFertilizer(ICropTile aCrop) {
+ if (aCrop.getNutrientStorage() >= 100) {
+ return false;
+ } else {
+ // Logger.INFO("Current Nutrient: "+aCrop.getNutrientStorage()+" for "+aCrop.getCrop().displayName());
+ aCrop.setNutrientStorage(aCrop.getNutrientStorage() + 100);
+ return true;
+ }
+ }
+
+ public boolean applyHydration(ICropTile aCrop) {
+ if (aCrop.getHydrationStorage() >= 200 || this.getFluidAmount() == 0) {
+ // Logger.INFO("Hydration Max");
+ return false;
+ } else {
+ int apply = 200 - aCrop.getHydrationStorage();
+ if (this.getFluidAmount() >= 0) {
+ int drain = 0;
+ if (this.getFluidAmount() >= apply) {
+ drain = apply;
+ } else {
+ drain = this.getFluidAmount();
+ }
+ this.mFluid.amount -= drain;
+ if (this.mFluid.amount <= 0) {
+ this.mFluid = null;
+ }
+ // Logger.INFO("Did Hydrate");
+ aCrop.setHydrationStorage(aCrop.getHydrationStorage() + drain);
+ return true;
+ } else {
+ // Logger.INFO("No water?");
+ return false;
+ }
+ }
+ }
+
+ public boolean consume(int aSlot, int amount, boolean simulate) {
+ ItemStack stack = this.mInventory[aSlot];
+ if (stack != null && stack.stackSize >= amount) {
+ int currentAmount = Math.min(amount, stack.stackSize);
+ amount -= currentAmount;
+ if (!simulate) {
+ if (stack.stackSize == currentAmount) {
+ this.mInventory[aSlot] = null;
+ } else {
+ stack.stackSize -= currentAmount;
+ }
+ } else {
+ return amount >= 0;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public ItemStack damage(int aSlot, int amount, boolean simulate) {
+ ItemStack ret = null;
+ int damageApplied = 0;
+ ItemStack stack = this.mInventory[aSlot];
+ Item item = stack.getItem();
+ if (stack != null && item.isDamageable()
+ && (ret == null || stack.getItem() == ret.getItem() && ItemStack.areItemStackTagsEqual(stack, ret))) {
+ if (simulate) {
+ stack = stack.copy();
+ }
+ int maxDamage = DamageHandler.getMaxDamage(stack);
+ while (amount > 0 && stack.stackSize > 0) {
+ int currentAmount = Math.min(amount, maxDamage - DamageHandler.getDamage(stack));
+ DamageHandler.damage(stack, currentAmount, null);
+ damageApplied += currentAmount;
+ amount -= currentAmount;
+ if (DamageHandler.getDamage(stack) >= maxDamage) {
+ --stack.stackSize;
+ DamageHandler.setDamage(stack, 0);
+ }
+
+ if (ret == null) {
+ ret = stack.copy();
+ }
+ }
+ if (stack.stackSize == 0 && !simulate) {
+ this.mInventory[aSlot] = null;
+ }
+ }
+
+ if (ret != null) {
+ int i = DamageHandler.getMaxDamage(ret);
+ ret.stackSize = damageApplied / i;
+ DamageHandler.setDamage(ret, damageApplied % i);
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aStack != null && aIndex >= SLOT_OUTPUT_START && aIndex < this.getSizeInventory();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (aStack != null) {
+ if (aStack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemFertilizer")) {
+ return aIndex >= SLOT_FERT_1 && aIndex <= SLOT_FERT_4;
+ } else if (aStack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemWeedEx")) {
+ return aIndex >= SLOT_WEEDEX_1 && aIndex <= SLOT_WEEDEX_2;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String[] getDescription() {
+ int aRadius = 10 + getRange(this.mTier);
+ int aSide = (aRadius - 1) / 2;
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Secondary mode can Hydrate/Fertilize/Weed-EX",
+ "Consumes " + powerUsage() + "eu per harvest",
+ "Consumes " + powerUsageSecondary() + "eu per secondary operation",
+ "Can harvest 1 block level above and below itself",
+ "Radius: " + aSide + " blocks each side (" + aRadius + "x3x" + aRadius + ")",
+ "Has " + (this.mTier * 5) + "% chance for extra drops",
+ "Holds " + this.getCapacity() + "L of Water",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return true;
+ }
+
+ /*
+ * @Override public int getTextureIndex(byte aSide, byte aFacing, boolean aActive, boolean aRedstone) { if (aSide ==
+ * aFacing) return 118+(aRedstone?8:0); if (GT_Utility.getOppositeSide(aSide) == aFacing) return
+ * 113+(aRedstone?8:0); int tIndex = 128+(aRedstone?8:0); switch (aFacing) { case 0: return tIndex+64; case 1:
+ * return tIndex+32; case 2: switch (aSide) { case 0: return tIndex+32; case 1: return tIndex+32; case 4: return
+ * tIndex+16; case 5: return tIndex+48; } case 3: switch (aSide) { case 0: return tIndex+64; case 1: return
+ * tIndex+64; case 4: return tIndex+48; case 5: return tIndex+16; } case 4: switch (aSide) { case 0: return
+ * tIndex+16; case 1: return tIndex+16; case 2: return tIndex+48; case 3: return tIndex+16; } case 5: switch (aSide)
+ * { case 0: return tIndex+48; case 1: return tIndex+48; case 2: return tIndex+16; case 3: return tIndex+48; } }
+ * return tIndex; }
+ */
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFront(i);
+ rTextures[6][i + 1] = this.getBack(i);
+ rTextures[7][i + 1] = this.getBottom(i);
+ rTextures[8][i + 1] = this.getTop(i);
+ rTextures[9][i + 1] = this.getSides(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) {
+ return this.mTextures[3][aColorIndex + 1];
+ } else {
+ return this.mTextures[4][aColorIndex + 1];
+ }
+ /*
+ * return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0 : aSide == GT_Utility.getOppositeSide(aFacing)
+ * ? 1 : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ */
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Boxes) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Boxes) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mModeAlternative", this.mModeAlternative);
+ aNBT.setBoolean("mHarvestEnabled", this.mHarvestEnabled);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mModeAlternative = aNBT.getBoolean("mModeAlternative");
+ if (aNBT.hasKey("mHarvestEnabled")) {
+ this.mHarvestEnabled = aNBT.getBoolean("mHarvestEnabled");
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new CycleButtonWidget().setToggle(() -> mModeAlternative, val -> mModeAlternative = val)
+ .setTexture(GTPP_UITextures.OVERLAY_BUTTON_HARVESTER_MODE)
+ .addTooltip(0, "Enable Hydration/Fertilizing/Weed-EX")
+ .addTooltip(1, "Disable Hydration/Fertilizing/Weed-EX")
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(47, 63)
+ .setSize(18, 18));
+ builder.widget(
+ new CycleButtonWidget().setToggle(() -> mHarvestEnabled, val -> mHarvestEnabled = val)
+ .setTexture(GTPP_UITextures.OVERLAY_BUTTON_HARVESTER_TOGGLE)
+ .addTooltip(0, "Enable Harvest")
+ .addTooltip(1, "Disable Harvest")
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(67, 63)
+ .setSize(18, 18));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(SLOT_WEEDEX_1)
+ .endAtSlot(SLOT_WEEDEX_2)
+ .applyForWidget(
+ widget -> widget.setFilter(
+ stack -> stack != null && stack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemWeedEx"))
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_WEED_EX))
+ .build()
+ .setPos(7, 13))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(SLOT_FERT_1)
+ .endAtSlot(SLOT_FERT_4)
+ .applyForWidget(
+ widget -> widget.setFilter(
+ stack -> stack != null && stack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemFertilizer"))
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_FERTILIZER))
+ .build()
+ .setPos(7, 31))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 6)
+ .startFromSlot(SLOT_OUTPUT_START)
+ .endAtSlot(SLOT_OUTPUT_START + 6 * 3)
+ .canInsert(false)
+ .build()
+ .setPos(61, 7));
+ builder
+ .widget(
+ new ProgressBar()
+ .setTexture(GTPP_UITextures.PROGRESSBAR_BOILER_EMPTY, GT_UITextures.PROGRESSBAR_BOILER_WATER, 54)
+ .setDirection(ProgressBar.Direction.UP)
+ .setProgress(() -> (float) getFluidAmount() / getCapacity())
+ .setSynced(false, false)
+ .dynamicTooltip(
+ () -> Collections.singletonList("Water: " + getFluidAmount() + "L / " + getCapacity() + "L"))
+ .setPos(47, 7)
+ .setSize(10, 54))
+ .widget(new FakeSyncWidget.FluidStackSyncer(this::getDrainableStack, this::setDrainableStack));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java
new file mode 100644
index 0000000000..9f2789b520
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java
@@ -0,0 +1,893 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.Collections;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.item.general.ItemBasicScrubberTurbine;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaAtmosphericReconditioner extends GT_MetaTileEntity_BasicMachine {
+
+ public int mPollutionReduction = 0;
+ protected int mBaseEff = 2500;
+ protected int mOptimalAirFlow = 0;
+ protected boolean mHasPollution = false;
+ protected int SLOT_ROTOR = 5;
+ protected int SLOT_FILTER = 6;
+ protected static boolean mPollutionEnabled = true;
+
+ protected boolean mSaveRotor = false;
+
+ public GregtechMetaAtmosphericReconditioner(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 2,
+ "Making sure you don't live in Gwalior - Uses 2A",
+ 3,
+ 0,
+ new ITexture[] { new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_MASSFAB),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab_Active),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent_Fast),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB) });
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ }
+
+ public GregtechMetaAtmosphericReconditioner(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 2, aDescription, aTextures, 2, 0);
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaAtmosphericReconditioner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+
+ boolean highTier = this.mTier >= 7;
+
+ String[] A = ArrayUtils.addAll(
+ this.mDescriptionArray,
+ highTier ? "Will attempt to remove 1/4 pollution from 8 surrounding chunks" : "",
+ highTier ? "If these chunks are not loaded, they will be ignored" : "",
+ "Requires a turbine rotor and an Air Filter [T1/T2] to run.",
+ "The turbine rotor must be manually inserted/replaced",
+ "Can be configured with a soldering iron to change modes",
+ "Low Efficiency: Removes half pollution, Turbine takes 50% dmg",
+ "High Efficiency: Removes full pollution, Turbine takes 100% dmg",
+ "Turbine Rotor will not break in LE mode",
+ "Insert an equal tier Conveyor Module to enable automation");
+ if (!mPollutionEnabled) {
+ String[] B = new String[] { "===============================================",
+ "Pollution is disabled, scrubbers will now have a bonus use",
+ "They are now able to remove ALL lingering pollution as GT ignores it", "and it will linger forever!",
+ "===============================================", };
+ A = ArrayUtils.addAll(A, B);
+ }
+ return A;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mOptimalAirFlow", this.mOptimalAirFlow);
+ aNBT.setBoolean("mSaveRotor", mSaveRotor);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mOptimalAirFlow = aNBT.getInteger("mOptimalAirFlow");
+ this.mSaveRotor = aNBT.getBoolean("mSaveRotor");
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 2;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 256;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+
+ // Get Current Pollution Amount.
+ int mCurrentPollution = getCurrentChunkPollution();
+ boolean isIdle = true;
+
+ // Get Inventory Item
+ ItemStack stackRotor = this.mInventory[SLOT_ROTOR];
+ ItemStack stackFilter = this.mInventory[SLOT_FILTER];
+
+ // Power Drain
+ long drainEU = maxEUInput() * maxAmperesIn();
+ if (aBaseMetaTileEntity.isActive() && aBaseMetaTileEntity.getStoredEU() >= drainEU) {
+ if (aBaseMetaTileEntity.decreaseStoredEnergyUnits(drainEU, false)) {
+ isIdle = false;
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ } else if (!aBaseMetaTileEntity.isActive() && aBaseMetaTileEntity.getStoredEU() >= drainEU / 4) {
+ if (aBaseMetaTileEntity.decreaseStoredEnergyUnits((drainEU / 4), false)) {
+ isIdle = false;
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+
+ // Only try once/sec.
+ if (!isIdle && aTick % 20L == 0L) {
+
+ for (int i = 0; i < this.mInventory.length; i++) {
+ ItemStack aSlotContent = this.mInventory[i];
+ if (aSlotContent != null) {
+ Logger.INFO("Found " + aSlotContent.getDisplayName() + " in slot " + i);
+ }
+ }
+
+ for (int i = 0; i < this.mInventory.length; i++) {
+ if (hasRotor(this.mInventory[i])) {
+ Logger.INFO("Found Rotor in slot " + i);
+ break;
+ }
+ }
+ for (int i = 0; i < this.mInventory.length; i++) {
+ if (hasAirFilter(this.mInventory[i])) {
+ Logger.INFO("Found Filter in slot " + i);
+ break;
+ }
+ }
+
+ // Check if machine can work.
+ if ((aBaseMetaTileEntity.isAllowedToWork())) {
+ Logger.INFO("Can work.");
+
+ // Enable machine animation/graphic
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter) && this.mHasPollution) {
+ if (!this.getBaseMetaTileEntity()
+ .isActive()) {
+ Logger.INFO("Set Active.");
+ aBaseMetaTileEntity.setActive(true);
+ }
+ } else if (!this.mHasPollution || mCurrentPollution <= 0
+ || stackRotor == null
+ || stackFilter == null
+ || !hasRotor(stackRotor)
+ || !hasAirFilter(stackFilter)) {
+ if (!this.getBaseMetaTileEntity()
+ .isActive()) {
+ Logger.INFO("Set Inactive.");
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ }
+
+ // If Active.
+ if (aBaseMetaTileEntity.isActive()) {
+ Logger.INFO("Doing something.");
+
+ // Do nothing if there is no pollution.
+ if (this.mHasPollution && mCurrentPollution > 0) {
+ Logger
+ .INFO("Has Pollution? " + mHasPollution + ", Current Pollution: " + mCurrentPollution);
+
+ // Only check every 30s.
+ if (!isIdle && aTick % (20L * 30) == 0L) {
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ // Clear out pollution if it's disabled, because I am a nice gal.
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PollutionUtils.nullifyPollution(this.getBaseMetaTileEntity());
+ }
+ }
+
+ // Use a Turbine
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter)) {
+ Logger.INFO("Found Turbine.");
+
+ mBaseEff = getBaseEfficiency(stackRotor);
+ mOptimalAirFlow = getOptimalAirFlow(stackRotor);
+
+ // Make sure we have a valid Turbine and Eff/Airflow
+ if (this.mBaseEff > 0 && this.mOptimalAirFlow > 0) {
+ // Utils.LOG_WARNING("Pollution Cleaner [5]");
+
+ // Log Debug information.
+ Logger.INFO("mBaseEff[1]:" + mBaseEff);
+ Logger.INFO("mOptimalAirFlow[1]:" + mOptimalAirFlow);
+
+ // Calculate The Voltage we are running
+ long tVoltage = drainEU;
+ byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+
+ // Check Sides for Air,
+ // More air means more pollution processing.
+ int mAirSides = getFreeSpaces();
+
+ int reduction = 0;
+
+ // If no sides are free, how will you process the atmosphere?
+ if (mAirSides > 0) {
+ reduction += (((Math.max((tTier - 2), 1) * 2) * 50) * mAirSides); // Was
+ // originally
+ // *100
+ Logger.INFO("mPollutionReduction[1]:" + reduction);
+
+ // I stole this code
+ reduction = (MathUtils.safeInt((long) reduction * this.mBaseEff) / 100000)
+ * mAirSides
+ * Math.max((tTier - 2), 1);
+ Logger.INFO("reduction[2]:" + reduction);
+ reduction = MathUtils.safeInt(((long) reduction / 100) * this.mOptimalAirFlow);
+ Logger.INFO("reduction[3]:" + reduction);
+
+ mPollutionReduction = reduction;
+
+ // Set a temp to remove variable to aleviate duplicate code.
+ int toRemove = 0;
+
+ Logger.INFO("mCurrentPollution[4]:" + mCurrentPollution);
+ Logger.INFO("mCurrentPollution[5]:" + reduction);
+ if (reduction <= mCurrentPollution) {
+ // Clean some Air.
+ toRemove = reduction;
+ } else {
+ // Makes sure we don't get negative pollution.
+ toRemove = mCurrentPollution;
+ }
+
+ toRemove = toRemove / 2;
+ Logger.INFO("mCurrentPollution[6]:" + toRemove);
+
+ // We are good to clean
+ if (toRemove > 0) {
+ if (damageTurbineRotor() && damageAirFilter()) {
+ Logger.INFO("Removing " + toRemove + " pollution");
+ removePollution(mSaveRotor ? (toRemove / 2) : toRemove);
+ Logger.INFO("mNewPollution[4]:" + getCurrentChunkPollution());
+ } else {
+ Logger.INFO("Could not damage turbine rotor or Air Filter.");
+ aBaseMetaTileEntity.setActive(false);
+ }
+ } // End of pollution removal block.
+ } // End of valid air sides block.
+ } // End of valid toolstats block.
+ } // End of correct inventory item block.
+ else {
+ // Utils.LOG_WARNING("Wrong Tool metaitem Found.");
+ }
+ }
+ } else if (!aBaseMetaTileEntity.isActive()) {
+ return;
+ }
+ } // End of can work block.
+ else { // Disable Machine.
+ // aBaseMetaTileEntity.setActive(false);
+ }
+ } // End of 1/sec action block.
+ else {
+
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter)
+ && this.mHasPollution
+ && !isIdle
+ && aBaseMetaTileEntity.isAllowedToWork()) {
+ aBaseMetaTileEntity.setActive(true);
+ } else if (isIdle || !this.mHasPollution
+ || mCurrentPollution <= 0
+ || stackRotor == null
+ || stackFilter == null
+ || !hasRotor(stackRotor)
+ || !hasAirFilter(stackFilter)) {
+ aBaseMetaTileEntity.setActive(false);
+ }
+ }
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ if (MathUtils.randInt(0, 5) <= 2) {
+ this.sendSound((byte) -120);
+ }
+ }
+ } // End of is serverside block.
+ }
+
+ public int getCurrentChunkPollution() {
+ int mCurrentChunkPollution = 0;
+ if (this.mTier < 7) {
+ mCurrentChunkPollution = PollutionUtils.getPollution(getBaseMetaTileEntity());
+ } else {
+ AutoMap<Chunk> aSurrounding = new AutoMap<>();
+ World aWorld = this.getBaseMetaTileEntity()
+ .getWorld();
+ int xPos = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int zPos = this.getBaseMetaTileEntity()
+ .getZCoord();
+ Chunk a1 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos - 32);
+ Chunk a2 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos);
+ Chunk a3 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos + 32);
+ Chunk b1 = aWorld.getChunkFromBlockCoords(xPos, zPos - 32);
+ Chunk b2 = aWorld.getChunkFromBlockCoords(xPos, zPos);
+ Chunk b3 = aWorld.getChunkFromBlockCoords(xPos, zPos + 32);
+ Chunk c1 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos - 32);
+ Chunk c2 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos);
+ Chunk c3 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos + 32);
+ aSurrounding.put(a1);
+ aSurrounding.put(a2);
+ aSurrounding.put(a3);
+ aSurrounding.put(b1);
+ aSurrounding.put(b2);
+ aSurrounding.put(b3);
+ aSurrounding.put(c1);
+ aSurrounding.put(c2);
+ aSurrounding.put(c3);
+ for (Chunk r : aSurrounding) {
+ mCurrentChunkPollution += getPollutionInChunk(r);
+ }
+ }
+ if (mCurrentChunkPollution > 0) {
+ mHasPollution = true;
+ } else {
+ mHasPollution = false;
+ }
+ return mCurrentChunkPollution;
+ }
+
+ public int getPollutionInChunk(Chunk aChunk) {
+ int mCurrentChunkPollution = PollutionUtils.getPollution(aChunk);
+ if (mCurrentChunkPollution > 0) {
+ mHasPollution = true;
+ } else {
+ mHasPollution = false;
+ }
+ return mCurrentChunkPollution;
+ }
+
+ public boolean hasRotor(ItemStack rotorStack) {
+ if (rotorStack != null) {
+ if (rotorStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ // Logger.INFO("Found Basic Turbine Rotor.");
+ return true;
+ } else if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool && rotorStack.getItemDamage() >= 170
+ && rotorStack.getItemDamage() <= 179) {
+ // Logger.INFO("Found Turbine Rotor.");
+ return true;
+ } else {
+ // Logger.INFO("Found: "+rotorStack.getDisplayName()+":"+rotorStack.getItemDamage());
+ }
+ }
+ // Logger.INFO("Found No Turbine Rotor.");
+ return false;
+ }
+
+ public boolean damageTurbineRotor() {
+ try {
+
+ boolean creativeRotor = false;
+ ItemStack rotorStack = this.mInventory[SLOT_ROTOR];
+ if (rotorStack == null) {
+ return false;
+ } else if (rotorStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ long currentUse = ItemBasicScrubberTurbine.getFilterDamage(rotorStack);
+ // Remove broken Filter
+ if (rotorStack.getItemDamage() == 0 && currentUse >= 2000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T1");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (rotorStack.getItemDamage() == 1 && currentUse >= 4000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T2");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (rotorStack.getItemDamage() == 2 && currentUse >= 6000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T3");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else {
+ // Do Damage
+ Logger.INFO("Damaging ItemBasicScrubberTurbine");
+ ItemBasicScrubberTurbine.setFilterDamage(rotorStack, currentUse + 10);
+ Logger.INFO("Rotor Damage: " + currentUse);
+ return true;
+ }
+ } else if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool_01) {
+ Materials t1 = GT_MetaGenerated_Tool.getPrimaryMaterial(rotorStack);
+ Materials t2 = GT_MetaGenerated_Tool.getSecondaryMaterial(rotorStack);
+ if (t1 == Materials._NULL && t2 == Materials._NULL) {
+ Logger.INFO("Found creative rotor.");
+ creativeRotor = true;
+ }
+ } else {
+ Logger.INFO("Bad item in rotor slot.");
+ return false;
+ }
+
+ if (mInventory[SLOT_ROTOR].getItem() instanceof GT_MetaGenerated_Tool_01
+ && ((GT_MetaGenerated_Tool) mInventory[SLOT_ROTOR].getItem()).getToolStats(mInventory[SLOT_ROTOR])
+ .getSpeedMultiplier() > 0
+ && GT_MetaGenerated_Tool.getPrimaryMaterial(mInventory[SLOT_ROTOR]).mToolSpeed > 0) {
+
+ long damageValue = (long) Math
+ .floor(Math.abs(MathUtils.randFloat(1, 2) - MathUtils.randFloat(1, 3)) * (1 + 3 - 1) + 1);
+ double fDam = Math
+ .floor(Math.abs(MathUtils.randFloat(1f, 2f) - MathUtils.randFloat(1f, 2f)) * (1f + 2f - 1f) + 1f);
+ damageValue -= fDam;
+
+ // Logger.INFO("Trying to do "+damageValue+" damage to the rotor. ["+fDam+"]");
+ /*
+ * Materials M1 = GT_MetaGenerated_Tool.getPrimaryMaterial(this.mInventory[this.SLOT_ROTOR]); Materials
+ * M2 = GT_MetaGenerated_Tool.getSecondaryMaterial(this.mInventory[this.SLOT_ROTOR]);
+ * Logger.INFO("Trying to do "+damageValue+" damage to the rotor. [2]");
+ */
+
+ // Damage Rotor
+ // int rotorDurability = this.mInventory[this.SLOT_ROTOR].getItemDamage();
+ long rotorDamage = creativeRotor ? 0
+ : GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ long rotorDurabilityMax = creativeRotor ? Integer.MAX_VALUE
+ : GT_MetaGenerated_Tool.getToolMaxDamage(this.mInventory[this.SLOT_ROTOR]);
+ long rotorDurability = (rotorDurabilityMax - rotorDamage);
+ Logger.INFO(
+ "Rotor Damage: " + rotorDamage
+ + " | Max Durability: "
+ + rotorDurabilityMax
+ + " | "
+ + " Remaining Durability: "
+ + rotorDurability);
+ if (rotorDurability >= damageValue) {
+
+ if (!mSaveRotor) {
+ Logger.INFO("Damaging Rotor.");
+
+ if (!creativeRotor) GT_ModHandler
+ .damageOrDechargeItem(this.mInventory[this.SLOT_ROTOR], (int) damageValue, 0, null);
+
+ long tempDur = GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ if (tempDur < rotorDurabilityMax) {
+ return true;
+ } else {
+ rotorDurability = 0;
+ }
+ } else {
+ Logger.INFO("Damaging Rotor.");
+ if (rotorDurability > 1000) {
+ if (!creativeRotor) GT_ModHandler
+ .damageOrDechargeItem(this.mInventory[this.SLOT_ROTOR], (int) damageValue / 2, 0, null);
+ long tempDur = GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ if (tempDur < rotorDurabilityMax) {
+ return true;
+ } else {
+ rotorDurability = 0;
+ }
+ }
+ }
+ }
+
+ if (rotorDurability <= 0 && !mSaveRotor && !creativeRotor) {
+ Logger.INFO("Destroying Rotor.");
+ this.mInventory[this.SLOT_ROTOR] = null;
+ return false;
+ } else if (rotorDurability <= 0 && mSaveRotor) {
+ Logger.INFO("Saving Rotor.");
+ return false;
+ }
+
+ } else {
+ Logger.INFO("Bad Rotor.");
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return false;
+ }
+
+ public int getFreeSpaces() {
+ int mAir = 0;
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ if (aBaseMetaTileEntity.getAirOffset(1, 0, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(-1, 0, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 0, 1)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 0, -1)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 1, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, -1, 0)) {
+ mAir++;
+ }
+ return mAir;
+ }
+
+ public boolean removePollution(int toRemove) {
+
+ if (this == null || this.getBaseMetaTileEntity() == null
+ || this.getBaseMetaTileEntity()
+ .getWorld() == null) {
+ return false;
+ }
+
+ if (this.mTier < 7) {
+ int startPollution = getCurrentChunkPollution();
+ Logger.INFO("Current Chunk Pollution: " + startPollution);
+ PollutionUtils.removePollution(this.getBaseMetaTileEntity(), toRemove);
+ int after = getCurrentChunkPollution();
+ Logger.INFO("Current Chunk Pollution: " + after);
+ return (after < startPollution);
+ } else {
+ int chunksWithRemoval = 0;
+ int totalRemoved = 0;
+ AutoMap<Chunk> aSurrounding = new AutoMap<>();
+ Chunk aThisChunk = this.getBaseMetaTileEntity()
+ .getWorld()
+ .getChunkFromBlockCoords(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord());
+ int mainChunkX = aThisChunk.xPosition;
+ int mainChunkZ = aThisChunk.zPosition;
+
+ World aWorld = this.getBaseMetaTileEntity()
+ .getWorld();
+ int xPos = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int zPos = this.getBaseMetaTileEntity()
+ .getZCoord();
+
+ Chunk a1 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos - 32);
+ Chunk a2 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos);
+ Chunk a3 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos + 32);
+ Chunk b1 = aWorld.getChunkFromBlockCoords(xPos, zPos - 32);
+ Chunk b2 = aWorld.getChunkFromBlockCoords(xPos, zPos);
+ Chunk b3 = aWorld.getChunkFromBlockCoords(xPos, zPos + 32);
+ Chunk c1 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos - 32);
+ Chunk c2 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos);
+ Chunk c3 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos + 32);
+
+ aSurrounding.put(a1);
+ aSurrounding.put(a2);
+ aSurrounding.put(a3);
+ aSurrounding.put(b1);
+ aSurrounding.put(b2);
+ aSurrounding.put(b3);
+ aSurrounding.put(c1);
+ aSurrounding.put(c2);
+ aSurrounding.put(c3);
+
+ for (Chunk r : aSurrounding) {
+ if (!r.isChunkLoaded) {
+ continue;
+ }
+
+ int startPollution = getPollutionInChunk(r);
+ if (startPollution == 0) {
+ continue;
+ }
+
+ Logger.INFO(
+ "Trying to remove pollution from chunk " + r.xPosition
+ + ", "
+ + r.zPosition
+ + " | "
+ + startPollution);
+ int after = 0;
+ boolean isMainChunk = r.isAtLocation(mainChunkX, mainChunkZ);
+
+ int removal = Math.max(0, !isMainChunk ? (toRemove / 4) : toRemove);
+ if (removePollution(r, removal)) {
+ chunksWithRemoval++;
+ after = getPollutionInChunk(r);
+ } else {
+ after = 0;
+ }
+ if (startPollution - after > 0) {
+ totalRemoved += (startPollution - after);
+ }
+ Logger.INFO(
+ "Removed " + (startPollution - after)
+ + " pollution from chunk "
+ + r.xPosition
+ + ", "
+ + r.zPosition
+ + " | "
+ + after);
+ }
+ return totalRemoved > 0 && chunksWithRemoval > 0;
+ }
+ }
+
+ public boolean removePollution(Chunk aChunk, int toRemove) {
+ int before = getCurrentChunkPollution();
+ PollutionUtils.removePollution(aChunk, toRemove);
+ int after = getCurrentChunkPollution();
+ return (after < before);
+ }
+
+ public boolean hasAirFilter(ItemStack filter) {
+ if (filter == null) {
+ return false;
+ }
+ return filter.getItem() instanceof ItemAirFilter;
+ }
+
+ public boolean damageAirFilter() {
+ ItemStack filter = this.mInventory[this.SLOT_FILTER];
+ if (filter == null) {
+ return false;
+ }
+
+ boolean creativeRotor = false;
+ ItemStack rotorStack = this.mInventory[SLOT_ROTOR];
+ if (rotorStack != null) {
+ if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool_01) {
+ Materials t1 = GT_MetaGenerated_Tool.getPrimaryMaterial(rotorStack);
+ Materials t2 = GT_MetaGenerated_Tool.getSecondaryMaterial(rotorStack);
+ if (t1 == Materials._NULL && t2 == Materials._NULL) {
+ creativeRotor = true;
+ }
+ }
+ }
+
+ if (creativeRotor) {
+ return true;
+ }
+
+ if (filter.getItem() instanceof ItemAirFilter) {
+
+ long currentUse = ItemAirFilter.getFilterDamage(filter);
+
+ // Remove broken Filter
+ if (filter.getItemDamage() == 0 && currentUse >= 50 - 1) {
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (filter.getItemDamage() == 1 && currentUse >= 2500 - 1) {
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else {
+ // Do Damage
+ ItemAirFilter.setFilterDamage(filter, currentUse + 1);
+ Logger.INFO("Filter Damage: " + currentUse);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == SLOT_FILTER) {
+ if (aStack.getItem() instanceof ItemAirFilter) {
+ Logger.INFO("Inserting Air Filter into " + aIndex);
+ return true;
+ }
+ }
+ if (aIndex == SLOT_ROTOR) {
+ if (this.mInventory[7] != null) {
+ Logger.INFO("Found conveyor, can automate turbines. Inserting into " + aIndex);
+ if (aStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ return true;
+ }
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool && aStack.getItemDamage() >= 170
+ && aStack.getItemDamage() <= 179) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == -120) {
+ GT_Utility
+ .doSoundAtClient(SoundResource.IC2_TOOLS_BATTERY_USE, MathUtils.randInt(5, 50), 0.05F, aX, aY, aZ);
+ } else {
+ super.doSound((byte) 0, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ AutoMap<String> aTooltipSuper = new AutoMap<>();
+ for (String s : super.getInfoData()) {
+ aTooltipSuper.put(s);
+ }
+ int mAirSides = getFreeSpaces();
+ int reduction = 0;
+
+ try {
+ long tVoltage = maxEUInput();
+ byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+ reduction += (((Math.max((tTier - 2), 1) * 2) * 50) * mAirSides);
+ reduction = (MathUtils.safeInt((long) reduction * this.mBaseEff) / 100000) * mAirSides
+ * Math.max((tTier - 2), 1);
+ reduction = MathUtils.safeInt(((long) reduction / 100) * this.mOptimalAirFlow);
+
+ aTooltipSuper.put("Maximum pollution removed per second: " + reduction);
+ } catch (Throwable t) {
+ aTooltipSuper.put("Maximum pollution removed per second: " + mPollutionReduction);
+ }
+ aTooltipSuper.put("Air Sides: " + mAirSides);
+
+ String[] mBuiltOutput = new String[aTooltipSuper.size()];
+ int aIndex = 0;
+ for (String i : aTooltipSuper) {
+ mBuiltOutput[aIndex++] = i;
+ }
+
+ return mBuiltOutput;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ if (side.offsetY != 0) {
+ return false;
+ }
+ return super.allowCoverOnSide(side, aCoverID);
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return super.getTopFacingInactive(aColor);
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setInteger("mOptimalAirFlow", this.mOptimalAirFlow);
+ aNBT.setBoolean("mSaveRotor", mSaveRotor);
+ super.setItemNBT(aNBT);
+ }
+
+ private static ItemStack[] sGregTurbines;
+
+ public static ItemStack getTieredTurbine(int aTier) {
+ if (sGregTurbines == null) {
+ sGregTurbines = new ItemStack[3];
+ sGregTurbines[0] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Iron, Materials.Iron, null);
+ sGregTurbines[1] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Bronze, Materials.Bronze, null);
+ sGregTurbines[2] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Steel, Materials.Steel, null);
+ } else {
+ return sGregTurbines[aTier];
+ }
+
+ return null;
+ }
+
+ public int getBaseEfficiency(ItemStack aStackRotor) {
+ if (aStackRotor.getItem() instanceof ItemBasicScrubberTurbine) {
+ return getBaseEfficiency(getTieredTurbine(aStackRotor.getItemDamage()));
+ }
+ return (int) ((50.0F
+ + (10.0F * ((GT_MetaGenerated_Tool) aStackRotor.getItem()).getToolCombatDamage(aStackRotor))) * 100);
+ }
+
+ public int getOptimalAirFlow(ItemStack aStackRotor) {
+ if (aStackRotor.getItem() instanceof ItemBasicScrubberTurbine) {
+ return getOptimalAirFlow(getTieredTurbine(aStackRotor.getItemDamage()));
+ }
+ return (int) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStackRotor.getItem()).getToolStats(aStackRotor)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStackRotor).mToolSpeed * 50);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(new SlotWidget(inventoryHandler, SLOT_ROTOR).setFilter(stack -> {
+ if (stack.getItem() instanceof ItemBasicScrubberTurbine) {
+ return true;
+ }
+ return stack.getItem() instanceof GT_MetaGenerated_Tool && stack.getItemDamage() >= 170
+ && stack.getItemDamage() <= 179;
+ })
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_TURBINE)
+ .setPos(52, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, SLOT_FILTER)
+ .setFilter(stack -> stack.getItem() instanceof ItemAirFilter)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_RECYCLE)
+ .setPos(106, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, 7)
+ .setFilter(stack -> GT_Utility.areStacksEqual(stack, CI.getConveyor(mTier, 1), true))
+ .setPos(124, 62));
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION)
+ .dynamicTooltip(() -> Collections.singletonList("Reduction: " + mPollutionReduction + "/s"))
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(() -> mPollutionReduction, val -> mPollutionReduction = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .setPos(163, 5)
+ .setSize(7, 18));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java
new file mode 100644
index 0000000000..d7b6b8fffd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java
@@ -0,0 +1,458 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaPollutionCreator extends GregtechMetaTileEntity {
+
+ int mCurrentPollution;
+ int mAveragePollution;
+ int mAveragePollutionArray[] = new int[10];
+ private int mArrayPos = 0;
+ private int mTickTimer = 0;
+ private int mSecondTimer = 0;
+
+ public GregtechMetaPollutionCreator(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaPollutionCreator(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "A useful debug machine to create pollution.", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (pollutionMultiplier > 99) {
+ pollutionMultiplier = 1;
+ } else {
+ pollutionMultiplier++;
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Pollution Mutliplier is now " + pollutionMultiplier + ".");
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPollutionCreator(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ this.showPollution(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ public int pollutionMultiplier = 1;
+
+ private void showPollution(final World worldIn, final EntityPlayer playerIn) {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PlayerUtils.messagePlayer(playerIn, "This block is useless, Pollution is disabled.");
+ } else {
+ addPollution();
+ PlayerUtils
+ .messagePlayer(playerIn, "This chunk now contains " + getCurrentChunkPollution() + " pollution.");
+ // PlayerUtils.messagePlayer(playerIn, "Average over last ten minutes: "+getAveragePollutionOverLastTen()+"
+ // pollution.");
+ }
+ }
+
+ private boolean addPollution() {
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), 100000 * pollutionMultiplier);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public int getCurrentChunkPollution() {
+ return getCurrentChunkPollution(this.getBaseMetaTileEntity());
+ }
+
+ public int getCurrentChunkPollution(IGregTechTileEntity aBaseMetaTileEntity) {
+ return PollutionUtils.getPollution(aBaseMetaTileEntity);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Current Pollution: " + this.mCurrentPollution,
+ "Average/10 minutes:" + getAveragePollutionOverLastTen() };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mCurrentPollution", this.mCurrentPollution);
+ aNBT.setInteger("mAveragePollution", this.mAveragePollution);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mCurrentPollution = aNBT.getInteger("mCurrentPollution");
+ this.mAveragePollution = aNBT.getInteger("mAveragePollution");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ if (this.mCurrentPollution == 0) {
+ this.mCurrentPollution = getCurrentChunkPollution();
+ }
+ if (this.mArrayPos < 0 || this.mArrayPos > 9) {
+ this.mArrayPos = 0;
+ }
+ this.mTickTimer = 0;
+ }
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // TickTimer - 20 times a second
+ this.mTickTimer++;
+ if (mTickTimer % 20 == 0) {
+ this.mCurrentPollution = getCurrentChunkPollution();
+ }
+ }
+ }
+
+ public int getAveragePollutionOverLastTen() {
+ int counter = 0;
+ int total = 0;
+
+ for (int j : this.mAveragePollutionArray) {
+ if (j != 0) {
+ total += j;
+ counter++;
+ }
+ }
+ int returnValue = 0;
+ if (total > 0 && counter > 0) {
+ returnValue = (total / counter);
+ this.mAveragePollution = returnValue;
+ } else {
+ returnValue = getCurrentChunkPollution();
+ }
+ // Logger.INFO("| DEBUG: "+returnValue +" | ArrayPos:"+this.mArrayPos+" | Counter:"+counter+" | Total:"+total+"
+ // |");
+ return returnValue;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java
new file mode 100644
index 0000000000..92443d2658
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java
@@ -0,0 +1,502 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaPollutionDetector extends GregtechMetaTileEntity {
+
+ int mCurrentPollution;
+ int mAveragePollution;
+ int mAveragePollutionArray[] = new int[10];
+ private int mArrayPos = 0;
+ private int mTickTimer = 0;
+ private int mSecondTimer = 0;
+ private long mRedstoneLevel = 0;
+
+ public GregtechMetaPollutionDetector(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaPollutionDetector(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Right click to check pollution levels.",
+ "Configure with screwdriver to set redstone output amount.", "Does not use power.", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ /*
+ * @Override public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final byte aSide, final
+ * byte aFacing, final int aColorIndex, final boolean aActive, final boolean aRedstone) { return
+ * this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0 : side == facing.getOpposite() ? 1 : side ==
+ * ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1]; }
+ */
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPollutionDetector(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ this.showPollution(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ private void showPollution(final World worldIn, final EntityPlayer playerIn) {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PlayerUtils.messagePlayer(playerIn, "This block is useless, Pollution is disabled.");
+ } else {
+ PlayerUtils.messagePlayer(playerIn, "This chunk contains " + getCurrentChunkPollution() + " pollution.");
+ PlayerUtils.messagePlayer(playerIn, "Emit Redstone at pollution level: " + this.mRedstoneLevel);
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public int getCurrentChunkPollution() {
+ return getCurrentChunkPollution(this.getBaseMetaTileEntity());
+ }
+
+ public int getCurrentChunkPollution(IGregTechTileEntity aBaseMetaTileEntity) {
+ return PollutionUtils.getPollution(aBaseMetaTileEntity);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Current Pollution: " + this.mCurrentPollution,
+ "Average/10 Sec: " + this.mAveragePollution, "Emit Redstone at pollution level: " + this.mRedstoneLevel };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mCurrentPollution", this.mCurrentPollution);
+ aNBT.setInteger("mAveragePollution", this.mAveragePollution);
+ aNBT.setLong("mRedstoneLevel", this.mRedstoneLevel);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mCurrentPollution = aNBT.getInteger("mCurrentPollution");
+ this.mAveragePollution = aNBT.getInteger("mAveragePollution");
+ this.mRedstoneLevel = aNBT.getLong("mRedstoneLevel");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ // Only Calc server-side
+ if (!this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ return;
+ }
+ // Emit Redstone
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ this.getBaseMetaTileEntity()
+ .setStrongOutputRedstoneSignal(side, (byte) 16);
+ }
+ this.markDirty();
+ } else {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ this.getBaseMetaTileEntity()
+ .setStrongOutputRedstoneSignal(side, (byte) 0);
+ }
+ this.markDirty();
+ }
+
+ // Do Math for stats
+ if (this.mTickTimer % 20 == 0) {
+ mCurrentPollution = this.getCurrentChunkPollution();
+ if (mArrayPos > mAveragePollutionArray.length - 1) {
+ mArrayPos = 0;
+ }
+ mAveragePollutionArray[mArrayPos] = mCurrentPollution;
+ mAveragePollution = getAveragePollutionOverLastTen();
+ mArrayPos++;
+ }
+ this.mTickTimer++;
+ }
+
+ public int getAveragePollutionOverLastTen() {
+ return MathUtils.getIntAverage(mAveragePollutionArray);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> this.mRedstoneLevel -= 5000;
+ case 1 -> this.mRedstoneLevel += 5000;
+ case 2 -> this.mRedstoneLevel -= 50000;
+ case 3 -> this.mRedstoneLevel += 50000;
+ }
+ this.markDirty();
+ GT_Utility.sendChatToPlayer(aPlayer, "Emit Redstone at Pollution Level: " + this.mRedstoneLevel);
+ }
+
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ this.markDirty();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ super.onMachineBlockUpdate();
+ }
+
+ @Override
+ public boolean hasSidedRedstoneOutputBehavior() {
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ this.markDirty();
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java
new file mode 100644
index 0000000000..751771f2b4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java
@@ -0,0 +1,190 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import team.chisel.carving.Carving;
+
+public class GregtechMetaTileEntity_AutoChisel extends GT_MetaTileEntity_BasicMachine {
+
+ private ItemStack mInputCache;
+ private ItemStack mOutputCache;
+
+ public GregtechMetaTileEntity_AutoChisel(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ "Chisels things, Gregtech style",
+ 1,
+ 1,
+ new ITexture[] { new GT_RenderedTexture(BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_SIDE_MASSFAB),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_FRONT_MULTI_SMELTER),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab_Active),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_BOTTOM_MASSFAB) });
+ }
+
+ public GregtechMetaTileEntity_AutoChisel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_AutoChisel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "What you want to chisel goes in slot 1",
+ "What you want to get goes in the special slot (bottom right)",
+ "If special slot is empty, first chisel result is used");
+ }
+
+ private boolean hasValidCache(ItemStack aStack, ItemStack aSpecialSlot, boolean aClearOnFailure) {
+ if (mInputCache != null && mOutputCache != null) {
+ if (GT_Utility.areStacksEqual(aStack, mInputCache)
+ && GT_Utility.areStacksEqual(aSpecialSlot, mOutputCache)) {
+ return true;
+ }
+ }
+ // clear cache if it was invalid
+ if (aClearOnFailure) {
+ mInputCache = null;
+ mOutputCache = null;
+ }
+ return false;
+ }
+
+ private void cacheItem(ItemStack mInputItem, ItemStack mOutputItem) {
+ mOutputCache = mOutputItem.copy();
+ mInputCache = mInputItem.copy();
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return hasValidCache(aStack, this.getSpecialSlot(), false) ? true
+ : super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) && hasChiselResults(aStack);
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean canBeMadeFrom(ItemStack from, ItemStack to) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ for (ItemStack s : results) {
+ if (s.getItem() == to.getItem() && s.getItemDamage() == to.getItemDamage()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean hasChiselResults(ItemStack from) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ return results.size() > 0;
+ }
+
+ private static List<ItemStack> getItemsForChiseling(ItemStack aStack) {
+ return Carving.chisel.getItemsForChiseling(aStack);
+ }
+
+ private static ItemStack getChiselOutput(ItemStack aInput, ItemStack aTarget) {
+ ItemStack tOutput = null;
+ if (aTarget != null && canBeMadeFrom(aInput, aTarget)) {
+ tOutput = aTarget;
+ } else if (aTarget != null && !canBeMadeFrom(aInput, aTarget)) {
+ tOutput = null;
+ } else {
+ tOutput = getItemsForChiseling(aInput).get(0);
+ }
+ return tOutput;
+ }
+
+ @Override
+ public int checkRecipe() {
+ ItemStack tOutput = null;
+ ItemStack aInput = getInputAt(0);
+ ItemStack aTarget = getSpecialSlot();
+ boolean tIsCached = hasValidCache(aInput, aTarget, true);
+ if (aInput != null && hasChiselResults(aInput) && aInput.stackSize > 0) {
+ tOutput = tIsCached ? mOutputCache.copy() : getChiselOutput(aInput, aTarget);
+ if (tOutput != null) {
+ tOutput = tOutput.copy();
+ tOutput.stackSize = 1;
+ // We can chisel this
+ if (canOutput(tOutput)) {
+ getInputAt(0).stackSize -= 1;
+ calculateOverclockedNess(16, 20);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) {
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ if (!tIsCached) {
+ cacheItem(ItemUtils.getSimpleStack(aInput, 1), ItemUtils.getSimpleStack(tOutput, 1));
+ }
+ this.mOutputItems[0] = tOutput.copy();
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ } else {
+ mOutputBlocked++;
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ private static final FallbackableUITexture progressBarTexture = GT_UITextures
+ .fallbackableProgressbar("auto_chisel", GT_UITextures.PROGRESSBAR_COMPRESS);
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return super.getUIProperties().toBuilder()
+ .progressBarTexture(progressBarTexture)
+ .build();
+ }
+
+ @Override
+ protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) super.createItemInputSlot(index, backgrounds, pos)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_COMPRESSOR);
+ }
+
+ @Override
+ protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos, BasicUIProperties uiProperties) {
+ return (SlotWidget) super.createSpecialSlot(backgrounds, pos, uiProperties)
+ .setGTTooltip(() -> mTooltipCache.getData("GTPP.machines.chisel_slot.tooltip"));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java
new file mode 100644
index 0000000000..b1289958a9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java
@@ -0,0 +1,672 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+
+public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity {
+
+ private int mCurrentDimension = 0;
+ public int mMode = 0;
+ public boolean mLocked = true;
+
+ public GregtechMetaWirelessCharger(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaWirelessCharger(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Can be locked to the owner by sneaking with a screwdriver",
+ "Can also be locked with a lock upgrade", "", "3 Modes, Long-Range, Local and Mixed.",
+ "Long-Range: Can supply 2A of power to a single player up to " + (GT_Values.V[this.mTier] * 4) + "m away.",
+ "Local: Can supply several Amps to each player within " + this.mTier * 20 + "m.",
+ "Mixed: Provides both 2A of long range and 1A per player locally.",
+ "Mixed mode is more conservative of power and as a result only",
+ "Gets half the distances each singular mode gets.", CORE.GT_Tooltip.get() };
+ }
+
+ public int getTier() {
+ return this.mTier;
+ }
+
+ public int getMode() {
+ return this.mMode;
+ }
+
+ public int getDimensionID() {
+ return this.mCurrentDimension;
+ }
+
+ public Map<String, UUID> getLocalMap() {
+ return this.mLocalChargingMap;
+ }
+
+ public Map<String, UUID> getLongRangeMap() {
+ return this.mWirelessChargingMap;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+
+ if (aPlayer.isSneaking()) {
+ mLocked = !mLocked;
+ PlayerUtils.messagePlayer(aPlayer, mLocked ? "Locked to owner." : "Unlocked.");
+ return;
+ }
+
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ if (!this.getBaseMetaTileEntity()
+ .getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : this.getBaseMetaTileEntity()
+ .getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+
+ if (this.mMode >= 2) {
+ this.mMode = 0;
+ } else {
+ this.mMode++;
+ }
+ if (this.mMode == 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Long-Range Charge Mode.");
+ } else if (this.mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Local Charge Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Mixed Charge Mode.");
+ }
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaWirelessCharger(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return GT_Values.V[this.mTier] * 128;
+ }
+
+ @Override
+ public int getCapacity() {
+ return (int) (GT_Values.V[this.mTier] * 32);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ if (this.mMode == 0) {
+ return 2;
+ } else if (this.mMode == 1) {
+ return this.mLocalChargingMap.size() * 8;
+ } else {
+ return ((this.mLocalChargingMap.size() * 4) + this.mWirelessChargingMap.size());
+ }
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName() };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setBoolean("mLocked", this.mLocked);
+ aNBT.setInteger("mMode", this.mMode);
+ aNBT.setInteger("mCurrentDimension", this.mCurrentDimension);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mLocked = aNBT.getBoolean("mLocked");
+ this.mMode = aNBT.getInteger("mMode");
+ this.mCurrentDimension = aNBT.getInteger("mCurrentDimension");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ }
+
+ private Map<String, UUID> mWirelessChargingMap = new HashMap<>();
+ private Map<String, UUID> mLocalChargingMap = new HashMap<>();
+
+ private boolean isValidPlayer(EntityPlayer aPlayer) {
+ BaseMetaTileEntity aTile = (BaseMetaTileEntity) this.getBaseMetaTileEntity();
+ if (mLocked || (aTile != null && aTile.privateAccess())) {
+ if (aPlayer.getUniqueID()
+ .equals(getBaseMetaTileEntity().getOwnerUuid())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+
+ if (this.mCurrentDimension != aBaseMetaTileEntity.getWorld().provider.dimensionId) {
+ this.mCurrentDimension = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ }
+
+ if (aTick % 20 == 0) {
+ boolean mHasBeenMapped = this.equals(ChargingHelper.getEntry(getTileEntityPosition()));
+ if (!mHasBeenMapped) {
+ mHasBeenMapped = ChargingHelper.addEntry(getTileEntityPosition(), this);
+ }
+
+ if (mHasBeenMapped && !aBaseMetaTileEntity.getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : aBaseMetaTileEntity.getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+
+ if (this.mMode == 1 || this.mMode == 2) {
+ int tempRange = (this.mMode == 1 ? this.mTier * 20 : this.mTier * 10);
+ if (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp))
+ < tempRange) {
+ if (isValidPlayer(mTemp)
+ && !mLocalChargingMap.containsKey(mTemp.getDisplayName())) {
+ mLocalChargingMap.put(mTemp.getDisplayName(), mTemp.getPersistentID());
+ ChargingHelper.addValidPlayer(mTemp, this);
+ // PlayerUtils.messagePlayer(mTemp, "You have entered charging range.
+ // ["+tempRange+"m - Local].");
+ }
+ } else {
+ if (mLocalChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (mLocalChargingMap.remove(mTemp.getDisplayName()) != null) {
+ // PlayerUtils.messagePlayer(mTemp, "You have left charging range.
+ // ["+tempRange+"m - Local].");
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+ }
+ if (this.mMode == 0 || this.mMode == 2) {
+ int tempRange = (int) (this.mMode == 0 ? 4 * GT_Values.V[this.mTier]
+ : 2 * GT_Values.V[this.mTier]);
+ if (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp))
+ <= tempRange) {
+ if (!mWirelessChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (isValidPlayer(mTemp)) {
+ mWirelessChargingMap.put(mTemp.getDisplayName(), mTemp.getPersistentID());
+ ChargingHelper.addValidPlayer(mTemp, this);
+ PlayerUtils.messagePlayer(
+ mTemp,
+ "You have entered charging range. [" + tempRange + "m - Long-Range].");
+ }
+ }
+ } else {
+ if (mWirelessChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (mWirelessChargingMap.remove(mTemp.getDisplayName()) != null) {
+ PlayerUtils.messagePlayer(
+ mTemp,
+ "You have left charging range. [" + tempRange + "m - Long Range].");
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+ }
+ /*
+ * if (this.mMode == 0 || this.mMode == 2){ int tempRange = (int) (this.mMode == 0 ?
+ * 4*GT_Values.V[this.mTier] : 2*GT_Values.V[this.mTier]); if
+ * (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp)) <
+ * tempRange){ if (!mWirelessChargingMap.containsKey(mTemp)){
+ * mWirelessChargingMap.put(mTemp, mTemp.getPersistentID());
+ * PlayerUtils.messagePlayer(mTemp, "You have entered charging range. ["+tempRange+"m].");
+ * ChargingHelper.addValidPlayer(mTemp, this); } } else { if
+ * (mWirelessChargingMap.containsKey(mTemp)){ if (mWirelessChargingMap.remove(mTemp) !=
+ * null){ PlayerUtils.messagePlayer(mTemp,
+ * "You have left charging range. ["+tempRange+"m].");
+ * ChargingHelper.removeValidPlayer(mTemp, this); } } } }
+ */
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public BlockPos getTileEntityPosition() {
+ return new BlockPos(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord(),
+ this.getBaseMetaTileEntity()
+ .getWorld());
+ }
+
+ public BlockPos getPositionOfEntity(Entity mEntity) {
+ if (mEntity == null) {
+ return null;
+ }
+ return EntityUtils.findBlockPosUnderEntity(mEntity);
+ }
+
+ public double getDistanceBetweenTwoPositions(BlockPos objectA, BlockPos objectB) {
+ if (objectA == null || objectB == null) {
+ return 0f;
+ }
+ int[] objectArray1 = new int[] { objectA.xPos, objectA.yPos, objectA.zPos };
+ int[] objectArray2 = new int[] { objectB.xPos, objectB.yPos, objectB.zPos };
+
+ final double distance = Math.sqrt(
+ (objectArray2[0] - objectArray1[0]) * (objectArray2[0] - objectArray1[0])
+ + (objectArray2[1] - objectArray1[1]) * (objectArray2[1] - objectArray1[1])
+ + (objectArray2[2] - objectArray1[2]) * (objectArray2[2] - objectArray1[2]));
+ return distance;
+ }
+
+ @Override
+ public void onRemoval() {
+
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ if (!this.getBaseMetaTileEntity()
+ .getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : this.getBaseMetaTileEntity()
+ .getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+
+ super.onRemoval();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+
+ int tempRange;
+
+ if (this.mMode == 0 || this.mMode == 2) {
+ tempRange = (int) (this.mMode == 0 ? 4 * GT_Values.V[this.mTier] : 2 * GT_Values.V[this.mTier]);
+ } else {
+ tempRange = this.mMode == 1 ? this.mTier * 20 : this.mTier * 10;
+ }
+
+ if (this.mMode == 2) {
+ PlayerUtils
+ .messagePlayer(aPlayer, "Mixed Mode | Local: " + this.mTier * 10 + "m | Long: " + tempRange + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLocalMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "Local: " + name);
+ }
+ for (String name : this.getLongRangeMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "Long: " + name);
+ }
+ } else if (this.mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Local Mode: " + this.mTier * 20 + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLocalMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "" + name);
+ }
+
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Long-range Mode: " + tempRange + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLongRangeMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "" + name);
+ }
+ }
+
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onServerStart() {
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ super.onServerStart();
+ }
+
+ @Override
+ public void onExplosion() {
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+ super.onExplosion();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+ super.doExplosion(aExplosionPower);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java
new file mode 100644
index 0000000000..0e71c3b9b1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java
@@ -0,0 +1,168 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.misc;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GMTE_AmazonPackager extends GregtechMeta_MultiBlockBase<GMTE_AmazonPackager>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+
+ private static IStructureDefinition<GMTE_AmazonPackager> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GMTE_AmazonPackager(mName);
+ }
+
+ public GMTE_AmazonPackager(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GMTE_AmazonPackager(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Packager";
+ }
+
+ @Override
+ public IStructureDefinition<GMTE_AmazonPackager> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GMTE_AmazonPackager>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GMTE_AmazonPackager.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.getIndexFromPage(2, 9))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 9))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Amazon Warehouse")
+ .addInfo("This Multiblock is used for EXTREME packaging requirements")
+ .addInfo("Dust Schematics are inserted into the input busses")
+ .addInfo("If inserted into the controller, it is shared across all busses")
+ .addInfo("1x, 2x, 3x & Other Schematics are to be placed into the controller GUI slot")
+ .addInfo("500% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes 16 items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Supply Depot Casings", 10, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher("GT++");
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(2, 9);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.packagerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 6F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack p0) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack arg0) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiPackager;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (16 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java
new file mode 100644
index 0000000000..e5d138dfda
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java
@@ -0,0 +1,223 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_IndustrialAlloySmelter extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialAlloySmelter> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ private HeatingCoilLevel mHeatingCapacity;
+ private int mLevel = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialAlloySmelter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialAlloySmelter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 1);
+ }
+
+ public GregtechMetaTileEntity_IndustrialAlloySmelter(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 1);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialAlloySmelter(this.mName);
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.alloySmelterRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialAlloySmelter;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Alloy Smelter";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Alloy Smelter")
+ .addInfo("Gains one parallel per voltage tier")
+ .addInfo("Gains one multiplier per coil tier")
+ .addInfo("Parallel = Tier * Coil Tier")
+ .addInfo("Gains 5% speed bonus per coil tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, true)
+ .addController("Bottom center")
+ .addCasingInfoMin("Inconel Reinforced Casings", 8, false)
+ .addOtherStructurePart("Integral Encasement V", "Middle Layer")
+ .addOtherStructurePart("Heating Coils", "Above and below Integral Encasements")
+ .addInputBus("Any Inconel Reinforced Casing", 1)
+ .addOutputBus("Any Inconel Reinforced Casing", 1)
+ .addEnergyHatch("Any Inconel Reinforced Casing", 1)
+ .addMaintenanceHatch("Any Inconel Reinforced Casing", 1)
+ .addMufflerHatch("Any Inconel Reinforced Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialAlloySmelter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialAlloySmelter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "VVV", "V-V", "VVV" },
+ { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialAlloySmelter.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 1))))
+ .addElement(
+ 'H',
+ ofCoil(
+ GregtechMetaTileEntity_IndustrialAlloySmelter::setCoilLevel,
+ GregtechMetaTileEntity_IndustrialAlloySmelter::getCoilLevel))
+ .addElement('V', ofBlock(ModBlocks.blockCasingsTieredGTPP, 4))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mLevel = 0;
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 4, 0) && mCasing >= 8
+ && getCoilLevel() != HeatingCoilLevel.None
+ && (mLevel = getCoilLevel().getTier() + 1) > 0
+ && checkHatch();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (this.mLevel * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setSpeedBoost(100F / (100F + 5F * mLevel))
+ .setHeatOC(true)
+ .setRecipeHeat(0)
+ // Need to multiply by 2 because heat OC is done only once every 1800 and this one does it once
+ // every
+ // 900
+ .setMachineHeat((int) (getCoilLevel().getHeat() * 2));
+ }
+ }.setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java
new file mode 100644
index 0000000000..c27422fb93
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java
@@ -0,0 +1,337 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialArcFurnace
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialArcFurnace> implements ISurvivalConstructable {
+
+ // 862
+ private static final int mCasingTextureID = TAE.getIndexFromPage(3, 3);
+ public static String mCasingName = "Tempered Arc Furnace Casing";
+ private boolean mPlasmaMode = false;
+ private int mSize = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialArcFurnace> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialArcFurnace(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialArcFurnace(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialArcFurnace(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "(Plasma/Electric) Arc Furnace";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for Industrial Arc Furnace")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes 8 items per voltage tier * W/L")
+ .addInfo("Right-click controller with a Screwdriver to change modes")
+ .addInfo("Max Size required to process Plasma recipes")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addController("Top center")
+ .addStructureInfo("Size: nxnx3 [WxHxL] (Hollow)")
+ .addStructureInfo("n can be 3, 5 or 7")
+ .addCasingInfoMin(mCasingName, 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ /**
+ * The front part of multi. Used to determine the tier, or in other words, determine the size of multi.
+ */
+ private static final String STRUCTURE_PIECE_FRONT = "front";
+ /**
+ * The rest part of multi.
+ */
+ private static final String STRUCTURE_PIECE_REST = "rest";
+ private static final int MAX_TIER = 3;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialArcFurnace> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialArcFurnace>builder()
+ .addShape(STRUCTURE_PIECE_FRONT + 1, new String[][] { { "CCC", "C~C", "CCC" } })
+ .addShape(STRUCTURE_PIECE_FRONT + 2, new String[][] { { "CCCCC", "C C", "C C", "C C", "CCCCC" } })
+ .addShape(
+ STRUCTURE_PIECE_FRONT + 3,
+ new String[][] { { "CCCCCCC", "C C", "C C", "C C", "C C", "C C", "CCCCCCC" }, })
+ .addShape(STRUCTURE_PIECE_REST + 1, new String[][] { { "CCC", "C-C", "CCC" }, { "CCC", "CCC", "CCC" } })
+ .addShape(
+ STRUCTURE_PIECE_REST + 2,
+ new String[][] { { "CCCCC", "C---C", "C---C", "C---C", "CCCCC" },
+ { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" } })
+ .addShape(
+ STRUCTURE_PIECE_REST + 3,
+ new String[][] { { "CCCCCCC", "C-----C", "C-----C", "C-----C", "C-----C", "C-----C", "CCCCCCC" },
+ { "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC" }, })
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialArcFurnace.class)
+ .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .allowOnly(ForgeDirection.NORTH)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings4Misc, 3))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private int getTierFromHint(ItemStack stackSize) {
+ if (stackSize.stackSize <= 0 || stackSize.stackSize >= MAX_TIER) {
+ return MAX_TIER;
+ }
+ return stackSize.stackSize;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ int maxTier = getTierFromHint(stackSize);
+ for (int tier = 1; tier <= maxTier; tier++) {
+ buildPiece(STRUCTURE_PIECE_FRONT + tier, stackSize, hintsOnly, tier, tier, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_REST + maxTier, stackSize, hintsOnly, maxTier, maxTier, -1);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int maxTier = getTierFromHint(stackSize);
+ int built;
+ for (int tier = 1; tier <= maxTier; tier++) {
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_FRONT + tier,
+ stackSize,
+ tier,
+ tier,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_REST + maxTier,
+ stackSize,
+ maxTier,
+ maxTier,
+ -1,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mSize = 0;
+ int tier = 0;
+ while (tier < MAX_TIER && checkPiece(STRUCTURE_PIECE_FRONT + (tier + 1), (tier + 1), (tier + 1), 0)) {
+ tier++;
+ }
+ if (tier <= 0) return false;
+ if (checkPiece(STRUCTURE_PIECE_REST + tier, tier, tier, -1)) {
+ mSize = 2 * tier + 1;
+ return mCasing >= 10 && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return mCasingTextureID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mPlasmaMode ? RecipeMaps.plasmaArcFurnaceRecipes : RecipeMaps.arcFurnaceRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.arcFurnaceRecipes, RecipeMaps.plasmaArcFurnaceRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (this.mSize * 8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialArcFurnace;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings4Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 3;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) mCasingTextureID;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (this.mSize > 5) {
+ this.mPlasmaMode = !mPlasmaMode;
+ if (mPlasmaMode) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "Plasma"
+ + EnumChatFormatting.RESET);
+ } else {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.YELLOW
+ + "Electric"
+ + EnumChatFormatting.RESET);
+ }
+ } else {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.GRAY
+ + "Cannot change mode, structure not large enough."
+ + EnumChatFormatting.RESET);
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mPlasmaMode", mPlasmaMode);
+ aNBT.setInteger("mSize", mSize);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mPlasmaMode = aNBT.getBoolean("mPlasmaMode");
+ mSize = aNBT.getInteger("mSize");
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mUpdate = 100;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java
new file mode 100644
index 0000000000..c04620d4b4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java
@@ -0,0 +1,228 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+
+public class GregtechMetaTileEntity_IndustrialCentrifuge
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCentrifuge> implements ISurvivalConstructable {
+
+ private boolean mIsAnimated;
+ private static final CustomIcon frontFaceActive = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE5");
+ private static final CustomIcon frontFace = new CustomIcon("iconsets/LARGECENTRIFUGE5");
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCentrifuge> STRUCTURE_DEFINITION = null;
+ // public static double recipesComplete = 0;
+
+ public GregtechMetaTileEntity_IndustrialCentrifuge(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mIsAnimated = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialCentrifuge(final String aName) {
+ super(aName);
+ mIsAnimated = true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCentrifuge(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Centrifuge";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Centrifuge")
+ .addInfo("125% faster than using single block machines of the same voltage")
+ .addInfo("Disable animations with a screwdriver")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes six items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Centrifuge Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCentrifuge> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCentrifuge>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCentrifuge.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 0))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ if (usingAnimations()) {
+ return frontFaceActive;
+ } else {
+ return frontFace;
+ }
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return frontFace;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(0);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.centrifugeNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setEuModifier(0.9F)
+ .setSpeedBonus(1F / 2.25F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (6 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(0);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ this.mIsAnimated = !mIsAnimated;
+ Logger.INFO("Is Centrifuge animated " + this.mIsAnimated);
+ if (this.mIsAnimated) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animated Turbine Texture. ");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Using Static Turbine Texture. ");
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mIsAnimated", mIsAnimated);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mIsAnimated")) {
+ mIsAnimated = aNBT.getBoolean("mIsAnimated");
+ } else {
+ mIsAnimated = true;
+ }
+ }
+
+ public boolean usingAnimations() {
+ // Logger.INFO("Is animated? "+this.mIsAnimated);
+ return this.mIsAnimated;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java
new file mode 100644
index 0000000000..a9f18dfce8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java
@@ -0,0 +1,342 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ChiselBus;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import team.chisel.carving.Carving;
+
+public class GregtechMetaTileEntity_IndustrialChisel
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialChisel> implements ISurvivalConstructable {
+
+ private int mCasing;
+
+ private ItemStack target;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialChisel> STRUCTURE_DEFINITION = null;
+ private ItemStack mInputCache;
+ private ItemStack mOutputCache;
+ private GT_Recipe mCachedRecipe;
+
+ public GregtechMetaTileEntity_IndustrialChisel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialChisel(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialChisel(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Chisel";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Auto Chisel")
+ .addInfo("Target block goes in Controller slot for common Input Buses")
+ .addInfo("You can also set a target block in each Chisel Input Bus and use them as an Input Bus")
+ .addInfo("If no target is provided for common buses, the result of the first chisel is used")
+ .addInfo("Speed: +200% | EU Usage: 75% | Parallel: Tier x 16")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Sturdy Printer Casing", 6, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialChisel> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialChisel>builder()
+ .addShape(
+ mName,
+ transpose(
+ // spotless:off
+ new String[][] {
+ { "CCC", "CCC", "CCC" },
+ { "C~C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC" },
+ }))
+ // spotless:on
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialChisel.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(90)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings5Misc, 5))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 90;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ private boolean hasValidCache(ItemStack aStack, ItemStack aSpecialSlot, boolean aClearOnFailure) {
+ if (mInputCache != null && mOutputCache != null && mCachedRecipe != null) {
+ if (GT_Utility.areStacksEqual(aStack, mInputCache)
+ && GT_Utility.areStacksEqual(aSpecialSlot, mOutputCache)) {
+ return true;
+ }
+ }
+ // clear cache if it was invalid
+ if (aClearOnFailure) {
+ mInputCache = null;
+ mOutputCache = null;
+ mCachedRecipe = null;
+ }
+ return false;
+ }
+
+ private void cacheItem(ItemStack aInputItem, ItemStack aOutputItem, GT_Recipe aRecipe) {
+ mInputCache = aInputItem.copy();
+ mOutputCache = aOutputItem.copy();
+ mCachedRecipe = aRecipe;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean canBeMadeFrom(ItemStack from, ItemStack to) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ for (ItemStack s : results) {
+ if (s.getItem() == to.getItem() && s.getItemDamage() == to.getItemDamage()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean hasChiselResults(ItemStack from) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ return results.size() > 0;
+ }
+
+ private static List<ItemStack> getItemsForChiseling(ItemStack aStack) {
+ return Carving.chisel.getItemsForChiseling(aStack);
+ }
+
+ private static ItemStack getChiselOutput(ItemStack aInput, ItemStack aTarget) {
+ ItemStack tOutput;
+ if (aTarget != null && canBeMadeFrom(aInput, aTarget)) {
+ tOutput = aTarget;
+ } else if (aTarget != null && !canBeMadeFrom(aInput, aTarget)) {
+ tOutput = null;
+ } else {
+ tOutput = getItemsForChiseling(aInput).get(0);
+ }
+ return tOutput;
+ }
+
+ private GT_Recipe generateChiselRecipe(ItemStack aInput) {
+ boolean tIsCached = hasValidCache(aInput, this.target, true);
+ if (tIsCached || aInput != null && hasChiselResults(aInput)) {
+ ItemStack tOutput = tIsCached ? mOutputCache.copy() : getChiselOutput(aInput, this.target);
+ if (tOutput != null) {
+ if (mCachedRecipe != null && GT_Utility.areStacksEqual(aInput, mInputCache)
+ && GT_Utility.areStacksEqual(tOutput, mOutputCache)) {
+ return mCachedRecipe;
+ }
+ // We can chisel this
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { ItemUtils.getSimpleStack(aInput, 1) },
+ new ItemStack[] { ItemUtils.getSimpleStack(tOutput, 1) },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ 20,
+ 16,
+ 0);
+
+ // Cache it
+ cacheItem(aInput, tOutput, aRecipe);
+ return aRecipe;
+ }
+ }
+ return null;
+ }
+
+ private GT_Recipe getRecipe() {
+ for (GT_MetaTileEntity_Hatch_InputBus bus : this.mInputBusses) {
+ if (bus instanceof GT_MetaTileEntity_ChiselBus) { // Chisel buses
+ if (bus.mInventory[bus.getSizeInventory() - 1] == null) continue;
+ this.target = bus.mInventory[bus.getSizeInventory() - 1];
+
+ for (int i = bus.getSizeInventory() - 2; i >= 0; i--) {
+ ItemStack itemsInSlot = bus.mInventory[i];
+ if (itemsInSlot != null) {
+ GT_Recipe tRecipe = generateChiselRecipe(itemsInSlot);
+ if (tRecipe != null) {
+ return tRecipe;
+ }
+ }
+ }
+ } else {
+ target = this.getControllerSlot(); // Common buses
+ for (int i = bus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack itemsInSlot = bus.mInventory[i];
+ if (itemsInSlot != null) {
+ GT_Recipe tRecipe = generateChiselRecipe(itemsInSlot);
+ if (tRecipe != null) {
+ return tRecipe;
+ }
+ }
+ }
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ return GT_StreamUtil.ofNullable(getRecipe());
+ }
+ }.setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void sendStartMultiBlockSoundLoop() {
+ sendLoopStart(PROCESS_START_SOUND_INDEX);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (16 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ private static ResourceLocation sChiselSound = null;
+
+ private static ResourceLocation getChiselSound() {
+ if (sChiselSound == null) {
+ sChiselSound = new ResourceLocation(Carving.chisel.getVariationSound(Blocks.stone, 0));
+ }
+ return sChiselSound;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ switch (aIndex) {
+ case PROCESS_START_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(getChiselSound(), getTimeBetweenProcessSounds(), 1.0F, 1.0F, aX, aY, aZ);
+ case INTERRUPT_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialChisel;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java
new file mode 100644
index 0000000000..b71600e3fd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java
@@ -0,0 +1,209 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialCokeOven
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCokeOven> implements ISurvivalConstructable {
+
+ private int mLevel = 0;
+ private int mCasing;
+ private int mCasing1;
+ private int mCasing2;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCokeOven> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialCokeOven(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialCokeOven(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCokeOven(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Coke Oven";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Processes Logs and Coal into Charcoal and Coal Coke.")
+ .addInfo("Controller Block for the Industrial Coke Oven")
+ .addInfo("Gain 4% energy discount per voltage tier")
+ .addInfo("Process 12x materials with Heat Resistant Casings")
+ .addInfo("Or 24x materials with Heat Proof Casings")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front middle at bottom")
+ .addCasingInfoMin("Structural Coke Oven Casings", 8, false)
+ .addCasingInfoMin("Heat Resistant/Proof Coke Oven Casings", 8, false)
+ .addInputBus("Any Structural Coke Oven Casing", 1)
+ .addOutputBus("Any Structural Coke Oven Casing", 1)
+ .addInputHatch("Any Structural Coke Oven Casing", 1)
+ .addOutputHatch("Any Structural Coke Oven Casing", 1)
+ .addEnergyHatch("Any Structural Coke Oven Casing", 1)
+ .addMaintenanceHatch("Any Structural Coke Oven Casing", 1)
+ .addMufflerHatch("Any Structural Coke Oven Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCokeOven> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCokeOven>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addShape(
+ mName + "1",
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "aaa", "a-a", "aaa" }, { "C~C", "CCC", "CCC" }, }))
+ .addShape(
+ mName + "2",
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "bbb", "b-b", "bbb" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCokeOven.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(1))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 1))))
+ .addElement(
+ 'H',
+ ofChain(
+ onElementPass(x -> ++x.mCasing1, ofBlock(ModBlocks.blockCasingsMisc, 2)),
+ onElementPass(x -> ++x.mCasing2, ofBlock(ModBlocks.blockCasingsMisc, 3))))
+ .addElement('a', ofBlock(ModBlocks.blockCasingsMisc, 2))
+ .addElement('b', ofBlock(ModBlocks.blockCasingsMisc, 3))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ if (stackSize.stackSize == 1) buildPiece(mName + "1", stackSize, hintsOnly, 1, 2, 0);
+ else buildPiece(mName + "2", stackSize, hintsOnly, 1, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ if (stackSize.stackSize == 1)
+ return survivialBuildPiece(mName + "1", stackSize, 1, 2, 0, elementBudget, env, false, true);
+ else return survivialBuildPiece(mName + "2", stackSize, 1, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mCasing1 = 0;
+ mCasing2 = 0;
+ mLevel = 0;
+ if (checkPiece(mName, 1, 2, 0)) {
+ if (mCasing1 == 8) mLevel = 1;
+ if (mCasing2 == 8) mLevel = 2;
+ return mLevel > 0 && mCasing >= 8 && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.cokeOvenRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.setEuModifier((100F - (GT_Utility.getTier(getMaxInputVoltage()) * 4)) / 100F);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return this.mLevel * 12;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCokeOven;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java
new file mode 100644
index 0000000000..295f195d55
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java
@@ -0,0 +1,230 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialCuttingMachine extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCuttingMachine> implements ISurvivalConstructable {
+
+ private boolean mCuttingMode = true;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCuttingMachine> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialCuttingMachine(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialCuttingMachine(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCuttingMachine(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Cutting Machine / Slicing Machine";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Cutting Factory")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Cutting Factory Frames", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCuttingMachine> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCuttingMachine>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCuttingMachine.class)
+ .atLeast(InputBus, InputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 13))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(29);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mCuttingMode ? RecipeMaps.cutterRecipes : RecipeMaps.slicerRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.cutterRecipes, RecipeMaps.slicerRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCuttingMachine;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 13;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(29);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mCuttingMode = !mCuttingMode;
+ String aMode = mCuttingMode ? "Cutting" : "Slicing";
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + aMode);
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mCuttingMode", mCuttingMode);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mCuttingMode")) {
+ mCuttingMode = aNBT.getBoolean("mCuttingMode");
+ } else {
+ mCuttingMode = true;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java
new file mode 100644
index 0000000000..9122090f89
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialDehydrator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialDehydrator> implements ISurvivalConstructable {
+
+ private static int CASING_TEXTURE_ID;
+ private static String mCasingName = "Vacuum Casing";
+ private HeatingCoilLevel mHeatingCapacity;
+ private boolean mDehydratorMode = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialDehydrator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialDehydrator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(3, 10);
+ }
+
+ public GregtechMetaTileEntity_IndustrialDehydrator(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(3, 10);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialDehydrator(mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Vacuum Furnace")
+ .addInfo("Can toggle the operation temperature with a Screwdriver")
+ .addInfo("All Dehydrator recipes are Low Temp recipes")
+ .addInfo("Speed: +120% | EU Usage: 50% | Parallel: 4")
+ .addInfo("Each 900K over the min. Heat Capacity grants 5% speedup (multiplicatively)")
+ .addInfo("Each 1800K over the min. Heat Capacity allows for one upgraded overclock")
+ .addInfo("Upgraded overclocks reduce recipe time to 25% and increase EU/t to 400%")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin(mCasingName, 5, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialDehydrator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialDehydrator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialDehydrator.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings4Misc, 10))))
+ .addElement(
+ 'H',
+ ofCoil(
+ GregtechMetaTileEntity_IndustrialDehydrator::setCoilLevel,
+ GregtechMetaTileEntity_IndustrialDehydrator::getCoilLevel))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 4, 0) && mCasing >= 5 && getCoilLevel() != HeatingCoilLevel.None && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mDehydratorMode ? GTPPRecipeMaps.chemicalDehydratorNonCellRecipes : GTPPRecipeMaps.vacuumFurnaceRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(GTPPRecipeMaps.chemicalDehydratorNonCellRecipes, GTPPRecipeMaps.vacuumFurnaceRecipes);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialDehydrator;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Vacuum Furnace / Dehydrator";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 4;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= getCoilLevel().getHeat() ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat((int) getCoilLevel().getHeat());
+ }
+ }.setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mDehydratorMode = !mDehydratorMode;
+ String aMode = mDehydratorMode ? "Dehydrator" : "Vacuum Furnace";
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + aMode);
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mDehydratorMode", mDehydratorMode);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mDehydratorMode = aNBT.getBoolean("mDehydratorMode");
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java
new file mode 100644
index 0000000000..f12007b952
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java
@@ -0,0 +1,169 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialElectrolyzer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialElectrolyzer> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialElectrolyzer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialElectrolyzer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialElectrolyzer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialElectrolyzer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Electrolyzer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Electrolyzer")
+ .addInfo("180% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Electrolyzer Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialElectrolyzer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialElectrolyzer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialElectrolyzer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.GTPP_INDEX(5))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 5))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(5);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.electrolyzerNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.8F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialElectrolyzer;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * GT_Utility.getTier(this.getMaxInputVoltage());
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java
new file mode 100644
index 0000000000..ea61048f33
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialExtruder
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialExtruder> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialExtruder> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialExtruder(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialExtruder(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialExtruder(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Extruder";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Material Extruder")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes four items per voltage tier")
+ .addInfo("Extrusion Shape for recipe goes in the Input Bus")
+ .addInfo("Each Input Bus can have a different shape!")
+ .addInfo("You can use several input buses per multiblock")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Inconel Reinforced Casings", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialExtruder> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialExtruder>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialExtruder.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(33);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.extruderRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialExtruder;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 1;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(33);
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java
new file mode 100644
index 0000000000..a34532ee83
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialFluidHeater extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialFluidHeater> implements ISurvivalConstructable {
+
+ private int mCasing1;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialFluidHeater> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialFluidHeater(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialFluidHeater(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialFluidHeater(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fluid Heater";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Fluid Heater")
+ .addInfo("120% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes eight items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 6, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Top/Bottom layer: Multi-use Casings", 34, false)
+ .addCasingInfoMin("Middle layers: Thermal Containment Casing", 47, false)
+ .addInputBus("Bottom Layer (optional)", 1)
+ .addInputHatch("Bottom Layer", 1)
+ .addOutputBus("Top Layer (optional)", 1)
+ .addOutputHatch("Top Layer", 1)
+ .addEnergyHatch("Any Multi-use Casing", 1)
+ .addMaintenanceHatch("Any Multi-use Casing", 1)
+ .addMufflerHatch("Any Multi-use Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialFluidHeater> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialFluidHeater>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { " TTT ", "TTTTT", "TTTTT", "TTTTT", " TTT " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " X~X ", "X---X", "X---X", "X---X", " XXX " },
+ { " BBB ", "BBBBB", "BBBBB", "BBBBB", " BBB " }, }))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFluidHeater.class)
+ .atLeast(InputBus, InputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing1, ofBlock(getCasingBlock2(), getCasingMeta2()))))
+ .addElement('X', ofBlock(getCasingBlock1(), getCasingMeta1()))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFluidHeater.class)
+ .atLeast(OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing1, ofBlock(getCasingBlock2(), getCasingMeta2()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing1 = 0;
+ boolean didBuild = checkPiece(mName, 2, 4, 0);
+ log("Built? " + didBuild + ", " + mCasing1);
+ return didBuild && mCasing1 >= 34 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.fluidHeaterRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock1() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta1() {
+ return 11;
+ }
+
+ public Block getCasingBlock2() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta2() {
+ return 2;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.getIndexFromPage(2, 2);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java
new file mode 100644
index 0000000000..8e2f040d75
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.ThaumicBases;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.ITierConverter;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GregtechMetaTileEntity_IndustrialForgeHammer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialForgeHammer> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private int mAnvilTier = 0;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialForgeHammer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialForgeHammer(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialForgeHammer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialForgeHammer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Forge Hammer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Forge Hammer")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: Tier x Anvil Tier x 8")
+ .addInfo("T1 - Vanilla Anvil");
+ if (Railcraft.isModLoaded()) {
+ tt.addInfo("T2 - Steel Anvil");
+ }
+ if (EnderIO.isModLoaded()) {
+ tt.addInfo("T3 - Dark Steel Anvil");
+ }
+ if (ThaumicBases.isModLoaded()) {
+ tt.addInfo("T3 - Thaumium Anvil");
+ tt.addInfo("T4 - Void Metal Anvil");
+ }
+
+ tt.addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Forge Casing", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addOtherStructurePart("Anvil", "In the center of 3x3x3 structure", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialForgeHammer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ Map<Block, Integer> anvilTiers = new HashMap<>();
+
+ anvilTiers.put(Blocks.anvil, 1);
+
+ if (Railcraft.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(Railcraft.ID, "anvil"), 2);
+ }
+
+ if (EnderIO.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(EnderIO.ID, "blockDarkSteelAnvil"), 3);
+ }
+
+ if (ThaumicBases.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(ThaumicBases.ID, "thaumicAnvil"), 3);
+ anvilTiers.put(GameRegistry.findBlock(ThaumicBases.ID, "voidAnvil"), 4);
+ }
+
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialForgeHammer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "CAC", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialForgeHammer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.getIndexFromPage(1, 11))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings5Misc, 6))))
+ .addElement(
+ 'A',
+ ofBlocksTiered(
+ anvilTierConverter(anvilTiers),
+ getAllAnvilTiers(anvilTiers),
+ 0,
+ GregtechMetaTileEntity_IndustrialForgeHammer::setAnvilTier,
+ GregtechMetaTileEntity_IndustrialForgeHammer::getAnvilTier))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private static List<Pair<Block, Integer>> getAllAnvilTiers(Map<Block, Integer> anvilTiers) {
+ return anvilTiers.entrySet()
+ .stream()
+ .map(e -> Pair.of(e.getKey(), e.getValue()))
+ .collect(Collectors.toList());
+ }
+
+ private static ITierConverter<Integer> anvilTierConverter(Map<Block, Integer> anvilTiers) {
+ return (block, meta) -> block == null ? 0 : anvilTiers.getOrDefault(block, 0);
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.RANDOM_ANVIL_USE;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(1, 11);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hammerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1 / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * getAnvilTier() * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialForgeHammer;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private void setAnvilTier(int tier) {
+ mAnvilTier = tier;
+ }
+
+ private int getAnvilTier() {
+ return mAnvilTier;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java
new file mode 100644
index 0000000000..5591b9fbe8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java
@@ -0,0 +1,458 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GregtechMetaTileEntity_IndustrialMacerator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMacerator> implements ISurvivalConstructable {
+
+ private int controllerTier = 1;
+ private int mCasing;
+ private int mPerLayer;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMacerator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialMacerator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMacerator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMacerator(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Macerator/Pulverizer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller block for the Industrial Maceration Stack")
+ .addInfo("60% faster than using single block machines of the same voltage")
+ .addInfo("Maximum of n*tier parallels, LV = Tier 1, MV = Tier 2, etc.")
+ .addInfo("n=2 initially. n=8 after inserting Maceration Upgrade Chip.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 6, 3, true)
+ .addController("Bottom center")
+ .addCasingInfoMin("Maceration Stack Casings (After upgrade)", 26, false)
+ .addCasingInfoMin("Stable Titanium Casings (Before upgrade)", 26, false)
+ .addInputBus("Bottom casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addOutputBus("One per layer except bottom layer", 2)
+ .addMufflerHatch("Any casing except bottom layer", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMacerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMacerator>builder()
+ .addShape(mName + "top1", transpose(new String[][] { { "ccc", "ccc", "ccc" }, }))
+ .addShape(mName + "mid1", transpose(new String[][] { { "ccc", "c-c", "ccc" }, }))
+ .addShape(mName + "bottom1", transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(mName + "top2", transpose(new String[][] { { "CCC", "CCC", "CCC" }, }))
+ .addShape(mName + "mid2", transpose(new String[][] { { "CCC", "C-C", "CCC" }, }))
+ .addShape(mName + "bottom2", transpose(new String[][] { { "B~B", "BBB", "BBB" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class).anyOf(OutputBus)
+ .shouldReject(t -> t.mPerLayer + 1 == t.mOutputBusses.size())
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, Muffler)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 7))))
+ .addElement(
+ 'B',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, InputBus)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 7))))
+ .addElement(
+ 'c',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class).anyOf(OutputBus)
+ .shouldReject(t -> t.mPerLayer + 1 == t.mOutputBusses.size())
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, Muffler)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings4, 2))))
+ .addElement(
+ 'b',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, InputBus)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings4, 2))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName + "bottom" + controllerTier, stackSize, hintsOnly, 1, 0, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 1, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 2, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 3, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 4, 0);
+ buildPiece(mName + "top" + controllerTier, stackSize, hintsOnly, 1, 5, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built;
+ built = survivialBuildPiece(
+ mName + "bottom" + controllerTier,
+ stackSize,
+ 1,
+ 0,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ mPerLayer = 0;
+ if (built >= 0) return built;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ mPerLayer = 1;
+ if (built >= 0) return built;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 2,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 2;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 3,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 3;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 4,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 4;
+ return survivialBuildPiece(mName + "top" + controllerTier, stackSize, 1, 5, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mPerLayer = 0;
+ if (checkPiece(mName + "bottom" + controllerTier, 1, 0, 0)) {
+ while (mPerLayer < 4) {
+ if (!checkPiece(mName + "mid" + controllerTier, 1, mPerLayer + 1, 0)
+ || mPerLayer + 1 != mOutputBusses.size()) return false;
+ mPerLayer++;
+ }
+ return checkPiece(mName + "top" + controllerTier, 1, 5, 0) && mOutputBusses.size() == 5
+ && mCasing >= 26
+ && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MACERATOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return switch (controllerTier) {
+ case 2 -> TAE.GTPP_INDEX(7);
+ default -> GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2);
+ };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ @Override
+ public void onPreTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())
+ && (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP)
+ && (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0)
+ && (!aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP))) {
+ final Random tRandom = aBaseMetaTileEntity.getWorld().rand;
+ aBaseMetaTileEntity.getWorld()
+ .spawnParticle(
+ "smoke",
+ (aBaseMetaTileEntity.getXCoord() + 0.8F) - (tRandom.nextFloat() * 0.6F),
+ aBaseMetaTileEntity.getYCoord() + 0.3f + (tRandom.nextFloat() * 0.2F),
+ (aBaseMetaTileEntity.getZCoord() + 1.2F) - (tRandom.nextFloat() * 1.6F),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && aTick % 20 == 0 && controllerTier == 1) {
+ ItemStack aGuiStack = this.getControllerSlot();
+ if (GregtechItemList.Maceration_Upgrade_Chip.isStackEqual(aGuiStack, false, true)) {
+ controllerTier = 2;
+ mInventory[1] = ItemUtils.depleteStack(aGuiStack);
+ markDirty();
+ // schedule a structure check
+ mUpdated = true;
+ }
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (controllerTier == 1 && !aPlayer.isSneaking()) {
+ ItemStack heldItem = aPlayer.getHeldItem();
+ if (GregtechItemList.Maceration_Upgrade_Chip.isStackEqual(heldItem, false, true)) {
+ controllerTier = 2;
+ aPlayer.setCurrentItemOrArmor(0, ItemUtils.depleteStack(heldItem));
+ if (getBaseMetaTileEntity().isServerSide()) {
+ markDirty();
+ aPlayer.inventory.markDirty();
+ // schedule a structure check
+ mUpdated = true;
+ }
+ return true;
+ }
+ }
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ controllerTier = aValue;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) controllerTier;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mTier", (byte) controllerTier);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey("mTier", NBT.TAG_BYTE))
+ // we assume old macerators are all T2 variants, as they were made before price reduction and shouldn't need
+ // to worry about upgrading
+ controllerTier = 2;
+ else controllerTier = aNBT.getByte("mTier");
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ super.initDefaultModes(aNBT);
+ if (aNBT == null || !aNBT.hasKey("mTier")) {
+ controllerTier = 1;
+ } else {
+ controllerTier = aNBT.getByte("mTier");
+ }
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ aNBT.setByte("mTier", (byte) controllerTier);
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ super.addAdditionalTooltipInformation(stack, tooltip);
+ NBTTagCompound aNBT = stack.getTagCompound();
+ int tier;
+ if (aNBT == null || !aNBT.hasKey("mTier")) {
+ tier = 1;
+ } else {
+ tier = aNBT.getInteger("mTier");
+ }
+ tooltip.add(StatCollector.translateToLocalFormatted("tooltip.large_macerator.tier", tier));
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 1.6F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ final long tVoltage = getMaxInputVoltage();
+ final byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+ return Math.max(1, (controllerTier == 1 ? 2 : 8) * tTier);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMacerator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("tier", controllerTier);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("tier")) {
+ currentTip.add(
+ "Tier: " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(tag.getInteger("tier"))
+ + EnumChatFormatting.RESET);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java
new file mode 100644
index 0000000000..3f4c4ccfa4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java
@@ -0,0 +1,213 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialMixer
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMixer> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mCasingName = "Multi-Use Casing";
+ public static String mCasingName2 = "Titanium Turbine Casing";
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMixer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialMixer(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 2);
+ inputSeparation = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialMixer(final String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 2);
+ inputSeparation = true;
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ if (aNBT.hasKey("isBussesSeparate")) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ // Fallback for existing mixers
+ else {
+ inputSeparation = true;
+ }
+ }
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMixer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Mixer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Mixer")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes eight recipes per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, false)
+ .addController("Second Layer Center")
+ .addCasingInfoMin(mCasingName, 6, false)
+ .addCasingInfoMin(mCasingName2, 2, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMixer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMixer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "CCC", "CMC", "CCC" }, { "C~C", "CMC", "CCC" },
+ { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMixer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 2))))
+ .addElement('M', ofBlock(GregTech_API.sBlockCasings4, 11))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 2, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.mixerNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMixer;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java
new file mode 100644
index 0000000000..02b0bcf978
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialMolecularTransformer
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMolecularTransformer>
+ implements ISurvivalConstructable {
+
+ private static final int CASING_TEXTURE_ID = 48;
+ private int mCasing = 0;
+
+ public GregtechMetaTileEntity_IndustrialMolecularTransformer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMolecularTransformer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMolecularTransformer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Molecular Transformer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Changes the structure of items to produce new ones")
+ .addInfo("Maximum 1x of each bus/hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 7, 7, false)
+ .addController("Top Center")
+ .addCasingInfoMin("Robust Tungstensteel Machine Casing", 40, false)
+ .addCasingInfoMin("Tungstensteel Coils", 16, false)
+ .addCasingInfoMin("Molecular Containment Casing", 52, false)
+ .addCasingInfoMin("High Voltage Current Capacitor", 32, false)
+ .addCasingInfoMin("Particle Containment Casing", 4, false)
+ .addCasingInfoMin("Resonance Chamber I", 5, false)
+ .addCasingInfoMin("Modulator I", 4, false)
+ .addInputBus("Any Robust Tungstensteel Machine Casing", 1)
+ .addOutputBus("Any Robust Tungstensteel Machine Casing", 1)
+ .addEnergyHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .addMaintenanceHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .addMufflerHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMolecularTransformer> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMolecularTransformer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMolecularTransformer>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] { { " ", " ", " xxx ", " x~x ", " xxx ", " ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " t ", " ttxtt ", " tyyyt ", "txyzyxt", " tyyyt ", " ttxtt ", " t " },
+ { " c ", " ccecc ", " cxfxc ", "cefefec", " cxfxc ", " ccecc ", " c " },
+ { " h ", " hhhhh ", " hhhhh ", "hhhhhhh", " hhhhh ", " hhhhh ", " h " }, }))
+ .addElement('x', ofBlock(getCasingBlock(), getCasingMeta()))
+ .addElement('y', ofBlock(getCasingBlock(), getCasingMeta2()))
+ .addElement('z', ofBlock(getCasingBlock(), getCasingMeta3()))
+ .addElement('e', ofBlock(getCasingBlock2(), 0))
+ .addElement('f', ofBlock(getCasingBlock2(), 4))
+ .addElement('c', ofBlock(getCoilBlock(), 3))
+ .addElement('t', ofBlock(getCasingBlock3(), getTungstenCasingMeta()))
+ .addElement(
+ 'h',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMolecularTransformer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock3(), getTungstenCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aDidBuild = checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0);
+ if (this.mInputBusses.size() != 1 || this.mOutputBusses.size() != 1 || this.mEnergyHatches.size() != 1) {
+ return false;
+ }
+ // there are 16 slot that only allow casing, so we subtract this from the grand total required
+ return aDidBuild && mCasing >= 40 - 16 && checkHatch();
+ }
+
+ protected static int getCasingTextureIndex() {
+ return CASING_TEXTURE_ID;
+ }
+
+ protected static Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ protected static Block getCasingBlock2() {
+ return ModBlocks.blockSpecialMultiCasings2;
+ }
+
+ protected static Block getCasingBlock3() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ protected static Block getCoilBlock() {
+ return GregTech_API.sBlockCasings5;
+ }
+
+ protected static int getCasingMeta() {
+ return 11;
+ }
+
+ protected static int getCasingMeta2() {
+ return 12;
+ }
+
+ protected static int getCasingMeta3() {
+ return 13;
+ }
+
+ protected static int getTungstenCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 44;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.molecularTransformerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java
new file mode 100644
index 0000000000..52c7736ae3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java
@@ -0,0 +1,514 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gregtech.common.tileentities.machines.IDualInputInventory;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Solidifier;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GregtechMetaTileEntity_IndustrialMultiMachine extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMultiMachine> implements ISurvivalConstructable {
+
+ protected int mInternalMode = 0;
+ private static final int MODE_COMPRESSOR = 0;
+ private static final int MODE_LATHE = 1;
+ private static final int MODE_MAGNETIC = 2;
+ private static final int MODE_FERMENTER = 3;
+ private static final int MODE_FLUIDEXTRACT = 4;
+ private static final int MODE_EXTRACTOR = 5;
+ private static final int MODE_LASER = 6;
+ private static final int MODE_AUTOCLAVE = 7;
+ private static final int MODE_FLUIDSOLIDIFY = 8;
+ private static final int[][] MODE_MAP = new int[][] { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
+ public static final String[] aToolTipNames = new String[9];
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMultiMachine> STRUCTURE_DEFINITION = null;
+
+ static {
+ for (int id = 0; id < 9; id++) {
+ RecipeMap<?> recipeMap = getRecipeMap(id);
+ if (recipeMap != null) {
+ String aNEI = GT_LanguageManager.getTranslation(getRecipeMap(id).unlocalizedName);
+ aToolTipNames[id] = aNEI != null ? aNEI : "BAD NEI NAME (Report to Github)";
+ }
+ }
+ }
+
+ public GregtechMetaTileEntity_IndustrialMultiMachine(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMultiMachine(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMultiMachine(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Nine in One";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ String[] aBuiltStrings = new String[3];
+ aBuiltStrings[0] = aToolTipNames[0] + ", " + aToolTipNames[1] + ", " + aToolTipNames[2];
+ aBuiltStrings[1] = aToolTipNames[3] + ", " + aToolTipNames[4] + ", " + aToolTipNames[5];
+ aBuiltStrings[2] = aToolTipNames[6] + ", " + aToolTipNames[7] + ", " + aToolTipNames[8];
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Multi-Machine")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 80% of the EU/t normally required")
+ .addInfo("Processes two items per voltage tier")
+ .addInfo("Machine Type: Metal - " + EnumChatFormatting.YELLOW + aBuiltStrings[0] + EnumChatFormatting.RESET)
+ .addInfo("Machine Type: Fluid - " + EnumChatFormatting.YELLOW + aBuiltStrings[1] + EnumChatFormatting.RESET)
+ .addInfo("Machine Type: Misc - " + EnumChatFormatting.YELLOW + aBuiltStrings[2] + EnumChatFormatting.RESET)
+ .addInfo("Read Multi-Machine Manual for extra information")
+ .addInfo(
+ EnumChatFormatting.AQUA + "You can use Solidifier Hatch to solidify multiple liquids."
+ + EnumChatFormatting.RESET)
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Multi-Use Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMultiMachine> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMultiMachine>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMultiMachine.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(getTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 2))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getTextureIndex();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (2 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (mInternalMode == 0) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal;
+ } else if (mInternalMode == 1) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid;
+ } else { // config 2
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc;
+ }
+ }
+
+ public int getTextureIndex() {
+ return TAE.getIndexFromPage(2, 2);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private ItemStack getCircuit(ItemStack[] t) {
+ for (ItemStack j : t) {
+ if (j.getItem() == CI.getNumberedCircuit(0)
+ .getItem()) {
+ if (j.getItemDamage() >= 20 && j.getItemDamage() <= 22) {
+ return j;
+ }
+ }
+ }
+ return null;
+ }
+
+ private int getCircuitID(ItemStack circuit) {
+ int H = circuit.getItemDamage();
+ int T = (H == 20 ? 0 : (H == 21 ? 1 : (H == 22 ? 2 : -1)));
+ return MODE_MAP[this.mInternalMode][T];
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(
+ RecipeMaps.compressorRecipes,
+ RecipeMaps.latheRecipes,
+ RecipeMaps.polarizerRecipes,
+ RecipeMaps.fermentingRecipes,
+ RecipeMaps.fluidExtractionRecipes,
+ RecipeMaps.extractorRecipes,
+ RecipeMaps.laserEngraverRecipes,
+ RecipeMaps.autoclaveRecipes,
+ RecipeMaps.fluidSolidifierRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ private static RecipeMap<?> getRecipeMap(int aMode) {
+ if (aMode == MODE_COMPRESSOR) {
+ return RecipeMaps.compressorRecipes;
+ } else if (aMode == MODE_LATHE) {
+ return RecipeMaps.latheRecipes;
+ } else if (aMode == MODE_MAGNETIC) {
+ return RecipeMaps.polarizerRecipes;
+ } else if (aMode == MODE_FERMENTER) {
+ return RecipeMaps.fermentingRecipes;
+ } else if (aMode == MODE_FLUIDEXTRACT) {
+ return RecipeMaps.fluidExtractionRecipes;
+ } else if (aMode == MODE_EXTRACTOR) {
+ return RecipeMaps.extractorRecipes;
+ } else if (aMode == MODE_LASER) {
+ return RecipeMaps.laserEngraverRecipes;
+ } else if (aMode == MODE_AUTOCLAVE) {
+ return RecipeMaps.autoclaveRecipes;
+ } else if (aMode == MODE_FLUIDSOLIDIFY) {
+ return RecipeMaps.fluidSolidifierRecipes;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private ItemStack lastCircuit = null;
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ ItemStack circuit = getCircuit(inputItems);
+ if (circuit == null) {
+ return Stream.empty();
+ }
+ if (!GT_Utility.areStacksEqual(circuit, lastCircuit)) {
+ lastRecipe = null;
+ lastCircuit = circuit;
+ }
+ RecipeMap<?> foundMap = getRecipeMap(getCircuitID(circuit));
+ if (foundMap == null) {
+ return Stream.empty();
+ }
+ return super.findRecipeMatches(foundMap);
+ }
+ }.setSpeedBonus(1F / 3.5F)
+ .setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (mInternalMode < 2) {
+ mInternalMode++;
+ } else {
+ mInternalMode = 0;
+ }
+ String mModeString = (mInternalMode == 0 ? "Metal"
+ : mInternalMode == 1 ? "Fluid" : mInternalMode == 2 ? "Misc." : "null");
+ PlayerUtils.messagePlayer(aPlayer, "Multi-Machine is now in " + mModeString + " mode.");
+ mLastRecipe = null;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String[] data = super.getInfoData();
+ ArrayList<String> mInfo = new ArrayList<>(Arrays.asList(data));
+ String mode;
+ if (mInternalMode == 0) {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.metal");
+ } else if (mInternalMode == 1) {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.fluid");
+ } else {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.misc");
+ }
+ mInfo.add(mode);
+ return mInfo.toArray(new String[0]);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mInternalMode", mInternalMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mInternalMode = aNBT.getInteger("mInternalMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("mode", mInternalMode);
+ }
+
+ @Override
+ protected CheckRecipeResult doCheckRecipe() {
+
+ if (mInternalMode != 2 || !isInputSeparationEnabled()) {
+ return super.doCheckRecipe();
+ } else {
+ CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE;
+
+ // check crafting input hatches first
+ if (supportsCraftingMEBuffer()) {
+ for (IDualInputHatch dualInputHatch : mDualInputHatches) {
+ for (var it = dualInputHatch.inventories(); it.hasNext();) {
+ IDualInputInventory slot = it.next();
+ processingLogic.setInputItems(slot.getItemInputs());
+ processingLogic.setInputFluids(slot.getFluidInputs());
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ }
+
+ // Logic for GT_MetaTileEntity_Hatch_Solidifier
+ for (GT_MetaTileEntity_Hatch_Input solidifierHatch : mInputHatches) {
+ if (solidifierHatch instanceof GT_MetaTileEntity_Hatch_Solidifier) {
+ ItemStack mold = ((GT_MetaTileEntity_Hatch_Solidifier) solidifierHatch).getMold();
+ FluidStack fluid = solidifierHatch.getFluid();
+
+ if (mold != null && fluid != null) {
+ List<ItemStack> inputItems = new ArrayList<>();
+ inputItems.add(mold);
+ inputItems.add(ItemUtils.getGregtechCircuit(22));
+
+ processingLogic.setInputItems(inputItems.toArray(new ItemStack[0]));
+ processingLogic.setInputFluids(fluid);
+
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ }
+ processingLogic.clear();
+ processingLogic.setInputFluids(getStoredFluids());
+ // Default logic
+ for (GT_MetaTileEntity_Hatch_InputBus bus : mInputBusses) {
+ if (bus instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) {
+ continue;
+ }
+ List<ItemStack> inputItems = new ArrayList<>();
+ for (int i = bus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack stored = bus.getStackInSlot(i);
+ if (stored != null) {
+ inputItems.add(stored);
+ }
+ }
+ if (canUseControllerSlotForRecipe() && getControllerSlot() != null) {
+ inputItems.add(getControllerSlot());
+ }
+ processingLogic.setInputItems(inputItems.toArray(new ItemStack[0]));
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+
+ return result;
+ }
+ }
+
+ @Override
+ public ArrayList<FluidStack> getStoredFluids() {
+ ArrayList<FluidStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Solidifier) {
+ continue;
+ }
+
+ setHatchRecipeMap(tHatch);
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ for (FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) {
+ if (tFluid != null) {
+ rList.add(tFluid);
+ }
+ }
+ } else if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME) {
+ if (tHatch.isValid()) {
+ for (FluidStack fluidStack : ((GT_MetaTileEntity_Hatch_Input_ME) tHatch).getStoredFluids()) {
+ if (fluidStack == null) continue;
+ rList.add(fluidStack);
+ }
+ }
+ } else {
+ if (tHatch.getFillableStack() != null) {
+ rList.add(tHatch.getFillableStack());
+ }
+ }
+ }
+
+ return rList;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("mode")) {
+ currentTip.add("Mode: " + EnumChatFormatting.YELLOW + switch (tag.getInteger("mode")) {
+ case 1 -> "Fluid";
+ case 2 -> "Misc";
+ default -> "Metal";
+ } + EnumChatFormatting.RESET);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java
new file mode 100644
index 0000000000..972cf492b6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java
@@ -0,0 +1,218 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialPlatePress
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialPlatePress> implements ISurvivalConstructable {
+
+ private boolean mFormingMode = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialPlatePress> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialPlatePress(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialPlatePress(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialPlatePress(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Bending Machine, Forming Press";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for Advanced Bending & Forming")
+ .addInfo("500% faster than using single block machines of the same voltage")
+ .addInfo("Processes four items per voltage tier")
+ .addInfo("Circuit for recipe goes in the Input Bus")
+ .addInfo("Each Input Bus can have a different Circuit/Shape!")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Material Press Machine Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialPlatePress> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialPlatePress>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialPlatePress.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(50)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 4))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 50;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mFormingMode ? RecipeMaps.formingPressRecipes : RecipeMaps.benderRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.formingPressRecipes, RecipeMaps.benderRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 6F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (this.mFormingMode) return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeForming;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeBending;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFormingMode", mFormingMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFormingMode = aNBT.getBoolean("mFormingMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFormingMode = !mFormingMode;
+ if (mFormingMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Now running in Forming Press Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Now running in Bending Mode.");
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java
new file mode 100644
index 0000000000..e4dd3d11ba
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java
@@ -0,0 +1,209 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Random;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialSifter
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialSifter> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialSifter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialSifter(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialSifter(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialSifter(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Sifter";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Sifter")
+ .addInfo("400% faster than single-block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 3, 5, false)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Sieve Grate", 18, false)
+ .addCasingInfoMin("Sieve Casings", 35, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialSifter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialSifter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CMMMC", "CMMMC", "CMMMC", "CCCCC" },
+ { "CCCCC", "CMMMC", "CMMMC", "CMMMC", "CCCCC" },
+ { "CC~CC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialSifter.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.GTPP_INDEX(21))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 5))))
+ .addElement('M', ofBlock(ModBlocks.blockCasings2Misc, 6))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 2, 0) && mCasing >= 35 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(21);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.sifterRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public void onPreTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())
+ && (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP)
+ && (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0)
+ && (!aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP))) {
+ final Random tRandom = aBaseMetaTileEntity.getWorld().rand;
+ if (tRandom.nextFloat() > 0.4) return;
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * 2;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * 2;
+
+ aBaseMetaTileEntity.getWorld()
+ .spawnParticle(
+ "smoke",
+ (aBaseMetaTileEntity.getXCoord() + xDir + 2.1F) - (tRandom.nextFloat() * 3.2F),
+ aBaseMetaTileEntity.getYCoord() + 2.5f + (tRandom.nextFloat() * 1.2F),
+ (aBaseMetaTileEntity.getZCoord() + zDir + 2.1F) - (tRandom.nextFloat() * 3.2F),
+ 0.0,
+ 0.0,
+ 0.0);
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 5F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialSifter;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java
new file mode 100644
index 0000000000..14ff4ebb6d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialThermalCentrifuge extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialThermalCentrifuge> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialThermalCentrifuge> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialThermalCentrifuge(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialThermalCentrifuge(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialThermalCentrifuge(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Thermal Centrifuge";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Thermal Centrifuge")
+ .addInfo("150% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 80% of the EU/t normally required")
+ .addInfo("Processes eight items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 2, 3, false)
+ .addController("Front Center")
+ .addCasingInfoMin("Thermal Processing Casings/Noise Hazard Sign Blocks", 8, false)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .addMufflerHatch("Bottom Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialThermalCentrifuge> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialThermalCentrifuge>builder()
+ .addShape(mName, transpose(new String[][] { { "X~X", "XXX", "XXX" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialThermalCentrifuge.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0)),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 9))))
+ .addElement(
+ 'X',
+ ofChain(
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0)),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 9))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 0, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 0, 0) && mCasing >= 8 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.thermalCentrifugeRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.5F)
+ .setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(16);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java
new file mode 100644
index 0000000000..aba508e183
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java
@@ -0,0 +1,261 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialVacuumFreezer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialVacuumFreezer> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mCryoFuelName = "Gelid Cryotheum";
+ public static String mCasingName = "Advanced Cryogenic Casing";
+ public static String mHatchName = "Cryotheum Hatch";
+ public static FluidStack mFuelStack;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialVacuumFreezer> STRUCTURE_DEFINITION = null;
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mCryotheumHatches = new ArrayList<>();
+
+ public GregtechMetaTileEntity_IndustrialVacuumFreezer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mFuelStack = FluidUtils.getFluidStack("cryotheum", 1);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 10);
+ }
+
+ public GregtechMetaTileEntity_IndustrialVacuumFreezer(final String aName) {
+ super(aName);
+ mFuelStack = FluidUtils.getFluidStack("cryotheum", 1);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 10);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return (IMetaTileEntity) new GregtechMetaTileEntity_IndustrialVacuumFreezer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Vacuum Freezer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Vacuum Freezer")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: 4")
+ .addInfo("Consumes 20L of " + mCryoFuelName + "/s during operation")
+ .addInfo("Constructed exactly the same as a normal Vacuum Freezer")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName, 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addOtherStructurePart(mHatchName, "Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialVacuumFreezer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialVacuumFreezer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialVacuumFreezer.class)
+ .adder(GregtechMetaTileEntity_IndustrialVacuumFreezer::addCryotheumHatch)
+ .hatchId(967)
+ .shouldReject(t -> !t.mCryotheumHatches.isEmpty())
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialVacuumFreezer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mCryotheumHatches.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && !mCryotheumHatches.isEmpty();
+ }
+
+ private boolean addCryotheumHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase
+ && aMetaTileEntity.getBaseMetaTileEntity()
+ .getMetaTileID() == 967) {
+ return addToMachineListInternal(mCryotheumHatches, aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mCryotheumHatches)) tHatch.updateSlots();
+ super.updateSlots();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.advancedFreezerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 4;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialVacuumFreezer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private int mGraceTimer = 2;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ /*
+ * if (this.getBaseMetaTileEntity().isActive()) { if (!this.depleteInput(mFuelStack.copy())) {
+ * this.getBaseMetaTileEntity().setActive(false); } }
+ */
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (this.mStartUpCheck < 0) {
+ if (this.mMaxProgresstime > 0 && this.mProgresstime != 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (aTick % 10 == 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (!this.depleteInputFromRestrictedHatches(this.mCryotheumHatches, 10)) {
+ if (mGraceTimer-- == 0) {
+ this.causeMaintenanceIssue();
+ this.stopMachine(
+ ShutDownReasonRegistry
+ .outOfFluid(Objects.requireNonNull(FluidUtils.getFluidStack("cryotheum", 20))));
+ mGraceTimer = 2;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java
new file mode 100644
index 0000000000..a12db63f4e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java
@@ -0,0 +1,372 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMetaTileEntity_IndustrialWashPlant
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialWashPlant> implements ISurvivalConstructable {
+
+ private int mMode = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialWashPlant> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialWashPlant(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialWashPlant(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialWashPlant(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Ore Washer, Simple Washer, Chemical Bath";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Wash Plant")
+ .addInfo("Can be configured with a screwdriver to also do Simple Washer and process Chemical Bathing")
+ .addInfo("400% faster than using single block machines of the same voltage")
+ .addInfo("Processes four item per voltage tier")
+ .addInfo("Always requires an Input Hatch full of water to refill structure")
+ .addInfo("Need to be filled with water.")
+ .addInfo("Will automatically fill water from input hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 3, 7, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Wash Plant Casings", 40, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialWashPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialWashPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CCCCC" },
+ { "CC~CC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CCCCC" },
+ { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialWashPlant.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement(
+ 'w',
+ ofChain(
+ isAir(),
+ ofBlockAnyMeta(Blocks.water),
+ ofBlockAnyMeta(Blocks.flowing_water),
+ ofBlockAnyMeta(BlocksItems.getFluidBlock(InternalName.fluidDistilledWater))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 1, 0) && mCasing >= 40 && checkHatch();
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a washer, water will flow out.
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mMode == 0 ? RecipeMaps.oreWasherRecipes
+ : mMode == 1 ? GTPPRecipeMaps.simpleWasherRecipes : RecipeMaps.chemicalBathRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays
+ .asList(RecipeMaps.oreWasherRecipes, GTPPRecipeMaps.simpleWasherRecipes, RecipeMaps.chemicalBathRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (checkForWater()) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ }.setSpeedBonus(1F / 5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (mMode == 2) return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeWasher;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 4;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(11);
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ if (mDirectionX == 0) {
+ mCurrentDirectionX = 2;
+ mCurrentDirectionZ = 3;
+ mOffsetX_Lower = -2;
+ mOffsetX_Upper = 2;
+ mOffsetZ_Lower = -3;
+ mOffsetZ_Upper = 3;
+ } else {
+ mCurrentDirectionX = 3;
+ mCurrentDirectionZ = 2;
+ mOffsetX_Lower = -3;
+ mOffsetX_Upper = 3;
+ mOffsetZ_Lower = -2;
+ mOffsetZ_Upper = 2;
+ }
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; ++h) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.air || tBlock == Blocks.flowing_water || tBlock == Blocks.water) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = null;
+ if (tBlock == Blocks.air || tBlock == Blocks.flowing_water) {
+ fluidUsed = Blocks.water;
+ }
+ if (tBlock == Blocks.water) {
+ fluidUsed = BlocksItems.getFluidBlock(InternalName.fluidDistilledWater);
+ }
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ if (tBlock == Blocks.water) {
+ ++tAmount;
+ // Utils.LOG_WARNING("Found Water");
+ } else if (tBlock == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)) {
+ ++tAmount;
+ ++tAmount;
+ // Utils.LOG_WARNING("Found Distilled Water");
+ }
+ }
+ }
+ }
+
+ boolean isValidWater = tAmount >= 45;
+ if (isValidWater) {
+ Logger.WARNING("Filled structure.");
+ } else {
+ Logger.WARNING("Did not fill structure.");
+ }
+ return isValidWater;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mMode", mMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (aNBT.hasKey("mChemicalMode")) {
+ boolean aTempMode = aNBT.getBoolean("mChemicalMode");
+ if (aTempMode) {
+ mMode = 2;
+ } else {
+ mMode = 0;
+ }
+ aNBT.removeTag("mChemicalMode");
+ }
+ if (aNBT.hasKey("mMode")) {
+ mMode = aNBT.getInteger("mMode");
+ }
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mMode++;
+ if (mMode > 2) {
+ mMode = 0;
+ }
+ if (mMode == 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Ore Washer Mode.");
+ } else if (mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Simple Washer Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Chemical Bath Mode.");
+ }
+ mLastRecipe = null;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java
new file mode 100644
index 0000000000..15ae5a96f8
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialWireMill
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialWireMill> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialWireMill> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialWireMill(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ inputSeparation = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialWireMill(final String aName) {
+ super(aName);
+ inputSeparation = true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialWireMill(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Wiremill";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Wire Factory")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Wire Factory Casings", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialWireMill> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialWireMill>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialWireMill.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_RECYCLER_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(6);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.wiremillRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ inputSeparation ? "interaction.separateBusses.enabled" : "interaction.separateBusses.disabled"));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWireMill;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ public byte getCasingMeta() {
+ return 6;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(6);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java
new file mode 100644
index 0000000000..c14cae9b88
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java
@@ -0,0 +1,529 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_MillingBalls;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+
+public class GregtechMetaTileEntity_IsaMill extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IsaMill>
+ implements ISurvivalConstructable {
+
+ protected boolean boostEu = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IsaMill> STRUCTURE_DEFINITION = null;
+
+ private static final IIconContainer frontFaceActive = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE5");
+ private static final IIconContainer frontFace = new CustomIcon("iconsets/Grinder/GRINDER5");
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_MillingBalls> mMillingBallBuses = new ArrayList<>();
+ private static final DamageSource mIsaMillDamageSource = new DamageSource("gtpp.grinder").setDamageBypassesArmor();
+
+ public GregtechMetaTileEntity_IsaMill(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IsaMill(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Grinding Machine")
+ .addInfo("Grind ores.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 7, false)
+ .addController("Front Center")
+ .addCasingInfoMin("IsaMill Exterior Casing", 40, false)
+ .addOtherStructurePart("IsaMill Gearbox", "5x, Inner Blocks")
+ .addOtherStructurePart("IsaMill Piping", "8x, ring around controller")
+ .addStructureInfo("IsaMill Pipings must not be obstructed in front (only air blocks)")
+ .addOtherStructurePart("Milling Ball Hatch", "Any Casing")
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IsaMill> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IsaMill>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "DDD", "CCC", "CCC", "CCC", "CCC", "CCC", "CCC" },
+ { "D~D", "CGC", "CGC", "CGC", "CGC", "CGC", "CCC" },
+ { "DDD", "CCC", "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IsaMill.class)
+ .adder(GregtechMetaTileEntity_IsaMill::addMillingBallsHatch)
+ .hatchClass(GT_MetaTileEntity_Hatch_MillingBalls.class)
+ .shouldReject(t -> !t.mMillingBallBuses.isEmpty())
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IsaMill.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('D', ofBlock(getIntakeBlock(), getIntakeMeta()))
+ .addElement('G', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mMillingBallBuses.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 48 - 8 && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && mMillingBallBuses.size() == 1;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return frontFaceActive;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return frontFace;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(2);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ private boolean addMillingBallsHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MillingBalls) {
+ return addToMachineListInternal(mMillingBallBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MillingBalls) {
+ log("Found GT_MetaTileEntity_Hatch_MillingBalls");
+ return addToMachineListInternal(mMillingBallBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.millingRecipes;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mMillingBallBuses.clear();
+ }
+ }
+ if (aTick % 20 == 0 && isMachineRunning()) {
+ checkForEntities(aBaseMetaTileEntity, aTick);
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ private final AutoMap<BlockPos> mFrontBlockPosCache = new AutoMap<>();
+
+ public void checkForEntities(IGregTechTileEntity aBaseMetaTileEntity, long aTime) {
+
+ if (aTime % 100 == 0) {
+ mFrontBlockPosCache.clear();
+ }
+ if (mFrontBlockPosCache.isEmpty()) {
+ ForgeDirection tSide = aBaseMetaTileEntity.getBackFacing();
+ int aTileX = aBaseMetaTileEntity.getXCoord();
+ int aTileY = aBaseMetaTileEntity.getYCoord();
+ int aTileZ = aBaseMetaTileEntity.getZCoord();
+ boolean xFacing = tSide.offsetX != 0;
+ boolean zFacing = tSide.offsetZ != 0;
+
+ // Check Casings
+ int aDepthOffset = (tSide == ForgeDirection.NORTH || tSide == ForgeDirection.WEST) ? 1 : -1;
+ for (int aHorizontalOffset = -1; aHorizontalOffset < 2; aHorizontalOffset++) {
+ for (int aVerticalOffset = -1; aVerticalOffset < 2; aVerticalOffset++) {
+ int aX = !xFacing ? (aTileX + aHorizontalOffset) : (aTileX + aDepthOffset);
+ int aY = aTileY + aVerticalOffset;
+ int aZ = !zFacing ? (aTileZ + aHorizontalOffset) : (aTileZ + aDepthOffset);
+ mFrontBlockPosCache.add(new BlockPos(aX, aY, aZ, aBaseMetaTileEntity.getWorld()));
+ }
+ }
+ }
+
+ AutoMap<EntityLivingBase> aEntities = getEntities(mFrontBlockPosCache, aBaseMetaTileEntity.getWorld());
+ if (!aEntities.isEmpty()) {
+ for (EntityLivingBase aFoundEntity : aEntities) {
+ if (aFoundEntity instanceof EntityPlayer aPlayer) {
+ if (PlayerUtils.isCreative(aPlayer) || !PlayerUtils.canTakeDamage(aPlayer)) {
+ continue;
+ } else {
+ if (aFoundEntity.getHealth() > 0) {
+ EntityUtils.doDamage(aFoundEntity, mIsaMillDamageSource, getPlayerDamageValue(aPlayer, 10));
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+ generateParticles(aFoundEntity);
+ }
+ }
+ }
+ } else if (aFoundEntity.getHealth() > 0) {
+ EntityUtils.doDamage(
+ aFoundEntity,
+ mIsaMillDamageSource,
+ Math.max(1, (int) (aFoundEntity.getMaxHealth() / 3)));
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+ generateParticles(aFoundEntity);
+ }
+ }
+ }
+ }
+ }
+
+ // 20 armor points add 80% damage reduction, more points add more damage reduction
+ private int getPlayerDamageValue(EntityPlayer player, int damage) {
+ int armorValue = player.getTotalArmorValue();
+ int reducedDamage = (int) (damage - damage * (armorValue * 0.04));
+ return Math.max(reducedDamage, 0);
+ }
+
+ private static AutoMap<EntityLivingBase> getEntities(AutoMap<BlockPos> aPositionsToCheck, World aWorld) {
+ AutoMap<EntityLivingBase> aEntities = new AutoMap<>();
+ HashSet<Chunk> aChunksToCheck = new HashSet<>();
+ if (!aPositionsToCheck.isEmpty()) {
+ Chunk aLocalChunk;
+ for (BlockPos aPos : aPositionsToCheck) {
+ aLocalChunk = aWorld.getChunkFromBlockCoords(aPos.xPos, aPos.zPos);
+ aChunksToCheck.add(aLocalChunk);
+ }
+ }
+ if (!aChunksToCheck.isEmpty()) {
+ AutoMap<EntityLivingBase> aEntitiesFound = new AutoMap<>();
+ for (Chunk aChunk : aChunksToCheck) {
+ if (aChunk.isChunkLoaded) {
+ List[] aEntityLists = aChunk.entityLists;
+ for (List aEntitySubList : aEntityLists) {
+ for (Object aEntity : aEntitySubList) {
+ if (aEntity instanceof EntityLivingBase aPlayer) {
+ aEntitiesFound.add(aPlayer);
+ }
+ }
+ }
+ }
+ }
+ if (!aEntitiesFound.isEmpty()) {
+ for (EntityLivingBase aEntity : aEntitiesFound) {
+ BlockPos aPlayerPos = EntityUtils.findBlockPosOfEntity(aEntity);
+ for (BlockPos aBlockSpaceToCheck : aPositionsToCheck) {
+ if (aBlockSpaceToCheck.equals(aPlayerPos)) {
+ aEntities.add(aEntity);
+ }
+ }
+ }
+ }
+ }
+ return aEntities;
+ }
+
+ private static void generateParticles(EntityLivingBase aEntity) {
+ BlockPos aPlayerPosBottom = EntityUtils.findBlockPosOfEntity(aEntity);
+ BlockPos aPlayerPosTop = aPlayerPosBottom.getUp();
+ AutoMap<BlockPos> aEntityPositions = new AutoMap<>();
+ aEntityPositions.add(aPlayerPosBottom);
+ aEntityPositions.add(aPlayerPosTop);
+ for (int i = 0; i < 64; i++) {
+ BlockPos aEffectPos = aEntityPositions.get(aEntity.height > 1f ? MathUtils.randInt(0, 1) : 0);
+ float aOffsetX = MathUtils.randFloat(-0.35f, 0.35f);
+ float aOffsetY = MathUtils.randFloat(-0.25f, 0.35f);
+ float aOffsetZ = MathUtils.randFloat(-0.35f, 0.35f);
+ aEntity.worldObj.spawnParticle(
+ "reddust",
+ aEffectPos.xPos + aOffsetX,
+ aEffectPos.yPos + 0.3f + aOffsetY,
+ aEffectPos.zPos + aOffsetZ,
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public Block getIntakeBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getIntakeMeta() {
+ return 1;
+ }
+
+ public Block getGearboxBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getGearboxMeta() {
+ return 2;
+ }
+
+ public byte getCasingTextureIndex() {
+ return 66;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IsaMill(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIsaMill;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "IsaMill Grinding Machine", "Current Efficiency: " + (mEfficiency / 100) + "%",
+ getIdealStatus() == getRepairStatus() ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Grinding Machine";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ /*
+ * Milling Ball Handling
+ */
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> tItems = super.getStoredInputs();
+ for (GT_MetaTileEntity_Hatch_MillingBalls tHatch : filterValidMTEs(mMillingBallBuses)) {
+ AutoMap<ItemStack> aHatchContent = tHatch.getContentUsageSlots();
+ if (!aHatchContent.isEmpty()) {
+ tItems.addAll(aHatchContent);
+ }
+ }
+ return tItems;
+ }
+
+ public int getMaxBallDurability(ItemStack aStack) {
+ return ItemGenericChemBase.getMaxBallDurability(aStack);
+ }
+
+ private ItemStack findMillingBall(ItemStack[] aItemInputs) {
+ if (mMillingBallBuses.size() != 1) {
+ return null;
+ } else {
+ GT_MetaTileEntity_Hatch_MillingBalls aBus = mMillingBallBuses.get(0);
+ if (aBus != null) {
+ AutoMap<ItemStack> aAvailableItems = aBus.getContentUsageSlots();
+ if (!aAvailableItems.isEmpty()) {
+ for (final ItemStack aInput : aItemInputs) {
+ if (ItemUtils.isMillingBall(aInput)) {
+ for (ItemStack aBall : aAvailableItems) {
+ if (GT_Utility.areStacksEqual(aBall, aInput, true)) {
+ Logger.INFO("Found a valid milling ball to use.");
+ return aBall;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private void damageMillingBall(ItemStack aStack) {
+ if (MathUtils.randFloat(0, 10000000) / 10000000f < (1.2f - (0.2 * 1))) {
+ int damage = getMillingBallDamage(aStack) + 1;
+ log("damage milling ball " + damage);
+ if (damage >= getMaxBallDurability(aStack)) {
+ log("consuming milling ball");
+ aStack.stackSize -= 1;
+ } else {
+ setDamage(aStack, damage);
+ }
+ } else {
+ log("not damaging milling ball");
+ }
+ }
+
+ private int getMillingBallDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getMillingBallDamage(aStack);
+ }
+
+ private void setDamage(ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setMillingBallDamage(aStack, aAmount);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ ItemStack millingBall;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ millingBall = findMillingBall(inputItems);
+ if (millingBall == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_milling_ball");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (result.wasSuccessful()) {
+ damageMillingBall(millingBall);
+ }
+ return result;
+ }
+ }.enablePerfectOverclock();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java
new file mode 100644
index 0000000000..6d1593bec9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java
@@ -0,0 +1,224 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_NuclearSaltProcessingPlant extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_NuclearSaltProcessingPlant> implements ISurvivalConstructable {
+
+ protected GT_Recipe lastRecipeToBuffer;
+ private int casing;
+ private static IStructureDefinition<GregtechMetaTileEntity_NuclearSaltProcessingPlant> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_NuclearSaltProcessingPlant(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_NuclearSaltProcessingPlant(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Reactor Processing Unit, Cold Trap";
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity tileEntity) {
+ return new GregtechMetaTileEntity_NuclearSaltProcessingPlant(this.mName);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack itemStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Nuclear Salt Processing Plant")
+ .addInfo("Processes depleted nuclear salts that come from the LFTR")
+ .addInfo("Handles the recipes of the Reactor Processor Unit and Cold Trap")
+ .addInfo("Only Thermally Insulated Casings can be replaced with hatches")
+ .addInfo("Mufflers on top, Energy Hatches on bottom, exactly 2 of each are required")
+ .addInfo("Maintenance Hatch goes on the back, opposite of the controller block")
+ .addInfo("Inputs go on the left side of the multi, outputs on the right side")
+ .addInfo("150% faster than using single block machines of the same voltage")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("IV Machine Casing", 58, false)
+ .addCasingInfoMin("Thermally Insulated Casing", 1, false)
+ .addInputBus("Left Half", 2)
+ .addInputHatch("Left Half", 2)
+ .addOutputBus("Right Half", 3)
+ .addOutputHatch("Right Half", 3)
+ .addMufflerHatch("Top Side, 2 Required", 4)
+ .addEnergyHatch("Bottom Side, 2 Required", 5)
+ .addMaintenanceHatch("Back Side, Opposite of Controller", 6)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_NuclearSaltProcessingPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_NuclearSaltProcessingPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "AAA AAA", "ADA ADA", "AAA AAA" },
+ { "ABBA ACCA", "B AAA C", "ABBA ACCA" }, { "ABBB~CCCA", "B C", "ABBBFCCCA" },
+ { "ABBA ACCA", "B AAA C", "ABBA ACCA" }, { "AAA AAA", "AEA AEA", "AAA AAA" } }))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings1, 5))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class)
+ .atLeast(InputBus, InputHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(2)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class)
+ .atLeast(OutputBus, OutputHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(3)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'D',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(4)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'E',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Energy)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'F',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Maintenance)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(6)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean hintsOnly) {
+ buildPiece(mName, itemStack, hintsOnly, 4, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, itemStack, 4, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity baseMetaTileEntity, ItemStack itemStack) {
+ casing = 0;
+ return checkPiece(mName, 4, 2, 0) && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return mEnergyHatches.size() == 2 && mMufflerHatches.size() == 2 && super.checkHatch();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String running = (this.mMaxProgresstime > 0 ? "Salt Plant running" : "Salt Plant stopped");
+ final String maintenance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintenance issues"
+ : "Needs Maintenance");
+ String tSpecialText;
+
+ if (lastRecipeToBuffer != null && lastRecipeToBuffer.mOutputs[0].getDisplayName() != null) {
+ tSpecialText = "Currently processing: " + lastRecipeToBuffer.mOutputs[0].getDisplayName();
+ } else {
+ tSpecialText = "Currently processing: Nothing";
+ }
+
+ return new String[] { "Nuclear Salt Processing Plant", running, maintenance, tSpecialText };
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java
new file mode 100644
index 0000000000..5f4203b99e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java
@@ -0,0 +1,507 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GasSpargingRecipe;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_SpargeTower extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_SpargeTower>
+ implements ISurvivalConstructable {
+
+ protected static final String STRUCTURE_PIECE_BASE = "base";
+ protected static final String STRUCTURE_PIECE_LAYER = "layer";
+ protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint";
+ protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint";
+ private static final IStructureDefinition<GregtechMetaTileEntity_SpargeTower> STRUCTURE_DEFINITION;
+
+ static {
+ IHatchElement<GregtechMetaTileEntity_SpargeTower> layeredOutputHatch = OutputHatch
+ .withCount(GregtechMetaTileEntity_SpargeTower::getCurrentLayerOutputHatchCount)
+ .withAdder(GregtechMetaTileEntity_SpargeTower::addLayerOutputHatch);
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SpargeTower>builder()
+ .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" } }))
+ .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" } }))
+ .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "lll", "lll", "lll" } }))
+ .addElement(
+ 'b',
+ buildHatchAdder(GregtechMetaTileEntity_SpargeTower.class)
+ .atLeast(Energy, InputHatch, InputBus, Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(getCasingIndex())
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GregtechMetaTileEntity_SpargeTower::onCasingFound,
+ ofBlock(ModBlocks.blockCasings5Misc, 4))))
+ .addElement(
+ 'l',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_SpargeTower.class).atLeast(layeredOutputHatch)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(getCasingIndex())
+ .dot(2)
+ .build(),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addEnergyInputToMachineList, getCasingIndex(), 2),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addMaintenanceToMachineList, getCasingIndex(), 2),
+ onElementPass(
+ GregtechMetaTileEntity_SpargeTower::onCasingFound,
+ ofBlock(ModBlocks.blockCasings5Misc, 4))))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addOutputToMachineList, getCasingIndex(), 3)),
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(
+ GregtechMetaTileEntity_SpargeTower::addMaintenanceToMachineList,
+ getCasingIndex(),
+ 3)),
+ onElementPass(t -> t.onTopLayerFound(true), ofBlock(ModBlocks.blockCasings5Misc, 4)),
+ isAir()))
+ .build();
+ }
+
+ protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
+ protected int mHeight;
+ protected int mCasing;
+ protected boolean mTopLayerFound;
+
+ public GregtechMetaTileEntity_SpargeTower(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_SpargeTower(String aName) {
+ super(aName);
+ }
+
+ public static int getCasingIndex() {
+ return 68;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_SpargeTower(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Gas Sparge Tower")
+ .addInfo("Controller block for the Sparging Tower")
+ .addInfo("Runs gases through depleted molten salts to extract precious fluids")
+ .addInfo("Works the same way as the Distillation Tower, but with a fixed height of 8")
+ .addInfo("Fluids are only put out at the correct height")
+ .addInfo("The correct height equals the slot number in the NEI recipe")
+ .addSeparator()
+ .beginStructureBlock(3, 8, 3, true)
+ .addController("Front bottom")
+ .addOtherStructurePart("Sparge Tower Exterior Casing", "45 (minimum)")
+ .addEnergyHatch("Any casing", 1, 2)
+ .addMaintenanceHatch("Any casing", 1, 2, 3)
+ .addInputHatch("2x Input Hatches (Any bottom layer casing)", 1)
+ .addOutputHatch("6x Output Hatches (At least one per layer except bottom layer)", 2, 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ if (GTPPRecipeMaps.spargeTowerFakeRecipes.getAllRecipes()
+ .isEmpty()) {
+ generateRecipes();
+ }
+ return GTPPRecipeMaps.spargeTowerFakeRecipes;
+ }
+
+ private static boolean generateRecipes() {
+ for (GasSpargingRecipe aRecipe : GasSpargingRecipeMap.mRecipes) {
+ GT_Recipe newRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ null,
+ aRecipe.mFluidInputs.clone(),
+ new FluidStack[] {},
+ aRecipe.mDuration,
+ aRecipe.mEUt,
+ 0);
+ GTPPRecipeMaps.spargeTowerFakeRecipes.add(newRecipe);
+ }
+ return !GTPPRecipeMaps.spargeTowerFakeRecipes.getAllRecipes()
+ .isEmpty();
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> tFluidList = getStoredFluids();
+ long tVoltage = GT_Utility.roundUpVoltage(this.getMaxInputVoltage());
+ byte tTier = (byte) Math.max(0, GT_Utility.getTier(tVoltage));
+ FluidStack[] tFluids = tFluidList.toArray(new FluidStack[0]);
+ if (tFluids.length > 0) {
+ GT_Recipe tRecipe = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), false, gregtech.api.enums.GT_Values.V[tTier], tFluids);
+ if (tRecipe != null) {
+ FluidStack[] possibleOutputs = getPossibleByproductsOfSparge(
+ tRecipe.mFluidInputs[0],
+ tRecipe.mFluidInputs[1]).toArray(new FluidStack[0]);
+ if (canOutputAll(possibleOutputs) && tRecipe.isRecipeInputEqual(true, tFluids)) {
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ calculateOverclockedNessMulti((long) tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage);
+ mMaxProgresstime = Math.max(1, mMaxProgresstime);
+ ArrayList<FluidStack> aFluidOutputs = getByproductsOfSparge(
+ tRecipe.mFluidInputs[0],
+ tRecipe.mFluidInputs[1]);
+ this.mOutputFluids = aFluidOutputs.toArray(new FluidStack[0]);
+ updateSlots();
+
+ if (lEUt > 0) {
+ lEUt = (-lEUt);
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ private static List<FluidStack> getPossibleByproductsOfSparge(final FluidStack aSpargeGas,
+ final FluidStack aSpentFuel) {
+ GasSpargingRecipe aSpargeRecipe = GasSpargingRecipeMap.findRecipe(aSpargeGas, aSpentFuel);
+ ArrayList<FluidStack> aOutputGases = new ArrayList<>();
+ if (aSpargeRecipe == null) {
+ return aOutputGases;
+ }
+
+ aOutputGases.add(aSpargeRecipe.mOutputSpargedFuel.copy());
+ ArrayList<FluidStack> aTempMap = new ArrayList<>();
+ for (int i = 2; i < aSpargeRecipe.mFluidOutputs.length; i++) {
+ int aGasAmount = aSpargeRecipe.mMaxOutputQuantity[i - 2] / 100;
+ FluidStack aOutput = aSpargeRecipe.mFluidOutputs[i].copy();
+ FluidStack aSpargeOutput = null;
+ if (aGasAmount > 0) {
+ aSpargeOutput = new FluidStack(aOutput.getFluid(), aGasAmount);
+ }
+ aTempMap.add(aSpargeOutput);
+ }
+ aOutputGases.add(new FluidStack(aSpargeRecipe.mInputGas.getFluid(), aSpargeRecipe.mInputGas.amount));
+ aOutputGases.addAll(aTempMap);
+ return aOutputGases;
+ }
+
+ private static ArrayList<FluidStack> getByproductsOfSparge(final FluidStack aSpargeGas,
+ final FluidStack aSpentFuel) {
+ GasSpargingRecipe aSpargeRecipe = GasSpargingRecipeMap.findRecipe(aSpargeGas, aSpentFuel);
+ ArrayList<FluidStack> aOutputGases = new ArrayList<>();
+ if (aSpargeRecipe == null) {
+ Logger.INFO("Did not find sparge recipe!");
+ return aOutputGases;
+ }
+ int aSpargeGasAmount = aSpargeRecipe.mInputGas.amount;
+
+ aOutputGases.add(aSpargeRecipe.mOutputSpargedFuel.copy());
+ ArrayList<FluidStack> aTempMap = new ArrayList<>();
+ for (int i = 2; i < aSpargeRecipe.mFluidOutputs.length; i++) {
+ int aGasAmount = MathUtils.randInt(0, (aSpargeRecipe.mMaxOutputQuantity[i - 2] / 100));
+ FluidStack aOutput = aSpargeRecipe.mFluidOutputs[i].copy();
+ aSpargeGasAmount -= aGasAmount;
+ FluidStack aSpargeOutput = null;
+ if (aGasAmount > 0) {
+ aSpargeOutput = new FluidStack(aOutput.getFluid(), aGasAmount);
+ }
+ aTempMap.add(aSpargeOutput);
+ }
+ Logger.INFO("Sparge gas left: " + aSpargeGasAmount);
+ if (aSpargeGasAmount > 0) {
+ aOutputGases.add(new FluidStack(aSpargeRecipe.mInputGas.getFluid(), aSpargeGasAmount));
+ }
+ // Logger.INFO("Sparge Outputs: "+ItemUtils.getArrayStackNames(aTempMap));
+ aOutputGases.addAll(aTempMap);
+ Logger.INFO("Sparge output size: " + aOutputGases.size());
+ // Logger.INFO("Output of sparging: "+ItemUtils.getArrayStackNames(aOutputGases));
+ return aOutputGases;
+ }
+
+ protected void onCasingFound() {
+ mCasing++;
+ }
+
+ protected void onTopLayerFound(boolean aIsCasing) {
+ mTopLayerFound = true;
+ if (aIsCasing) {
+ onCasingFound();
+ }
+ }
+
+ protected int getCurrentLayerOutputHatchCount() {
+ return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0
+ : mOutputHatchesByLayer.get(mHeight - 1)
+ .size();
+ }
+
+ protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null || aTileEntity.isDead()
+ || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) {
+ Logger.INFO("Bad Output Hatch");
+ return false;
+ }
+ while (mOutputHatchesByLayer.size() < mHeight) {
+ mOutputHatchesByLayer.add(new ArrayList<>());
+ }
+ tHatch.updateTexture(aBaseCasingIndex);
+ boolean addedHatch = mOutputHatchesByLayer.get(mHeight - 1)
+ .add(tHatch);
+ Logger.INFO("Added Hatch: " + addedHatch);
+ return addedHatch;
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a freaking tower, it won't work
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SpargeTower> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // reset
+ mOutputHatchesByLayer.forEach(List::clear);
+ mHeight = 1;
+ mTopLayerFound = false;
+ mCasing = 0;
+
+ // check base
+ if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) {
+ Logger.INFO("Bad Base. Height: " + mHeight);
+ return false;
+ }
+
+ // check each layer
+ while (mHeight < 8 && checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0) && !mTopLayerFound) {
+ if (mOutputHatchesByLayer.get(mHeight - 1)
+ .isEmpty()) {
+ // layer without output hatch
+ Logger.INFO("Height: " + mHeight + " - Missing output on " + (mHeight - 1));
+ return false;
+ }
+ // not top
+ mHeight++;
+ }
+
+ // validate final invariants...
+ Logger.INFO("Height: " + mHeight);
+ Logger.INFO("Casings: " + mCasing);
+ Logger.INFO("Required: " + (7 * mHeight - 5));
+ Logger.INFO("Found Top: " + mTopLayerFound);
+ return mCasing >= 45 && mTopLayerFound && mMaintenanceHatches.size() == 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) {
+ FluidStack tStack = mOutputFluids2[i] != null ? mOutputFluids2[i].copy() : null;
+ if (tStack == null) {
+ continue;
+ }
+ if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true)) {
+ dumpFluid(mOutputHatchesByLayer.get(i), tStack, false);
+ }
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0);
+ int tTotalHeight = 8; // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ mHeight = 0;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ int tTotalHeight = 8; // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ mHeight = i;
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_LAYER_HINT,
+ stackSize,
+ 1,
+ i,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+ mHeight = tTotalHeight - 1;
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_TOP_HINT,
+ stackSize,
+ 1,
+ tTotalHeight - 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Gas Sparger";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean onPlungerRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ int aLayerIndex = 0;
+ PlayerUtils
+ .messagePlayer(aPlayer, "Trying to clear " + mOutputHatchesByLayer.size() + " layers of output hatches.");
+ for (List<GT_MetaTileEntity_Hatch_Output> layer : this.mOutputHatchesByLayer) {
+ int aHatchIndex = 0;
+ for (GT_MetaTileEntity_Hatch_Output hatch : layer) {
+ if (hatch.mFluid != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Clearing " + hatch.mFluid.amount
+ + "L of "
+ + hatch.mFluid.getLocalizedName()
+ + " from hatch "
+ + aHatchIndex
+ + " on layer "
+ + aLayerIndex
+ + ".");
+ hatch.mFluid = null;
+ }
+ aHatchIndex++;
+ }
+ aLayerIndex++;
+ }
+ return aLayerIndex > 0;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ // Ensure that lEUt is negative from loaded NBT data, since this multi consumes EU
+ if (lEUt > 0) {
+ lEUt = (-lEUt);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java
new file mode 100644
index 0000000000..8296b8e7cb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java
@@ -0,0 +1,491 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_Adv_DistillationTower extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_DistillationTower> implements ISurvivalConstructable {
+
+ private Mode mMode = Mode.DistillationTower;
+ private boolean mUpgraded = false;
+
+ protected static final String STRUCTURE_PIECE_BASE = "base";
+ protected static final String STRUCTURE_PIECE_LAYER = "layer";
+ protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint";
+ protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint";
+
+ protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
+ protected int mHeight;
+ protected int mCasing;
+ protected boolean mTopLayerFound;
+
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_DistillationTower> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Adv_DistillationTower(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_DistillationTower(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_DistillationTower(this.mName);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_DistillationTower> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ IHatchElement<GregtechMetaTileEntity_Adv_DistillationTower> layeredOutputHatch = OutputHatch
+ .withCount(GregtechMetaTileEntity_Adv_DistillationTower::getCurrentLayerOutputHatchCount)
+ .withAdder(GregtechMetaTileEntity_Adv_DistillationTower::addLayerOutputHatch);
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_DistillationTower>builder()
+ .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "ttt", "ttt", "ttt" }, }))
+ .addElement(
+ 'b',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(Energy, OutputBus, InputHatch, InputBus, Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(getCasingTextureId())
+ .dot(1)
+ .build(),
+ ofBlock(GregTech_API.sBlockCasings4, 1)))
+ .addElement(
+ 'l',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(layeredOutputHatch, Energy, Maintenance)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(getCasingTextureId())
+ .dot(2)
+ .build(),
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMufflerToMachineList,
+ getCasingTextureId(),
+ 3),
+ ofBlock(GregTech_API.sBlockCasings4, 1)))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMufflerToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addOutputToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMaintenanceToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofBlock(GregTech_API.sBlockCasings4, 1)),
+ isAir()))
+ .addElement(
+ 't',
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(layeredOutputHatch, Muffler)
+ .disallowOnly(ForgeDirection.DOWN)
+ .casingIndex(getCasingTextureId())
+ .dot(2)
+ .buildAndChain(GregTech_API.sBlockCasings4, 1))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ protected int getCurrentLayerOutputHatchCount() {
+ return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0
+ : mOutputHatchesByLayer.get(mHeight - 1)
+ .size();
+ }
+
+ protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null || aTileEntity.isDead()
+ || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false;
+ while (mOutputHatchesByLayer.size() < mHeight) mOutputHatchesByLayer.add(new ArrayList<>());
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatchesByLayer.get(mHeight - 1)
+ .add(tHatch) && mOutputHatches.add(tHatch);
+ }
+
+ protected void onTopLayerFound() {
+ mTopLayerFound = true;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Advanced Distillation Tower")
+ .addInfo("Use 85% less energy in distillery mode")
+ .addInfo("250%/100% faster in DT/distillery mode")
+ .addInfo("Right click the controller with screwdriver to change mode.")
+ .addInfo("Max parallel dictated by tower tier and mode")
+ .addInfo("DTower Mode: T1=4, T2=12")
+ .addInfo("Distilery Mode: Tower Tier * (4*InputTier)")
+ .addInfo("Distilery Mode require a full height tower")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addCasingInfoMin("Clean Stainless Steel Machine Casing", 7, false)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addOutputHatch("One per layer except bottom", 2)
+ .addMufflerHatch("Top Casing", 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0);
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ mHeight = 0;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ mHeight = i;
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_LAYER_HINT,
+ stackSize,
+ 1,
+ i,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+ mHeight = tTotalHeight - 1;
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_TOP_HINT,
+ stackSize,
+ 1,
+ tTotalHeight - 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // reset
+ mOutputHatchesByLayer.forEach(List::clear);
+ mHeight = 1;
+ mTopLayerFound = false;
+
+ // check base
+ if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) return false;
+
+ // check each layer
+ while (mHeight < 12) {
+ if (!checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) {
+ return false;
+ }
+ if (mOutputHatchesByLayer.size() < mHeight || mOutputHatchesByLayer.get(mHeight - 1)
+ .isEmpty())
+ // layer without output hatch
+ return false;
+ if (mTopLayerFound || !mMufflerHatches.isEmpty()) {
+ break;
+ }
+ // not top
+ mHeight++;
+ }
+ boolean check = mTopLayerFound && mHeight >= 2 && checkHatch();
+ if (check && mHeight < 11) {
+ // force the mode to DT if not in full height
+ mMode = Mode.DistillationTower;
+ mLastRecipe = null;
+ }
+ return check;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mMode.getRecipeMap();
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.distilleryRecipes, RecipeMaps.distillationTowerRecipes);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a freaking tower, it won't work
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ if (this.mMode == Mode.Distillery)
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDistillery;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDT;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("mMode", (byte) mMode.ordinal());
+ aNBT.setBoolean("mUpgraded", mUpgraded);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mMode = Mode.values()[aNBT.getByte("mMode")];
+ mUpgraded = aNBT.getBoolean("mUpgraded");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (mHeight < 11) {
+ PlayerUtils.messagePlayer(aPlayer, "Cannot switch mode if not in full height.");
+ return;
+ }
+ mMode = mMode.next();
+ PlayerUtils.messagePlayer(aPlayer, "Now running in " + mMode + " Mode.");
+ mLastRecipe = null;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean addOutput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ FluidStack copiedFluidStack = aLiquid.copy();
+ for (List<GT_MetaTileEntity_Hatch_Output> hatches : mOutputHatchesByLayer) {
+ if (dumpFluid(hatches, copiedFluidStack, true)) return true;
+ }
+ for (List<GT_MetaTileEntity_Hatch_Output> hatches : mOutputHatchesByLayer) {
+ if (dumpFluid(hatches, copiedFluidStack, false)) return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ if (mMode == Mode.DistillationTower) {
+ // dt mode
+ for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) {
+ FluidStack tStack = mOutputFluids2[i].copy();
+ if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true))
+ dumpFluid(mOutputHatchesByLayer.get(i), tStack, false);
+ }
+ } else {
+ // distillery mode
+ for (FluidStack outputFluidStack : mOutputFluids2) {
+ addOutput(outputFluidStack);
+ }
+ }
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Distillery, Distillation Tower";
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.setEuModifier(mMode == Mode.Distillery ? 0.15F : 1F);
+ logic.setSpeedBonus(mMode == Mode.Distillery ? 1F / 2F : 1F / 3.5F);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return switch (mMode) {
+ case DistillationTower -> getTierOfTower() == 1 ? 4 : getTierOfTower() == 2 ? 12 : 0;
+ case Distillery -> getTierOfTower() * (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ default -> 0;
+ };
+ }
+
+ private int getTierOfTower() {
+ return mUpgraded ? 2 : 1;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 49;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aTick % 20 == 0 && !mUpgraded) {
+ ItemStack aGuiStack = this.getControllerSlot();
+ if (aGuiStack != null) {
+ if (GT_Utility.areStacksEqual(aGuiStack, GregtechItemList.Distillus_Upgrade_Chip.get(1))) {
+ this.mUpgraded = true;
+ mInventory[1] = ItemUtils.depleteStack(aGuiStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ // All fluids can be dumped to ME only if each layer contains a ME Output Hatch.
+ return this.mOutputHatchesByLayer.stream()
+ .allMatch(
+ tLayerOutputHatches -> tLayerOutputHatches.stream()
+ .anyMatch(tHatch -> tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME));
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mUpgraded", mUpgraded);
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ super.addAdditionalTooltipInformation(stack, tooltip);
+ NBTTagCompound aNBT = stack.getTagCompound();
+ if (aNBT != null && aNBT.hasKey("mUpgraded")) {
+ tooltip.add(StatCollector.translateToLocal("tooltip.large_distill_tower.upgraded"));
+ }
+ }
+
+ private enum Mode {
+
+ DistillationTower(RecipeMaps.distillationTowerRecipes),
+ Distillery(RecipeMaps.distilleryRecipes),;
+
+ static final Mode[] VALUES = values();
+ private final RecipeMap<?> recipeMap;
+
+ Mode(RecipeMap<?> recipeMap) {
+ this.recipeMap = recipeMap;
+ }
+
+ public RecipeMap<?> getRecipeMap() {
+ return recipeMap;
+ }
+
+ public Mode next() {
+ return VALUES[(ordinal() + 1) % VALUES.length];
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java
new file mode 100644
index 0000000000..89c219c14e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java
@@ -0,0 +1,333 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_EBF extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_EBF>
+ implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mHotFuelName = "Blazing Pyrotheum";
+ public static String mCasingName = "Volcanus Casing";
+ public static String mHatchName = "Pyrotheum Hatch";
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_EBF> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+ private final ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mPyrotheumHatches = new ArrayList<>();
+
+ private HeatingCoilLevel mHeatingCapacity = HeatingCoilLevel.None;
+
+ public GregtechMetaTileEntity_Adv_EBF(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 11);
+ }
+
+ public GregtechMetaTileEntity_Adv_EBF(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 11);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Blast Furnace";
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_EBF(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Blast Furnace")
+ .addInfo("Speed: +120% | EU Usage: 90% | Parallel: 8")
+ .addInfo("Consumes 10L of " + mHotFuelName + " per second during operation")
+ .addInfo("Constructed exactly the same as a normal EBF")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addController("Bottom center")
+ .addCasingInfoMin(mCasingName, 8, false)
+ .addInputHatch("Any Casing", 1)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addOtherStructurePart(mHatchName, "Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { StatCollector.translateToLocal("GT5U.EBF.heat") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mHeatingCapacity.getHeat())
+ + EnumChatFormatting.RESET
+ + " K" };
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_EBF> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_EBF>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_EBF.class)
+ .adder(GregtechMetaTileEntity_Adv_EBF::addPyrotheumHatch)
+ .hatchId(968)
+ .shouldReject(x -> !x.mPyrotheumHatches.isEmpty())
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_Adv_EBF.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 11))))
+ .addElement(
+ 'H',
+ ofCoil(GregtechMetaTileEntity_Adv_EBF::setCoilLevel, GregtechMetaTileEntity_Adv_EBF::getCoilLevel))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mPyrotheumHatches.clear();
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 3, 0) && mCasing >= 8 && getCoilLevel() != HeatingCoilLevel.None && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && !mPyrotheumHatches.isEmpty();
+ }
+
+ private boolean addPyrotheumHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase
+ && aMetaTileEntity.getBaseMetaTileEntity()
+ .getMetaTileID() == 968) {
+ return addToMachineListInternal(mPyrotheumHatches, aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mPyrotheumHatches)) tHatch.updateSlots();
+ super.updateSlots();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= getCoilLevel().getHeat() ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat((int) getCoilLevel().getHeat());
+ }
+ }.setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvEBF;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ private int mGraceTimer = 2;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ // Try dry Pyrotheum after all other logic
+ if (this.mStartUpCheck < 0) {
+ if (this.mMaxProgresstime > 0 && this.mProgresstime != 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (aTick % 10 == 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (!this.depleteInputFromRestrictedHatches(this.mPyrotheumHatches, 5)) {
+ if (mGraceTimer-- == 0) {
+ this.causeMaintenanceIssue();
+ this.stopMachine(
+ ShutDownReasonRegistry
+ .outOfFluid(Objects.requireNonNull(FluidUtils.getFluidStack("pyrotheum", 10))));
+ mGraceTimer = 2;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ inputSeparation ? "interaction.separateBusses.enabled" : "interaction.separateBusses.disabled"));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java
new file mode 100644
index 0000000000..0981a34b85
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import java.lang.reflect.Method;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.AdvancedFusionOverclockDescriber;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Fusion_MK4 extends GT_MetaTileEntity_FusionComputer {
+
+ public static final Method mUpdateHatchTexture;
+
+ static {
+ mUpdateHatchTexture = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK4(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK4(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected OverclockDescriber createOverclockDescriber() {
+ return new AdvancedFusionOverclockDescriber((byte) tier(), capableStartupCanonical());
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("HARNESSING THE POWER OF A BLUE GIANT")
+ .addInfo("Controller block for the Fusion Reactor Mk IV")
+ .addInfo("131072EU/t and 320M EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addInfo("Performs 4/4 overclocks")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoMin("Fusion Machine Casings MK III", 79, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Advanced Fusion Coils", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be UHV or better")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public int tier() {
+ return 9;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640010000L * 4) * (Math.min(16, this.mEnergyHatches.size())) / 8L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 5_120_000_000L;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Fusion_MK4(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return getFusionCoil();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 12;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 13;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return super.createProcessingLogic().setOverclock(2, 2);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)),
+ TextureFactory.builder()
+ .addIcon(this.getIconOverlay())
+ .extFacing()
+ .build() };
+ } else if (!aActive) {
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ } else {
+ return new ITexture[] { new GT_RenderedTexture(
+ TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_ULTRA,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ }
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return new GT_RenderedTexture(
+ this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_3 : TexturesGtBlock.Casing_Machine_Screen_1);
+ }
+
+ public IIconContainer getIconOverlay() {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_3 : TexturesGtBlock.Casing_Machine_Screen_1;
+ }
+
+ @Override
+ public boolean turnCasingActive(final boolean status) {
+ try {
+ if (this.mEnergyHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) {
+ mUpdateHatchTexture.invoke(hatch, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch2 : this.mOutputHatches) {
+ mUpdateHatchTexture.invoke(hatch2, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch3 : this.mInputHatches) {
+ mUpdateHatchTexture.invoke(hatch3, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ } catch (Throwable t) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String tier = "IV";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "Fusion Reactor MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + mEUStore + " / " + maxEUStore(), "Plasma Output: " + plasmaOut + "L/t" };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java
new file mode 100644
index 0000000000..b2c2e5eb27
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import java.lang.reflect.Method;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.AdvancedFusionOverclockDescriber;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Fusion_MK5 extends GT_MetaTileEntity_FusionComputer {
+
+ public static final Method mUpdateHatchTexture;
+
+ static {
+ mUpdateHatchTexture = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK5(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK5(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected OverclockDescriber createOverclockDescriber() {
+ return new AdvancedFusionOverclockDescriber((byte) tier(), capableStartupCanonical());
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("HARNESSING THE POWER OF A NEUTRON STAR")
+ .addInfo("Controller block for the Fusion Reactor Mk V")
+ .addInfo("524,288EU/t and 1.28B EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addInfo("Performs 4/4 overclocks")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoMin("Fusion Machine Casings MK IV", 79, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Advanced Fusion Coils II", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be UEV or better")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public int tier() {
+ return 10;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640010000L * 16) * (Math.min(16, this.mEnergyHatches.size())) / 8L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 20_480_000_000L;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Fusion_MK5(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return getFusionCoil();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return ModBlocks.blockCasings6Misc;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return super.createProcessingLogic().setOverclock(2, 2);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)),
+ TextureFactory.builder()
+ .addIcon(this.getIconOverlay())
+ .extFacing()
+ .build() };
+ } else if (!aActive) {
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ } else {
+ return new ITexture[] { new GT_RenderedTexture(
+ TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_HYPER,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ }
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return new GT_RenderedTexture(
+ this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_Rainbow : TexturesGtBlock.Casing_Machine_Screen_1);
+ }
+
+ public IIconContainer getIconOverlay() {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_Rainbow : TexturesGtBlock.Casing_Machine_Screen_1;
+ }
+
+ @Override
+ public boolean turnCasingActive(final boolean status) {
+ try {
+ if (this.mEnergyHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) {
+ mUpdateHatchTexture.invoke(hatch, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch2 : this.mOutputHatches) {
+ mUpdateHatchTexture.invoke(hatch2, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch3 : this.mInputHatches) {
+ mUpdateHatchTexture.invoke(hatch3, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ } catch (Throwable t) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String tier = "V";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "Fusion Reactor MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + mEUStore + " / " + maxEUStore(), "Plasma Output: " + plasmaOut + "L/t" };
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java
new file mode 100644
index 0000000000..e4340c4d28
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java
@@ -0,0 +1,414 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_HeatExchanger
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_HeatExchanger> {
+
+ private static final int CASING_INDEX = TAE.getIndexFromPage(1, 12);
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+
+ private static final IStructureDefinition<GregtechMetaTileEntity_Adv_HeatExchanger> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregtechMetaTileEntity_Adv_HeatExchanger>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { " ccc ", "cCCCc", "cCCCc", "cCCCc", " ccc " },
+ { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " },
+ { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " },
+ { " c~c ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " hhh ", "hHHHh", "hHHHh", "hHHHh", " hhh " },
+ { " f f ", "f f", " ", "f f", " f f " },
+ { " f f ", "f f", " ", "f f", " f f " }, }))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings2, 15))
+ .addElement('f', ofBlock(getFrame(), 0))
+ .addElement(
+ 'C',
+ ofChain(
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_HeatExchanger::addColdFluidOutputToMachineList,
+ CASING_INDEX,
+ 2),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'H',
+ ofChain(
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addHotFluidInputToMachineList, CASING_INDEX, 3),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'h',
+ ofChain(
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addInputToMachineList, CASING_INDEX, 1),
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addOutputToMachineList, CASING_INDEX, 1),
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addMaintenanceToMachineList, CASING_INDEX, 1),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .build();
+ public static float penalty_per_config = 0.015f; // penalize 1.5% efficiency per circuitry level (1-25)
+
+ private GT_MetaTileEntity_Hatch_Input mInputHotFluidHatch;
+ private GT_MetaTileEntity_Hatch_Output mOutputColdFluidHatch;
+ private boolean superheated = false;
+ private int superheated_threshold = 0;
+ private float water;
+ private int mCasingAmount;
+
+ public GregtechMetaTileEntity_Adv_HeatExchanger(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_HeatExchanger(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the XL Heat Exchanger")
+ .addInfo("More complicated than a Fusion Reactor. Seriously")
+ .addInfo("But you know this by now, right?")
+ .addInfo("Works as fast as 32 Large Heat Exchangers")
+ .addSeparator()
+ .addInfo("Inputs are Hot Coolant or Lava")
+ .addInfo("Outputs Coolant or Pahoehoe Lava and SH Steam/Steam")
+ .addInfo("Outputs SH Steam if input flow is equal to or above a certain value:")
+ .addInfo("Hot Coolant: 25,600 L/s, maximum 51,200 L/s, max output 10,240,000 SH Steam/s")
+ .addInfo("Lava: 32,000 L/s, maximum 64,000 L/s, max output 5,120,000 SH Steam/s")
+ .addInfo("A circuit in the controller lowers the SH Steam threshold and efficiency")
+ .addInfo("3.75% reduction and 1.5% efficiency loss per circuit config over 1")
+ .addSeparator()
+ .beginStructureBlock(5, 9, 5, false)
+ .addController("Front bottom")
+ .addCasingInfoMin("Reinforced Heat Exchanger Casing", 90, false)
+ .addOtherStructurePart("Tungstensteel Pipe Casing", "Center 3x5x3 (45 blocks)")
+ .addMaintenanceHatch("Any casing", 1)
+ .addInputHatch("Hot fluid, bottom center", 2)
+ .addInputHatch("Distilled water, any bottom layer casing", 1)
+ .addOutputHatch("Cold fluid, top center", 3)
+ .addOutputHatch("Steam/SH Steam, any bottom layer casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ superheated = aNBT.getBoolean("superheated");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("superheated", superheated);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_INDEX;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.SUCCESSFUL;
+
+ int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch
+
+ // The XL LHE works as fast as 32 regular LHEs. These are the comments from the original LHE,
+ // with changes where the values needed to change for the 32x speed multiplier
+ superheated_threshold = 128000; // default: must have 4000L -> 128000L per second to generate superheated steam
+ float efficiency = 1f; // default: operate at 100% efficiency with no integrated circuitry
+ int shs_reduction_per_config = 4800; // reduce threshold 150L -> 4800L per second per circuitry level (1-25)
+ float steam_output_multiplier = 20f; // default: multiply output by 4 * 10 (boosted x5)
+ float penalty = 0.0f; // penalty to apply to output based on circuitry level (1-25).
+ boolean do_lava = false;
+
+ // Do we have an integrated circuit with a valid configuration?
+ if (mInventory[1] != null && mInventory[1].getUnlocalizedName()
+ .startsWith("gt.integrated_circuit")) {
+ int circuit_config = mInventory[1].getItemDamage();
+ if (circuit_config >= 1 && circuit_config <= 25) {
+ // If so, apply the penalty and reduced threshold.
+ penalty = (circuit_config - 1) * penalty_per_config;
+ superheated_threshold -= (shs_reduction_per_config * (circuit_config - 1));
+ }
+ }
+ efficiency -= penalty;
+
+ // If we're working with lava, adjust the threshold and multipliers accordingly.
+ if (GT_ModHandler.isLava(mInputHotFluidHatch.getFluid())) {
+ steam_output_multiplier /= 5f; // lava is not boosted
+ superheated_threshold /= 4f; // unchanged
+ do_lava = true;
+ } else if (mInputHotFluidHatch.getFluid()
+ .isFluidEqual(FluidRegistry.getFluidStack("ic2hotcoolant", 1))) {
+ steam_output_multiplier /= 2f; // was boosted x2 on top of x5 -> total x10 -> nerf with this code back
+ // to 5x
+ superheated_threshold /= 5f; // 10x smaller since the Hot Things production in reactor is the same.
+ } else {
+ // If we're working with neither, fail out
+ superheated_threshold = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ superheated = fluidAmountToConsume >= superheated_threshold; // set the internal superheated flag if we have
+ // enough hot fluid. Used in the
+ // onRunningTick method.
+ fluidAmountToConsume = Math.min(fluidAmountToConsume, superheated_threshold * 2); // Don't consume too much hot
+ // fluid per second, maximum
+ // is 2x SH threshold.
+ mInputHotFluidHatch.drain(fluidAmountToConsume, true);
+ this.mMaxProgresstime = 20;
+ this.lEUt = (long) (fluidAmountToConsume * steam_output_multiplier * efficiency);
+ if (do_lava) {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2pahoehoelava", fluidAmountToConsume), true);
+ } else {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2coolant", fluidAmountToConsume), true);
+ }
+ this.mEfficiencyIncrease = 80;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ private int useWater(float input) {
+ water = water + input;
+ int usage = (int) water;
+ water = water - usage;
+ return usage;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.lEUt > 0) {
+ int tGeneratedEU = (int) (this.lEUt * 2L * this.mEfficiency / 10000L); // APPROXIMATELY how much steam to
+ // generate.
+ if (tGeneratedEU > 0) {
+
+ if (superheated) tGeneratedEU /= 2; // We produce half as much superheated steam if necessary
+
+ int distilledConsumed = useWater(tGeneratedEU / 160f); // how much distilled water to consume
+ // tGeneratedEU = distilledConsumed * 160; // EXACTLY how much steam to generate, producing a perfect
+ // 1:160 ratio with distilled water consumption
+
+ FluidStack distilledStack = GT_ModHandler.getDistilledWater(distilledConsumed);
+ if (depleteInput(distilledStack)) // Consume the distilled water
+ {
+ if (superheated) {
+ addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU)); // Generate
+ // superheated
+ // steam
+ } else {
+ addOutput(GT_ModHandler.getSteam(tGeneratedEU)); // Generate regular steam
+ }
+ } else {
+ GT_Log.exp.println(this.mName + " had no more Distilled water!");
+ explodeMultiblock(); // Generate crater
+ }
+ }
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_HeatExchanger> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mOutputColdFluidHatch = null;
+ mInputHotFluidHatch = null;
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 2, 5, 0) && mCasingAmount >= 90 && mMaintenanceHatches.size() == 1;
+ }
+
+ public boolean addColdFluidOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ mOutputColdFluidHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean addHotFluidInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ mInputHotFluidHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_HeatExchanger(this.mName);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return super.isGivingInformation();
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.steam")
+ + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW)
+ + GT_Utility.formatNumbers(superheated ? -2 * lEUt : -lEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.BLUE)
+ + superheated
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.threshold")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(superheated_threshold)
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 5, 0);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Heat Exchanger";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 0;
+ }
+
+ private static Block sFrame;
+
+ public static Block getFrame() {
+ if (sFrame == null) {
+ sFrame = BlockBaseModular.getMaterialBlock(ALLOY.TALONITE, BlockTypes.FRAME);
+ }
+ return sFrame;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java
new file mode 100644
index 0000000000..432ce23e74
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings4;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Implosion
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_Implosion> {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_Implosion> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Adv_Implosion(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Implosion(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Implosion(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Implosion Compressor";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Implosion Compressor")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: ((Tier/2)+1)")
+ .addInfo("Constructed exactly the same as a normal Implosion Compressor")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Robust TungstenSteel Casing", 10, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_Implosion> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_Implosion>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_Implosion.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(48)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings4, 0))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 48;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.implosionRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.RANDOM_EXPLODE;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvImplosion;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (GT_Utility.getTier(this.getMaxInputVoltage()) / 2 + 1);
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java
new file mode 100644
index 0000000000..0845c7f061
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings1;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_SteamMultiBase;
+
+public class GregtechMetaTileEntity_SteamCompressor
+ extends GregtechMeta_SteamMultiBase<GregtechMetaTileEntity_SteamCompressor> implements ISurvivalConstructable {
+
+ private String mCasingName = "Bronze Plated Bricks";
+ private static IStructureDefinition<GregtechMetaTileEntity_SteamCompressor> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+
+ public GregtechMetaTileEntity_SteamCompressor(String aName) {
+ super(aName);
+ }
+
+ public GregtechMetaTileEntity_SteamCompressor(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity arg0) {
+ return new GregtechMetaTileEntity_SteamCompressor(this.mName);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlay() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlayActive() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Compressor";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Steam Compressor")
+ .addInfo("33.3% faster than using a single block Steam Compressor.")
+ .addInfo("Uses only 66.6% of the steam/s compared to a single block Steam Compressor.")
+ .addInfo("Compresses up to " + getMaxParallelRecipes() + " things at a time")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 28, false)
+ .addOtherStructurePart(TT_steaminputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamoutputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamhatch, "Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SteamCompressor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SteamCompressor>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildSteamInput(GregtechMetaTileEntity_SteamCompressor.class).casingIndex(10)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_SteamCompressor.class)
+ .atLeast(SteamHatchElement.InputBus_Steam, SteamHatchElement.OutputBus_Steam)
+ .casingIndex(10)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings1, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ fixAllMaintenanceIssue();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 28;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.compressorRecipes;
+ }
+
+ // note that a basic steam machine has .setEUtDiscount(2F).setSpeedBoost(2F). So these are bonuses.
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe)
+ .setEUtDiscount(1.33F)
+ .setSpeedBoost(1.5F);
+ }
+ }.setMaxParallel(getMaxParallelRecipes());
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java
new file mode 100644
index 0000000000..dce362fa14
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings1;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_SteamMultiBase;
+
+public class GregtechMetaTileEntity_SteamMacerator
+ extends GregtechMeta_SteamMultiBase<GregtechMetaTileEntity_SteamMacerator> implements ISurvivalConstructable {
+
+ private String mCasingName = "Bronze Plated Bricks";
+ private static IStructureDefinition<GregtechMetaTileEntity_SteamMacerator> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+
+ public GregtechMetaTileEntity_SteamMacerator(String aName) {
+ super(aName);
+ }
+
+ public GregtechMetaTileEntity_SteamMacerator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity arg0) {
+ return new GregtechMetaTileEntity_SteamMacerator(this.mName);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlay() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlayActive() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Macerator";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ if (mCasingName.contains("gt.blockcasings")) {
+ mCasingName = ItemList.Casing_BronzePlatedBricks.get(1)
+ .getDisplayName();
+ }
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Steam Macerator")
+ .addInfo("33.3% faster than using a single block Steam Macerator.")
+ .addInfo("Uses only 66.6% of the steam/s required compared to a single block Steam Macerator.")
+ .addInfo("Macerates up to " + getMaxParallelRecipes() + " things at a time")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 14, false)
+ .addOtherStructurePart(TT_steaminputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamoutputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamhatch, "Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SteamMacerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SteamMacerator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildSteamInput(GregtechMetaTileEntity_SteamMacerator.class).casingIndex(10)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_SteamMacerator.class)
+ .atLeast(SteamHatchElement.InputBus_Steam, SteamHatchElement.OutputBus_Steam)
+ .casingIndex(10)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings1, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ fixAllMaintenanceIssue();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ // note that a basic steam machine has .setEUtDiscount(2F).setSpeedBoost(2F). So these are bonuses.
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe)
+ .setEUtDiscount(1.33F)
+ .setSpeedBoost(1.5F);
+ }
+
+ }.setMaxParallel(getMaxParallelRecipes());
+ }
+
+ @Override
+ public int getItemOutputLimit() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java
new file mode 100644
index 0000000000..6cae5e4bcd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java
@@ -0,0 +1,196 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GT4Entity_AutoCrafter extends GregtechMeta_MultiBlockBase<GT4Entity_AutoCrafter>
+ implements ISurvivalConstructable {
+
+ protected GT_Recipe lastRecipeToBuffer;
+ private int casing;
+ private static IStructureDefinition<GT4Entity_AutoCrafter> STRUCTURE_DEFINITION = null;
+
+ public GT4Entity_AutoCrafter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT4Entity_AutoCrafter(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Assembler";
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity tileEntity) {
+ return new GT4Entity_AutoCrafter(this.mName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack itemStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Highly Advanced Assembling Machine")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoRange("Bulk Production Frame", 10, 25, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public IStructureDefinition<GT4Entity_AutoCrafter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GT4Entity_AutoCrafter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GT4Entity_AutoCrafter.class)
+ .atLeast(InputBus, OutputBus, InputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean hintsOnly) {
+ buildPiece(mName, itemStack, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, itemStack, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity baseMetaTileEntity, ItemStack itemStack) {
+ casing = 0;
+ return checkPiece(mName, 1, 1, 0) && casing >= 10 && checkHatch();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.assemblerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String running = (this.mMaxProgresstime > 0 ? "Auto-Crafter running" : "Auto-Crafter stopped");
+ final String maintenance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintenance issues"
+ : "Needs Maintenance");
+ String tSpecialText;
+
+ if (lastRecipeToBuffer != null && lastRecipeToBuffer.mOutputs[0].getDisplayName() != null) {
+ tSpecialText = "Currently processing: " + lastRecipeToBuffer.mOutputs[0].getDisplayName();
+ } else {
+ tSpecialText = "Currently processing: Nothing";
+ }
+
+ return new String[] { "Large Scale Auto-Assembler v1.01c", running, maintenance, tSpecialText };
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java
new file mode 100644
index 0000000000..b7a4afb878
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java
@@ -0,0 +1,353 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT4Entity_ThermalBoiler extends GregtechMeta_MultiBlockBase<GT4Entity_ThermalBoiler>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GT4Entity_ThermalBoiler> STRUCTURE_DEFINITION = null;
+
+ private static final int lavaFilterResilience = 30; // Damage lava filter with 1/n probability every operation.
+ private int dryHeatCounter = 0; // Counts up to dryHeatMaximum to check for explosion conditions.
+ private static final int dryHeatMaximum = 10; // 10 consecutive operations without water = BOOM
+
+ private static final Item itemLavaFilter = ItemList.Component_LavaFilter.getItem();
+ private static final Item itemObsidian = Item.getItemFromBlock(Blocks.obsidian);
+ private static final Fluid fluidWater = FluidRegistry.WATER;
+ private static final Fluid fluidDistilledWater = FluidUtils.getDistilledWater(1)
+ .getFluid();
+ private static final Fluid fluidSteam = FluidUtils.getSteam(1)
+ .getFluid();
+ private static final Fluid fluidSHSteam = FluidUtils.getSuperHeatedSteam(1)
+ .getFluid();
+
+ public GT4Entity_ThermalBoiler(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT4Entity_ThermalBoiler(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT4Entity_ThermalBoiler(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Boiler";
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (aStack != null && aStack.getItem() == itemLavaFilter) ? 1 : 0;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.thermalBoilerRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ // Only test against the first fluid input in the recipe.
+ // We still want to run if we lack water (and subsequently explode).
+ @NotNull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (lastRecipe != null && depleteInput(lastRecipe.mFluidInputs[0], true)) {
+ return Stream.of(lastRecipe);
+ }
+ if (map == null) {
+ return Stream.empty();
+ }
+ return map.getAllRecipes()
+ .stream()
+ .filter(recipe -> depleteInput(recipe.mFluidInputs[0], true));
+ }
+
+ @NotNull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ GT_Recipe adjustedRecipe = recipe.copy();
+
+ // Hack the recipe logic to not consume water, so that we can explode.
+ for (FluidStack inputFluid : adjustedRecipe.mFluidInputs) {
+ if (inputFluid != null
+ && (inputFluid.getFluid() == fluidWater || inputFluid.getFluid() == fluidDistilledWater)) {
+ inputFluid.amount = 0;
+ }
+ }
+
+ // If we don't have a lava filter, remove non-obsidian outputs
+ // so that output space for them is not required if void protection is on.
+ if (!findLavaFilter()) {
+ for (ItemStack outputItem : adjustedRecipe.mOutputs) {
+ if (outputItem != null && outputItem.getItem() != itemObsidian) {
+ outputItem.stackSize = 0;
+ }
+ }
+ }
+ return super.createParallelHelper(adjustedRecipe);
+ }
+ };
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ // super.checkProcessing() instantly sets efficiency to maximum, override this.
+ int efficiency = mEfficiency;
+ CheckRecipeResult result = super.checkProcessing();
+ if (result.wasSuccessful()) {
+ mEfficiency = efficiency;
+ mEfficiencyIncrease = mMaxProgresstime * getEfficiencyIncrease();
+
+ // Adjust steam output based on efficiency.
+ if (mOutputFluids != null) {
+ for (FluidStack outputFluid : mOutputFluids) {
+ if (outputFluid != null
+ && (outputFluid.getFluid() == fluidSteam || outputFluid.getFluid() == fluidSHSteam)) {
+
+ // Purely for display reasons, we don't actually make any EU.
+ if (outputFluid.getFluid() == fluidSteam) {
+ lEUt = outputFluid.amount / mMaxProgresstime / 2;
+ } else {
+ lEUt = outputFluid.amount / mMaxProgresstime;
+ }
+
+ // Adjust steam output based on efficiency.
+ // TODO: This is not reflected in the GUI while the player has it open??
+ if (mEfficiency < getMaxEfficiency(null)) {
+ outputFluid.amount = Math
+ .max(1, (outputFluid.amount * mEfficiency) / getMaxEfficiency(null));
+ }
+
+ // Consume water to run recipe.
+ if (!useWater(outputFluid.amount)) {
+ outputFluid.amount = 0;
+ lEUt = 0;
+ }
+ }
+ }
+ }
+
+ // Remove non-obsidian outputs if we can't damage lava filter.
+ if (mOutputItems != null && mOutputItems.length > 0) {
+ if (!damageLavaFilter()) {
+ for (ItemStack outputItem : mOutputItems) {
+ if (outputItem != null && outputItem.getItem() != itemObsidian) {
+ outputItem.stackSize = 0;
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ private boolean findLavaFilter() {
+ if (getControllerSlot() == null) {
+ for (var bus : mInputBusses) {
+ for (ItemStack stack : bus.mInventory) {
+ if (stack != null && stack.getItem() == itemLavaFilter) {
+ setGUIItemStack(stack);
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ return getControllerSlot().getItem() == itemLavaFilter;
+ }
+ }
+
+ private boolean damageLavaFilter() {
+ if (!findLavaFilter()) return false;
+ if (getBaseMetaTileEntity().getRandomNumber(lavaFilterResilience) > 0) return true;
+
+ ItemStack filter = getControllerSlot();
+ if (filter.attemptDamageItem(1, getBaseMetaTileEntity().getWorld().rand)) {
+ mInventory[1] = null;
+ }
+ return true;
+ }
+
+ private boolean useWater(int steamAmount) {
+ // Round up to not dupe decimal amounts of water.
+ int waterAmount = Math.floorDiv(steamAmount + GT_Values.STEAM_PER_WATER - 1, GT_Values.STEAM_PER_WATER);
+ if (depleteInput(FluidUtils.getWater(waterAmount)) || depleteInput(FluidUtils.getDistilledWater(waterAmount))) {
+ dryHeatCounter = 0;
+ return true;
+ } else {
+ // Add some leniency with explosions.
+ if (dryHeatCounter < dryHeatMaximum) {
+ ++dryHeatCounter;
+ } else {
+ GT_Log.exp.println(this.mName + " was too hot and had no more Water!");
+ explodeMultiblock(); // Generate crater
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ public int getEfficiencyIncrease() {
+ return 12;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiThermalBoiler;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Thermal Boiler Controller")
+ .addInfo("Converts Water & Heat into Steam")
+ .addInfo("Filters raw materials from lava")
+ .addInfo("Explodes if water is not supplied")
+ .addInfo("Consult user manual for more information")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Thermal Containment Casings", 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(1);
+ }
+
+ @Override
+ public IStructureDefinition<GT4Entity_ThermalBoiler> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GT4Entity_ThermalBoiler>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GT4Entity_ThermalBoiler.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 1))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 11))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java
new file mode 100644
index 0000000000..d835d9be4c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java
@@ -0,0 +1,352 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_ElementalDataOrbHolder;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMTE_ElementalDuplicator extends GregtechMeta_MultiBlockBase<GregtechMTE_ElementalDuplicator>
+ implements ISurvivalConstructable {
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_ElementalDataOrbHolder> mReplicatorDataOrbHatches = new ArrayList<>();
+ private static final int CASING_TEXTURE_ID = TAE.getIndexFromPage(0, 3);
+ private int mCasing = 0;
+
+ public GregtechMTE_ElementalDuplicator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_ElementalDuplicator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_ElementalDuplicator(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Replicator";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Produces Elemental Material from UU Matter")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: 8 * Tier")
+ .addInfo("Maximum 1x of each bus/hatch.")
+ .addInfo("Requires circuit 1-16 in your Data Orb Repository")
+ .addInfo("depending on what Data Orb you want to prioritize")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 6, 9, true)
+ .addController("Top Center")
+ .addCasingInfoMin("Elemental Confinement Shell", 138, false)
+ .addCasingInfoMin("Matter Fabricator Casing", 24, false)
+ .addCasingInfoMin("Particle Containment Casing", 24, false)
+ .addCasingInfoMin("Matter Generation Coil", 24, false)
+ .addCasingInfoMin("High Voltage Current Capacitor", 20, false)
+ .addCasingInfoMin("Resonance Chamber III", 24, false)
+ .addCasingInfoMin("Modulator III", 16, false)
+ .addOtherStructurePart("Data Orb Repository", "1x", 1)
+ .addInputHatch("Any 1 dot hint", 1)
+ .addOutputBus("Any 1 dot hint", 1)
+ .addOutputHatch("Any 1 dot hint", 1)
+ .addEnergyHatch("Any 1 dot hint", 1)
+ .addMaintenanceHatch("Any 1 dot hint", 1)
+ .addMufflerHatch("Any 1 dot hint", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static IStructureDefinition<GregtechMTE_ElementalDuplicator> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IStructureDefinition<GregtechMTE_ElementalDuplicator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_ElementalDuplicator>builder()
+
+ // h = Hatch
+ // c = Casing
+
+ // a = MF Casing 1
+ // b = Matter Gen Coil
+
+ // d = Current Capacitor
+ // e = Particle
+
+ // f = Resonance III
+ // g = Modulator III
+
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] {
+ { " ccc ", " ccccc ", " ccccccc ", "ccchhhccc", "ccch~hccc", "ccchhhccc", " ccccccc ",
+ " ccccc ", " ccc " },
+ { " cac ", " abfba ", " abfgfba ", "cbfgdgfbc", "afgdddgfa", "cbfgdgfbc", " abfgfba ",
+ " abfba ", " cac " },
+ { " cec ", " e e ", " e e ", "c d c", "e ddd e", "c d c", " e e ",
+ " e e ", " cec " },
+ { " cec ", " e e ", " e e ", "c d c", "e ddd e", "c d c", " e e ",
+ " e e ", " cec " },
+ { " cac ", " abfba ", " abfgfba ", "cbfgdgfbc", "afgdddgfa", "cbfgdgfbc", " abfgfba ",
+ " abfba ", " cac " },
+ { " ccc ", " ccccc ", " ccccccc ", "ccchhhccc", "ccchhhccc", "ccchhhccc", " ccccccc ",
+ " ccccc ", " ccc " }, }))
+ .addElement('a', ofBlock(getCasingBlock4(), getCasingMeta6()))
+ .addElement('b', ofBlock(getCasingBlock4(), getCasingMeta7()))
+ .addElement('d', ofBlock(getCasingBlock2(), getCasingMeta2()))
+ .addElement('e', ofBlock(getCasingBlock2(), getCasingMeta3()))
+ .addElement('f', ofBlock(getCasingBlock3(), getCasingMeta4()))
+ .addElement('g', ofBlock(getCasingBlock3(), getCasingMeta5()))
+ .addElement('c', lazy(t -> onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement(
+ 'h',
+ lazy(
+ t -> ofChain(
+ buildHatchAdder(GregtechMTE_ElementalDuplicator.class)
+ .atLeast(InputHatch, OutputBus, OutputHatch, Maintenance, Muffler, Energy)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ElementalDuplicator.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.class)
+ .shouldReject(x -> x.mReplicatorDataOrbHatches.size() >= 1)
+ .adder(GregtechMTE_ElementalDuplicator::addDataOrbHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta())))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 4, 0);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aDidBuild = checkPiece(STRUCTURE_PIECE_MAIN, 4, 4, 0);
+ if (this.mInputHatches.size() != 1 || (this.mOutputBusses.size() != 1 && this.mOutputHatches.size() != 0)
+ || this.mEnergyHatches.size() != 1
+ || this.mReplicatorDataOrbHatches.size() != 1) {
+ return false;
+ }
+ log("Casings: " + mCasing);
+ return aDidBuild && mCasing >= 138 && checkHatch();
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, itemStack, 4, 4, 0, elementBudget, env, false, true);
+ }
+
+ protected static int getCasingTextureIndex() {
+ return CASING_TEXTURE_ID;
+ }
+
+ protected static Block getCasingBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ protected static Block getCasingBlock2() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ protected static Block getCasingBlock3() {
+ return ModBlocks.blockSpecialMultiCasings2;
+ }
+
+ protected static Block getCasingBlock4() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ protected static int getCasingMeta() {
+ return 3;
+ }
+
+ protected static int getCasingMeta2() {
+ return 12;
+ }
+
+ protected static int getCasingMeta3() {
+ return 13;
+ }
+
+ protected static int getCasingMeta4() {
+ return 2;
+ }
+
+ protected static int getCasingMeta5() {
+ return 6;
+ }
+
+ protected static int getCasingMeta6() {
+ return 9;
+ }
+
+ protected static int getCasingMeta7() {
+ return 8;
+ }
+
+ private boolean addDataOrbHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_ElementalDataOrbHolder) {
+ try {
+ return addToMachineListInternal(mReplicatorDataOrbHatches, aMetaTileEntity, aBaseCasingIndex);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.replicatorRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .enablePerfectOverclock()
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ for (GT_MetaTileEntity_Hatch_ElementalDataOrbHolder hatch : filterValidMTEs(mReplicatorDataOrbHatches)) {
+ ItemStack orb = hatch.getOrbByCircuit();
+ logic.setSpecialSlotItem(orb);
+ break;
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mReplicatorDataOrbHatches.clear();
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> tItems = super.getStoredInputs();
+ for (GT_MetaTileEntity_Hatch_ElementalDataOrbHolder tHatch : filterValidMTEs(mReplicatorDataOrbHatches)) {
+ tItems.add(tHatch.getOrbByCircuit());
+ }
+ tItems.removeAll(Collections.singleton(null));
+ return tItems;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java
new file mode 100644
index 0000000000..8f807b94fd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java
@@ -0,0 +1,287 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.Objects;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.FlotationRecipeHandler;
+
+public class GregtechMTE_FrothFlotationCell extends GregtechMeta_MultiBlockBase<GregtechMTE_FrothFlotationCell>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_FrothFlotationCell> STRUCTURE_DEFINITION = null;
+
+ public GregtechMTE_FrothFlotationCell(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_FrothFlotationCell(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_FrothFlotationCell(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Flotation Cell";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Process that milled ore!")
+ .addInfo("You can only ever process one type of material per controller")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 9, 7, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Inconel Reinforced Casing", 68, false)
+ .addCasingInfoMin("Flotation Casing", 52, false)
+ .addInputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addOutputHatch("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(2, 1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.flotationCellRecipes;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_FrothFlotationCell> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_FrothFlotationCell>builder()
+ .addShape(
+ mName,
+ new String[][] { { " ", " ", " X ", " X~X ", " X ", " ", " " },
+ { " ", " F ", " FFF ", " FF FF ", " FFF ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " CCC ", " CCCCC ", "CCCCCCC", "CCCCCCC", "CCCCCCC", " CCCCC ", " CCC " },
+ { " CCC ", " CCCCC ", "CCCCCCC", "CCCCCCC", "CCCCCCC", " CCCCC ", " CCC " }, })
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMTE_FrothFlotationCell.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, Maintenance, Energy)
+ .casingIndex(getCasingTextureId())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 1))))
+ .addElement('F', ofBlock(ModBlocks.blockSpecialMultiCasings, 9))
+ .addElement('X', ofBlock(ModBlocks.blockCasings3Misc, 1))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 3, 3, 0) && mCasing >= 68 - 4 && checkHatch();
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiFrothFlotationCell;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ /*
+ * Material checks Makes sure we can only ever use one type of material in this flotation cell. We used
+ * to depend on Alk's hash, but it's unreliable and user-hostile So we're using unlocalized name of
+ * material now.
+ */
+ Material foundMaterial = FlotationRecipeHandler
+ .getMaterialOfMilledProduct(FlotationRecipeHandler.findMilledStack(recipe));
+ String foundMaterialName = null;
+ if (foundMaterial != null) {
+ foundMaterialName = foundMaterial.getUnlocalizedName();
+ }
+
+ if (foundMaterialName == null) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ // Set material locked for this controller
+ if (lockedMaterialName == null) {
+ lockedMaterialName = foundMaterialName;
+ }
+
+ // Check material match
+ if (!Objects.equals(lockedMaterialName, foundMaterialName)) {
+ return SimpleCheckRecipeResult.ofFailure("machine_locked_to_different_recipe");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }.enablePerfectOverclock();
+ }
+
+ /*
+ * Handle NBT
+ */
+
+ private String lockedMaterialName = null;
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ if (lockedMaterialName != null) {
+ aNBT.setString("lockedMaterialName", lockedMaterialName);
+ }
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (lockedMaterialName != null) {
+ aNBT.setString("lockedMaterialName", lockedMaterialName);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("lockedMaterialName", Constants.NBT.TAG_STRING)) {
+ lockedMaterialName = aNBT.getString("lockedMaterialName");
+ }
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound() && stack.getTagCompound()
+ .hasKey("lockedMaterialName")) {
+ tooltip.add(
+ StatCollector.translateToLocal("tooltip.flotationCell.lockedTo") + " "
+ + StatCollector.translateToLocal(
+ stack.getTagCompound()
+ .getString("lockedMaterialName")));
+ }
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Locked material: " + lockedMaterialName };
+ }
+
+ @Override
+ public boolean isRecipeLockingEnabled() {
+ return lockedMaterialName != null && !lockedMaterialName.equals("");
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(new FakeSyncWidget.StringSyncer(() -> lockedMaterialName, val -> lockedMaterialName = val));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java
new file mode 100644
index 0000000000..2faccc9697
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java
@@ -0,0 +1,524 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMTE_NuclearReactor extends GregtechMeta_MultiBlockBase<GregtechMTE_NuclearReactor>
+ implements ISurvivalConstructable {
+
+ protected int mFuelRemaining = 0;
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_NuclearReactor> STRUCTURE_DEFINITION = null;
+
+ public GregtechMTE_NuclearReactor(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_NuclearReactor(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640000000L * (Math.min(16, this.mEnergyHatches.size()))) / 16L;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Reactor";
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Liquid Fluoride Thorium Reactor.")
+ .addInfo("Produces energy and new elements from Radioactive Beta Decay!")
+ .addInfo("Input LFTB and a molten salt as fuel, and match the 4 Buffered Dynamo Hatches:")
+ .addInfo("LFTR Fuel 1 (4 EV Hatches), LFTR Fuel 2 (4 IV Hatches), LFTR Fuel 3 (4 LuV Hatches)")
+ .addInfo("If using better hatches for a worse fuel, only 1 hatch will output EU")
+ .addInfo("Outputs U233 every 10 seconds, on average, while the reactor is running")
+ .addInfo("Check NEI to see the other 3 outputs - they differ between fuels")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 4, 7, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Hastelloy-N Reactor Casing", 27, false)
+ .addCasingInfoMin("Zeron-100 Reactor Shielding", 26, false)
+ .addInputHatch("Top or bottom layer edges", 1)
+ .addOutputHatch("Top or bottom layer edges", 1)
+ .addDynamoHatch("Top or bottom layer edges", 1)
+ .addMaintenanceHatch("Top or bottom layer edges", 1)
+ .addMufflerHatch("Top 3x3", 2)
+ .addStructureInfo("All dynamos must be between EV and LuV tier.")
+ .addStructureInfo("All other hatches must be IV+ tier.")
+ .addStructureInfo("4x Output Hatches or 1x Output Hatch (ME), 1+ Input Hatches, 4x Dynamo Hatches")
+ .addStructureInfo("2x Maintenance Hatches, 4x Mufflers")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String tRunning = (this.mMaxProgresstime > 0 ? "Reactor running" : "Reactor stopped");
+ final String tMaintainance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintainance issues"
+ : "Needs Maintainance");
+
+ return new String[] { "Liquid Fluoride Thorium Reactor", tRunning, tMaintainance,
+ "Current Output: " + this.lEUt + " EU/t", "Fuel Remaining: " + this.mFuelRemaining + " Litres",
+ "Current Efficiency: " + (this.mEfficiency / 5) + "%", "Current Efficiency (Raw): " + (this.mEfficiency),
+ "It requires you to have 100% Efficiency." };
+ }
+
+ @Override
+ public boolean allowCoverOnSide(final ForgeDirection side, final GT_ItemStack aStack) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ boolean aWarmedUp = this.mEfficiency == this.getMaxEfficiency(null);
+ if (!aBaseMetaTileEntity.isActive() || !aWarmedUp) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ } else if (aBaseMetaTileEntity.isActive() && aWarmedUp) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ }
+
+ public final boolean addNuclearReactorEdgeList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo dynamo
+ && dynamo.getTierForStructure() >= 4
+ && dynamo.getTierForStructure() <= 6) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input hatch
+ && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output hatch
+ && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public final boolean addNuclearReactorTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler hatch && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_NuclearReactor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_NuclearReactor>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "CCCCCCC", "COOOOOC", "COXXXOC", "COXXXOC", "COXXXOC", "COOOOOC", "CCCCCCC" },
+ { "GGGGGGG", "G-----G", "G-----G", "G-----G", "G-----G", "G-----G", "GGGGGGG" },
+ { "GGGGGGG", "G-----G", "G-----G", "G-----G", "G-----G", "G-----G", "GGGGGGG" },
+ { "CCC~CCC", "COOOOOC", "COOOOOC", "COOOOOC", "COOOOOC", "COOOOOC", "CCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Maintenance)
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(InputHatch, OutputHatch)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorEdgeList)
+ .hatchItemFilterAnd(t -> filterByMTETier(5, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Dynamo)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorEdgeList)
+ .hatchItemFilterAnd(t -> filterByMTETier(4, 6))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 12))))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Muffler)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorTopList)
+ .hatchItemFilterAnd(t -> filterByMTETier(5, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 12))))
+ .addElement('O', ofBlock(ModBlocks.blockCasingsMisc, 12))
+ .addElement('G', ofBlock(ModBlocks.blockCasingsMisc, 13))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ if (checkPiece(mName, 3, 3, 0) && mCasing >= 27) {
+ if ((mOutputHatches.size() >= 3 || canDumpFluidToME()) && mInputHatches.size() >= 1
+ && mDynamoHatches.size() == 4
+ && mMufflerHatches.size() == 4
+ && mMaintenanceHatches.size() == 2) {
+ fixAllMaintenanceIssue();
+ this.turnCasingActive(false);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Alk's Life Lessons from Greg.
+ /*
+ * [23:41:15] <GregoriusTechneticies> xdir and zdir are x2 and not x3 [23:41:26] <GregoriusTechneticies> thats you
+ * issue [23:44:33] <Alkalus> mmm? [23:44:49] <Alkalus> Should they be x3? [23:44:50] <GregoriusTechneticies> you
+ * just do a x2, what is for a 5x5 multiblock [23:45:01] <GregoriusTechneticies> x3 is for a 7x7 one [23:45:06]
+ * <Alkalus> I have no idea what that value does, tbh.. [23:45:15] <GregoriusTechneticies> its the offset [23:45:23]
+ * <Alkalus> Debugging checkMachine has been a pain and I usually trash designs that don't work straight up..
+ * [23:45:28] <GregoriusTechneticies> it determines the horizontal middle of the multiblock [23:45:47]
+ * <GregoriusTechneticies> which is in your case THREE blocks away from the controller [23:45:51] <Alkalus> Ahh
+ * [23:45:57] <GregoriusTechneticies> and not 2 [23:46:06] <Alkalus> Noted, thanks :D
+ */
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_NuclearReactor(this.mName);
+ }
+
+ public boolean turnCasingActive(final boolean status) {
+ // TODO
+ if (this.mDynamoHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Dynamo hatch : this.mDynamoHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mMufflerHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Muffler hatch : this.mMufflerHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch : this.mInputHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mMaintenanceHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Maintenance hatch : this.mMaintenanceHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe.mSpecialValue * 4L, recipe.mDuration);
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (!result.wasSuccessful()) {
+ resetMultiProcessing();
+ }
+ return result;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ mFuelRemaining = 0;
+ int li2bef4 = 0;
+ FluidStack aFuelFluid = null;
+ for (FluidStack aFluidInput : recipe.mFluidInputs) {
+ if (!aFluidInput.getFluid()
+ .equals(NUCLIDE.Li2BeF4.getFluid())) {
+ aFuelFluid = aFluidInput;
+ break;
+ }
+ }
+ if (aFuelFluid != null) {
+ for (FluidStack fluidStack : getStoredFluids()) {
+ if (fluidStack.isFluidEqual(aFuelFluid)) {
+ mFuelRemaining += fluidStack.amount;
+ } else if (fluidStack.getFluid()
+ .equals(NUCLIDE.Li2BeF4.getFluid())) {
+ li2bef4 += fluidStack.amount;
+ }
+ }
+ }
+ if (mFuelRemaining < 100) {
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ if (li2bef4 < 200) {
+ return SimpleCheckRecipeResult.ofFailure("no_li2bef4");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ };
+ }
+
+ protected void resetMultiProcessing() {
+ this.mEfficiency = 0;
+ this.mLastRecipe = null;
+ stopMachine(ShutDownReasonRegistry.NONE);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ // Warm up for 4~ minutes
+ if (mEfficiency < this.getMaxEfficiency(null)) {
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 2;
+ return SimpleCheckRecipeResult.ofSuccess("warm_up");
+ }
+ CheckRecipeResult result = super.checkProcessing();
+ if (result.wasSuccessful()) {
+ // We produce EU, so we negate the value, if negative
+ if (lEUt < 0) {
+ lEUt = -lEUt;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ this.mInventory[1] = null;
+ long explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ for (final MetaTileEntity tTileEntity : this.mInputBusses) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mOutputBusses) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mInputHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mOutputHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mDynamoHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mMufflerHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mEnergyHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mMaintenanceHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ this.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.getWorld().isRemote) {
+ if (aBaseMetaTileEntity.isActive()) {
+ // Set casings active if we're warmed up.
+ if (this.mEfficiency == this.getMaxEfficiency(null)) {
+ this.turnCasingActive(true);
+ } else {
+ this.turnCasingActive(false);
+ }
+ } else {
+ this.turnCasingActive(false);
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ // See if we're warmed up.
+ if (this.mEfficiency == this.getMaxEfficiency(null)) {
+ // Try output some Uranium-233
+ if (MathUtils.randInt(1, 300) == 1) {
+ this.addOutput(ELEMENT.getInstance().URANIUM233.getFluidStack(MathUtils.randInt(1, 10)));
+ }
+ }
+ return super.onRunningTick(aStack);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mFuelRemaining", this.mFuelRemaining);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mFuelRemaining = aNBT.getInteger("mFuelRemaining");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java
new file mode 100644
index 0000000000..0441907f40
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java
@@ -0,0 +1,809 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTEnergy;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemShears;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import forestry.api.arboriculture.IToolGrafter;
+import forestry.api.arboriculture.ITree;
+import forestry.api.arboriculture.TreeManager;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.VoidProtectionHelper;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class GregtechMetaTileEntityTreeFarm extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntityTreeFarm>
+ implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ private static final int TICKS_PER_OPERATION = 100;
+ private static final int TOOL_DAMAGE_PER_OPERATION = 1;
+ private static final int TOOL_CHARGE_PER_OPERATION = 32;
+
+ private int mCasing;
+ public static String mCasingName = "Sterile Farm Casing";
+ private static IStructureDefinition<GregtechMetaTileEntityTreeFarm> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntityTreeFarm(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(1, 15);
+ }
+
+ public GregtechMetaTileEntityTreeFarm(final String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(1, 15);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityTreeFarm(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Tree Farm";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller block for the Tree Growth Simulator")
+ .addInfo("Farms and harvests trees using EU")
+ .addInfo("Place a sapling in the controller slot")
+ .addInfo("Place a tool in an input bus")
+ .addInfo("Different tools are required for different outputs")
+ .addInfo("Advanced tools multiply output amount")
+ .addInfo(" Logs: Saw (1x), Buzzsaw (2x), Chainsaw (4x)")
+ .addInfo(" Saplings: Branch Cutter (1x), Grafter (3x)")
+ .addInfo(" Leaves: Shears (1x), Wire Cutter (2x), Automatic Snips (4x)")
+ .addInfo(" Fruit: Knife (1x)")
+ .addInfo("Multiple tools can be used at the same time")
+ .addSeparator()
+ .addInfo("Work time is fixed at 5 seconds")
+ .addInfo("Energy input tier multiplies output further")
+ .addInfo("Output multiplier is equal to: 2*tier^2 - 2*tier + 5")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 8, false)
+ .addInputBus("Any casing", 1)
+ .addStructureInfo(
+ EnumChatFormatting.YELLOW + "Stocking Input Busses and Crafting Input Busses/Buffers are not allowed!")
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 8 && checkHatch();
+ }
+
+ @Override
+ public boolean addInputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ // Tools from a stocking inout bus can not be damaged, this would cause an infinite durability exploit.
+ // Therefore disallow ME input bus.
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus_ME) return false;
+ return super.addInputBusToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public boolean supportsCraftingMEBuffer() {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ // Batch mode would not do anything, processing time is fixed at 100 ticks.
+ return false;
+ }
+
+ @Override
+ public boolean isBatchModeEnabled() {
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiTreeFarm;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntityTreeFarm> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntityTreeFarm>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntityTreeFarm.class)
+ .atLeast(
+ InputHatch,
+ OutputHatch,
+ InputBus,
+ OutputBus,
+ Maintenance,
+ Energy.or(TTEnergy),
+ Muffler)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 15))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ /* Processing logic. */
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ if (aStack == null) return false;
+ if (isValidSapling(aStack)) return true;
+ /*
+ * In previous versions, a saw used to go in the controller slot. We do not want an update to stop processing of
+ * a machine set up like this. Instead, a sapling is placed in this slot at the start of the next operation.
+ */
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool_01) return true;
+ return false;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for NEI, not used in processing logic.
+ return GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes;
+ }
+
+ /**
+ * Valid processing modes (types of output) for the Tree Growth Simulator.
+ */
+ public enum Mode {
+ LOG,
+ SAPLING,
+ LEAVES,
+ FRUIT
+ }
+
+ /**
+ * Edit this to change relative yields for different modes. For example, logs are output at 5 times the rate of
+ * saplings.
+ */
+ private static final EnumMap<Mode, Integer> modeMultiplier = new EnumMap<>(Mode.class);
+ static {
+ modeMultiplier.put(Mode.LOG, 5);
+ modeMultiplier.put(Mode.SAPLING, 1);
+ modeMultiplier.put(Mode.LEAVES, 2);
+ modeMultiplier.put(Mode.FRUIT, 1);
+ }
+
+ /**
+ * Return the output multiplier for a given power tier.
+ *
+ * @param tier Power tier the machine runs on.
+ * @return Factor to multiply all outputs by.
+ */
+ private static int getTierMultiplier(int tier) {
+ /*
+ * Where does this formula come from? [12:57 AM] boubou_19: i did. Basically Pandoro measured the output of a
+ * WA-ed farming station for each tier of WA, then i computed the Lagrange interpolating polynomial of his
+ * dataset, which gave this
+ */
+ return (2 * (tier * tier)) - (2 * tier) + 5;
+ }
+
+ /**
+ * Key of this map is the registry name of the sapling, followed by ":", and the sapling's metadata value.
+ * <p>
+ * The value of the map is a list of products by {@link Mode}. Products for some modes can be null if the tree does
+ * not produce anything in that mode (for example, it has no fruit).
+ */
+ public static final HashMap<String, EnumMap<Mode, ItemStack>> treeProductsMap = new HashMap<>();
+
+ @Override
+ public ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult process() {
+ if (inputItems == null) {
+ inputItems = new ItemStack[0];
+ }
+ if (inputFluids == null) {
+ inputFluids = new FluidStack[0];
+ }
+
+ ItemStack sapling = findSapling();
+ if (sapling == null) return SimpleCheckRecipeResult.ofFailure("no_sapling");
+
+ EnumMap<Mode, ItemStack> outputPerMode = getOutputsForSapling(sapling);
+ if (outputPerMode == null) {
+ // This should usually not be possible, outputs for all valid saplings should be defined.
+ Logger.INFO("No output found for sapling: " + sapling.getDisplayName());
+ return SimpleCheckRecipeResult.ofFailure("no_output_for_sapling");
+ }
+
+ int tier = Math.max(1, GT_Utility.getTier(availableVoltage * availableAmperage));
+ int tierMultiplier = getTierMultiplier(tier);
+
+ List<ItemStack> outputs = new ArrayList<>();
+ for (Mode mode : Mode.values()) {
+ ItemStack output = outputPerMode.get(mode);
+ if (output == null) continue; // This sapling has no output in this mode.
+
+ // Find a tool to use in this mode.
+ int toolMultiplier = useToolForMode(mode);
+ if (toolMultiplier < 0) continue; // No valid tool for this mode found.
+
+ // Increase output by the relevant multipliers.
+ ItemStack out = output.copy();
+ out.stackSize *= tierMultiplier * modeMultiplier.get(mode) * toolMultiplier;
+ outputs.add(out);
+ }
+
+ if (outputs.isEmpty()) {
+ // No outputs can be produced using the tools we have available.
+ return SimpleCheckRecipeResult.ofFailure("no_tools");
+ }
+
+ outputItems = outputs.toArray(new ItemStack[0]);
+
+ VoidProtectionHelper voidProtection = new VoidProtectionHelper().setMachine(machine)
+ .setItemOutputs(outputItems)
+ .build();
+ if (voidProtection.isItemFull()) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ duration = TICKS_PER_OPERATION;
+ calculatedEut = GT_Values.VP[tier];
+
+ return SimpleCheckRecipeResult.ofSuccess("growing_trees");
+ }
+ };
+ }
+
+ /* Handling tools. */
+
+ /**
+ * Attempts to find a tool appropriate for the given mode, and damage/discharge it by one use.
+ *
+ * @param mode The mode to use. This specifies which tools are valid.
+ * @return Production multiplier based on the tool used, or -1 if no appropriate tool was found.
+ */
+ private int useToolForMode(Mode mode) {
+ for (ItemStack stack : getStoredInputs()) {
+ int toolMultiplier = getToolMultiplier(stack, mode);
+ if (toolMultiplier < 0) continue;
+ boolean canDamage = GT_ModHandler
+ .damageOrDechargeItem(stack, TOOL_DAMAGE_PER_OPERATION, TOOL_CHARGE_PER_OPERATION, null);
+ if (canDamage) {
+ // Tool was used.
+ if (GT_ModHandler.isElectricItem(stack)
+ && !GT_ModHandler.canUseElectricItem(stack, TOOL_CHARGE_PER_OPERATION)) {
+ // Tool is out of charge, move it to output.
+ depleteInput(stack);
+ addOutput(stack);
+ }
+ return toolMultiplier;
+ } else {
+ // Correct item type, but the tool could not be used.
+ depleteInput(stack);
+ addOutput(stack);
+ }
+
+ }
+ return -1;
+ }
+
+ /**
+ * Calculate output multiplier for a given tool and mode.
+ *
+ * @param toolStack The tool to use.
+ * @param mode The mode to use.
+ * @return Output multiplier for the given tool used in the given mode. If the tool is not appropriate for this
+ * mode, returns -1.
+ */
+ public static int getToolMultiplier(ItemStack toolStack, Mode mode) {
+ Item tool = toolStack.getItem();
+ switch (mode) {
+ case LOG:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.SAW:
+ case GT_MetaGenerated_Tool_01.POCKET_SAW:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ case GT_MetaGenerated_Tool_01.BUZZSAW_LV:
+ case GT_MetaGenerated_Tool_01.BUZZSAW_MV:
+ case GT_MetaGenerated_Tool_01.BUZZSAW_HV:
+ return 2;
+ case GT_MetaGenerated_Tool_01.CHAINSAW_LV:
+ case GT_MetaGenerated_Tool_01.CHAINSAW_MV:
+ case GT_MetaGenerated_Tool_01.CHAINSAW_HV:
+ return 4;
+ }
+ }
+ break;
+
+ case SAPLING:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.BRANCHCUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_BRANCHCUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ }
+ }
+ if (tool instanceof IToolGrafter && tool.isDamageable()) {
+ return 3;
+ }
+ break;
+
+ case LEAVES:
+ // Do not allow unbreakable tools. Operation should have a running cost.
+ if (tool instanceof ItemShears && tool.isDamageable()) {
+ return 1;
+ }
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ case GT_MetaGenerated_Tool_01.WIRECUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_WIRECUTTER:
+ return 2;
+ }
+ }
+ if (tool instanceof MetaGeneratedGregtechTools) {
+ if (toolStack.getItemDamage() == MetaGeneratedGregtechTools.ELECTRIC_SNIPS) {
+ return 4;
+ }
+ }
+ break;
+
+ case FRUIT:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.KNIFE:
+ case GT_MetaGenerated_Tool_01.POCKET_KNIFE:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ }
+ }
+ break;
+ }
+
+ // No valid tool was found.
+ return -1;
+ }
+
+ /* Handling saplings. */
+
+ /**
+ * Finds a valid sapling from input buses, and places it into the controller slot.
+ *
+ * @return The sapling that was found (now in the controller slot).
+ */
+ private ItemStack findSapling() {
+ ItemStack controllerSlot = getControllerSlot();
+
+ if (isValidSapling(controllerSlot)) {
+ return controllerSlot;
+ }
+
+ if (controllerSlot != null) {
+ // Non-sapling item in controller slot. This could be a saw from an older version of the TGS.
+ // We first try to swap it with a sapling from an input bus to not interrupt existing setups.
+ if (!legacyToolSwap()) {
+ // Swap failed, output whatever is blocking the slot.
+ addOutput(controllerSlot);
+ mInventory[1] = null;
+ }
+ }
+
+ // Here controller slot is empty, find a valid sapling to use.
+ for (ItemStack stack : getStoredInputs()) {
+ if (isValidSapling(stack)) {
+ mInventory[1] = stack.splitStack(1);
+ return mInventory[1];
+ }
+ }
+
+ // No saplings were found.
+ return null;
+ }
+
+ /**
+ * In previous versions, the saw used to be placed in the controller slot and the sapling into an input bus. We do
+ * not want to break existing setups like this, so we attempt to swap the two if possible.
+ *
+ * @return True on success, false otherwise.
+ */
+ private boolean legacyToolSwap() {
+ ItemStack controllerSlot = getControllerSlot();
+ if (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool_01)) return false;
+
+ for (GT_MetaTileEntity_Hatch_InputBus inputBus : filterValidMTEs(mInputBusses)) {
+ ItemStack[] inventory = inputBus.getRealInventory();
+ for (int slot = 0; slot < inventory.length; ++slot) {
+ if (isValidSapling(inventory[slot])) {
+ // Do the swap.
+ mInventory[1] = inventory[slot];
+ inventory[slot] = controllerSlot;
+ inputBus.updateSlots();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if an ItemStack is a sapling that can be farmed.
+ *
+ * @param stack An ItemStack.
+ * @return True if stack is a valid sapling that can be farmed.
+ */
+ private boolean isValidSapling(ItemStack stack) {
+ if (stack == null) return false;
+ String registryName = Item.itemRegistry.getNameForObject(stack.getItem());
+ return treeProductsMap.containsKey(registryName + ":" + stack.getItemDamage())
+ || "Forestry:sapling".equals(registryName);
+ }
+
+ /**
+ * Get a list of possible outputs for a sapling, for each mode. This is either recovered from
+ * {@link #treeProductsMap}, or generated from stats of Forestry saplings.
+ *
+ * @param sapling A sapling to farm.
+ * @return A map of outputs for each mode. Outputs for some modes might be null.
+ */
+ private static EnumMap<Mode, ItemStack> getOutputsForSapling(ItemStack sapling) {
+ String registryName = Item.itemRegistry.getNameForObject(sapling.getItem());
+ if ("Forestry:sapling".equals(registryName)) {
+ return getOutputsForForestrySapling(sapling);
+ } else {
+ return treeProductsMap.get(registryName + ":" + sapling.getItemDamage());
+ }
+ }
+
+ /**
+ * Calculate outputs for Forestry saplings. Default amounts stored in {@link #treeProductsMap} are adjusted based
+ * the genetics of the input sapling.
+ * <p>
+ * Relevant stats:
+ * <ul>
+ * <li>height, girth: Affects log output.</li>
+ * <li>fertility (called Saplings in game): Affects sapling output.</li>
+ * <li>yield: Affects fruit output.</li>
+ * </ul>
+ * See {@link forestry.core.genetics.alleles.EnumAllele} for detailed numeric values for each allele.
+ *
+ * @param sapling A sapling to farm. Must be a Forestry sapling with a valid genome.
+ * @return A map of outputs for each mode. Outputs for some modes might be null.
+ */
+ private static EnumMap<Mode, ItemStack> getOutputsForForestrySapling(ItemStack sapling) {
+ ITree tree = TreeManager.treeRoot.getMember(sapling);
+ if (tree == null) return null;
+
+ String speciesUUID = tree.getIdent();
+
+ EnumMap<Mode, ItemStack> defaultMap = treeProductsMap.get("Forestry:sapling:" + speciesUUID);
+ if (defaultMap == null) return null;
+
+ // We need to make a new map so that we don't modify the stored amounts of outputs.
+ EnumMap<Mode, ItemStack> adjustedMap = new EnumMap<>(Mode.class);
+
+ ItemStack log = defaultMap.get(Mode.LOG);
+ if (log != null) {
+ double height = Math.max(
+ 3 * (tree.getGenome()
+ .getHeight() - 1),
+ 0) + 1;
+ double girth = tree.getGenome()
+ .getGirth();
+
+ log = log.copy();
+ log.stackSize = (int) (log.stackSize * height * girth);
+ adjustedMap.put(Mode.LOG, log);
+ }
+
+ ItemStack saplingOut = defaultMap.get(Mode.SAPLING);
+ if (saplingOut != null) {
+ // Lowest = 0.01 ... Average = 0.05 ... Highest = 0.3
+ double fertility = tree.getGenome()
+ .getFertility() * 10;
+
+ // Return a copy of the *input* sapling, retaining its genetics.
+ int stackSize = Math.max(1, (int) (saplingOut.stackSize * fertility));
+ saplingOut = sapling.copy();
+ saplingOut.stackSize = stackSize;
+ adjustedMap.put(Mode.SAPLING, saplingOut);
+ }
+
+ ItemStack leaves = defaultMap.get(Mode.LEAVES);
+ if (leaves != null) {
+ adjustedMap.put(Mode.LEAVES, leaves.copy());
+ }
+
+ ItemStack fruit = defaultMap.get(Mode.FRUIT);
+ if (fruit != null) {
+ // Lowest = 0.025 ... Average = 0.2 ... Highest = 0.4
+ double yield = tree.getGenome()
+ .getYield() * 10;
+
+ fruit = fruit.copy();
+ fruit.stackSize = (int) (fruit.stackSize * yield);
+ adjustedMap.put(Mode.FRUIT, fruit);
+ }
+
+ return adjustedMap;
+ }
+
+ /* Recipe registration. */
+
+ /**
+ * Registers outputs for a sapling. This method assumes that output in mode SAPLING is the same as the input
+ * sapling. Output amount is further modified by mode, machine tier, and tool used. Recipes are added in
+ * {@link gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm}.
+ *
+ * @param sapling The input sapling to farm, and also the output in mode SAPLING.
+ * @param log ItemStack to output in mode LOG.
+ * @param leaves ItemStack to output in mode LEAVES.
+ * @param fruit ItemStack to output in mode FRUIT.
+ */
+ public static void registerTreeProducts(ItemStack sapling, ItemStack log, ItemStack leaves, ItemStack fruit) {
+ registerTreeProducts(sapling, log, sapling, leaves, fruit);
+ }
+
+ /**
+ * Registers outputs for a sapling. Output amount is further modified by mode, machine tier, and tool used. Recipes
+ * are added in {@link gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm}.
+ *
+ * @param saplingIn The input sapling to farm.
+ * @param log ItemStack to output in mode LOG.
+ * @param saplingOut ItemStack to output in mode SAPLING.
+ * @param leaves ItemStack to output in mode LEAVES.
+ * @param fruit ItemStack to output in mode FRUIT.
+ */
+ public static void registerTreeProducts(ItemStack saplingIn, ItemStack log, ItemStack saplingOut, ItemStack leaves,
+ ItemStack fruit) {
+ String key = Item.itemRegistry.getNameForObject(saplingIn.getItem()) + ":" + saplingIn.getItemDamage();
+ EnumMap<Mode, ItemStack> map = new EnumMap<>(Mode.class);
+ if (log != null) map.put(Mode.LOG, log);
+ if (saplingOut != null) map.put(Mode.SAPLING, saplingOut);
+ if (leaves != null) map.put(Mode.LEAVES, leaves);
+ if (fruit != null) map.put(Mode.FRUIT, fruit);
+ treeProductsMap.put(key, map);
+
+ if (!addFakeRecipeToNEI(saplingIn, log, saplingOut, leaves, fruit)) {
+ Logger.INFO("Registering NEI fake recipe for " + key + " failed!");
+ }
+ }
+
+ /**
+ * For Forestry trees, the output amounts depend on the genetics of the sapling. Here we register only the types of
+ * items to output. In {@link #getOutputsForForestrySapling(ItemStack)} these outputs are then multiplied according
+ * to the stats of the real sapling that is in the controller slot.
+ */
+ public static void registerForestryTree(String speciesUID, ItemStack sapling, ItemStack log, ItemStack leaves,
+ ItemStack fruit) {
+ String key = "Forestry:sapling:" + speciesUID;
+ EnumMap<Mode, ItemStack> map = new EnumMap<>(Mode.class);
+ map.put(Mode.LOG, log);
+ map.put(Mode.SAPLING, sapling);
+ map.put(Mode.LEAVES, leaves);
+ map.put(Mode.FRUIT, fruit);
+ treeProductsMap.put(key, map);
+
+ // In the NEI recipe we want to display outputs adjusted for the default genetics of this tree type.
+ // To do this we use the same method as when calculating real outputs.
+ map = getOutputsForForestrySapling(sapling);
+ if (map == null) {
+ Logger.INFO("Could not create Forestry tree output map for " + speciesUID);
+ return;
+ }
+ addFakeRecipeToNEI(
+ sapling,
+ map.get(Mode.LOG),
+ map.get(Mode.SAPLING),
+ map.get(Mode.LEAVES),
+ map.get(Mode.FRUIT));
+ }
+
+ /**
+ * This array is used to get the rotating display of items in NEI showing all possible tools for a given mode.
+ */
+ private static final ItemStack[][] altToolsForNEI;
+ static {
+ GT_MetaGenerated_Tool toolInstance = GT_MetaGenerated_Tool_01.INSTANCE;
+ altToolsForNEI = new ItemStack[][] {
+ // Mode.LOG
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.SAW, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_SAW, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_LV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_LV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_MV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_MV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_HV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_HV, 1, null, null, null), },
+ // Mode.SAPLING
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BRANCHCUTTER, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_BRANCHCUTTER, 1, null, null, null),
+ GT_ModHandler.getModItem(Mods.Forestry.ID, "grafter", 1, 0), },
+ // Mode.LEAVES
+ { new ItemStack(Items.shears),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.WIRECUTTER, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_WIRECUTTER, 1, null, null, null),
+ MetaGeneratedGregtechTools.getInstance()
+ .getToolWithStats(MetaGeneratedGregtechTools.ELECTRIC_SNIPS, 1, null, null, null), },
+ // Mode.FRUIT
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.KNIFE, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_KNIFE, 1, null, null, null), } };
+ }
+
+ /**
+ * Add a recipe for this tree to NEI. These recipes are only used in NEI, they are never used for processing logic.
+ *
+ * @return True if the recipe was added successfully.
+ */
+ public static boolean addFakeRecipeToNEI(ItemStack saplingIn, ItemStack log, ItemStack saplingOut, ItemStack leaves,
+ ItemStack fruit) {
+ int recipeCount = GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.getAllRecipes()
+ .size();
+
+ // Sapling goes into the "special" slot.
+ ItemStack specialStack = saplingIn.copy();
+ specialStack.stackSize = 0;
+
+ /*
+ * Calculate the correct amount of outputs for each mode. The amount displayed in NEI should take into account
+ * the mode multiplier, but not tool/tier multipliers as those can change dynamically. If the sapling has an
+ * output in this mode, also add the tools usable for this mode as inputs.
+ */
+ ItemStack[][] inputStacks = new ItemStack[Mode.values().length][];
+ ItemStack[] outputStacks = new ItemStack[Mode.values().length];
+
+ for (Mode mode : Mode.values()) {
+ ItemStack output = switch (mode) {
+ case LOG -> log;
+ case SAPLING -> saplingOut;
+ case LEAVES -> leaves;
+ case FRUIT -> fruit;
+ };
+ if (output != null) {
+ int ordinal = mode.ordinal();
+ inputStacks[ordinal] = altToolsForNEI[ordinal];
+ outputStacks[ordinal] = output.copy();
+ outputStacks[ordinal].stackSize *= modeMultiplier.get(mode);
+ }
+ }
+
+ Logger.INFO(
+ "Adding Tree Growth Simulation NEI recipe for " + specialStack.getDisplayName()
+ + " -> "
+ + ItemUtils.getArrayStackNames(outputStacks));
+
+ GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.addFakeRecipe(
+ false,
+ new GT_Recipe.GT_Recipe_WithAlt(
+ false,
+ null, // All inputs are taken from aAtl argument.
+ outputStacks,
+ specialStack,
+ null,
+ null,
+ null,
+ TICKS_PER_OPERATION,
+ 0,
+ recipeCount, // special value, also sorts recipes correctly in order of addition.
+ inputStacks));
+
+ return GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.getAllRecipes()
+ .size() > recipeCount;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java
new file mode 100644
index 0000000000..580efdcdab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java
@@ -0,0 +1,235 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_AlloyBlastSmelter
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_AlloyBlastSmelter> implements ISurvivalConstructable {
+
+ private int mMode = 0;
+ private boolean isUsingControllerCircuit = false;
+ private static Item circuit;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_AlloyBlastSmelter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_AlloyBlastSmelter(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_AlloyBlastSmelter(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_AlloyBlastSmelter(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fluid Alloy Cooker";
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("isBussesSeparate")) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Alloy Blast Smelter")
+ .addInfo("20% Faster than the Electric Blast Furnace")
+ .addInfo("Allows Complex GT++ alloys to be created")
+ .addInfo("Accepts only one Energy Hatch")
+ .addInfo("Circuit for recipe goes in the Input Bus or GUI slot")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Blast Smelter Casings", 5, false)
+ .addCasingInfoMin("Blast Smelter Heat Containment Coils", 16, false)
+ .addInputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_AlloyBlastSmelter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_AlloyBlastSmelter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_AlloyBlastSmelter.class)
+ .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 15))))
+ .addElement('H', ofBlock(ModBlocks.blockCasingsMisc, 14))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 3, 0) && mCasing >= 5 && mEnergyHatches.size() == 1 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_INDUCTION_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(15);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.alloyBlastSmelterRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Get Controller Circuit
+ if (circuit == null) {
+ circuit = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (aStack != null && aStack.getItem() == circuit) {
+ this.mMode = aStack.getItemDamage();
+ return this.isUsingControllerCircuit = true;
+ } else {
+ if (aStack == null) {
+ this.isUsingControllerCircuit = false;
+ return true; // Allowed empty
+ }
+ Logger.WARNING("Not circuit in GUI inputs.");
+ return this.isUsingControllerCircuit = false;
+ }
+ }
+ Logger.WARNING("No Circuit, clientside.");
+ return this.isUsingControllerCircuit = false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiABS;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java
new file mode 100644
index 0000000000..5861885bd0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java
@@ -0,0 +1,331 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Cyclotron extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Cyclotron>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Cyclotron> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Cyclotron(int aID, String aName, String aNameRegional, int tier) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Cyclotron(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Particle Accelerator";
+ }
+
+ public int tier() {
+ return 5;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 1800000000L;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Cyclotron(this.mName);
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Cyclotron> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Cyclotron>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { " ", " hhh ", " hh hh ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " hh hh ", " hhh ", " ", },
+ { " hhh ", " hhccchh ", " hcchhhcch ", " hchh hhch ",
+ " hch hch ", " hch hch ", "hch hch", "hch hch",
+ "hch hch", " hch hch ", " hch hch ", " hchh hhch ",
+ " hcch~hcch ", " hhccchh ", " hhh ", },
+ { " ", " hhh ", " hh hh ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " hh hh ", " hhh ", " ", } }))
+ .addElement(
+ 'h',
+ buildHatchAdder(GregtechMetaTileEntity_Cyclotron.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(44)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('c', ofBlock(getCyclotronCoil(), getCyclotronCoilMeta()))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 7, 1, 12);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 7, 1, 12, elementBudget, env, false, true);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.GT_MACHINES_FUSION_LOOP;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 7, 1, 12) && mCasing >= 40 && checkHatch();
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public int getCasingMeta() {
+ return 10;
+ }
+
+ public Block getCyclotronCoil() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public int getCyclotronCoilMeta() {
+ return 9;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Super Magnetic Speed Shooter")
+ .addSeparator()
+ .addInfo("Particles are accelerated over 186 revolutions to 80% light speed")
+ .addInfo("Can produce a continuous beam current of 2.2 mA at 590 MeV")
+ .addInfo("Which will be extracted from the Isochronous Cyclotron")
+ .addSeparator()
+ .addInfo("Consists of the same layout as a Fusion Reactor")
+ .addInfo("Any external casing can be a hatch/bus, unlike Fusion")
+ .addInfo("Cyclotron Machine Casings around Cyclotron Coil Blocks")
+ .addInfo("All Hatches must be IV or better")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addCasingInfoMin("Cyclotron Machine Casings", 40, false)
+ .addCasingInfoMin("Cyclotron Coil", 32, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return getIconOverlay();
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return getIconOverlay();
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 44;
+ }
+
+ public IIconContainer getIconOverlay() {
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ return TexturesGtBlock.Overlay_MatterFab_Active_Animated;
+ }
+ return TexturesGtBlock.Overlay_MatterFab_Animated;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.cyclotronRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ fixAllMaintenanceIssue();
+ CheckRecipeResult result = super.process();
+ if (result.wasSuccessful()) {
+ for (ItemStack s : outputItems) {
+ if (s != null) {
+ if (s.getItem() instanceof IonParticles) {
+ long aCharge = IonParticles.getChargeState(s);
+ if (aCharge == 0) {
+ IonParticles.setChargeState(
+ s,
+ MathUtils.getRandomFromArray(
+ new int[] { -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2,
+ -2, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 5, 5, 5, 6, 6 }));
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.mOutputBusses.size() > 0) {
+ for (GT_MetaTileEntity_Hatch_OutputBus g : this.mOutputBusses) {
+ if (g != null) {
+ for (ItemStack s : g.mInventory) {
+ if (s != null) {
+ if (s.getItem() instanceof IonParticles) {
+ long aCharge = IonParticles.getChargeState(s);
+ if (aCharge == 0) {
+ IonParticles.setChargeState(
+ s,
+ MathUtils.getRandomFromArray(
+ new int[] { -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2,
+ -2, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 5, 5, 5, 6, 6 }));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ this.fixAllMaintenanceIssue();
+ return super.onRunningTick(aStack);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiCyclotron;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ String tier = tier() == 5 ? "I" : "II";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "COMET - Compact Cyclotron MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + this.getEUVar() + " / " + maxEUStore() };
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java
new file mode 100644
index 0000000000..78e4a17274
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java
@@ -0,0 +1,489 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gtPlusPlus.core.util.data.ArrayUtils.removeNulls;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomFishable;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.FishPondFakeRecipe;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMetaTileEntity_IndustrialFishingPond extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialFishingPond> implements ISurvivalConstructable {
+
+ private boolean isUsingControllerCircuit = false;
+ private static final Item circuit = CI.getNumberedCircuit(0)
+ .getItem();
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialFishingPond> STRUCTURE_DEFINITION = null;
+ private static final Class<?> cofhWater;
+
+ static {
+ cofhWater = ReflectionUtils.getClass("cofh.asmhooks.block.BlockWater");
+ }
+
+ public GregtechMetaTileEntity_IndustrialFishingPond(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialFishingPond(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialFishingPond(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fish Trap";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Fishing Pond")
+ .addInfo("Can process (Tier + 1) * 2 recipes")
+ .addInfo("Put a numbered circuit into the input bus.")
+ .addInfo("Circuit 14 for Fish")
+ .addInfo("Circuit 15 for Junk")
+ .addInfo("Circuit 16 for Treasure")
+ .addInfo("Need to be filled with water.")
+ .addInfo("Will automatically fill water from input hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 3, 9, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Aquatic Casings", 64, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialFishingPond> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialFishingPond>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXX~XXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX",
+ "XXXXXXXXX", "XXXXXXXXX" }, }))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFishingPond.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 4, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 4, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 4, 1, 0) && mCasing >= 64 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.fishPondRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ItemStack controllerStack = getControllerSlot();
+ if (controllerStack != null) {
+ if (controllerStack.getItem() == circuit) {
+ this.isUsingControllerCircuit = true;
+ this.mMode = controllerStack.getItemDamage();
+ } else {
+ this.isUsingControllerCircuit = false;
+ }
+ } else {
+ this.isUsingControllerCircuit = false;
+ }
+ if (!hasGenerateRecipes) {
+ generateRecipes();
+ }
+ if (!checkForWater()) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
+ FluidStack[] tFluidInputs = getStoredFluids().toArray(new FluidStack[0]);
+
+ if (!isUsingControllerCircuit && tItemInputs.length == 0) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ long tEnergy = getMaxInputEnergy();
+
+ getCircuit(tItemInputs);
+
+ ItemStack[] mFishOutput = generateLoot(this.mMode);
+ mFishOutput = removeNulls(mFishOutput);
+ GT_Recipe g = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ mFishOutput,
+ null,
+ new int[] {},
+ tFluidInputs,
+ null,
+ 200,
+ 16,
+ 0);
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(g.mEUt)
+ .setEUt(tEnergy)
+ .setDuration(g.mDuration);
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(g)
+ .setItemInputs(tItemInputs)
+ .setFluidInputs(tFluidInputs)
+ .setAvailableEUt(tEnergy)
+ .setMaxParallel(getMaxParallelRecipes())
+ .setConsumption(true)
+ .setOutputCalculation(true)
+ .setMachine(this)
+ .enableBatchMode(batchMode ? 128 : 1)
+ .setCalculator(calculator);
+
+ helper.build();
+
+ if (helper.getCurrentParallel() == 0) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ lEUt = -calculator.getConsumption();
+ mMaxProgresstime = (int) Math.ceil(calculator.getDuration() * helper.getDurationMultiplierDouble());
+
+ mOutputItems = helper.getItemOutputs();
+ mOutputFluids = null;
+ updateSlots();
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (2 * (GT_Utility.getTier(this.getMaxInputVoltage()) + 1));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialFishingPond;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public int getCasingTextureIndex() {
+ return TAE.GTPP_INDEX(32);
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ mCurrentDirectionX = 4;
+ mCurrentDirectionZ = 4;
+
+ mOffsetX_Lower = -4;
+ mOffsetX_Upper = 4;
+ mOffsetZ_Lower = -4;
+ mOffsetZ_Upper = 4;
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; h++) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (isNotStaticWater(tBlock, tMeta)) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = Blocks.water;
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.water || tBlock == Blocks.flowing_water) {
+ ++tAmount;
+ }
+ }
+ }
+ }
+
+ return tAmount >= 60;
+ }
+
+ private boolean isNotStaticWater(Block block, byte meta) {
+ return block == Blocks.air || block == Blocks.flowing_water
+ || block == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)
+ || (cofhWater != null && cofhWater.isAssignableFrom(block.getClass()) && meta != 0);
+ }
+
+ private static AutoMap<AutoMap<WeightedRandomFishable>> categories = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryFish = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryJunk = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryLoot = new AutoMap<>();
+ private static boolean hasGenerateRecipes = false;
+ private int mMode = 14;
+ private int mMax = 8;
+
+ private void generateRecipes() {
+ if (hasGenerateRecipes) return;
+
+ categories.put(categoryFish);
+ categories.put(categoryJunk);
+ categories.put(categoryLoot);
+ for (WeightedRandomFishable h : FishPondFakeRecipe.fish) {
+ categoryFish.put(h);
+ }
+ for (WeightedRandomFishable h : FishPondFakeRecipe.junk) {
+ categoryJunk.put(h);
+ }
+ for (WeightedRandomFishable h : FishPondFakeRecipe.treasure) {
+ categoryLoot.put(h);
+ }
+ hasGenerateRecipes = true;
+ }
+
+ private int getCircuit(ItemStack[] t) {
+ if (!this.isUsingControllerCircuit) {
+ for (ItemStack j : t) {
+ if (j.getItem() == CI.getNumberedCircuit(0)
+ .getItem()) {
+ // Fish
+ if (j.getItemDamage() == 14) {
+ mMax = 8 + (this.getMaxParallelRecipes() - 2);
+ this.mMode = 14;
+ break;
+ }
+ // Junk
+ else if (j.getItemDamage() == 15) {
+ this.mMode = 15;
+ mMax = 4;
+ break;
+ }
+ // Loot
+ else if (j.getItemDamage() == 16) {
+ this.mMode = 16;
+ mMax = 4;
+ break;
+ } else {
+ this.mMode = 0;
+ mMax = 0;
+ break;
+ }
+ } else {
+ this.mMode = 0;
+ mMax = 0;
+ break;
+ }
+ }
+ }
+ return this.mMode;
+ }
+
+ // reflection map
+ private static Map<WeightedRandomFishable, ItemStack> reflectiveFishMap = new HashMap<>();
+
+ private ItemStack reflectiveFish(WeightedRandomFishable y) {
+ if (reflectiveFishMap.containsKey(y)) {
+ return reflectiveFishMap.get(y);
+ }
+ ItemStack t;
+ try {
+ t = (ItemStack) ReflectionUtils.getField(WeightedRandomFishable.class, "field_150711_b")
+ .get(y);
+ ItemStack k = ItemUtils.getSimpleStack(t, 1);
+ reflectiveFishMap.put(y, k);
+ return t;
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ return null;
+ }
+
+ private ItemStack[] generateLoot(int mode) {
+ ItemStack[] mFishOutput = new ItemStack[this.mMax];
+ if (this.mMode == 14) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryFish.values()) {
+ if (MathUtils.randInt(0, (65 - getMaxParallelRecipes())) <= 2) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else if (this.mMode == 15) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryJunk.values()) {
+ if (MathUtils.randInt(0, 100) <= 1) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else if (this.mMode == 16) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryLoot.values()) {
+ if (MathUtils.randInt(0, 1000) <= 2) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else {
+ mFishOutput = null;
+ }
+ return mFishOutput;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java
new file mode 100644
index 0000000000..e7e74ac061
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java
@@ -0,0 +1,367 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialRockBreaker extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialRockBreaker> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialRockBreaker> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialRockBreaker(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialRockBreaker(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialRockBreaker(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Rock Breaker";
+ }
+
+ private static final String casingBaseName = GT_LanguageManager.getTranslation("gtplusplus.blockcasings.2.0.name");
+ private static final String casingMiddleName = GT_LanguageManager
+ .getTranslation("gtplusplus.blockcasings.2.11.name");
+ private static final String anyBaseCasing = "Any " + casingBaseName;
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Rock Breaker")
+ .addInfo("Speed: +200% | EU Usage: 75% | Parallel: Tier x 8")
+ .addInfo("Circuit goes in the GUI slot")
+ .addInfo("1 = cobble, 2 = stone, 3 = obsidian")
+ .addInfo("Supply Water/Lava")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin(casingBaseName, 9, false)
+ .addCasingInfoExactly(casingMiddleName, 16, false)
+ .addInputBus(anyBaseCasing, 1)
+ .addInputHatch(anyBaseCasing, 1)
+ .addOutputBus(anyBaseCasing, 1)
+ .addEnergyHatch(anyBaseCasing, 1)
+ .addMaintenanceHatch(anyBaseCasing, 1)
+ .addMufflerHatch(anyBaseCasing, 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialRockBreaker> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialRockBreaker>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialRockBreaker.class)
+ .atLeast(InputBus, InputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(16))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0))))
+ .addElement('H', ofBlock(ModBlocks.blockCasings2Misc, 11))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aCheckPiece = checkPiece(mName, 1, 3, 0);
+ boolean aCasingCount = mCasing >= 9;
+ boolean aCheckHatch = checkHatch();
+ log("" + aCheckPiece + ", " + aCasingCount + ", " + aCheckHatch);
+ return aCheckPiece && aCasingCount && aCheckHatch;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_INDUCTION_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(16);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.rockBreakerFakeRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ private static GT_Recipe sRecipe_Cobblestone;
+ private static GT_Recipe sRecipe_SmoothStone;
+ private static GT_Recipe sRecipe_Redstone;
+
+ private static void generateRecipes() {
+ sRecipe_Cobblestone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(1) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.cobblestone) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 16,
+ 32,
+ 0);
+ sRecipe_SmoothStone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(2) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.stone) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 16,
+ 32,
+ 0);
+ sRecipe_Redstone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.obsidian) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 128,
+ 32,
+ 0);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> aFluids = this.getStoredFluids();
+ if (aFluids.isEmpty()) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ boolean aHasWater = false;
+ boolean aHasLava = false;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.getFluid() == FluidRegistry.WATER) {
+ aHasWater = true;
+ } else if (aFluid.getFluid() == FluidRegistry.LAVA) {
+ aHasLava = true;
+ }
+ }
+ ArrayList<ItemStack> aItems = this.getStoredInputs();
+ boolean aHasRedstone = false;
+ if (!aItems.isEmpty()) {
+ for (ItemStack aItem : aItems) {
+ if (GT_Utility
+ .areStacksEqual(aItem, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))) {
+ aHasRedstone = true;
+ break;
+ }
+ }
+ }
+
+ if (!aHasWater) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ if (!aHasLava) {
+ return SimpleCheckRecipeResult.ofFailure("no_lava");
+ }
+ ItemStack aGuiCircuit = this.getControllerSlot();
+ if (!ItemUtils.isControlCircuit(aGuiCircuit)) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ if (sRecipe_Cobblestone == null || sRecipe_SmoothStone == null || sRecipe_Redstone == null) {
+ generateRecipes();
+ }
+
+ int aCircuit = aGuiCircuit.getItemDamage();
+
+ GT_Recipe tRecipe = null;
+ switch (aCircuit) {
+ case 1 -> tRecipe = sRecipe_Cobblestone;
+ case 2 -> tRecipe = sRecipe_SmoothStone;
+ case 3 -> {
+ if (aHasRedstone) {
+ tRecipe = sRecipe_Redstone;
+ }
+ }
+ }
+
+ if (tRecipe == null) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ ItemStack[] aItemInputs = aItems.toArray(new ItemStack[0]);
+ FluidStack[] aFluidInputs = new FluidStack[] {};
+
+ long tEnergy = getMaxInputEnergy();
+ // Remember last recipe - an optimization for findRecipe()
+ this.mLastRecipe = tRecipe;
+
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(tRecipe)
+ .setItemInputs(aItemInputs)
+ .setFluidInputs(aFluidInputs)
+ .setAvailableEUt(tEnergy)
+ .setMaxParallel(getMaxParallelRecipes())
+ .setConsumption(true)
+ .setOutputCalculation(true)
+ .setEUtModifier(0.75F)
+ .setMachine(this);
+
+ if (batchMode) {
+ helper.enableBatchMode(128);
+ }
+
+ helper.build();
+
+ if (helper.getCurrentParallel() == 0) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(tRecipe.mEUt)
+ .setEUt(tEnergy)
+ .setDuration(tRecipe.mDuration)
+ .setEUtDiscount(0.75F)
+ .setSpeedBoost(1F / 3F)
+ .setParallel((int) Math.floor(helper.getCurrentParallel() / helper.getDurationMultiplierDouble()))
+ .calculate();
+ lEUt = -calculator.getConsumption();
+ mMaxProgresstime = (int) Math.ceil(calculator.getDuration() * helper.getDurationMultiplierDouble());
+
+ mOutputItems = helper.getItemOutputs();
+ mOutputFluids = helper.getFluidOutputs();
+ updateSlots();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialRockBreaker;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> aInputs = super.getStoredInputs();
+ if (this.getControllerSlot() != null) {
+ aInputs.add(this.getControllerSlot());
+ }
+ return aInputs;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java
new file mode 100644
index 0000000000..e77ac454ee
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java
@@ -0,0 +1,524 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.AirIntake;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.RocketFuels;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_LargeRocketEngine
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargeRocketEngine> implements ISurvivalConstructable {
+
+ protected int fuelConsumption;
+ protected int fuelValue;
+ protected int fuelRemaining;
+ protected int freeFuelTicks = 0;
+ protected int euProduction = 0;
+ protected boolean boostEu;
+
+ public static String mLubricantName = "Carbon Dioxide";
+ public static String mCoolantName = "Liquid Hydrogen";
+
+ public static String mCasingName = "Turbodyne Casing";
+ public static String mIntakeHatchName = "Tungstensteel Turbine Casing";
+ public static String mGearboxName = "Inconel Reinforced Casing";
+
+ private static Fluid sAirFluid = null;
+ private static FluidStack sAirFluidStack = null;
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_LargeRocketEngine> STRUCTURE_DEFINITION = null;
+
+ private static final int CASING_ID = TAE.getIndexFromPage(3, 11);
+
+ public GregtechMetaTileEntity_LargeRocketEngine(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ this.fuelConsumption = 0;
+ this.fuelValue = 0;
+ this.fuelRemaining = 0;
+ this.boostEu = false;
+ setAir();
+ }
+
+ public GregtechMetaTileEntity_LargeRocketEngine(final String aName) {
+ super(aName);
+ this.fuelConsumption = 0;
+ this.fuelValue = 0;
+ this.fuelRemaining = 0;
+ this.boostEu = false;
+ setAir();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Rocket Engine")
+ .addInfo("Generating Power from Rocket Fuels - Supports TecTech Multi-Amp Dynamos!")
+ .addInfo("Supply GT++ Rocket Fuels and 1000L of " + mLubricantName + " per hour")
+ .addInfo("Produces as much energy as you put fuel in, with optional boosting")
+ .addInfo("This multi doesn't accept fluids if not enabled - enable it first!")
+ .addInfo("Consumes 2000L/s of air and pollutes 1500 gibbl/s per 16384 eu/t produced")
+ .addInfo("Place 1-8 Air Intake Hatches on the sides to maintain Air input")
+ .addInfo("If it runs out of air, it will shut down and have to be manually restarted")
+ .addInfo("Supply 3L of " + mCoolantName + " per second, per 1000 EU/t to boost")
+ .addInfo("Takes 3x the amount of " + mLubricantName + " and maintains efficiency")
+ .addInfo("Fuel efficiency starts at ~160%, falls more slowly at higher EU/t if boosted")
+ .addInfo("If producing more than 30k EU/t, fuel efficiency will be lower:")
+ .addInfo("(These thresholds are 3x higher when boosted, boosted values displayed second)")
+ .addInfo("- 75% of max fuel efficiency at 53k or 159k EU/t output energy")
+ .addInfo("- 50% of max fuel efficiency at 69k or 207k EU/t output energy")
+ .addInfo("- 25% of max fuel efficiency at 98k or 294k EU/t output energy")
+ .addInfo("formula: x = input of energy (30000^(1/3)/ x^(1/3)) * (80000^(1/3)/ x^(1/3))")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 10, false)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName, 64, false)
+ .addCasingInfoMin(mGearboxName, 8, false)
+ .addStructureHint("Air Intake Hatch", 1)
+ .addInputBus("Side center line", 1)
+ .addInputHatch("Side center line", 1)
+ .addMaintenanceHatch("Any Block Touching Inconel Reinforced Casing", 1)
+ .addDynamoHatch("Top center line", 2)
+ .addMufflerHatch("Back Center", 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargeRocketEngine> getStructureDefinition() {
+ if (this.STRUCTURE_DEFINITION == null) {
+ this.STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_LargeRocketEngine>builder()
+ .addShape(
+ this.mName,
+ transpose(
+ new String[][] { { "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC" },
+ { "C~C", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "CMC" },
+ { "CCC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CCC" }, }))
+ .addElement('C', ofBlock(getCasingBlock(), getCasingMeta()))
+ .addElement('I', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ // side
+ .addElement(
+ 'S',
+ buildHatchAdder(GregtechMetaTileEntity_LargeRocketEngine.class)
+ .atLeast(ImmutableMap.of(AirIntake, 8, InputBus, 1, InputHatch, 3, Maintenance, 1))
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ // top
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_LargeRocketEngine.class)
+ .atLeast(ImmutableMap.of(AirIntake, 8, Dynamo.or(TTDynamo), 1, Maintenance, 1))
+ .casingIndex(getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('M', Muffler.newAny(getCasingTextureIndex(), 3))
+ .build();
+ }
+ return this.STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(this.mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mCasing = 0;
+ this.mTecTechDynamoHatches.clear();
+ this.mAllDynamoHatches.clear();
+ this.mAirIntakes.clear();
+ return checkPiece(this.mName, 1, 1, 0) && this.mCasing >= 64 - 48
+ && this.mAirIntakes.size() >= 1
+ && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_ID;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return this.getMaxEfficiency(aStack) > 0;
+ }
+
+ public static void setAir() {
+ if (sAirFluidStack == null) {
+ sAirFluidStack = FluidUtils.getFluidStack("air", 1);
+ }
+ if (sAirFluid == null && sAirFluidStack != null) {
+ sAirFluid = sAirFluidStack.getFluid();
+ }
+ }
+
+ public int getAir() {
+ setAir();
+ if (this.mAirIntakes.isEmpty() || this.mAirIntakes.size() <= 0) {
+ return 0;
+ } else {
+ int totalAir = 0;
+ for (GT_MetaTileEntity_Hatch_AirIntake u : this.mAirIntakes) {
+ if (u != null && u.mFluid != null) {
+ FluidStack f = u.mFluid;
+ if (f.isFluidEqual(sAirFluidStack)) {
+ totalAir += f.amount;
+ }
+ }
+ }
+ return totalAir;
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rocketFuels;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ final ArrayList<FluidStack> tFluids = this.getStoredFluids();
+ this.clearRecipeMapForAllInputHatches();
+ int aircount = getAir();
+ int aAirToConsume = this.euProduction / 100;
+ if (aircount < aAirToConsume) {
+ stopMachine(ShutDownReasonRegistry.outOfFluid(new FluidStack(sAirFluid, aAirToConsume)));
+ return SimpleCheckRecipeResult.ofFailure("no_air");
+ } else {
+ int aTotalAir = 0;
+ for (GT_MetaTileEntity_Hatch_AirIntake aAirHatch : this.mAirIntakes) {
+ if (aAirHatch.mFluid != null) {
+ aTotalAir += aAirHatch.getFluidAmount();
+ }
+ }
+ if (aTotalAir >= aAirToConsume) {
+ int aSplitAmount = (aAirToConsume / this.mAirIntakes.size());
+ if (aSplitAmount > 0) {
+ for (GT_MetaTileEntity_Hatch_AirIntake aAirHatch : mAirIntakes) {
+ boolean hasIntakeAir = aAirHatch.drain(aSplitAmount, true) != null;
+ if (!hasIntakeAir) {
+ this.freeFuelTicks = 0;
+ return SimpleCheckRecipeResult.ofFailure("no_air");
+ }
+ }
+ }
+ }
+ }
+ // reset fuel ticks in case it does not reset when it stops
+ if (this.freeFuelTicks != 0 && this.mProgresstime == 0 && this.mEfficiency == 0) this.freeFuelTicks = 0;
+
+ if (tFluids.size() > 0 && getRecipeMap() != null) {
+ if (this.mRuntime % 72 == 0) {
+ if (!consumeCO2()) {
+ this.freeFuelTicks = 0;
+ return SimpleCheckRecipeResult.ofFailure("no_co2");
+ }
+ }
+ if (this.freeFuelTicks == 0) {
+ this.boostEu = consumeLOH();
+ }
+ for (final FluidStack hatchFluid1 : tFluids) {
+ if (hatchFluid1.isFluidEqual(sAirFluidStack)) {
+ continue;
+ }
+ if (this.freeFuelTicks == 0) {
+ for (final GT_Recipe aFuel : getRecipeMap().getAllRecipes()) {
+ final FluidStack tLiquid;
+ tLiquid = aFuel.mFluidInputs[0];
+ if (hatchFluid1.isFluidEqual(tLiquid)) {
+ if (!consumeFuel(aFuel, hatchFluid1.amount)) {
+ continue;
+ }
+ this.fuelValue = aFuel.mSpecialValue * 3;
+ this.fuelRemaining = hatchFluid1.amount;
+ this.lEUt = ((this.mEfficiency < 2000) ? 0 : GT_Values.V[5] << 1);
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = this.euProduction / 2000;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+ } else {
+ this.mEfficiencyIncrease = this.euProduction / 2000;
+ this.freeFuelTicks--;
+ this.lEUt = ((this.mEfficiency < 1000) ? 0 : GT_Values.V[5] << 1);
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+ }
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ this.freeFuelTicks = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ /**
+ * Consumes Fuel if required. Free Fuel Ticks are handled here.
+ *
+ * @param aFuel
+ * @return
+ */
+ public boolean consumeFuel(GT_Recipe aFuel, int amount) {
+ amount *= this.boostEu ? 0.3 : 0.9;
+ this.freeFuelTicks = 0;
+ int value = aFuel.mSpecialValue * 3;
+ int energy = value * amount;
+ if (amount < 5) return false;
+ FluidStack tLiquid = FluidUtils.getFluidStack(aFuel.mFluidInputs[0], (this.boostEu ? amount * 3 : amount));
+ if (!this.depleteInput(tLiquid)) {
+ return false;
+ } else {
+ this.fuelConsumption = this.boostEu ? amount * 3 : amount;
+ this.freeFuelTicks = 20;
+ setEUProduction(energy);
+ return true;
+ }
+ }
+
+ public void setEUProduction(int energy) {
+ energy /= 20;
+ double energyEfficiency;
+ double tDivideEnergy = Math.cbrt(energy);
+ if (energy > 30000) {
+ // cbrt(30 000) /
+ energyEfficiency = (31.072325 / tDivideEnergy);
+ if (energy >= 80000)
+ // cbrt(80 000) /
+ energyEfficiency *= (43.0886938 / tDivideEnergy);
+ energyEfficiency *= energy;
+ } else {
+ energyEfficiency = energy;
+ }
+ this.euProduction = (int) (energyEfficiency);
+ if (this.boostEu) this.euProduction *= 3;
+ }
+
+ public boolean consumeCO2() {
+ return this.depleteInput(MISC_MATERIALS.CARBON_DIOXIDE.getFluidStack(this.boostEu ? 3 : 1))
+ || this.depleteInput(FluidUtils.getFluidStack("carbondioxide", (this.boostEu ? 3 : 1)));
+ }
+
+ public boolean consumeLOH() {
+ int LOHamount = (3 * this.euProduction) / 1000;
+ return this.depleteInput(FluidUtils.getFluidStack(RocketFuels.Liquid_Hydrogen, LOHamount)); // (40 * ((long)
+ // euProduction /
+ // 10000))
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ if (aEU <= 0) {
+ return true;
+ }
+ if (this.mAllDynamoHatches.size() > 0) {
+ return addEnergyOutputMultipleDynamos(aEU, true);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) {
+ int injected = 0;
+ long totalOutput = 0;
+ long aFirstVoltageFound = -1;
+ boolean aFoundMixedDynamos = false;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(this.mAllDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ long aTotal = aDynamo.maxAmperesOut() * aVoltage;
+ // Check against voltage to check when hatch mixing
+ if (aFirstVoltageFound == -1) {
+ aFirstVoltageFound = aVoltage;
+ } else {
+ if (aFirstVoltageFound != aVoltage) {
+ aFoundMixedDynamos = true;
+ }
+ }
+ totalOutput += aTotal;
+ }
+
+ if (totalOutput < aEU || (aFoundMixedDynamos && !aAllowMixedVoltageDynamos)) {
+ explodeMultiblock();
+ return false;
+ }
+
+ long leftToInject;
+ long aVoltage;
+ int aAmpsToInject;
+ int aRemainder;
+
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(this.mAllDynamoHatches)) {
+ leftToInject = aEU - injected;
+ aVoltage = aDynamo.maxEUOutput();
+ aAmpsToInject = (int) (leftToInject / aVoltage);
+ aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage));
+ long powerGain;
+ for (int i = 0; i < Math.min(aDynamo.maxAmperesOut(), aAmpsToInject + 1); i++) {
+ if (i == Math.min(aDynamo.maxAmperesOut(), aAmpsToInject)) {
+ powerGain = aRemainder;
+ } else {
+ powerGain = aVoltage;
+ }
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(powerGain, false);
+ injected += powerGain;
+ }
+ }
+ return injected > 0;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings4Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 11;
+ }
+
+ public Block getGearboxBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getGearboxMeta() {
+ return 1;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) CASING_ID;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_LargeRocketEngine(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("freeFuelTicks", this.freeFuelTicks);
+ aNBT.setInteger("euProduction", this.euProduction);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.freeFuelTicks = aNBT.getInteger("freeFuelTicks");
+ this.euProduction = aNBT.getInteger("euProduction");
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return this.euProduction;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 75 * (this.euProduction / 10000);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Rocket Engine", "Current Air: " + getAir(),
+ "Current Pollution: " + getPollutionPerTick(null),
+ "Time until next fuel consumption: " + this.freeFuelTicks,
+ "Current Output: " + this.lEUt * this.mEfficiency / 10000 + " EU/t",
+ "Fuel Consumption: " + (this.fuelConsumption) + "L/s", "Fuel Value: " + this.fuelValue + " EU/L",
+ "Fuel Remaining: " + this.fuelRemaining + " Litres", "Current Efficiency: " + this.mEfficiency / 100 + "%",
+ (this.getIdealStatus() == this.getRepairStatus()) ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Rocket Engine";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
new file mode 100644
index 0000000000..4403779d09
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
@@ -0,0 +1,332 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_LargeSemifluidGenerator extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargeSemifluidGenerator> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_LargeSemifluidGenerator> STRUCTURE_DEFINITION = null;
+
+ protected int fuelConsumption = 0;
+ protected int fuelValue = 0;
+ protected int fuelRemaining = 0;
+ protected boolean boostEu = false;
+
+ public GregtechMetaTileEntity_LargeSemifluidGenerator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_LargeSemifluidGenerator(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Semifluid Generator")
+ .addInfo("Engine Intake Casings must not be obstructed in front (only air blocks)")
+ .addInfo("Supply Semifluid Fuels and 2000L of Lubricant per hour to run.")
+ .addInfo("Supply 80L of Oxygen per second to boost output (optional).")
+ .addInfo("Default: Produces 2048EU/t at 100% efficiency")
+ .addInfo("Boosted: Produces 6144EU/t at 150% efficiency")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, false)
+ .addController("Front Center")
+ .addCasingInfoMin("Stable Titanium Machine Casing", 16, false)
+ .addCasingInfoMin("Steel Gear Box Machine Casing", 2, false)
+ .addCasingInfoMin("Engine Intake Machine Casing", 8, false)
+ .addInputHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addDynamoHatch("Back Center", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 50;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ // Check for lubricant and oxygen first, so we can compute costs ahead of time.
+ // This will allow us to check costs without needing to actually try to deplete fluids
+ // (wasting earlier fluids in the check if later fluids turn out to be insufficient).
+ FluidStack lubricant = Materials.Lubricant.getFluid(0L);
+ FluidStack oxygen = Materials.Oxygen.getGas(0L);
+ for (FluidStack hatchFluid : tFluids) {
+ if (hatchFluid.isFluidEqual(lubricant)) {
+ lubricant.amount = Math.max(lubricant.amount, hatchFluid.amount);
+ } else if (hatchFluid.isFluidEqual(oxygen)) {
+ oxygen.amount = Math.max(oxygen.amount, hatchFluid.amount);
+ }
+ }
+ boostEu = oxygen.amount >= 4L;
+ long lubricantCost = boostEu ? 2L : 1L;
+ if (lubricant.amount < lubricantCost) {
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
+ }
+
+ for (FluidStack hatchFluid : tFluids) { // Loops through hatches
+ GT_Recipe aFuel = GTPPRecipeMaps.semiFluidFuels.getBackend()
+ .findFuel(hatchFluid);
+ if (aFuel == null) {
+ // Not a valid semi-fluid fuel.
+ continue;
+ }
+
+ int newEUt = boostEu ? 4096 : 2048;
+ fuelConsumption = newEUt / aFuel.mSpecialValue; // Calc fuel consumption
+ FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
+ if (depleteInput(tLiquid)) { // Deplete that amount
+ // We checked beforehand, so both of these depletions should succeed.
+ // But check the return values anyway just to be safe.
+ if (boostEu) {
+ if (!depleteInput(Materials.Oxygen.getGas(4L))) {
+ return SimpleCheckRecipeResult.ofFailure("no_oxygen");
+ }
+ }
+ // Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
+ if (mRuntime % 72 == 0 || mRuntime == 0) {
+ if (!depleteInput(Materials.Lubricant.getFluid(lubricantCost))) {
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
+ }
+ }
+
+ fuelValue = aFuel.mSpecialValue;
+ fuelRemaining = hatchFluid.amount; // Record available fuel
+ this.lEUt = mEfficiency < 2000 ? 0 : newEUt; // Output 0 if startup is less than 20%
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 15;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargeSemifluidGenerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_LargeSemifluidGenerator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "III", "CCC", "CCC", "CCC" }, { "I~I", "CGC", "CGC", "CMC" },
+ { "III", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_LargeSemifluidGenerator.class)
+ .atLeast(Muffler, InputHatch, Maintenance)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('G', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ .addElement('I', ofBlock(getIntakeBlock(), getIntakeMeta()))
+ .addElement(
+ 'M',
+ Dynamo.or(TTDynamo)
+ .newAny(getCasingTextureIndex(), 2))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mDynamoHatches.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 16 && checkHatch();
+ }
+
+ public final boolean addLargeSemifluidGeneratorList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public final boolean addLargeSemifluidGeneratorBackList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo || this.isThisHatchMultiDynamo(aTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getCasingMeta() {
+ return 2;
+ }
+
+ public Block getIntakeBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getIntakeMeta() {
+ return 13;
+ }
+
+ public Block getGearboxBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ public byte getGearboxMeta() {
+ return 3;
+ }
+
+ public byte getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_LargeSemifluidGenerator(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return boostEu ? 15000 : 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiLargeSemiFluidGenerator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Large Semifluid Generator", "Current Output: " + lEUt * mEfficiency / 10000 + " EU/t",
+ "Fuel Consumption: " + fuelConsumption + "L/t", "Fuel Value: " + fuelValue + " EU/L",
+ "Fuel Remaining: " + fuelRemaining + " Litres", "Current Efficiency: " + (mEfficiency / 100) + "%",
+ getIdealStatus() == getRepairStatus() ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Semifluid Generator";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 0;
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java
new file mode 100644
index 0000000000..69042b7982
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java
@@ -0,0 +1,337 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_MassFabricator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_MassFabricator> implements ISurvivalConstructable {
+
+ public static int sUUAperUUM = 1;
+ public static int sUUASpeedBonus = 4;
+ public static int sDurationMultiplier = 3200;
+
+ public static String mCasingName1 = "Matter Fabricator Casing";
+ public static String mCasingName2 = "Containment Casing";
+ public static String mCasingName3 = "Matter Generation Coil";
+
+ private int mMode = 0;
+
+ private static final int MODE_SCRAP = 1;
+ private static final int MODE_UU = 0;
+
+ public static boolean sRequiresUUA = false;
+ private static final FluidStack[] mUU = new FluidStack[2];
+ private static final ItemStack[] mScrap = new ItemStack[2];
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_MassFabricator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_MassFabricator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_MassFabricator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Mass Fabricator / Recycler";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Matter Fabricator")
+ .addInfo("Speed: +0% | EU Usage: 80%")
+ .addInfo("Parallel: Scrap = 64 | UU = 8 * Tier")
+ .addInfo("Produces UU-A, UU-M & Scrap")
+ .addInfo("Change mode with screwdriver")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 4, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName3, 9, false)
+ .addCasingInfoMin(mCasingName2, 24, false)
+ .addCasingInfoMin(mCasingName1, 36, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Active_Animated;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Animated;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(9);
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ super.onConfigLoad(aConfig);
+ sDurationMultiplier = aConfig
+ .get(ConfigCategories.machineconfig, "Massfabricator.UUM_Duration_Multiplier", sDurationMultiplier);
+ sUUAperUUM = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_per_UUM", sUUAperUUM);
+ sUUASpeedBonus = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Speed_Bonus", sUUASpeedBonus);
+ sRequiresUUA = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Requirement", sRequiresUUA);
+ // Materials.UUAmplifier.mChemicalFormula = ("Mass Fabricator Eff/Speed Bonus: x" + sUUASpeedBonus);
+ }
+
+ public static boolean sInit = false;
+
+ public static void init() {
+ if (!sInit) {
+ if (mScrap[0] == null) {
+ mScrap[0] = ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrap"));
+ }
+ if (mScrap[1] == null) {
+ mScrap[1] = ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrapbox"));
+ }
+ if (mUU[0] == null) {
+ mUU[0] = Materials.UUAmplifier.getFluid(100);
+ }
+ if (mUU[1] == null) {
+ mUU[1] = Materials.UUMatter.getFluid(100);
+ }
+ sInit = true;
+ }
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_MassFabricator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_MassFabricator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" },
+ { "CGGGC", "G---G", "G---G", "G---G", "CGGGC" },
+ { "CGGGC", "G---G", "G---G", "G---G", "CGGGC" },
+ { "CC~CC", "CHHHC", "CHHHC", "CHHHC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_MassFabricator.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(9))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 9))))
+ .addElement('H', ofBlock(ModBlocks.blockCasingsMisc, 8))
+ .addElement('G', ofBlock(ModBlocks.blockCasings3Misc, 15))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 3, 0) && mCasing >= 36 && checkHatch();
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMassFabricator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_MassFabricator(this.mName);
+ }
+
+ /**
+ * Special Recipe Handling
+ */
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return this.mMode == MODE_SCRAP ? RecipeMaps.recyclerRecipes : GTPPRecipeMaps.multiblockMassFabricatorRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.recyclerRecipes, GTPPRecipeMaps.multiblockMassFabricatorRecipes);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ init();
+ return super.process();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (mMode == MODE_SCRAP) {
+ if (recipe.mOutputs == null) {
+ return SimpleCheckRecipeResult.ofSuccess("no_scrap");
+ }
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (mMode == MODE_SCRAP) {
+ if (inputItems != null) {
+ for (ItemStack item : inputItems) {
+ if (item == null || item.stackSize == 0) continue;
+ ItemStack aPotentialOutput = GT_ModHandler
+ .getRecyclerOutput(GT_Utility.copyAmount(1, item), 0);
+ GT_Recipe recipe = new GT_Recipe(
+ false,
+ new ItemStack[] { GT_Utility.copyAmount(1, item) },
+ aPotentialOutput == null ? null : new ItemStack[] { aPotentialOutput },
+ null,
+ new int[] { 2000 },
+ null,
+ null,
+ 40,
+ MaterialUtils.getVoltageForTier(1),
+ 0);
+ return Stream.of(recipe);
+ }
+ }
+ return Stream.empty();
+ }
+ return super.findRecipeMatches(map);
+ }
+ }.setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.enablePerfectOverclock();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return this.mMode == MODE_SCRAP ? 64 : 8 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int aMode = this.mMode + 1;
+ if (aMode > 1) {
+ this.mMode = MODE_UU;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Matter/AmpliFabricator");
+ } else if (aMode == 1) {
+ this.mMode = MODE_SCRAP;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Recycler");
+ } else {
+ this.mMode = MODE_SCRAP;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Recycler");
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mMode", mMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mMode = aNBT.getInteger("mMode");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java
new file mode 100644
index 0000000000..bd5e579cd2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java
@@ -0,0 +1,939 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_OreDictUnificator.getAssociation;
+import static gregtech.api.util.GT_ParallelHelper.addFluidsLong;
+import static gregtech.api.util.GT_ParallelHelper.addItemsLong;
+import static gregtech.api.util.GT_ParallelHelper.calculateChancedOutputMultiplier;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.ITierConverter;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GregtechMetaTileEntity_QuantumForceTransformer
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GregtechMetaTileEntity_QuantumForceTransformer>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ protected int mCraftingTier = 0;
+ protected int mFocusingTier = 0;
+ protected int mMaxParallel = 0;
+ private boolean mFluidMode = false, doFermium = false, doNeptunium = false;
+ private static final Fluid mNeptunium = ELEMENT.getInstance().NEPTUNIUM.getPlasma();
+ private static final Fluid mFermium = ELEMENT.getInstance().FERMIUM.getPlasma();
+ private static final String MAIN_PIECE = "main";
+ private GT_MetaTileEntity_Hatch_Input mNeptuniumHatch;
+ private GT_MetaTileEntity_Hatch_Input mFermiumHatch;
+ private static final IStructureDefinition<GregtechMetaTileEntity_QuantumForceTransformer> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregtechMetaTileEntity_QuantumForceTransformer>builder()
+ .addShape(
+ MAIN_PIECE,
+ new String[][] { // A - 142, B - 234, C - 177, D - 96, E - 224, H - 36, M - 21
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " ", " BAB ", " BBBBABBBB ",
+ " BAAAAAAAB ", " BABBABBAB ", " BA AB ", " A A ", " A A ",
+ " A A " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " BAB ", " AAABBBAAA ", " BAAAAAAAAAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAB ", " AA AA ", " AA AA ", " BAA AAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAAAB ", " AA AA ", " AA AA ", "BAA AAB",
+ "B B", "A A", "A A", "A A", "A A",
+ "A A" },
+ { " TTT ", " EEE ", " EEE ", " EEE ", " DDD ",
+ " EEE ", " DDD ", " EEE ", " EEE ", " EEE ",
+ " DDD ", " BAEEEAB ", " AA EEE AA ", " A EEE A ", "BA DDD AB",
+ "B EEE B", "B DDD B", " EEE ", " EEE ", " EEE ",
+ " Z~X " },
+ { " TTTTT ", " ECCCE ", " ECCCE ", " ECCCE ", " D D ",
+ " ECCCE ", " D D ", " ECCCE ", " ECCCE ", " ECCCE ",
+ " D D ", " BAECCCEAB ", " A ECCCE A ", " A ECCCE A ", "BA D D AB",
+ "B ECCCE B", "B D D B", "B ECCCE B", " ECCCE ", " ECCCE ",
+ " HHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " BAEC CEAB ", " B EC CE B ", "BB EC CE BB", "BA D D AB",
+ "A EC CE A", "A D D A", "A EC CE A", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " AAEC CEAA ", " A EC CE A ", "AB EC CE BA", "AA D D AA",
+ "A EC CE A", "A D D A", " EC CE ", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " BAEC CEAB ", " B EC CE B ", "BB EC CE BB", "BA D D AB",
+ "A EC CE A", "A D D A", "A EC CE A", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTT ", " ECCCE ", " ECCCE ", " ECCCE ", " D D ",
+ " ECCCE ", " D D ", " ECCCE ", " ECCCE ", " ECCCE ",
+ " D D ", " BAECCCEAB ", " A ECCCE A ", " A ECCCE A ", "BA D D AB",
+ "B ECCCE B", "B D D B", "B ECCCE B", " ECCCE ", " ECCCE ",
+ " HHHHH " },
+ { " TTT ", " EEE ", " EEE ", " EEE ", " DDD ",
+ " EEE ", " DDD ", " EEE ", " EEE ", " EEE ",
+ " DDD ", " BAEEEAB ", " AA EEE AA ", " A EEE A ", "BA DDD AB",
+ "B EEE B", "B DDD B", " EEE ", " EEE ", " EEE ",
+ " HHH " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAAAB ", " AA AA ", " AA AA ", "BAA AAB",
+ "B B", "A A", "A A", "A A", "A A",
+ "A A" },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAB ", " AA AA ", " AA AA ", " BAA AAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " BAB ", " AAABBBAAA ", " BAAAAAAAAAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " ", " BAB ", " BBBBABBBB ",
+ " BBBAAABBB ", " ABBAAABBA ", " A BA AB A ", " A A ", " A A ",
+ " A A " }, })
+ .addElement(
+ 'A',
+ withChannel(
+ "manipulator",
+ StructureUtility.ofBlocksTiered(
+ craftingTierConverter(),
+ getAllCraftingTiers(),
+ 0,
+ GregtechMetaTileEntity_QuantumForceTransformer::setCraftingTier,
+ GregtechMetaTileEntity_QuantumForceTransformer::getCraftingTier)))
+ .addElement(
+ 'B',
+ withChannel(
+ "shielding",
+ StructureUtility.ofBlocksTiered(
+ focusingTierConverter(),
+ getAllFocusingTiers(),
+ 0,
+ GregtechMetaTileEntity_QuantumForceTransformer::setFocusingTier,
+ GregtechMetaTileEntity_QuantumForceTransformer::getFocusingTier)))
+ .addElement('C', ofBlock(ModBlocks.blockCasings4Misc, 4))
+ .addElement('D', ofBlock(ModBlocks.blockCasings2Misc, 12))
+ .addElement('E', lazy(t -> ofBlock(t.getCasingBlock1(), t.getCasingMeta1())))
+ .addElement(
+ 'H',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .atLeast(InputBus, InputHatch, Maintenance, Energy.or(ExoticEnergy))
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(4)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .atLeast(OutputBus, OutputHatch, Maintenance)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'Z',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GregtechMetaTileEntity_QuantumForceTransformer::addNeptuniumHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GregtechMetaTileEntity_QuantumForceTransformer::addFermiumHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .build();
+
+ public GregtechMetaTileEntity_QuantumForceTransformer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_QuantumForceTransformer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_QuantumForceTransformer(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Quantum Force Transformer")
+ .addInfo("Controller Block for the Quantum Force Transformer")
+ .addInfo("Allows Complex chemical lines to be performed instantly in one step")
+ .addInfo("Every recipe requires a catalyst, each catalyst adds 1 parallel and lasts forever")
+ .addInfo("Accepts TecTech Energy and Laser Hatches")
+ .addInfo("All inputs go on the bottom, all outputs go on the top")
+ .addInfo("Put a circuit in the controller to specify the focused output")
+ .addInfo("Check NEI to see the order of outputs, and which circuit number you need.")
+ .addInfo("If separate input busses are enabled put the circuit in the circuit slot of the bus")
+ .addInfo("Uses FocusTier*4*sqrt(parallels) Neptunium Plasma if focusing")
+ .addInfo("Can use FocusTier*4*sqrt(parallels) Fermium Plasma for additional chance output")
+ .addInfo("Use a screwdriver to enable Fluid mode")
+ .addInfo(
+ "Fluid mode turns all possible outputs into their fluid variant, those which can't are left as they were.")
+ .addInfo("This multi gets improved when all casings of some types are upgraded")
+ .addInfo("Casing functions:")
+ .addInfo("Pulse Manipulators: Recipe Tier Allowed (check NEI for the tier of each recipe)")
+ .addInfo("Shielding Cores: Focusing Tier (equal to or higher than recipe tier to allow focus)")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(15, 21, 15, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Bulk Production Frame", 80, false)
+ .addCasingInfoMin("Quantum Force Conductor", 177, false)
+ .addCasingInfoMin("Force Field Glass", 224, false)
+ .addCasingInfoMin("Pulse Manipulators", 236, true)
+ .addCasingInfoMin("Shielding Cores", 142, true)
+ .addInputBus(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addInputHatch(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addOutputHatch(EnumChatFormatting.AQUA + "Top" + EnumChatFormatting.GRAY + " Layer", 5)
+ .addOutputBus(EnumChatFormatting.AQUA + "Top" + EnumChatFormatting.GRAY + " Layer", 5)
+ .addEnergyHatch(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addMaintenanceHatch(
+ EnumChatFormatting.BLUE + "Bottom"
+ + EnumChatFormatting.GRAY
+ + " or "
+ + EnumChatFormatting.AQUA
+ + "Top"
+ + EnumChatFormatting.GRAY
+ + " Layer",
+ 4,
+ 5)
+ .addStructureInfo(
+ EnumChatFormatting.WHITE + "Neptunium Plasma Hatch: "
+ + EnumChatFormatting.GREEN
+ + "Left"
+ + EnumChatFormatting.GRAY
+ + " side of Controller")
+ .addStructureInfo(
+ EnumChatFormatting.WHITE + "Fermium Plasma Hatch: "
+ + EnumChatFormatting.DARK_GREEN
+ + "Right"
+ + EnumChatFormatting.GRAY
+ + " side of Controller")
+ .toolTipFinisher(
+ GT_Values.AuthorBlueWeabo + EnumChatFormatting.RESET
+ + EnumChatFormatting.GREEN
+ + " + Steelux"
+ + EnumChatFormatting.RESET
+ + " - [GT++]");
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_QuantumForceTransformer> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mCasing = 0;
+ this.mCraftingTier = 0;
+ this.mFocusingTier = 0;
+ if (!checkPiece(MAIN_PIECE, 7, 20, 4)) {
+ return false;
+ }
+
+ if (mMaintenanceHatches.size() != 1 || mOutputBusses.isEmpty() || mOutputHatches.isEmpty()) {
+ return false;
+ }
+
+ return checkExoticAndNormalEnergyHatches();
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(MAIN_PIECE, stackSize, hintsOnly, 7, 20, 4);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(MAIN_PIECE, stackSize, 7, 20, 4, elementBudget, env, false, true);
+ }
+
+ public static List<Pair<Block, Integer>> getAllCraftingTiers() {
+ return new ArrayList<>() {
+
+ {
+ add(Pair.of(ModBlocks.blockCasings5Misc, 7));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 8));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 9));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 10));
+ }
+ };
+ }
+
+ public static List<Pair<Block, Integer>> getAllFocusingTiers() {
+ return new ArrayList<>() {
+
+ {
+ add(Pair.of(ModBlocks.blockCasings5Misc, 11));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 12));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 13));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 14));
+ }
+ };
+ }
+
+ public static ITierConverter<Integer> craftingTierConverter() {
+ return (block, meta) -> {
+ if (block == null) {
+ return -1;
+ } else if (block == ModBlocks.blockCasings5Misc) { // Resonance Chambers
+ switch (meta) {
+ case 7 -> {
+ return 1;
+ }
+ case 8 -> {
+ return 2;
+ }
+ case 9 -> {
+ return 3;
+ }
+ case 10 -> {
+ return 4;
+ }
+ }
+ }
+ return -1;
+ };
+ }
+
+ public static ITierConverter<Integer> focusingTierConverter() {
+ return (block, meta) -> {
+ if (block == null) {
+ return -1;
+ } else if (block == ModBlocks.blockCasings5Misc) { // Generation Coils
+ switch (meta) {
+ case 11 -> {
+ return 1;
+ }
+ case 12 -> {
+ return 2;
+ }
+ case 13 -> {
+ return 3;
+ }
+ case 14 -> {
+ return 4;
+ }
+ }
+ }
+ return -1;
+ };
+ }
+
+ private void setCraftingTier(int tier) {
+ mCraftingTier = tier;
+ }
+
+ private void setFocusingTier(int tier) {
+ mFocusingTier = tier;
+ }
+
+ private int getCraftingTier() {
+ return mCraftingTier;
+ }
+
+ private int getFocusingTier() {
+ return mFocusingTier;
+ }
+
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.quantumForceTransformerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private int[] chances;
+ private FluidStack[] fluidModeItems;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (recipe.mSpecialValue > getCraftingTier()) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(recipe.mSpecialValue);
+ }
+ ItemStack catalyst = null;
+ for (ItemStack item : recipe.mInputs) {
+ if (ItemUtils.isCatalyst(item)) {
+ catalyst = item;
+ break;
+ }
+ }
+
+ if (catalyst == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_catalyst");
+ }
+
+ maxParallel = 0;
+ for (ItemStack item : inputItems) {
+ if (ItemUtils.isCatalyst(item) && item.isItemEqual(catalyst)) {
+ maxParallel += item.stackSize;
+ }
+ }
+
+ mMaxParallel = maxParallel;
+ doFermium = false;
+ doNeptunium = false;
+
+ if (recipe.mSpecialValue <= getFocusingTier()) {
+ if (drain(mFermiumHatch, new FluidStack(mFermium, 1), false)) {
+ doFermium = true;
+ }
+ if (drain(mNeptuniumHatch, new FluidStack(mNeptunium, 1), false)) {
+ doNeptunium = true;
+ }
+ }
+
+ chances = getOutputChances(recipe, doNeptunium ? findProgrammedCircuitNumber() : -1);
+
+ // Handle Fluid Mode. Add fluid that item can be turned into to fluidModeItems.
+ // null if Fluid Mode is disabled or item cannot be turned into fluid.
+ fluidModeItems = new FluidStack[recipe.mOutputs.length];
+ if (mFluidMode) {
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null) continue;
+ ItemData data = getAssociation(item);
+ Materials mat = data == null ? null : data.mMaterial.mMaterial;
+ if (mat != null) {
+ if (mat.mStandardMoltenFluid != null) {
+ fluidModeItems[i] = mat.getMolten(INGOTS);
+ } else if (mat.mFluid != null) {
+ fluidModeItems[i] = mat.getFluid(BUCKETS);
+ }
+ }
+ }
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe).setCustomItemOutputCalculation(parallel -> {
+ ArrayList<ItemStack> items = new ArrayList<>();
+
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null || fluidModeItems[i] != null) continue;
+ ItemStack itemToAdd = item.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(chances[i], parallel);
+ long itemAmount = (long) (item.stackSize * outputMultiplier);
+ addItemsLong(items, itemToAdd, itemAmount);
+ }
+
+ return items.toArray(new ItemStack[0]);
+ })
+ .setCustomFluidOutputCalculation(parallel -> {
+ ArrayList<FluidStack> fluids = new ArrayList<>();
+
+ if (mFluidMode) {
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ FluidStack fluid = fluidModeItems[i];
+ if (fluid == null) continue;
+ FluidStack fluidToAdd = fluid.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(chances[i], parallel);
+ int itemAmount = recipe.mOutputs[i].stackSize;
+ long fluidAmount = (long) (fluidToAdd.amount * outputMultiplier * itemAmount);
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+ }
+
+ for (int i = 0; i < recipe.mFluidOutputs.length; i++) {
+ FluidStack fluid = recipe.getFluidOutput(i);
+ if (fluid == null) continue;
+ FluidStack fluidToAdd = fluid.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(
+ chances[i + recipe.mOutputs.length],
+ parallel);
+ long fluidAmount = (long) (fluidToAdd.amount * outputMultiplier);
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+
+ return fluids.toArray(new FluidStack[0]);
+ });
+ }
+
+ private int findProgrammedCircuitNumber() {
+ if (isInputSeparationEnabled()) {
+ for (ItemStack stack : inputItems) {
+ if (GT_Utility.isAnyIntegratedCircuit(stack)) {
+ return stack.getItemDamage() - 1;
+ }
+ }
+ return -1;
+ } else {
+ final ItemStack controllerStack = getControllerSlot();
+ return GT_Utility.isAnyIntegratedCircuit(controllerStack) ? controllerStack.getItemDamage() - 1
+ : -1;
+ }
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getAverageInputVoltage());
+ logic.setAvailableAmperage(getMaxInputAmps());
+ }
+
+ private byte runningTick = 0;
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (!super.onRunningTick(aStack)) {
+ return false;
+ }
+
+ if (runningTick % 20 == 0) {
+ int amount = (int) (getFocusingTier() * 4
+ * Math.sqrt(Math.min(mMaxParallel, processingLogic.getCurrentParallels())));
+ if (doFermium) {
+ FluidStack fermiumToConsume = new FluidStack(mFermium, amount);
+ if (!drain(mFermiumHatch, fermiumToConsume, true)) {
+ doFermium = false;
+ stopMachine(ShutDownReasonRegistry.outOfFluid(fermiumToConsume));
+ return false;
+ }
+ }
+
+ if (doNeptunium) {
+ FluidStack neptuniumToConsume = new FluidStack(mNeptunium, amount);
+ if (!drain(mNeptuniumHatch, neptuniumToConsume, true)) {
+ doNeptunium = false;
+ stopMachine(ShutDownReasonRegistry.outOfFluid(neptuniumToConsume));
+ return false;
+ }
+ }
+
+ runningTick = 1;
+ } else {
+ runningTick++;
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // TODO: Look for proper fix
+ // Updates every 30 sec
+ if (mUpdate <= -550) mUpdate = 50;
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private int[] getOutputChances(GT_Recipe tRecipe, int aChanceIncreased) {
+ int difference = getFocusingTier() - tRecipe.mSpecialValue;
+ int aOutputsAmount = tRecipe.mOutputs.length + tRecipe.mFluidOutputs.length;
+ int aChancePerOutput = 10000 / aOutputsAmount;
+ int[] tChances = new int[aOutputsAmount];
+ Arrays.fill(tChances, aChancePerOutput);
+
+ switch (difference) {
+ case 0 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] += aChancePerOutput / 2 * (aOutputsAmount - 1);
+ } else {
+ tChances[i] /= 2;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 4;
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] += aChancePerOutput * 3 / 4 * (aOutputsAmount - 1);
+ } else {
+ tChances[i] /= 4;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 3;
+ }
+ }
+ }
+ case 2, 3 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] = 10000;
+ } else {
+ tChances[i] = 0;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 2;
+ }
+ }
+ }
+ }
+ return tChances;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFluidMode = !mFluidMode;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("miscutils.machines.QFTFluidMode") + " " + mFluidMode);
+ }
+
+ public boolean addNeptuniumHatch(IGregTechTileEntity aTileEntity, short aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ mNeptuniumHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean addFermiumHatch(IGregTechTileEntity aTileEntity, short aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ mFermiumHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public Block getCasingBlock1() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getCasingMeta1() {
+ return 15;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFluidMode", mFluidMode);
+ aNBT.setBoolean("doFermium", doFermium);
+ aNBT.setBoolean("doNeptunium", doNeptunium);
+ aNBT.setInteger("mMaxParallel", mMaxParallel);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("mSeparateInputBusses");
+ }
+ if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
+ batchMode = aNBT.getBoolean("mBatchMode");
+ }
+ mFluidMode = aNBT.getBoolean("mFluidMode");
+ doFermium = aNBT.getBoolean("doFermium");
+ doNeptunium = aNBT.getBoolean("doNeptunium");
+ mMaxParallel = aNBT.getInteger("mMaxParallel");
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getActiveOverlay())
+ .extFacing()
+ .build() };
+ return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getInactiveOverlay())
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { getCasingTexture() };
+ }
+
+ private ITexture getCasingTexture() {
+ return Textures.BlockIcons.getCasingTextureForId(getCasingTextureId());
+ }
+
+ @SideOnly(Side.CLIENT)
+ private void renderForceField(double x, double y, double z, int side, double minU, double maxU, double minV,
+ double maxV) {
+ // spotless:off
+ Tessellator tes = Tessellator.instance;
+ switch (side) {
+ case 0 -> {
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, minU, minV);
+ tes.addVertexWithUV(x - 3, y, z + 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y, z + 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ }
+ case 1 -> {
+ tes.addVertexWithUV(x + 7, y, z + 4, maxU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x + 7, y, z + 4, maxU, maxV);
+ }
+ case 2 -> {
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, minU, minV);
+ tes.addVertexWithUV(x - 3, y, z - 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y, z - 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ }
+ case 3 -> {
+ tes.addVertexWithUV(x - 7, y, z + 4, maxU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x - 7, y, z + 4, maxU, maxV);
+ }
+ case 4 -> {
+ tes.addVertexWithUV(x - 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y, z + 7, maxU, maxV);
+ }
+ case 5 -> {
+ tes.addVertexWithUV(x - 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y, z - 7, maxU, maxV);
+ }
+ case 6 -> {
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ }
+ case 7 -> {
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public boolean renderInWorld(IBlockAccess aWorld, int x, int y, int z, Block block, RenderBlocks renderer) {
+ Tessellator tes = Tessellator.instance;
+ IIcon forceField = TexturesGtBlock.ForceField.getIcon();
+ if (getBaseMetaTileEntity().isActive()) {
+ double minU = forceField.getMinU();
+ double maxU = forceField.getMaxU();
+ double minV = forceField.getMinV();
+ double maxV = forceField.getMaxV();
+ double xBaseOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zBaseOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ tes.setColorOpaque_F(1f, 1f, 1f);
+ tes.setBrightness(15728880);
+ //Center O: 0, 0 1 ------- 8
+ //Corner 1: 7, -2 / \
+ //Corner 2: 3, -6 2 / \ 7
+ //Corner 3: -2, -6 | |
+ //Corner 4: -6, -2 | O |
+ //Corner 5: -6, 3 | |
+ //Corner 6: -2, 7 3 \ / 6
+ //Corner 7: 3, 7 \ /
+ //Corner 8: 7, 3 4 ------- 5
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 0, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 1, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 2, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 3, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 4, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 5, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 6, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 7, minU, maxU, minV, maxV);
+ }
+ // Needs to be false to render the controller
+ return false;
+ //spotless:on
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java
new file mode 100644
index 0000000000..8a6564858e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java
@@ -0,0 +1,220 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_Refinery extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Refinery>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Refinery> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Refinery(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Refinery(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fuel Refinery";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Fission Fuel Processing Unit")
+ .addInfo("Refines fluorides and Uranium into nuclear fuel for the LFTR")
+ .addInfo("LFTR Fuel 2 and Fuel 3 have alternative, much more efficient recipes")
+ .addInfo("However, they require fission breeding outputs from the LFTR itself")
+ .addInfo("Only one Energy Hatch is allowed per Processing Unit")
+ .addInfo("All recipe times in this multi are very long, watch out!")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 9, 3, false)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Hastelloy-X Structural Block", 7, false)
+ .addCasingInfoMin("Incoloy-DS Fluid Containment Block", 5, false)
+ .addCasingInfoMin("Zeron-100 Reactor Shielding", 4, false)
+ .addCasingInfoMin("Hastelloy-N Sealant Blocks", 17, false)
+ .addInputHatch("Base platform", 1)
+ .addOutputHatch("Base platform", 1)
+ .addMufflerHatch("Base platform", 1)
+ .addMaintenanceHatch("Base platform", 1)
+ .addEnergyHatch("Base platform", 1)
+ .addStructureInfo("Muffler's Tier must be IV+")
+ .addStructureInfo("2-4x Input Hatches, 1-2x Output Hatches")
+ .addStructureInfo("1x Muffler, 1x Maintenance Hatch, 1x Energy Hatch")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(18);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.fissionFuelProcessingRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler
+ && ((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity).mTier >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Refinery> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Refinery>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { " ", " N ", " " }, { " N ", "NIN", " N " }, { " N ", "NIN", " N " },
+ { " N ", "NIN", " N " }, { " Z ", "ZIZ", " Z " }, { " N ", "NIN", " N " },
+ { "XXX", "XXX", "XXX" }, { "X~X", "XXX", "XXX" }, }))
+ .addElement(
+ 'X',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Refinery.class)
+ .atLeast(Energy, Maintenance, OutputHatch, OutputBus, InputHatch)
+ .casingIndex(TAE.GTPP_INDEX(18))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_Refinery.class).atLeast(Muffler)
+ .adder(GregtechMetaTileEntity_Refinery::addMufflerToMachineList)
+ .hatchItemFilterAnd(t -> filterByMTETier(6, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(18))
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 2))))
+ .addElement('I', ofBlock(ModBlocks.blockCasings2Misc, 3))
+ .addElement('N', ofBlock(ModBlocks.blockCasings2Misc, 1))
+ .addElement('Z', ofBlock(ModBlocks.blockCasingsMisc, 13))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 7, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 7, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ if (checkPiece(mName, 1, 7, 0) && mCasing >= 7) {
+ if (this.mInputHatches.size() >= 2 && this.mInputHatches.size() <= 4
+ && this.mOutputHatches.size() >= 1
+ && this.mOutputHatches.size() <= 2
+ && this.mMufflerHatches.size() == 1
+ && this.mMaintenanceHatches.size() == 1
+ && this.mEnergyHatches.size() == 1) {
+ this.resetRecipeMapForAllInputHatches(this.getRecipeMap());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiRefinery;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Refinery(this.mName);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java
new file mode 100644
index 0000000000..0395ab5a01
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java
@@ -0,0 +1,675 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.misc.TileEntitySolarHeater;
+
+public class GregtechMetaTileEntity_SolarTower extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_SolarTower>
+ implements ISurvivalConstructable {
+
+ // 862
+ private static final int mCasingTextureID = TAE.getIndexFromPage(3, 9);
+ private int mHeatLevel = 0;
+ private int mCasing1;
+ private int mCasing2;
+ private int mCasing3;
+ private int mCasing4;
+
+ public ArrayList<TileEntitySolarHeater> mSolarHeaters = new ArrayList<>();
+
+ public GregtechMetaTileEntity_SolarTower(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_SolarTower(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_SolarTower(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Solar Tower";
+ }
+
+ @Override
+ protected final GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Contributing Green Energy towards the future")
+ .addInfo("Surround with rings of Solar Reflectors")
+ .addInfo("The Reflectors increase the internal heat value of the Tower (see below for formula)")
+ .addInfo("Each Reflector ring increases tier, the first ring is required for the Tower to work")
+ .addInfo("Input: " + MISC_MATERIALS.SOLAR_SALT_COLD.getLocalizedName())
+ .addInfo("Output: " + MISC_MATERIALS.SOLAR_SALT_HOT.getLocalizedName())
+ .addInfo("Every cycle (10 seconds), heat increases and all the Cold Solar Salt is heated")
+ .addInfo("Converting Cold to Hot Solar Salt reduces heat, equal to the amount converted")
+ .addInfo("This conversion only happens if heat >= 30000 and controller efficiency = 100%")
+ .addInfo("If there's more Cold Salt than heat, all the heat is used up and returns to 0")
+ .addInfo("The heat increase is most efficient at exactly half of maximum heat")
+ .addInfo("Minimum efficiency at 0 or 100000 heat, maximum efficiency at 50000")
+ .addInfo("Heat Efficiency formula: ( 7000 - [|currentHeat - 50000| ^ 0.8]) / 7000")
+ .addInfo("Heat gain per cycle: numberHeaters * heatEfficiency * (10 + bonus)")
+ .addInfo("Bonus: 1 ring = +1, 2 rings = +2, 3 rings = +4, 4 rings = +8, 5 rings = +16")
+ .addInfo("Total number of reflectors based on how many rings are built:")
+ .addInfo("1 ring = 36, 2 rings = 88, 3 rings = 156, 4 rings = 240, 5 rings = 340")
+ .addSeparator()
+ .beginVariableStructureBlock(15, 31, 28, 28, 15, 31, false)
+ .addController("Top Middle")
+ .addCasingInfoMin("Structural Solar Casing", 229, false)
+ .addCasingInfoMin("Thermally Insulated Casing", 60, false)
+ .addCasingInfoMin("Salt Containment Casing", 66, false)
+ .addCasingInfoMin("Thermal Containment Casing", 60, false)
+ .addInputHatch("Any 2 dot hint(min 1)", 2)
+ .addOutputHatch("Any 2 dot hint(min 1)", 2)
+ .addMaintenanceHatch("Any 2 dot hint", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_BASE = "base";
+ private static final String STRUCTURE_PIECE_TOWER = "tower";
+ private static final String STRUCTURE_PIECE_TOP = "top";
+
+ private static final String[] STRUCTURE_PIECE_SOLAR_HEATER_RING = { "ring1", "ring2", "ring3", "ring4", "ring5" };
+ private static final String SOLAR_HEATER_RING_1 = STRUCTURE_PIECE_SOLAR_HEATER_RING[0];
+ private static final String SOLAR_HEATER_RING_2 = STRUCTURE_PIECE_SOLAR_HEATER_RING[1];
+ private static final String SOLAR_HEATER_RING_3 = STRUCTURE_PIECE_SOLAR_HEATER_RING[2];
+ private static final String SOLAR_HEATER_RING_4 = STRUCTURE_PIECE_SOLAR_HEATER_RING[3];
+ private static final String SOLAR_HEATER_RING_5 = STRUCTURE_PIECE_SOLAR_HEATER_RING[4];
+
+ private static final ClassValue<IStructureDefinition<GregtechMetaTileEntity_SolarTower>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GregtechMetaTileEntity_SolarTower> computeValue(Class<?> type) {
+ return StructureDefinition.<GregtechMetaTileEntity_SolarTower>builder()
+
+ // s = salt
+ // c = thermal containment
+ // i = thermal insulated
+ // t = solar structural
+ // h = hatch
+ // g = solar heater
+
+ .addShape(
+ STRUCTURE_PIECE_TOP,
+ (new String[][] { { " ", " ", " ~ ", " ", " " },
+ { " ", " s ", " sss ", " s ", " " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " }, }))
+ .addShape(
+ STRUCTURE_PIECE_TOWER,
+ (new String[][] { { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " }, }))
+ .addShape(
+ STRUCTURE_PIECE_BASE,
+ (new String[][] {
+ { " ", " ", " t ", " ttt ", " ttstt ", " ttssstt ",
+ " ttstt ", " ttt ", " t ", " ", " " },
+ { " ", " ", " t ", " ttt ", " tssst ", " ttssstt ",
+ " tssst ", " ttt ", " t ", " ", " " },
+ { " ", " t ", " ttt ", " ttttt ", " ttssstt ", " tttsssttt ",
+ " ttssstt ", " ttttt ", " ttt ", " t ", " " },
+ { " ", " t ", " ttt ", " ttttt ", " ttssstt ", " tttsssttt ",
+ " ttssstt ", " ttttt ", " ttt ", " t ", " " },
+ { " hhh ", " ttttt ", " ttttttt ", " ttttttttt ", "htttsssttth", "htttsssttth",
+ "htttsssttth", " ttttttttt ", " ttttttt ", " ttttt ", " hhh " },
+ { " hhh ", " ttttt ", " ttttttt ", " ttttttttt ", "httttttttth", "httttttttth",
+ "httttttttth", " ttttttttt ", " ttttttt ", " ttttt ", " hhh " }, }))
+ .addShape(
+ SOLAR_HEATER_RING_1,
+ (new String[][] { { " ggggg ", " g g ", " g g ", " g g ",
+ " g g ", "g g", "g g", "g g", "g g",
+ "g g", " g g ", " g g ", " g g ", " g g ",
+ " ggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_2,
+ (new String[][] {
+ { " ggggggggg ", " g g ", " g g ", " g g ",
+ " g g ", "g g", "g g", "g g",
+ "g g", "g g", "g g", "g g",
+ "g g", "g g", " g g ", " g g ",
+ " g g ", " g g ", " ggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_3,
+ (new String[][] { { " ggggggggggggg ", " g g ", " g g ",
+ " g g ", " g g ", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ " g g ", " g g ", " g g ",
+ " g g ", " ggggggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_4,
+ (new String[][] { { " ggggggggggggggggg ", " g g ",
+ " g g ", " g g ", " g g ",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", " g g ",
+ " g g ", " g g ", " g g ",
+ " ggggggggggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_5,
+ (new String[][] { { " ggggggggggggggggggggg ", " g g ",
+ " g g ", " g g ",
+ " g g ", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ " g g ", " g g ",
+ " g g ", " g g ",
+ " ggggggggggggggggggggg ", } }))
+ .addElement(
+ 'g',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_SolarTower.class)
+ .hatchClass(TileEntitySolarHeater.class)
+ .adder(GregtechMetaTileEntity_SolarTower::addSolarHeater)
+ // Use a positive casing index to make adder builder happy
+ .casingIndex(1)
+ .dot(1)
+ .continueIfSuccess()
+ .build()))
+ .addElement(
+ 't',
+ lazy(t -> onElementPass(x -> ++x.mCasing1, ofBlock(t.getCasingBlock(), t.getCasingMeta()))))
+ .addElement(
+ 'i',
+ lazy(t -> onElementPass(x -> ++x.mCasing2, ofBlock(t.getCasingBlock(), t.getCasingMeta2()))))
+ .addElement(
+ 's',
+ lazy(t -> onElementPass(x -> ++x.mCasing3, ofBlock(t.getCasingBlock(), t.getCasingMeta3()))))
+ .addElement(
+ 'c',
+ lazy(t -> onElementPass(x -> ++x.mCasing4, ofBlock(t.getCasingBlock2(), t.getCasingMeta4()))))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_SolarTower.class)
+ .atLeast(InputHatch, OutputHatch, Maintenance)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(
+ onElementPass(x -> ++x.mCasing1, ofBlock(t.getCasingBlock(), t.getCasingMeta())))))
+ .build();
+ }
+ };
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ resetSolarHeaters();
+ this.mMaintenanceHatches.clear();
+ this.mInputHatches.clear();
+ this.mOutputHatches.clear();
+ mCasing1 = 0;
+ mCasing2 = 0;
+ mCasing3 = 0;
+ mCasing4 = 0;
+
+ boolean aStructureTop = checkPiece(STRUCTURE_PIECE_TOP, 2, 2, 0);
+ log("Top Check: " + aStructureTop);
+ boolean aStructureTower = checkPiece(STRUCTURE_PIECE_TOWER, 1, 1, -7);
+ log("Tower Check: " + aStructureTower);
+ boolean aStructureBase = checkPiece(STRUCTURE_PIECE_BASE, 5, 5, -22);
+ log("Base Check: " + aStructureBase);
+ boolean aCasingCount1 = mCasing1 >= 229;
+ boolean aCasingCount2 = mCasing2 == 60;
+ boolean aCasingCount3 = mCasing3 == 66;
+ boolean aCasingCount4 = mCasing4 == 60;
+ boolean aAllStructure = aStructureTop && aStructureTower && aStructureBase;
+ boolean aAllCasings = aCasingCount1 && aCasingCount2 && aCasingCount3 && aCasingCount4;
+ if (!aAllCasings || !aAllStructure
+ || mMaintenanceHatches.size() != 1
+ || mInputHatches.size() < 1
+ || mOutputHatches.size() < 1) {
+ log(
+ "Bad Hatches - Solar Heaters: " + mSolarHeaters.size()
+ + ", Maint: "
+ + mMaintenanceHatches.size()
+ + ", Input Hatches: "
+ + mInputHatches.size()
+ + ", Output Hatches: "
+ + mOutputHatches.size()
+ + ", Top: "
+ + aStructureTop
+ + ", Tower: "
+ + aStructureTower
+ + ", Base: "
+ + aStructureBase
+ + ", Casing Count: "
+ + aCasingCount1
+ + " | Found: "
+ + mCasing1
+ + ", Casing Count: "
+ + aCasingCount2
+ + " | Found: "
+ + mCasing2
+ + ", Casing Count: "
+ + aCasingCount3
+ + " | Found: "
+ + mCasing3
+ + ", Casing Count: "
+ + aCasingCount4
+ + " | Found: "
+ + mCasing4);
+ return false;
+ }
+ log(
+ "Built " + this.getLocalName()
+ + " with "
+ + mCasing1
+ + " Structural Solar casings, "
+ + mCasing2
+ + " Thermally Insulated casings, "
+ + mCasing3
+ + " Salt Containment casings, "
+ + mCasing4
+ + " Thermal Containment casings.");
+ return aAllCasings && aAllStructure;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ // Tower
+ buildPiece(STRUCTURE_PIECE_TOP, stackSize, hintsOnly, 2, 2, 0);
+ buildPiece(STRUCTURE_PIECE_TOWER, stackSize, hintsOnly, 1, 1, -7);
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 5, 5, -22);
+
+ // Solar Heaters
+ if (stackSize.stackSize >= 1) {
+ buildPiece(SOLAR_HEATER_RING_1, stackSize, hintsOnly, 7, 7, -27);
+ if (stackSize.stackSize >= 2) {
+ buildPiece(SOLAR_HEATER_RING_2, stackSize, hintsOnly, 9, 9, -27);
+ if (stackSize.stackSize >= 3) {
+ buildPiece(SOLAR_HEATER_RING_3, stackSize, hintsOnly, 11, 11, -27);
+ if (stackSize.stackSize >= 4) {
+ buildPiece(SOLAR_HEATER_RING_4, stackSize, hintsOnly, 13, 13, -27);
+ if (stackSize.stackSize >= 5) {
+ buildPiece(SOLAR_HEATER_RING_5, stackSize, hintsOnly, 15, 15, -27);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ int built;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 2);
+ // Tower
+ built = survivialBuildPiece(STRUCTURE_PIECE_TOP, stackSize, 2, 2, 0, realBudget, env, false, true);
+ if (built >= 0) return built;
+ built = survivialBuildPiece(STRUCTURE_PIECE_TOWER, stackSize, 1, 1, -7, realBudget, env, false, true);
+ if (built >= 0) return built;
+ built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 5, 5, -22, realBudget, env, false, true);
+ if (built >= 0) return built;
+
+ // Solar Heaters
+ if (stackSize.stackSize < 1) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_1, stackSize, 7, 7, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 2) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_2, stackSize, 9, 9, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 3) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_3, stackSize, 11, 11, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 4) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_4, stackSize, 13, 13, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 5) return -1;
+ return survivialBuildPiece(SOLAR_HEATER_RING_5, stackSize, 15, 15, -27, realBudget, env, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SolarTower> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Default_Active)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Default)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for visual
+ return GTPPRecipeMaps.solarTowerRecipes;
+ }
+
+ private int getHeaterTier() {
+ int aSolarHeaterCounter = this.mSolarHeaters.size();
+ if (aSolarHeaterCounter > 0) {
+ if (aSolarHeaterCounter == 36) {
+ return 1;
+ } else if (aSolarHeaterCounter == 88) {
+ return 2;
+ } else if (aSolarHeaterCounter == 156) {
+ return 4;
+ } else if (aSolarHeaterCounter == 240) {
+ return 8;
+ } else if (aSolarHeaterCounter == 340) {
+ return 16;
+ }
+ }
+ return 0;
+ }
+
+ private int getHeaterCountForTier(int aTier) {
+ return switch (aTier) {
+ case 1 -> 36;
+ case 2 -> 88;
+ case 4 -> 156;
+ case 8 -> 240;
+ case 16 -> 340;
+ default -> 0;
+ };
+ }
+
+ public boolean getConnectedSolarReflectors() {
+
+ resetSolarHeaters();
+ int aRing = 1;
+
+ if (this.mSolarHeaters.size() < 36) {
+ // 15x15
+ boolean aRing1 = checkPiece(SOLAR_HEATER_RING_1, 7, 7, -27);
+ if (aRing1) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 88) {
+ // 17x17
+ boolean aRing2 = checkPiece(SOLAR_HEATER_RING_2, 9, 9, -27);
+ if (aRing2) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 156) {
+ // 19x19
+ boolean aRing3 = checkPiece(SOLAR_HEATER_RING_3, 11, 11, -27);
+ if (aRing3) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 240) {
+ // 21x21
+ boolean aRing4 = checkPiece(SOLAR_HEATER_RING_4, 13, 13, -27);
+ if (aRing4) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 340) {
+ // 23x23
+ boolean aRing5 = checkPiece(SOLAR_HEATER_RING_5, 15, 15, -27);
+ if (aRing5) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ return mSolarHeaters.size() > 0;
+ }
+
+ private boolean addSolarHeater(IGregTechTileEntity aTileEntity, int a) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof TileEntitySolarHeater mTile) {
+ if (!mTile.hasSolarTower() && mTile.canSeeSky()) {
+ // Logger.INFO("Found Solar Reflector, Injecting Data.");
+ mTile.setSolarTower(this);
+ return this.mSolarHeaters.add(mTile);
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ private Fluid mColdSalt = null;
+ private Fluid mHotSalt = null;
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ this.mEfficiencyIncrease = 100;
+ this.mMaxProgresstime = 200;
+
+ if (this.mSolarHeaters.isEmpty() || this.mSolarHeaters.size() < 340
+ || this.getTotalRuntimeInTicks() % 200 == 0) {
+ getConnectedSolarReflectors();
+ }
+
+ int aTier = getHeaterTier();
+ int aHeaters = getHeaterCountForTier(aTier);
+
+ // Original formula was (-Math.pow(this.mHeatLevel - 50000, 0.8) + 7000) / 7000
+ // However, negative numbers to the power of a non-integer result in NaN, by default
+ // Max efficiency is 1, at mHeatLevel = 50000, and it lowers at the same rate if going above or below this heat
+ // Min efficiency is 0.179, at mHeatLevel = 0 or 100000
+ double aEfficiency = (-Math.pow(Math.abs(this.mHeatLevel - 50000), 0.8) + 7000) / 7000;
+
+ World w = this.getBaseMetaTileEntity()
+ .getWorld();
+
+ // Manage Heat every 10s
+ // Add Heat First, if sources available and it's daytime, heat gain is halved if raining
+ if (w != null) {
+ if (aHeaters > 0 && w.isDaytime()) {
+ if (w.isRaining() && this.getBaseMetaTileEntity()
+ .getBiome().rainfall > 0.0F) {
+ this.mHeatLevel += GT_Utility.safeInt((long) ((aHeaters / 2) * aEfficiency * (10 + aTier)));
+ } else {
+ this.mHeatLevel += GT_Utility.safeInt((long) (aHeaters * aEfficiency * (10 + aTier)));
+ }
+ }
+
+ // Remove Heat, based on time of day
+ if (mHeatLevel > 0) {
+ if (mHeatLevel > 100000) {
+ this.mHeatLevel = 100000;
+ } else {
+ this.mHeatLevel -= 10;
+ }
+ }
+ }
+
+ if (this.mEfficiency == this.getMaxEfficiency(null) && this.mHeatLevel >= 30000) {
+ if (mColdSalt == null) {
+ mColdSalt = MISC_MATERIALS.SOLAR_SALT_COLD.getFluid();
+ }
+ if (mHotSalt == null) {
+ mHotSalt = MISC_MATERIALS.SOLAR_SALT_HOT.getFluid();
+ }
+ ArrayList<FluidStack> aFluids = this.getStoredFluids();
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.getFluid()
+ .equals(mColdSalt)) {
+ int aFluidAmount = Math.min(aFluid.amount, this.mHeatLevel);
+
+ this.mHeatLevel -= aFluidAmount;
+ this.depleteInput(FluidUtils.getFluidStack(mColdSalt, aFluidAmount));
+ this.addOutput(FluidUtils.getFluidStack(mHotSalt, aFluidAmount));
+ this.mHeatLevel = Math.max(this.mHeatLevel, 0);
+
+ break;
+ }
+ }
+ }
+
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public Block getCasingBlock2() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 6;
+ }
+
+ public byte getCasingMeta2() {
+ return 8;
+ }
+
+ public byte getCasingMeta3() {
+ return 7;
+ }
+
+ public byte getCasingMeta4() {
+ return 11;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) mCasingTextureID;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mHeatLevel", mHeatLevel);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mHeatLevel = aNBT.getInteger("mHeatLevel");
+ }
+
+ @Override
+ public void onRemoval() {
+ resetSolarHeaters();
+ super.onRemoval();
+ }
+
+ private void resetSolarHeaters() {
+ for (TileEntitySolarHeater aTile : this.mSolarHeaters) {
+ aTile.clearSolarTower();
+ }
+ this.mSolarHeaters.clear();
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Internal Heat Level: " + this.mHeatLevel,
+ "Connected Solar Reflectors: " + this.mSolarHeaters.size() };
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java
new file mode 100644
index 0000000000..8a3442b5e7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java
@@ -0,0 +1,376 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.algae;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_AlgaeFarm;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMTE_AlgaePondBase extends GregtechMeta_MultiBlockBase<GregtechMTE_AlgaePondBase>
+ implements ISurvivalConstructable {
+
+ private int mLevel = -1;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_AlgaePondBase> STRUCTURE_DEFINITION = null;
+ private int checkMeta;
+ private int minTierOfHatch;
+ private static final Class<?> cofhWater;
+
+ static {
+ cofhWater = ReflectionUtils.getClass("cofh.asmhooks.block.BlockWater");
+ }
+
+ public GregtechMTE_AlgaePondBase(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_AlgaePondBase(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_AlgaePondBase(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Algae Pond";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Grows Algae!")
+ .addInfo("Controller Block for the Algae Farm")
+ .addInfo("Provide compost to boost production by one tier")
+ .addInfo("Does not require power or maintenance")
+ .addInfo("All Machine Casings must be the same tier, this dictates machine speed.")
+ .addInfo("All Buses/Hatches must, at least, match the tier of the Casings")
+ .addInfo("Fill Input Hatch with Water to fill the inside of the multiblock.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 3, 9, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Machine Casings", 64, true)
+ .addCasingInfoMin("Sterile Farm Casings", 64, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ public void setMeta(int meta) {
+ checkMeta = meta;
+ }
+
+ public int getMeta() {
+ return checkMeta;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_AlgaePondBase> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_AlgaePondBase>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "CCCC~CCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC",
+ "CCCCCCCCC", "CCCCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_AlgaePondBase.class).atLeast(InputHatch, InputBus, OutputBus)
+ .casingIndex(TAE.getIndexFromPage(1, 15))
+ .dot(1)
+ .build(),
+ onElementPass(
+ x -> ++x.mCasing,
+ addTieredBlock(
+ GregTech_API.sBlockCasings1,
+ GregtechMTE_AlgaePondBase::setMeta,
+ GregtechMTE_AlgaePondBase::getMeta,
+ 10))))
+ .addElement('X', ofBlock(ModBlocks.blockCasings2Misc, 15))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 4, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 4, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mLevel = 0;
+ checkMeta = 0;
+ minTierOfHatch = 100;
+ if (checkPiece(mName, 4, 2, 0) && mCasing >= 64 && checkMeta > 0) {
+ mLevel = checkMeta - 1;
+ return mLevel <= minTierOfHatch;
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ int aID = TAE.getIndexFromPage(1, 15);
+ if (mLevel > -1) {
+ aID = mLevel;
+ }
+ return aID;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2;
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ mCurrentDirectionX = 4;
+ mCurrentDirectionZ = 4;
+
+ mOffsetX_Lower = -4;
+ mOffsetX_Upper = 4;
+ mOffsetZ_Lower = -4;
+ mOffsetZ_Upper = 4;
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; h++) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (isNotStaticWater(tBlock, tMeta)) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = Blocks.water;
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.water || tBlock == Blocks.flowing_water) {
+ ++tAmount;
+ // Logger.INFO("Found Water");
+ }
+ }
+ }
+ }
+
+ boolean isValidWater = tAmount >= 49;
+
+ if (isValidWater) {
+ Logger.INFO("Filled structure.");
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private boolean isNotStaticWater(Block block, byte meta) {
+ return block == Blocks.air || block == Blocks.flowing_water
+ || block == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)
+ || (cofhWater != null && cofhWater.isAssignableFrom(block.getClass()) && meta != 0);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAlgaePond;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ this.fixAllMaintenanceIssue();
+ // Silly Client Syncing
+ if (aBaseMetaTileEntity.isClientSide()) {
+ this.mLevel = getCasingTier();
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ return GT_StreamUtil
+ .ofNullable(RecipeLoader_AlgaeFarm.getTieredRecipeFromCache(mLevel, isUsingCompost(inputItems)));
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (!checkForWater()) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }.setEuModifier(0F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ private boolean isUsingCompost(ItemStack[] aItemInputs) {
+ ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1);
+ for (ItemStack i : aItemInputs) {
+ if (GT_Utility.areStacksEqual(aCompost, i)) {
+ if (i.stackSize >= RecipeLoader_AlgaeFarm.compostForTier(mLevel)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private int getCasingTier() {
+ if (this.getBaseMetaTileEntity()
+ .getWorld() == null) {
+ return 0;
+ }
+ try {
+ Block aInitStructureCheck;
+ int aInitStructureCheckMeta;
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int xDir = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ;
+ aInitStructureCheck = aBaseMetaTileEntity.getBlockOffset(xDir, -1, zDir);
+ aInitStructureCheckMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir, -1, zDir);
+ if (aInitStructureCheck == GregTech_API.sBlockCasings1) {
+ return aInitStructureCheckMeta;
+ }
+ return 0;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return 0;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java
new file mode 100644
index 0000000000..30d2f75457
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java
@@ -0,0 +1,676 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.chemplant;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Triplet;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_Catalysts;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMTE_ChemicalPlant extends GregtechMeta_MultiBlockBase<GregtechMTE_ChemicalPlant>
+ implements ISurvivalConstructable {
+
+ private int mSolidCasingTier = 0;
+ private int mMachineCasingTier = 0;
+ private int mPipeCasingTier = 0;
+ private int mCoilTier = 0;
+ private HeatingCoilLevel checkCoil;
+ private int[] checkCasing = new int[8];
+ private int checkMachine;
+ private int checkPipe;
+ private int maxTierOfHatch;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_ChemicalPlant> STRUCTURE_DEFINITION = null;
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_Catalysts> mCatalystBuses = new ArrayList<>();
+
+ private static final HashMap<Integer, Triplet<Block, Integer, Integer>> mTieredBlockRegistry = new HashMap<>();
+
+ public GregtechMTE_ChemicalPlant(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_ChemicalPlant(final String aName) {
+ super(aName);
+ }
+
+ public static boolean registerMachineCasingForTier(int aTier, Block aBlock, int aMeta, int aCasingTextureID) {
+ Triplet<Block, Integer, Integer> aCasingData = new Triplet<>(aBlock, aMeta, aCasingTextureID);
+ if (mTieredBlockRegistry.containsKey(aTier)) {
+ CORE.crash(
+ "Tried to register a Machine casing for tier " + aTier
+ + " to the Chemical Plant, however this tier already contains one.");
+ }
+ mTieredBlockRegistry.put(aTier, aCasingData);
+ return true;
+ }
+
+ private static int getCasingTextureIdForTier(int aTier) {
+ if (!mTieredBlockRegistry.containsKey(aTier)) {
+ return 10;
+ }
+ int aCasingID = mTieredBlockRegistry.get(aTier)
+ .getValue_3();
+ // Logger.INFO("Found casing texture ID "+aCasingID+" for tier "+aTier);
+ return aCasingID;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_ChemicalPlant(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Chemical Plant";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Chemical Plant")
+ .addInfo("Heavy Industry, now right at your doorstep!")
+ .addInfo("Please read the user manual for more information on construction and usage")
+ .addSeparator()
+ .addController("Bottom Center")
+ .addStructureHint("Catalyst Housing", 1)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addOutputHatch("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .addSubChannelUsage("casing", "metal machine casing")
+ .addSubChannelUsage("machine", "tier machine casing")
+ .addSubChannelUsage("coil", "heating coil blocks")
+ .addSubChannelUsage("pipe", "pipe casing blocks")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ public void setMachineMeta(int meta) {
+ checkMachine = meta;
+ }
+
+ public int getMachineMeta() {
+ return checkMachine;
+ }
+
+ public void setPipeMeta(int meta) {
+ checkPipe = meta;
+ }
+
+ public int getPipeMeta() {
+ return checkPipe;
+ }
+
+ public void setCoilMeta(HeatingCoilLevel meta) {
+ checkCoil = meta;
+ }
+
+ public HeatingCoilLevel getCoilMeta() {
+ return checkCoil;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_ChemicalPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ IStructureElement<GregtechMTE_ChemicalPlant> allCasingsElement = withChannel(
+ "casing",
+ ofChain(
+ IntStream.range(0, 8)
+ .mapToObj(GregtechMTE_ChemicalPlant::ofSolidCasing)
+ .collect(Collectors.toList())));
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_ChemicalPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX" },
+ { "X X", " MMMMM ", " MHHHM ", " MHHHM ", " MHHHM ", " MMMMM ", "X X" },
+ { "X X", " ", " PPP ", " PPP ", " PPP ", " ", "X X" },
+ { "X X", " ", " HHH ", " HHH ", " HHH ", " ", "X X" },
+ { "X X", " ", " PPP ", " PPP ", " PPP ", " ", "X X" },
+ { "X X", " MMMMM ", " MHHHM ", " MHHHM ", " MHHHM ", " MMMMM ", "X X" },
+ { "CCC~CCC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class).atLeast(Maintenance)
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus)
+ .adder(GregtechMTE_ChemicalPlant::addChemicalPlantList)
+ .hatchItemFilterAnd(
+ (t, s) -> filterByMTETier(
+ Integer.MIN_VALUE,
+ s.stackSize >= 10 ? Integer.MAX_VALUE : s.stackSize))
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Catalysts.class)
+ .shouldReject(t -> t.mCatalystBuses.size() >= 1)
+ .adder(GregtechMTE_ChemicalPlant::addChemicalPlantList)
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ allCasingsElement))
+ .addElement('X', allCasingsElement)
+ .addElement(
+ 'M',
+ withChannel(
+ "machine",
+ addTieredBlock(
+ GregTech_API.sBlockCasings1,
+ GregtechMTE_ChemicalPlant::setMachineMeta,
+ GregtechMTE_ChemicalPlant::getMachineMeta,
+ 10)))
+ .addElement(
+ 'H',
+ withChannel(
+ "coil",
+ ofCoil(GregtechMTE_ChemicalPlant::setCoilMeta, GregtechMTE_ChemicalPlant::getCoilMeta)))
+ .addElement(
+ 'P',
+ withChannel(
+ "pipe",
+ addTieredBlock(
+ GregTech_API.sBlockCasings2,
+ GregtechMTE_ChemicalPlant::setPipeMeta,
+ GregtechMTE_ChemicalPlant::getPipeMeta,
+ 12,
+ 16)))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private static IStructureElement<GregtechMTE_ChemicalPlant> ofSolidCasing(int aIndex) {
+ return new IStructureElement<GregtechMTE_ChemicalPlant>() {
+
+ @Override
+ public boolean check(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z) {
+ if (check(aIndex, world, x, y, z)) {
+ t.checkCasing[aIndex]++;
+ t.mCasing++;
+ return true;
+ } else return false;
+ }
+
+ private boolean check(int aIndex, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ Block target = mTieredBlockRegistry.get(aIndex)
+ .getValue_1();
+ int targetMeta = mTieredBlockRegistry.get(aIndex)
+ .getValue_2();
+ return target.equals(block) && meta == targetMeta;
+ }
+
+ int getIndex(int size) {
+ if (size > 8) size = 8;
+ return size - 1;
+ }
+
+ @Override
+ public boolean spawnHint(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(
+ world,
+ x,
+ y,
+ z,
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2());
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ return world.setBlock(
+ x,
+ y,
+ z,
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2(),
+ 3);
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(GregtechMTE_ChemicalPlant gregtechMTE_chemicalPlant, World world,
+ int x, int y, int z, ItemStack trigger, AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2());
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z,
+ ItemStack trigger, AutoPlaceEnvironment env) {
+ if (check(getIndex(trigger.stackSize), world, x, y, z)) return PlaceResult.SKIP;
+ return StructureUtility.survivalPlaceBlock(
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2(),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 6, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 6, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ for (int i = 0; i < 8; i++) {
+ checkCasing[i] = 0;
+ }
+ checkPipe = 0;
+ checkMachine = 0;
+ mSolidCasingTier = 0;
+ mMachineCasingTier = 0;
+ mPipeCasingTier = 0;
+ mCoilTier = 0;
+ maxTierOfHatch = 0;
+ mCatalystBuses.clear();
+ setCoilMeta(HeatingCoilLevel.None);
+ if (checkPiece(mName, 3, 6, 0) && mCasing >= 70) {
+ for (int i = 0; i < 8; i++) {
+ if (checkCasing[i] == mCasing) {
+ mSolidCasingTier = i;
+ } else if (checkCasing[i] > 0) return false;
+ }
+ mMachineCasingTier = checkMachine - 1;
+ mPipeCasingTier = checkPipe - 12;
+ mCoilTier = checkCoil.getTier();
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData());
+ updateHatchTexture();
+ return (mMachineCasingTier >= 9 || mMachineCasingTier >= maxTierOfHatch) && mCatalystBuses.size() <= 1;
+ }
+ return false;
+ }
+
+ public void updateHatchTexture() {
+ for (GT_MetaTileEntity_Hatch h : mCatalystBuses) h.updateTexture(getCasingTextureID());
+ for (IDualInputHatch h : mDualInputHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mInputBusses) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mMaintenanceHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mEnergyHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mOutputBusses) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mInputHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mOutputHatches) h.updateTexture(getCasingTextureID());
+ }
+
+ public final boolean addChemicalPlantList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Catalysts) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureID();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.chemicalPlantRecipes;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * getPipeCasingTier();
+ }
+
+ private int getSolidCasingTier() {
+ return this.mSolidCasingTier;
+ }
+
+ private int getMachineCasingTier() {
+ return mMachineCasingTier;
+ }
+
+ private int getPipeCasingTier() {
+ return mPipeCasingTier;
+ }
+
+ private int getCasingTextureID() {
+ // Check the Tier Client Side
+ int aTier = mSolidCasingTier;
+ return getCasingTextureIdForTier(aTier);
+ }
+
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity) {
+ int aMaxTier = getMachineCasingTier();
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_TieredMachineBlock aMachineBlock) {
+ int aTileTier = aMachineBlock.mTier;
+ if (aTileTier > aMaxTier) {
+ log("Hatch tier too high.");
+ return false;
+ } else {
+ return addToMachineList(aTileEntity, getCasingTextureID());
+ }
+ } else {
+ log("Bad Tile Entity being added to hatch map."); // Shouldn't ever happen, but.. ya know..
+ return false;
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mSolidCasingTier", this.mSolidCasingTier);
+ aNBT.setInteger("mMachineCasingTier", this.mMachineCasingTier);
+ aNBT.setInteger("mPipeCasingTier", this.mPipeCasingTier);
+ aNBT.setInteger("mCoilTier", this.mCoilTier);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mSolidCasingTier = aNBT.getInteger("mSolidCasingTier");
+ mMachineCasingTier = aNBT.getInteger("mMachineCasingTier");
+ mPipeCasingTier = aNBT.getInteger("mPipeCasingTier");
+ mCoilTier = aNBT.getInteger("mCoilTier");
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Catalysts) {
+ log("Found GT_MetaTileEntity_Hatch_Catalysts");
+ return addToMachineListInternal(mCatalystBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public int getMaxCatalystDurability() {
+ return 50;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) mSolidCasingTier;
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ super.receiveClientEvent(aEventID, aValue);
+ if (aEventID == GregTechTileClientEvents.CHANGE_CUSTOM_DATA && (aValue & 0x80) == 0) {
+ // received an update data from above method
+ // if no &0x80 clause it might catch the noop texture page event
+ mSolidCasingTier = aValue;
+ }
+ }
+
+ private void damageCatalyst(@Nonnull ItemStack aStack, int minParallel) {
+ // Awakened Draconium Coils with Tungstensteel Pipe Casings (or above) no longer consume catalysts.
+ if (!isCatalystDamageable()) return;
+ for (int i = 0; i < minParallel; i++) {
+ if (MathUtils.randFloat(0, 10000000) / 10000000f < (1.2f - (0.2 * this.mPipeCasingTier))) {
+ int damage = getDamage(aStack) + 1;
+ if (damage >= getMaxCatalystDurability()) {
+ addOutput(CI.getEmptyCatalyst(1));
+ aStack.stackSize -= 1;
+ return;
+ } else {
+ setDamage(aStack, damage);
+ }
+ }
+ }
+ }
+
+ private boolean isCatalystDamageable() {
+ return this.mCoilTier < 10 || this.mPipeCasingTier < 4;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ ItemStack catalyst;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (recipe.mSpecialValue > mSolidCasingTier) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(recipe.mSpecialValue + 1);
+ }
+ // checks if it has a catalyst
+ ItemStack catalystInRecipe = null;
+ for (ItemStack item : recipe.mInputs) {
+ if (ItemUtils.isCatalyst(item)) {
+ catalystInRecipe = item;
+ break;
+ }
+ }
+
+ if (catalystInRecipe != null) {
+ catalyst = findCatalyst(getCatalystInputs().toArray(new ItemStack[0]), catalystInRecipe);
+ if (catalyst == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_catalyst");
+ }
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ ArrayList<ItemStack> inputItemsList = new ArrayList<>(Arrays.asList(inputItems));
+ inputItemsList.addAll(getCatalystInputs());
+ inputItems = inputItemsList.toArray(new ItemStack[0]);
+ return super.process();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@NotNull GT_Recipe recipe) {
+ if (catalyst != null) {
+ damageCatalyst(catalyst, getCurrentParallels());
+ }
+ return super.onRecipeStart(recipe);
+ }
+ }.setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ // Same speed bonus as pyro oven
+ logic.setSpeedBonus(2F / (1 + this.mCoilTier));
+ }
+
+ @Override
+ public void updateSlots() {
+ super.updateSlots();
+ for (GT_MetaTileEntity_Hatch_Catalysts h : mCatalystBuses) {
+ h.updateSlots();
+ h.tryFillUsageSlots();
+ }
+ }
+
+ private ItemStack findCatalyst(ItemStack[] aItemInputs, ItemStack catalyst) {
+ if (aItemInputs != null) {
+ for (ItemStack item : aItemInputs) {
+ if (GT_Utility.areStacksEqual(item, catalyst, true)) {
+ return item;
+ }
+ }
+ }
+ return null;
+ }
+
+ private int getDamage(@Nonnull ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystDamage(aStack);
+ }
+
+ private void setDamage(@Nonnull ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setCatalystDamage(aStack, aAmount);
+ }
+
+ /*
+ * Catalyst Handling
+ */
+ public ArrayList<ItemStack> getCatalystInputs() {
+ ArrayList<ItemStack> tItems = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Catalysts tHatch : filterValidMTEs(mCatalystBuses)) {
+ AutoMap<ItemStack> aHatchContent = tHatch.getContentUsageSlots();
+ if (!aHatchContent.isEmpty()) {
+ tItems.addAll(aHatchContent);
+ }
+ }
+ return tItems;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java
new file mode 100644
index 0000000000..1679629c88
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java
@@ -0,0 +1,468 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.mega;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregTechMetaTileEntity_MegaAlloyBlastSmelter
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GregTechMetaTileEntity_MegaAlloyBlastSmelter>
+ implements ISurvivalConstructable {
+
+ private static final int MAX_PARALLELS = 256;
+ private HeatingCoilLevel coilLevel;
+ private byte glassTier = -1;
+ private boolean hasNormalCoils;
+
+ private static final IStructureDefinition<GregTechMetaTileEntity_MegaAlloyBlastSmelter> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregTechMetaTileEntity_MegaAlloyBlastSmelter>builder()
+ .addShape(
+ "main",
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ",
+ " ", " DDDDD ", " CCCCC ", " AEEEA ", " AE~EA ", " AEEEA ",
+ " CCCCC ", " ZZZZZ " },
+ { " DDDDD ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " DDDDD ", " D D ", " C C ", " A A ", " A A ", " A A ",
+ " C C ", " ZZZZZZZ " },
+ { " DDDDDDD ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " DBBBBBD ", " D BBBBB D ", " C BBBBB C ", " A BBBBB A ", " A BBBBB A ", " A BBBBB A ",
+ " C BBBBB C ", " ZZZZZZZZZ " },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDFDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDD ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " DBBBBBD ", " D BBBBB D ", " C BBBBB C ", " A BBBBB A ", " A BBBBB A ", " A BBBBB A ",
+ " C BBBBB C ", " ZZZZZZZZZ " },
+ { " DDDDD ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " DDDDD ", " D D ", " C C ", " A A ", " A A ", " A A ",
+ " C C ", " ZZZZZZZ " },
+ { " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ",
+ " ", " DDDDD ", " CCCCC ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " CCCCC ", " ZZZZZ " } })
+ .addElement(
+ 'B',
+ withChannel(
+ "coil",
+ ofChain(
+ onElementPass(
+ te -> te.hasNormalCoils = false,
+ ofCoil(
+ GregTechMetaTileEntity_MegaAlloyBlastSmelter::setCoilLevel,
+ GregTechMetaTileEntity_MegaAlloyBlastSmelter::getCoilLevel)),
+ onElementPass(te -> te.hasNormalCoils = true, ofBlock(ModBlocks.blockCasingsMisc, 14)))))
+
+ .addElement(
+ 'Z',
+ buildHatchAdder(GregTechMetaTileEntity_MegaAlloyBlastSmelter.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Energy, ExoticEnergy)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(1)
+ .buildAndChain(ofBlock(ModBlocks.blockCasingsMisc, 15)))
+ .addElement(
+ 'E',
+ buildHatchAdder(GregTechMetaTileEntity_MegaAlloyBlastSmelter.class).atLeast(Maintenance)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(2)
+ .buildAndChain(ofBlock(ModBlocks.blockCasingsMisc, 15)))
+ .addElement('D', ofBlock(ModBlocks.blockCasingsMisc, 15))
+ .addElement('C', ofBlock(ModBlocks.blockCasingsMisc, 14))
+ .addElement(
+ 'A',
+ withChannel(
+ "glass",
+ BorosilicateGlass.ofBoroGlass((byte) -1, (te, t) -> te.glassTier = t, te -> te.glassTier)))
+ .addElement('F', Muffler.newAny(TAE.GTPP_INDEX(15), 3))
+ .build();
+
+ public GregTechMetaTileEntity_MegaAlloyBlastSmelter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregTechMetaTileEntity_MegaAlloyBlastSmelter(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (glassTier < GT_Utility.getTier(recipe.mEUt)) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(GT_Utility.getTier(recipe.mEUt));
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe)
+ .setSpeedBoost((float) (1.0 - getCoilDiscount(coilLevel)));
+ }
+ }.setMaxParallel(MAX_PARALLELS);
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getMaxInputEu());
+ logic.setAvailableAmperage(1);
+ }
+
+ @Override
+ public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ boolean exotic = addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex);
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex) || exotic;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ glassTier = -1;
+ coilLevel = HeatingCoilLevel.None;
+ if (!checkPiece("main", 5, 16, 0)) return false;
+ if (hasNormalCoils) coilLevel = HeatingCoilLevel.None;
+ if (mMaintenanceHatches.size() != 1) return false;
+ if (mMufflerHatches.size() != 1) return false;
+ if (this.glassTier < 10 && !getExoticAndNormalEnergyHatchList().isEmpty()) {
+ for (GT_MetaTileEntity_Hatch hatchEnergy : getExoticAndNormalEnergyHatchList()) {
+ if (this.glassTier < hatchEnergy.mTier) {
+ return false;
+ }
+ }
+ }
+ // Disallow lasers if the glass is below UV tier
+ if (glassTier < 8) {
+ for (GT_MetaTileEntity_Hatch hatchEnergy : getExoticEnergyHatches()) {
+ if (hatchEnergy.getConnectionType() == GT_MetaTileEntity_Hatch.ConnectionType.LASER) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public double getCoilDiscount(HeatingCoilLevel lvl) {
+ // Since there are only 14 tiers (starting from 0), this is what the function is.
+ double unRounded = (lvl != null ? lvl.getTier() : 0) / 130.0D;
+ if (unRounded < 0) return 1F;
+ double rounded = Math.floor(unRounded * 1000) / 1000;
+
+ return Math.max(0, rounded);
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ super.explodeMultiblock();
+ }
+
+ @Override
+ public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() {
+ List<GT_MetaTileEntity_Hatch> tHatches = new ArrayList<>();
+ tHatches.addAll(mExoticEnergyHatches);
+ tHatches.addAll(mEnergyHatches);
+ return tHatches;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece("main", stackSize, hintsOnly, 5, 16, 0);
+ }
+
+ @Override
+ public IStructureDefinition<GregTechMetaTileEntity_MegaAlloyBlastSmelter> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fluid Alloy Cooker")
+ .addInfo("Controller block for the Mega Alloy Blast Smelter")
+ .addInfo(
+ "Runs the same recipes as the normal ABS, except with up to " + EnumChatFormatting.BOLD
+ + EnumChatFormatting.UNDERLINE
+ + MAX_PARALLELS
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY
+ + " parallels.")
+ .addInfo("Every coil tier above cupronickel grants a speed bonus, based on this function:")
+ .addInfo("Bonus = TIER / 150, rounded to the nearest thousandth.")
+ .addInfo(
+ EnumChatFormatting.ITALIC
+ + "Can also use normal ABS coils in their place instead, if you don't like the bonuses :)"
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY)
+ .addInfo("The glass limits the tier of the energy hatch. UEV glass unlocks all tiers.")
+ .addInfo("UV glass required for TecTech laser hatches.")
+ .addInfo(
+ EnumChatFormatting.ITALIC + "\"all it does is make metals hot\""
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY)
+ .beginStructureBlock(11, 20, 11, false)
+ .addStructureInfo("This structure is too complex! See schematic for details.")
+ .addMaintenanceHatch("Around the controller", 2)
+ .addOtherStructurePart("Input Bus, Output Bus, Input Hatch, Output Bus, Energy Hatch", "Bottom Casing", 1)
+ .addMufflerHatch("1 in the center of the top layer", 3)
+ .toolTipFinisher(
+ EnumChatFormatting.AQUA + "MadMan310 "
+ + EnumChatFormatting.GRAY
+ + "via "
+ + EnumChatFormatting.RED
+ + "GT++");
+ return tt;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ int paras = getBaseMetaTileEntity().isActive() ? processingLogic.getCurrentParallels() : 0;
+ int discountP = (int) (getCoilDiscount(coilLevel) * 1000) / 10;
+
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { "------------ Critical Information ------------",
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime)
+ + EnumChatFormatting.RESET
+ + "t / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime)
+ + EnumChatFormatting.RESET
+ + "t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(-lEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getAverageInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxInputAmps())
+ + EnumChatFormatting.RESET
+ + "A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getAverageInputVoltage())]
+ + EnumChatFormatting.RESET,
+ "Parallels: " + EnumChatFormatting.BLUE + paras + EnumChatFormatting.RESET,
+ "Coil Discount: " + EnumChatFormatting.BLUE + discountP + "%" + EnumChatFormatting.RESET,
+ "-----------------------------------------" };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregTechMetaTileEntity_MegaAlloyBlastSmelter(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.alloyBlastSmelterRecipes;
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return coilLevel;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel coilLevel) {
+ this.coilLevel = coilLevel;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ // Lock to single recipe
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ } else {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Batch recipes.");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes.");
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 102400;
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece("main", stackSize, 5, 16, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.glassTier = aNBT.getByte("glassTier");
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("separateBusses");
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("glassTier", glassTier);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java
new file mode 100644
index 0000000000..84fac40265
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java
@@ -0,0 +1,208 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static gtPlusPlus.core.lib.CORE.RANDOM;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Gas extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private static final HashSet<Fluid> BLACKLIST = new HashSet<>();
+
+ static {
+ BLACKLIST.add(
+ Materials.Benzene.getFluid(0)
+ .getFluid());
+ }
+
+ public GT_MTE_LargeTurbine_Gas(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Gas(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Gas(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 3;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 58;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return false;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 4000;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) {
+ return 0;
+ }
+ GT_Recipe tFuel = getRecipeMap().getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) {
+ return tFuel.mSpecialValue;
+ }
+ return 0;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.gasTurbineFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -20;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ List<FluidStack> fluids = getStoredFluids();
+ for (FluidStack fluid : fluids) {
+ if (fluid != null && BLACKLIST.contains(fluid.getFluid())) {
+ return SimpleCheckRecipeResult.ofFailure("fuel_blacklisted");
+ }
+ }
+ return super.checkProcessing();
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ int tEU = 0;
+ int actualOptimalFlow = 0;
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+ // log("Fuel Value of "+aFluids.get(0).getLocalizedName()+" is "+fuelValue+"eu");
+ if (aOptFlow < fuelValue) {
+ // turbine too weak and/or fuel too powerful
+ // at least consume 1L
+ this.realOptFlow = 1;
+ // wastes the extra fuel and generate aOptFlow directly
+ depleteInput(new FluidStack(firstFuelType, 1));
+ this.storedFluid += 1;
+ return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L);
+ }
+
+ actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * (double) flowMultipliers[1] / fuelValue));
+ this.realOptFlow = actualOptimalFlow;
+
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * 1.25f)); // Allowed to use up to 125% of
+ // optimal flow. Variable
+ // required outside of loop for
+ // multi-hatch scenarios.
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up to 125% of optimal flow w/o
+ // exceeding remainingFlow
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) totalFlow * fuelValue);
+
+ if (totalFlow == actualOptimalFlow) {
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ } else {
+ float efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ tEU *= efficiency;
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ }
+
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Gas Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Gas";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Gas Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java
new file mode 100644
index 0000000000..db99b52be1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java
@@ -0,0 +1,314 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Plasma extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private static final HashSet<Fluid> BLACKLIST = new HashSet<>();
+
+ public GT_MTE_LargeTurbine_Plasma(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Plasma(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Plasma(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 4;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 60;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) {
+ return 0;
+ }
+ GT_Recipe tFuel = getRecipeMap().getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) {
+ return tFuel.mSpecialValue;
+ }
+ return 0;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.plasmaFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -20;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+
+ try {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = getEmptyTurbineAssemblies();
+ if (aEmptyTurbineRotorHatches.size() > 0) {
+ hatch: for (GT_MetaTileEntity_Hatch_Turbine aHatch : aEmptyTurbineRotorHatches) {
+ ArrayList<ItemStack> aTurbines = getAllBufferedTurbines();
+ for (ItemStack aTurbineItem : aTurbines) {
+ if (aTurbineItem == null) {
+ continue;
+ }
+ if (aHatch.insertTurbine(aTurbineItem.copy())) {
+ depleteTurbineFromStock(aTurbineItem);
+ continue hatch;
+ }
+ }
+ }
+ }
+
+ if (getEmptyTurbineAssemblies().size() > 0 || !areAllTurbinesTheSame()) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ if (tFluids.size() > 0) {
+ for (FluidStack fluid : tFluids) {
+ if (fluid != null && BLACKLIST.contains(fluid.getFluid())) {
+ return SimpleCheckRecipeResult.ofFailure("fuel_blacklisted");
+ }
+ }
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+
+ float aTotalBaseEff = 0;
+ float aTotalOptimalFlow = 0;
+
+ ItemStack aStack = getFullTurbineAssemblies().get(0)
+ .getTurbine();
+ aTotalBaseEff += GT_Utility.safeInt(
+ (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
+ aTotalOptimalFlow += GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
+ * 50));
+
+ // Calculate total EU/t (as shown on turbine tooltip (Fast mode doesn't affect))
+ double aEUPerTurbine = aTotalOptimalFlow * 40
+ * 0.0105
+ * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier
+ * (50.0f + (10.0f * ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)));
+ aTotalOptimalFlow *= getSpeedMultiplier();
+
+ if (aTotalOptimalFlow < 0) {
+ aTotalOptimalFlow = 100;
+ }
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ baseEff = MathUtils.roundToClosestInt(aTotalBaseEff);
+ optFlow = MathUtils.roundToClosestInt(aTotalOptimalFlow);
+ euPerTurbine = MathUtils.roundToClosestInt(aEUPerTurbine);
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ // How much the turbine should be producing with this flow
+ long newPower = fluidIntoPower(tFluids, optFlow, baseEff, flowMultipliers);
+
+ // Reduce produced power depending on the ratio between fuel value and turbine EU/t with the following
+ // formula:
+ // EU/t = EU/t * MIN(1, ( ( (FuelValue / 200) ^ 2 ) / EUPerTurbine))
+ int fuelValue = 0;
+ if (tFluids.size() > 0) {
+ fuelValue = getFuelValue(new FluidStack(tFluids.get(0), 0));
+ }
+ float magicValue = (fuelValue * 0.005f) * (fuelValue * 0.005f);
+ float efficiencyLoss = Math.min(1.0f, magicValue / euPerTurbine);
+ newPower *= efficiencyLoss;
+
+ long difference = newPower - this.lEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the
+ // difference in power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(10, GT_Utility.safeInt((long) Math.abs(difference) / 100));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed
+ // change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.lEUt += change; // Apply the change
+ } else {
+ this.lEUt = newPower;
+ }
+ if (this.lEUt <= 0) {
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 20;
+ this.mEfficiencyIncrease = 10;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+ // Play sounds (GT++ addition - GT multiblocks play no sounds)
+ enableAllTurbineHatches();
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ aOptFlow *= 800; // CHANGED THINGS HERE, check recipe runs once per 20 ticks
+ int tEU = 0;
+
+ int actualOptimalFlow = 0;
+
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+ actualOptimalFlow = GT_Utility
+ .safeInt((long) Math.ceil((double) aOptFlow * (double) flowMultipliers[2] / (double) fuelValue));
+ this.realOptFlow = actualOptimalFlow; // For scanner info
+
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * 1.25f)); // Allowed to use up to 125% of
+ // optimal flow. Variable
+ // required outside of loop for
+ // multi-hatch scenarios.
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ String fn = FluidRegistry.getFluidName(firstFuelType);
+ String[] nameSegments = fn.split("\\.", 2);
+ if (nameSegments.length == 2) {
+ String outputName = nameSegments[1];
+ FluidStack output = FluidRegistry.getFluidStack(outputName, totalFlow);
+ if (output == null) {
+ output = FluidRegistry.getFluidStack("molten." + outputName, totalFlow);
+ }
+ if (output != null) {
+ addOutput(output);
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) ((fuelValue / 20D) * (double) totalFlow));
+
+ if (totalFlow == actualOptimalFlow) {
+ tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU));
+ } else {
+ double efficiency = 1.0D - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+
+ tEU = (int) (tEU * efficiency);
+ tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU));
+ }
+
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Plasma Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Plasma";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Plasma Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java
new file mode 100644
index 0000000000..7ee40757fd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MTE_LargeTurbine_SCSteam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ public GT_MTE_LargeTurbine_SCSteam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_SCSteam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_SCSteam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 15;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 1538;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ int tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow;
+ // this.realOptFlow = (double) aOptFlow * (double) flowMultipliers[0];
+ // Will there be an multiplier for SC?
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to use up to
+ // 125% of optimal flow.
+
+ storedFluid = 0;
+ FluidStack tSCSteam = FluidRegistry.getFluidStack("supercriticalsteam", 1);
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) {
+ if (GT_Utility.areFluidsEqual(aFluids.get(i), tSCSteam, true)) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ addOutput(GT_ModHandler.getSteam(totalFlow));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1, MathUtils.safeInt((long) tEU * (long) aBaseEff / 10000L));
+ } else {
+ tEU = MathUtils.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ }
+
+ return tEU * 100L;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 8;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Supercritical Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Supercritical Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced SC Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return TextureFactory.of(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return TextureFactory.of(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java
new file mode 100644
index 0000000000..d1346d3a51
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_SHSteam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ public boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MTE_LargeTurbine_SHSteam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_SHSteam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_SHSteam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 2;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 59;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (looseFit) {
+ aOptFlow *= 4;
+ if (aBaseEff > 10000) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff = 7500;
+ } else if (aBaseEff > 7500) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff *= 0.75f;
+ } else {
+ aBaseEff *= 0.75f;
+ }
+ }
+ // prevent overflow like that in SC Steam
+ long tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to use up to
+ // 125% of optimal flow.
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) {
+ String fluidName = aFluids.get(i)
+ .getFluid()
+ .getUnlocalizedName(aFluids.get(i));
+ if (fluidName.equals("ic2.fluidSuperheatedSteam")) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "efficientsteam");
+ } catch (Exception e) {}
+ achievement = true;
+ }
+ } else if (fluidName.equals("fluid.steam") || fluidName.equals("ic2.fluidSteam")
+ || fluidName.equals("fluid.mfr.steam.still.name")) {
+ depleteInput(new FluidStack(aFluids.get(i), aFluids.get(i).amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ addOutput(GT_ModHandler.getSteam(totalFlow));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1L, tEU * aBaseEff / 10000L);
+ } else {
+ tEU = tEU * aBaseEff / 10000L;
+ }
+
+ return tEU;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Using a screwdriver to change modes should allow for any combination of Slow/Fast and Tight/Loose Mode
+ // Whenever there's a mode switch, there will be two messages on the player chat
+ // The two messages specify which two modes the turbine is on after the change
+ // (Tight/Loose changes on every action, Slow/Fast changes every other action, all pairs are cycled this way)
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? "Fitting is Loose (Higher Flow)" : "Fitting is Tight (Higher Efficiency)");
+ }
+
+ if (looseFit) {
+ super.onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ } else if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && CORE.RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public boolean isLooseMode() {
+ return looseFit;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Super-heated Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Super-heated Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced HP Steam Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java
new file mode 100644
index 0000000000..c882b84aab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static gtPlusPlus.core.lib.CORE.RANDOM;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Steam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private float water;
+ private boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MTE_LargeTurbine_Steam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Steam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Steam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 1;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ private int useWater(float input) {
+ water = water + input;
+ int usage = (int) water;
+ water = water - usage;
+ return usage;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (looseFit) {
+ aOptFlow *= 4;
+ if (aBaseEff > 10000) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff = 7500;
+ } else if (aBaseEff > 7500) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff *= 0.75f;
+ } else {
+ aBaseEff *= 0.75f;
+ }
+ }
+ // prevent overflow like that in SC Steam
+ long tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to
+ // use up to
+ // 125% of
+ // optimal flow.
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { // loop through each hatch; extract inputs and
+ // track totals.
+ String fluidName = aFluids.get(i)
+ .getFluid()
+ .getUnlocalizedName(aFluids.get(i));
+ if (fluidName.equals("fluid.steam") || fluidName.equals("ic2.fluidSteam")
+ || fluidName.equals("fluid.mfr.steam.still.name")) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "muchsteam");
+ achievement = true;
+ }
+ } else if (fluidName.equals("ic2.fluidSuperheatedSteam")) {
+ depleteInput(new FluidStack(aFluids.get(i), aFluids.get(i).amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ int waterToOutput = useWater(totalFlow / 160.0f);
+ addOutput(GT_ModHandler.getDistilledWater(waterToOutput));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1L, tEU * aBaseEff / 20000L);
+ } else {
+ tEU = tEU * aBaseEff / 20000L;
+ }
+
+ return tEU;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Using a screwdriver to change modes should allow for any combination of Slow/Fast and Tight/Loose Mode
+ // Whenever there's a mode switch, there will be two messages on the player chat
+ // The two messages specify which two modes the turbine is on after the change
+ // (Tight/Loose changes on every action, Slow/Fast changes every other action, all pairs are cycled this way)
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? "Fitting: Loose - More Flow" : "Fitting: Tight - More Efficiency");
+ }
+
+ if (looseFit) {
+ super.onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ } else if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public boolean isLooseMode() {
+ return looseFit;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Steam Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java
new file mode 100644
index 0000000000..eec137cea2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java
@@ -0,0 +1,893 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public abstract class GregtechMetaTileEntity_LargerTurbineBase
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargerTurbineBase> implements ISurvivalConstructable {
+
+ protected int baseEff = 0;
+ protected long optFlow = 0;
+ protected long euPerTurbine = 0;
+ protected double realOptFlow = 0;
+ protected int storedFluid = 0;
+ protected int counter = 0;
+ protected boolean mFastMode = false;
+ protected double mufflerReduction = 1;
+ protected float[] flowMultipliers = new float[] { 1, 1, 1 };
+
+ public ITexture frontFace;
+ public ITexture frontFaceActive;
+
+ public ArrayList<GT_MetaTileEntity_Hatch_Turbine> mTurbineRotorHatches = new ArrayList<>();
+
+ public GregtechMetaTileEntity_LargerTurbineBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ frontFace = getTextureFrontFace();
+ frontFaceActive = getTextureFrontFaceActive();
+ }
+
+ public GregtechMetaTileEntity_LargerTurbineBase(String aName) {
+ super(aName);
+ frontFace = getTextureFrontFace();
+ frontFaceActive = getTextureFrontFaceActive();
+ }
+
+ protected abstract ITexture getTextureFrontFace();
+
+ protected abstract ITexture getTextureFrontFaceActive();
+
+ protected abstract String getTurbineType();
+
+ protected abstract String getCasingName();
+
+ protected abstract boolean requiresOutputHatch();
+
+ @Override
+ protected final GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the XL " + getTurbineType() + " Turbine")
+ .addInfo("Runs as fast as 16 Large Turbines of the same type, takes the space of 12")
+ .addInfo("Right-click with screwdriver to enable Fast Mode, to run it even faster")
+ .addInfo("Optimal flow will increase or decrease accordingly on mode switch")
+ .addInfo("Fast Mode increases speed to 48x instead of 16x, with some penalties")
+ .addInfo("Maintenance problems and turbine damage happen 12x as often in Fast Mode");
+ if (getTurbineType().contains("Steam")) {
+ tt.addInfo("XL Steam Turbines can use Loose Mode with either Slow or Fast Mode");
+ }
+ if (getTurbineType().equals("Plasma")) {
+ tt.addInfo("Plasma fuel efficiency is lower for high tier turbines when using low-grade plasmas")
+ .addInfo("Efficiency = ((FuelValue / 200,000)^2) / (EU per Turbine)");
+ }
+ tt.addPollutionAmount(getPollutionPerSecond(null))
+ .addInfo("Pollution is 3x higher in Fast Mode")
+ .addSeparator()
+ .beginStructureBlock(7, 9, 7, false)
+ .addController("Top Middle")
+ .addCasingInfoMin(getCasingName(), 360, false)
+ .addCasingInfoMin("Rotor Shaft", 30, false)
+ .addOtherStructurePart("Rotor Assembly", "Any 1 dot hint", 1)
+ .addInputBus("Any 4 dot hint (min 1)", 4)
+ .addInputHatch("Any 4 dot hint(min 1)", 4);
+ if (requiresOutputHatch()) {
+ tt.addOutputHatch("Any 4 dot hint(min 1)", 4);
+ }
+ tt.addDynamoHatch("Any 4 dot hint(min 1)", 4)
+ .addMaintenanceHatch("Any 4 dot hint(min 1)", 4);
+ if (requiresMufflers()) {
+ tt.addMufflerHatch("Any 7 dot hint (x4)", 7);
+ }
+ tt.toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ @SuppressWarnings("SpellCheckingInspection")
+ protected IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase> computeValue(Class<?> type) {
+ return StructureDefinition.<GregtechMetaTileEntity_LargerTurbineBase>builder()
+ // c = turbine casing
+ // s = turbine shaft
+ // t = turbine housing
+ // h = dynamo/maint
+ // m = muffler
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] { { "ccchccc", "ccccccc", "ccmmmcc", "ccm~mcc", "ccmmmcc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" }, }))
+ .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement('s', lazy(t -> ofBlock(t.getShaftBlock(), t.getTurbineShaftMeta())))
+ .addElement(
+ 't',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class)
+ .adder(GregtechMetaTileEntity_LargerTurbineBase::addTurbineHatch)
+ .hatchClass(GT_MetaTileEntity_Hatch_Turbine.class)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(1)
+ .build()))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, Dynamo.or(TTDynamo), Maintenance)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(4)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement(
+ 'm',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class).atLeast(Muffler)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(7)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .build();
+ }
+ };
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ private boolean requiresMufflers() {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ return false;
+ }
+ return getPollutionPerSecond(null) > 0;
+ }
+
+ public final double getMufflerReduction() {
+ double totalReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ totalReduction += ((double) tHatch.calculatePollutionReduction(100)) / 100;
+ }
+ return totalReduction / 4;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mTurbineRotorHatches.clear();
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // we do not check for casing count here. the bare minimal is 372 but we only require 360
+ boolean aStructure = checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0);
+ log("Structure Check: " + aStructure);
+ if (mTurbineRotorHatches.size() != 12 || mMaintenanceHatches.size() != 1
+ || (mDynamoHatches.size() < 1 && mTecTechDynamoHatches.size() < 1)
+ || (requiresMufflers() && mMufflerHatches.size() != 4)
+ || mInputBusses.size() < 1
+ || mInputHatches.size() < 1
+ || (requiresOutputHatch() && mOutputHatches.size() < 1)) {
+ log(
+ "Bad Hatches - Turbine Housings: " + mTurbineRotorHatches.size()
+ + ", Maint: "
+ + mMaintenanceHatches.size()
+ + ", Dynamo: "
+ + mDynamoHatches.size()
+ + ", Muffler: "
+ + mMufflerHatches.size()
+ + ", Input Buses: "
+ + mInputBusses.size()
+ + ", Input Hatches: "
+ + mInputHatches.size()
+ + ", Output Hatches: "
+ + mOutputHatches.size());
+ return false;
+ }
+ mufflerReduction = getMufflerReduction();
+ return aStructure;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 2);
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 3, 0, realBudget, env, false, true);
+ }
+
+ public boolean addTurbineHatch(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine aTurbineHatch) {
+ log("Found GT_MetaTileEntity_Hatch_Turbine");
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ IGregTechTileEntity g = this.getBaseMetaTileEntity();
+ if (aTurbineHatch.setController(new BlockPos(g.getXCoord(), g.getYCoord(), g.getZCoord(), g.getWorld()))) {
+ boolean aDidAdd = this.mTurbineRotorHatches.add(aTurbineHatch);
+ Logger.INFO("Injected Controller into Turbine Assembly. Found: " + this.mTurbineRotorHatches.size());
+ return aDidAdd;
+ } else {
+ Logger.INFO("Failed to inject controller into Turbine Assembly Hatch.");
+ }
+ }
+ log("Bad Turbine Housing");
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public final Block getShaftBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public abstract int getCasingMeta();
+
+ public byte getTurbineShaftMeta() {
+ return 0;
+ }
+
+ public abstract int getCasingTextureIndex();
+
+ public abstract int getFuelValue(FluidStack aLiquid);
+
+ public static boolean isValidTurbine(ItemStack aTurbine) {
+ return (aTurbine != null && aTurbine.getItem() instanceof GT_MetaGenerated_Tool
+ && aTurbine.getItemDamage() >= 170
+ && aTurbine.getItemDamage() <= 176);
+ }
+
+ protected ArrayList<ItemStack> getAllBufferedTurbines() {
+ startRecipeProcessing();
+ ArrayList<ItemStack> aTurbinesInStorage = new ArrayList<>();
+ for (ItemStack aStack : getStoredInputs()) {
+ if (isValidTurbine(aStack)) {
+ int stackSize = aStack.stackSize;
+ while (stackSize > 0) {
+ int tmpStackSize = Math.min(stackSize, aStack.getMaxStackSize());
+ ItemStack copy = aStack.copy();
+ copy.stackSize = tmpStackSize;
+ aTurbinesInStorage.add(copy);
+ stackSize -= tmpStackSize;
+ }
+ }
+ }
+ endRecipeProcessing();
+ return aTurbinesInStorage;
+ }
+
+ public boolean areAllTurbinesTheSame() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aTurbineAssemblies = getFullTurbineAssemblies();
+ if (aTurbineAssemblies.size() < 12) {
+ log("Found " + aTurbineAssemblies.size() + ", expected 12.");
+ return false;
+ }
+ AutoMap<Materials> aTurbineMats = new AutoMap<>();
+ AutoMap<Integer> aTurbineSizes = new AutoMap<>();
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : aTurbineAssemblies) {
+ aTurbineMats.add(GT_MetaGenerated_Tool.getPrimaryMaterial(aHatch.getTurbine()));
+ aTurbineSizes.add(getTurbineSize(aHatch.getTurbine()));
+ }
+ Materials aBaseMat = aTurbineMats.get(0);
+ int aBaseSize = aTurbineSizes.get(0);
+ for (int aSize : aTurbineSizes) {
+ if (aBaseSize != aSize) {
+ return false;
+ }
+ }
+ for (Materials aMat : aTurbineMats) {
+ if (aBaseMat != aMat) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static int getTurbineSize(ItemStack aTurbine) {
+ if (isValidTurbine(aTurbine)) {
+ if (aTurbine.getItemDamage() >= 170 && aTurbine.getItemDamage() < 172) {
+ return 1;
+ } else if (aTurbine.getItemDamage() >= 172 && aTurbine.getItemDamage() < 174) {
+ return 2;
+ } else if (aTurbine.getItemDamage() >= 174 && aTurbine.getItemDamage() < 176) {
+ return 3;
+ } else if (aTurbine.getItemDamage() >= 176 && aTurbine.getItemDamage() < 178) {
+ return 4;
+ }
+ }
+ return 0;
+ }
+
+ public static String getTurbineSizeString(int aSize) {
+ return switch (aSize) {
+ case 1 -> "Small Turbine";
+ case 2 -> "Turbine";
+ case 3 -> "Large Turbine";
+ case 4 -> "Huge Turbine";
+ default -> "";
+ };
+ }
+
+ protected ArrayList<GT_MetaTileEntity_Hatch_Turbine> getEmptyTurbineAssemblies() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = new ArrayList<>();
+ // log("Checking "+mTurbineRotorHatches.size()+" Assemblies for empties.");
+ for (GT_MetaTileEntity_Hatch_Turbine aTurbineHatch : this.mTurbineRotorHatches) {
+ if (!aTurbineHatch.hasTurbine()) {
+ aEmptyTurbineRotorHatches.add(aTurbineHatch);
+ }
+ }
+ return aEmptyTurbineRotorHatches;
+ }
+
+ protected ArrayList<GT_MetaTileEntity_Hatch_Turbine> getFullTurbineAssemblies() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aTurbineRotorHatches = new ArrayList<>();
+ // log("Checking "+mTurbineRotorHatches.size()+" Assemblies for Turbines.");
+ for (GT_MetaTileEntity_Hatch_Turbine aTurbineHatch : this.mTurbineRotorHatches) {
+ if (aTurbineHatch.hasTurbine()) {
+ // log("Found Assembly with Turbine.");
+ aTurbineRotorHatches.add(aTurbineHatch);
+ }
+ }
+ return aTurbineRotorHatches;
+ }
+
+ protected void depleteTurbineFromStock(ItemStack aTurbine) {
+ if (aTurbine == null) {
+ return;
+ }
+ startRecipeProcessing();
+ for (GT_MetaTileEntity_Hatch_InputBus aInputBus : this.mInputBusses) {
+ for (int slot = aInputBus.getSizeInventory() - 1; slot >= 0; slot--) {
+ ItemStack aStack = aInputBus.getStackInSlot(slot);
+ if (aStack != null && GT_Utility.areStacksEqual(aStack, aTurbine)) {
+ aStack.stackSize -= aTurbine.stackSize;
+ updateSlots();
+ endRecipeProcessing();
+ return;
+ }
+ }
+ }
+ endRecipeProcessing();
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ try {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = getEmptyTurbineAssemblies();
+ if (aEmptyTurbineRotorHatches.size() > 0) {
+ hatch: for (GT_MetaTileEntity_Hatch_Turbine aHatch : aEmptyTurbineRotorHatches) {
+ ArrayList<ItemStack> aTurbines = getAllBufferedTurbines();
+ for (ItemStack aTurbineItem : aTurbines) {
+ if (aTurbineItem == null) {
+ continue;
+ }
+ if (aHatch.insertTurbine(aTurbineItem.copy())) {
+ depleteTurbineFromStock(aTurbineItem);
+ continue hatch;
+ }
+ }
+ }
+ }
+
+ if (getEmptyTurbineAssemblies().size() > 0 || !areAllTurbinesTheSame()) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ if (tFluids.size() > 0) {
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+ float aTotalBaseEff = 0;
+ float aTotalOptimalFlow = 0;
+
+ ItemStack aStack = getFullTurbineAssemblies().get(0)
+ .getTurbine();
+ aTotalBaseEff += GT_Utility.safeInt(
+ (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
+ aTotalOptimalFlow += GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
+ * 50)
+ * getSpeedMultiplier());
+ if (aTotalOptimalFlow < 0) {
+ aTotalOptimalFlow = 100;
+ }
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ baseEff = MathUtils.roundToClosestInt(aTotalBaseEff);
+ optFlow = MathUtils.roundToClosestInt(aTotalOptimalFlow);
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ // How much the turbine should be producing with this flow
+ long newPower = fluidIntoPower(tFluids, optFlow, baseEff, flowMultipliers);
+ long difference = newPower - this.lEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the
+ // difference in power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(10, GT_Utility.safeInt(Math.abs(difference) / 100));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed
+ // change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.lEUt += change; // Apply the change
+ } else {
+ this.lEUt = newPower;
+ }
+ if (this.lEUt <= 0) {
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 10;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+ // Play sounds (GT++ addition - GT multiblocks play no sounds)
+ enableAllTurbineHatches();
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ public boolean doRandomMaintenanceDamage() {
+ if (getMaxParallelRecipes() == 0) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return false;
+ }
+
+ if (mRuntime++ > 1000) {
+ mRuntime = 0;
+
+ if (getBaseMetaTileEntity().getRandomNumber(6000) < getMaintenanceThreshold()) {
+ switch (getBaseMetaTileEntity().getRandomNumber(6)) {
+ case 0 -> mWrench = false;
+ case 1 -> mScrewdriver = false;
+ case 2 -> mSoftHammer = false;
+ case 3 -> mHardHammer = false;
+ case 4 -> mSolderingTool = false;
+ case 5 -> mCrowbar = false;
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : getFullTurbineAssemblies()) {
+ // This cycle depletes durability from the turbine rotors.
+ // The amount of times it is run depends on turbineDamageMultiplier
+ // In XL turbines, durability loss is around 5.2-5.3x faster than in singles
+ // To compensate for that, the mEU/t scaling is divided by 5 to make it only slightly faster
+ for (int i = 0; i < getTurbineDamageMultiplier(); i++) {
+ aHatch.damageTurbine(lEUt / 5, damageFactorLow, damageFactorHigh);
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (getFullTurbineAssemblies().size());
+ }
+
+ abstract long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers);
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return this.getMaxParallelRecipes() == 12 ? 10000 : 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public boolean isLooseMode() {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ int mPollutionReduction = (int) (100 * mufflerReduction);
+
+ String tRunning = mMaxProgresstime > 0
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false")
+ + EnumChatFormatting.RESET;
+
+ String tMaintenance = getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET;
+ int tDura;
+
+ StringBuilder aTurbineDamage = new StringBuilder();
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : this.getFullTurbineAssemblies()) {
+ ItemStack aTurbine = aHatch.getTurbine();
+ tDura = MathUtils.safeInt(
+ (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(aTurbine)
+ * (GT_MetaGenerated_Tool.getToolDamage(aTurbine)) + 1));
+ aTurbineDamage.append(EnumChatFormatting.RED)
+ .append(GT_Utility.formatNumbers(tDura))
+ .append(EnumChatFormatting.RESET)
+ .append("% | ");
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ boolean aIsSteam = this.getClass()
+ .getName()
+ .toLowerCase()
+ .contains("steam");
+
+ String[] ret = new String[] {
+ // 8 Lines available for information panels
+ tRunning + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(((lEUt * mEfficiency) / 10000))
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ tMaintenance,
+ StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers((mEfficiency / 100F))
+ + EnumChatFormatting.RESET
+ + "%",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/s"
+ + EnumChatFormatting.YELLOW
+ + " ("
+ + (isLooseMode() ? StatCollector.translateToLocal("GT5U.turbine.loose")
+ : StatCollector.translateToLocal("GT5U.turbine.tight"))
+ + ")",
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(storedFluid)
+ + EnumChatFormatting.RESET
+ + "L",
+ StatCollector.translateToLocal("GT5U.turbine.dmg") + ": " + aTurbineDamage,
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mPollutionReduction)
+ + EnumChatFormatting.RESET
+ + " %" };
+ if (!aIsSteam) ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/t";
+ return ret;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean polluteEnvironment(int aPollutionLevel) {
+ if (this.requiresMufflers()) {
+ mPollution += aPollutionLevel * getPollutionMultiplier() * mufflerReduction;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ if (mPollution >= 10000) {
+ if (PollutionUtils.addPollution(this.getBaseMetaTileEntity(), 10000)) {
+ mPollution -= 10000;
+ }
+ } else {
+ break;
+ }
+ }
+ return mPollution < 10000;
+ }
+ return true;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ // This should not be a hard limit, due to TecTech dynamos
+ if (mFastMode) {
+ return 64;
+ } else {
+ return 16;
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFastMode", mFastMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFastMode = aNBT.getBoolean("mFastMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFastMode = !mFastMode;
+ if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ public final ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side,
+ ForgeDirection facing, int aColorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[1][aColorIndex + 1],
+ facing == side ? getFrontFacingTurbineTexture(aActive)
+ : Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) };
+ }
+
+ protected ITexture getFrontFacingTurbineTexture(boolean isActive) {
+ if (isActive) {
+ return frontFaceActive;
+ }
+ return frontFace;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.maxProgresstime() > 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ enableAllTurbineHatches();
+ }
+ if (this.maxProgresstime() <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE);
+ }
+ }
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ baseEff = 0;
+ optFlow = 0;
+ disableAllTurbineHatches();
+ super.stopMachine(reason);
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ for (GT_MetaTileEntity_Hatch_Turbine h : this.mTurbineRotorHatches) {
+ h.clearController();
+ }
+ disableAllTurbineHatches();
+ this.mTurbineRotorHatches.clear();
+ }
+
+ public void enableAllTurbineHatches() {
+ updateTurbineHatches(this.isMachineRunning());
+ }
+
+ public void disableAllTurbineHatches() {
+ updateTurbineHatches(false);
+ }
+
+ private Long mLastHatchUpdate;
+
+ public void updateTurbineHatches(boolean aState) {
+ if (mLastHatchUpdate == null) {
+ mLastHatchUpdate = System.currentTimeMillis() / 1000;
+ }
+ if (this.mTurbineRotorHatches.isEmpty() || ((System.currentTimeMillis() / 1000) - mLastHatchUpdate) <= 2) {
+ return;
+ }
+ for (GT_MetaTileEntity_Hatch_Turbine h : filterValidMTEs(this.mTurbineRotorHatches)) {
+ h.setActive(aState);
+ }
+
+ mLastHatchUpdate = System.currentTimeMillis() / 1000;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ /**
+ * Called every tick the Machine runs
+ */
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (lEUt > 0) {
+ addEnergyOutput((lEUt * mEfficiency) / 10000);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ if (aEU <= 0) {
+ return true;
+ }
+ if (this.mAllDynamoHatches.size() > 0) {
+ return addEnergyOutputMultipleDynamos(aEU, true);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) {
+ int injected = 0;
+ long aFirstVoltageFound = -1;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(mAllDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ // Check against voltage to check when hatch mixing
+ if (aFirstVoltageFound == -1) {
+ aFirstVoltageFound = aVoltage;
+ }
+ }
+
+ long leftToInject;
+ long aVoltage;
+ int aAmpsToInject;
+ int aRemainder;
+ int ampsOnCurrentHatch;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(mAllDynamoHatches)) {
+ leftToInject = aEU - injected;
+ aVoltage = aDynamo.maxEUOutput();
+ aAmpsToInject = (int) (leftToInject / aVoltage);
+ aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage));
+ ampsOnCurrentHatch = (int) Math.min(aDynamo.maxAmperesOut(), aAmpsToInject);
+
+ // add full amps
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aVoltage * ampsOnCurrentHatch, false);
+ injected += aVoltage * ampsOnCurrentHatch;
+
+ // add reminder
+ if (aRemainder > 0 && ampsOnCurrentHatch < aDynamo.maxAmperesOut()) {
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aRemainder, false);
+ injected += aRemainder;
+ }
+ }
+ return injected > 0;
+ }
+
+ public int getSpeedMultiplier() {
+ return mFastMode ? 48 : 16;
+ }
+
+ public int getMaintenanceThreshold() {
+ return mFastMode ? 12 : 1;
+ }
+
+ public int getPollutionMultiplier() {
+ return mFastMode ? 3 : 1;
+ }
+
+ public int getTurbineDamageMultiplier() {
+ return mFastMode ? 3 : 1;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java
new file mode 100644
index 0000000000..67244cb399
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java
@@ -0,0 +1,939 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onlyIf;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTEnergy;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ChannelDataAccessor;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.forge.PlayerMainInvWrapper;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.MovingAverageLong;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_PowerSubStationController extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_PowerSubStationController> implements ISurvivalConstructable {
+
+ private static enum TopState {
+ MayBeTop,
+ Top,
+ NotTop
+ }
+
+ protected long mAverageEuUsage = 0;
+ protected final MovingAverageLong mAverageEuAdded = new MovingAverageLong(20);
+ protected final MovingAverageLong mAverageEuConsumed = new MovingAverageLong(20);
+ protected long mTotalEnergyAdded = 0;
+ protected long mTotalEnergyConsumed = 0;
+ protected long mTotalEnergyLost = 0;
+ protected boolean mIsOutputtingPower = false;
+ protected long mBatteryCapacity = 0;
+
+ private final int ENERGY_TAX = 5;
+
+ private int mCasing;
+ private int[] cellCount = new int[6];
+ private TopState topState = TopState.MayBeTop;
+ private static IStructureDefinition<GregtechMetaTileEntity_PowerSubStationController> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_PowerSubStationController(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_PowerSubStationController(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Energy Buffer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Consumes " + this.ENERGY_TAX + "% of the average voltage of all energy type hatches")
+ .addInfo("Does not require maintenance")
+ .addInfo(
+ "Can be built with variable height between " + (CELL_HEIGHT_MIN + 2) + "-" + (CELL_HEIGHT_MAX + 2) + "")
+ .addInfo("Hatches can be placed nearly anywhere")
+ .addInfo("HV Energy/Dynamo Hatches are the lowest tier you can use")
+ .addInfo("Supports voltages >= UHV using MAX tier components.")
+ .addSeparator()
+ .addController("Bottom Center")
+ .addCasingInfoMin("Sub-Station External Casings", 10, false)
+ .addDynamoHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addSubChannelUsage("capacitor", "Vanadium Capacitor Cell Tier")
+ .addSubChannelUsage("height", "Height of structure")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(24)),
+ new GT_RenderedTexture(
+ aActive ? Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE
+ : Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER) };
+ }
+ if (side == this.getBaseMetaTileEntity()
+ .getBackFacing()) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(24)),
+ mIsOutputtingPower ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[(int) this.getOutputTier()]
+ : Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[(int) this.getInputTier()] };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(23)) };
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ // if (mBatteryCapacity <= 0) return false;
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ private void checkMachineProblem(String msg, int xOff, int yOff, int zOff) {
+ final IGregTechTileEntity te = this.getBaseMetaTileEntity();
+ final Block tBlock = te.getBlockOffset(xOff, yOff, zOff);
+ final byte tMeta = te.getMetaIDOffset(xOff, yOff, zOff);
+ String name = tBlock.getLocalizedName();
+ String problem = msg + ": (" + xOff + ", " + yOff + ", " + zOff + ") " + name + ":" + tMeta;
+ checkMachineProblem(problem);
+ }
+
+ private void checkMachineProblem(String msg) {
+ if (!AsmConfig.disableAllLogging) {
+ Logger.INFO("Power Sub-Station problem: " + msg);
+ }
+ }
+
+ public static int getCellTier(Block aBlock, int aMeta) {
+ if (aBlock == ModBlocks.blockCasings2Misc && aMeta == 7) {
+ return 4;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 4) {
+ return 5;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 5) {
+ return 6;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 6) {
+ return 7;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 7) {
+ return 8;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 8) {
+ return 9;
+ } else {
+ return -1;
+ }
+ }
+
+ public static int getMetaFromTier(int tier) {
+ if (tier == 4) return 7;
+ if (tier >= 5 && tier <= 9) return tier - 1;
+ return 0;
+ }
+
+ public static Block getBlockFromTier(int tier) {
+ return switch (tier) {
+ case 4 -> ModBlocks.blockCasings2Misc;
+ case 5, 6, 7, 8, 9 -> ModBlocks.blockCasings3Misc;
+ default -> null;
+ };
+ }
+
+ public static int getMaxHatchTier(int aCellTier) {
+ switch (aCellTier) {
+ case 9 -> {
+ return GT_Values.VOLTAGE_NAMES[9].equals("Ultimate High Voltage") ? 15 : 9;
+ }
+ default -> {
+ if (aCellTier < 4) {
+ return 0;
+ } else {
+ return aCellTier;
+ }
+ }
+ }
+ }
+
+ public static final int CELL_HEIGHT_MAX = 16;
+ public static final int CELL_HEIGHT_MIN = 2;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_PowerSubStationController> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_PowerSubStationController>builder()
+ .addShape(
+ mName + "bottom",
+ transpose(new String[][] { { "BB~BB", "BBBBB", "BBBBB", "BBBBB", "BBBBB" } }))
+ .addShape(
+ mName + "layer",
+ transpose(new String[][] { { "CCCCC", "CIIIC", "CIIIC", "CIIIC", "CCCCC" } }))
+ .addShape(mName + "mid", transpose(new String[][] { { "CCCCC", "CHHHC", "CHHHC", "CHHHC", "CCCCC" } }))
+ .addShape(mName + "top", transpose(new String[][] { { "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT" } }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'I',
+ withChannel(
+ "cell",
+ ofChain(
+ onlyIf(
+ x -> x.topState != TopState.NotTop,
+ onElementPass(
+ x -> x.topState = TopState.Top,
+ ofHatchAdderOptional(
+ GregtechMetaTileEntity_PowerSubStationController::addPowerSubStationList,
+ TAE.GTPP_INDEX(24),
+ 1,
+ ModBlocks.blockCasings2Misc,
+ 8))),
+ onlyIf(
+ x -> x.topState != TopState.Top,
+ onElementPass(
+ x -> x.topState = TopState.NotTop,
+ ofChain(
+ onElementPass(x -> ++x.cellCount[0], ofCell(4)),
+ onElementPass(x -> ++x.cellCount[1], ofCell(5)),
+ onElementPass(x -> ++x.cellCount[2], ofCell(6)),
+ onElementPass(x -> ++x.cellCount[3], ofCell(7)),
+ onElementPass(x -> ++x.cellCount[4], ofCell(8)),
+ onElementPass(x -> ++x.cellCount[5], ofCell(9))))))))
+ .addElement('H', ofCell(4))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ public static <T> IStructureElement<T> ofCell(int aIndex) {
+ return new IStructureElement<T>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ int tier = getCellTier(block, meta);
+ return aIndex == tier;
+ }
+
+ public int getIndex(int size) {
+ if (size > 6) size = 6;
+ return size + 3;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(
+ world,
+ x,
+ y,
+ z,
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)));
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ return world.setBlock(
+ x,
+ y,
+ z,
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)),
+ 3);
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(getBlockFromTier(trigger.stackSize), getMetaFromTier(trigger.stackSize));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ int tier = getCellTier(block, meta);
+ if (tier >= 0) return PlaceResult.SKIP;
+ return StructureUtility.survivalPlaceBlock(
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ int layer = Math.min(stackSize.stackSize + 3, 18);
+ log("Layer: " + layer);
+ log("Building 0");
+ buildPiece(mName + "bottom", stackSize, hintsOnly, 2, 0, 0);
+ log("Built 0");
+ for (int i = 1; i < layer - 1; i++) {
+ log("Building " + i);
+ buildPiece(mName + "mid", stackSize, hintsOnly, 2, i, 0);
+ log("Built " + i);
+ }
+ log("Building " + (layer - 1));
+ buildPiece(mName + "top", stackSize, hintsOnly, 2, layer - 1, 0);
+ log("Built " + (layer - 1));
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int layer = Math.min(ChannelDataAccessor.getChannelData(stackSize, "height") + 3, 18);
+ int built;
+ built = survivialBuildPiece(mName + "bottom", stackSize, 2, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ for (int i = 1; i < layer - 1; i++) {
+ built = survivialBuildPiece(mName + "mid", stackSize, 2, i, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ }
+ return survivialBuildPiece(mName + "top", stackSize, 2, layer - 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mEnergyHatches.clear();
+ mDynamoHatches.clear();
+ mTecTechEnergyHatches.clear();
+ mTecTechDynamoHatches.clear();
+ mAllEnergyHatches.clear();
+ mAllDynamoHatches.clear();
+ for (int i = 0; i < 6; i++) {
+ cellCount[i] = 0;
+ }
+ log("Checking 0");
+ if (!checkPiece(mName + "bottom", 2, 0, 0)) {
+ log("Failed on Layer 0");
+ return false;
+ }
+ log("Pass 0");
+ int layer = 1;
+ topState = TopState.MayBeTop;
+ while (true) {
+ if (!checkPiece(mName + "layer", 2, layer, 0)) return false;
+ layer++;
+ if (topState == TopState.Top) break; // top found, break out
+ topState = TopState.MayBeTop;
+ if (layer > 18) return false; // too many layers
+ }
+ int level = 0;
+ for (int i = 0; i < 6; i++) {
+ if (cellCount[i] != 0) {
+ if (level == 0) {
+ level = i + 4;
+ } else {
+ return false;
+ }
+ }
+ }
+ int tier = getMaxHatchTier(level);
+ long volSum = 0;
+ for (GT_MetaTileEntity_Hatch hatch : mAllDynamoHatches) {
+ if (hatch.mTier > tier || hatch.mTier < 3) {
+ return false;
+ }
+ volSum += (8L << (hatch.mTier * 2));
+ }
+ for (GT_MetaTileEntity_Hatch hatch : mAllEnergyHatches) {
+ if (hatch.mTier > tier || hatch.mTier < 3) {
+ return false;
+ }
+ volSum += (8L << (hatch.mTier * 2));
+ }
+ mBatteryCapacity = getCapacityFromCellTier(level) * cellCount[level - 4];
+ if (mAllEnergyHatches.size() + mAllDynamoHatches.size() > 0) {
+ mAverageEuUsage = volSum / (mAllEnergyHatches.size() + mAllDynamoHatches.size());
+ } else mAverageEuUsage = 0;
+ fixAllMaintenanceIssue();
+ return true;
+ }
+
+ public final boolean addPowerSubStationList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (TecTech.isModLoaded()) {
+ if (isThisHatchMultiDynamo(aMetaTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ }
+ return false;
+ }
+
+ // Define storage capacity of smallest cell tier (EV) and compute higher tiers from it
+ private static final long CELL_TIER_EV_CAPACITY = 100 * 1000 * 1000;
+ private static final long CELL_TIER_MULTIPLIER = 4; // each tier's capacity is this many times the previous tier
+
+ public static long getCapacityFromCellTier(int aOverallCellTier) {
+ // Use integer math instead of `Math.pow` to avoid range/precision errors
+ if (aOverallCellTier < 4) return 0;
+ aOverallCellTier -= 4;
+ long capacity = CELL_TIER_EV_CAPACITY;
+ while (aOverallCellTier > 0) {
+ capacity *= CELL_TIER_MULTIPLIER;
+ aOverallCellTier--;
+ }
+ return capacity;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_PowerSubStationController(this.mName);
+ }
+
+ // mTotalEnergyAdded
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setLong("mAverageEuUsage", this.mAverageEuUsage);
+ this.mAverageEuAdded.write(aNBT, "mAverageEuAdded");
+ this.mAverageEuConsumed.write(aNBT, "mAverageEuConsumed");
+
+ // Usage Stats
+ aNBT.setLong("mTotalEnergyAdded", this.mTotalEnergyAdded);
+ aNBT.setLong("mTotalEnergyLost", this.mTotalEnergyLost);
+ aNBT.setLong("mTotalEnergyConsumed", this.mTotalEnergyConsumed);
+ aNBT.setLong("mTotalRunTime", this.mTotalRunTime);
+ aNBT.setBoolean("mIsOutputtingPower", this.mIsOutputtingPower);
+ aNBT.setLong("mBatteryCapacity", this.mBatteryCapacity);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+
+ // Best not to get a long if the Tag Map is holding an int
+ if (aNBT.hasKey("mAverageEuUsage")) {
+ this.mAverageEuUsage = aNBT.getLong("mAverageEuUsage");
+ }
+ switch (aNBT.func_150299_b("mAverageEuAdded")) {
+ case NBT.TAG_BYTE_ARRAY -> this.mAverageEuAdded.read(aNBT, "mAverageEuAdded");
+ case NBT.TAG_LONG -> this.mAverageEuAdded.set(aNBT.getLong("mAverageEuAdded"));
+ }
+ switch (aNBT.func_150299_b("mAverageEuConsumed")) {
+ case NBT.TAG_BYTE_ARRAY -> this.mAverageEuConsumed.read(aNBT, "mAverageEuConsumed");
+ case NBT.TAG_LONG -> this.mAverageEuConsumed.set(aNBT.getLong("mAverageEuConsumed"));
+ }
+
+ // Usage Stats
+ this.mTotalEnergyAdded = aNBT.getLong("mTotalEnergyAdded");
+ this.mTotalEnergyLost = aNBT.getLong("mTotalEnergyLost");
+ this.mTotalEnergyConsumed = aNBT.getLong("mTotalEnergyConsumed");
+ this.mTotalRunTime = aNBT.getLong("mTotalRunTime");
+
+ this.mIsOutputtingPower = aNBT.getBoolean("mIsOutputtingPower");
+
+ this.mBatteryCapacity = aNBT.getLong("mBatteryCapacity");
+
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ this.mProgresstime = 0;
+ this.mMaxProgresstime = 200;
+ this.lEUt = 0;
+ this.mEfficiencyIncrease = 10000;
+ this.fixAllMaintenanceIssue();
+ return SimpleCheckRecipeResult.ofSuccess("managing_power");
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ private long drawEnergyFromHatch(MetaTileEntity aHatch) {
+ long stored = aHatch.getEUVar();
+ long voltage = aHatch.maxEUInput() * aHatch.maxAmperesIn();
+
+ if (voltage > stored || (voltage + this.getEUVar() > this.mBatteryCapacity)) {
+ return 0;
+ }
+
+ if (this.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(voltage, false)) {
+ aHatch.setEUVar((stored - voltage));
+ this.mTotalEnergyAdded += voltage;
+ return voltage;
+ }
+ return 0;
+ }
+
+ private long addEnergyToHatch(MetaTileEntity aHatch) {
+ long voltage = aHatch.maxEUOutput() * aHatch.maxAmperesOut();
+
+ if (aHatch.getEUVar() > aHatch.maxEUStore() - voltage) {
+ return 0;
+ }
+
+ if (this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(voltage, false)) {
+ aHatch.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(voltage, false);
+ this.mTotalEnergyConsumed += voltage;
+ return voltage;
+ }
+ return 0;
+ }
+
+ private long computeEnergyTax() {
+ float mTax = mAverageEuUsage * (ENERGY_TAX / 100f);
+
+ // Increase tax up to 2x if machine is not fully repaired (does not actually work at the moment, mEfficiency is
+ // always 0)
+ // mTax = mTax * (1f + (10000f - mEfficiency) / 10000f);
+
+ return MathUtils.roundToClosestLong(mTax);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ this.fixAllMaintenanceIssue();
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ // First, decay overcharge (1% of stored energy plus 1000 EU per tick)
+ if (this.getEUVar() > this.mBatteryCapacity) {
+ long energy = (long) (this.getEUVar() * 0.990f) - 1000;
+ this.setEUVar(energy);
+ }
+
+ // Pay Tax
+ long mDecrease = computeEnergyTax();
+ this.mTotalEnergyLost += Math.min(mDecrease, this.getEUVar());
+ this.setEUVar(Math.max(0, this.getEUVar() - mDecrease));
+
+ long aInputAverage = 0;
+ long aOutputAverage = 0;
+ // Input Power
+ for (GT_MetaTileEntity_Hatch THatch : filterValidMTEs(this.mDischargeHatches)) {
+ aInputAverage += drawEnergyFromHatch(THatch);
+ }
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(this.mAllEnergyHatches)) {
+ aInputAverage += drawEnergyFromHatch(tHatch);
+ }
+
+ // Output Power
+ for (GT_MetaTileEntity_Hatch THatch : filterValidMTEs(this.mChargeHatches)) {
+ aOutputAverage += addEnergyToHatch(THatch);
+ }
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(this.mAllDynamoHatches)) {
+ aOutputAverage += addEnergyToHatch(tHatch);
+ }
+ // reset progress time
+ mProgresstime = 0;
+
+ this.mAverageEuAdded.sample(aInputAverage);
+ this.mAverageEuConsumed.sample(aOutputAverage);
+
+ return true;
+ }
+
+ @Override
+ public boolean drainEnergyInput(long aEU) {
+ // Not applicable to this machine
+ return true;
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ // Not applicable to this machine
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return mBatteryCapacity;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ String mode;
+ if (mIsOutputtingPower) {
+ mode = EnumChatFormatting.GOLD + "Output" + EnumChatFormatting.RESET;
+ } else {
+ mode = EnumChatFormatting.BLUE + "Input" + EnumChatFormatting.RESET;
+ }
+
+ String storedEnergyText;
+ if (this.getEUVar() > this.mBatteryCapacity) {
+ storedEnergyText = EnumChatFormatting.RED + GT_Utility.formatNumbers(this.getEUVar())
+ + EnumChatFormatting.RESET;
+ } else {
+ storedEnergyText = EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.getEUVar())
+ + EnumChatFormatting.RESET;
+ }
+
+ int errorCode = this.getBaseMetaTileEntity()
+ .getErrorDisplayID();
+ boolean mMaint = (errorCode != 0);
+
+ return new String[] { "Ergon Energy - District Sub-Station", "Stored EU: " + storedEnergyText,
+ "Capacity: " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.maxEUStore())
+ + EnumChatFormatting.RESET,
+ "Running Costs: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(this.computeEnergyTax())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ "Controller Mode: " + mode,
+ "Requires Maintenance: " + (!mMaint ? EnumChatFormatting.GREEN : EnumChatFormatting.RED)
+ + mMaint
+ + EnumChatFormatting.RESET
+ + " | Code: ["
+ + (!mMaint ? EnumChatFormatting.GREEN : EnumChatFormatting.RED)
+ + errorCode
+ + EnumChatFormatting.RESET
+ + "]",
+ "----------------------", "Stats for Nerds",
+ "Average Input: " + EnumChatFormatting.BLUE
+ + GT_Utility.formatNumbers(this.getAverageEuAdded())
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Average Output: " + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(this.getAverageEuConsumed())
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Input: " + EnumChatFormatting.BLUE
+ + GT_Utility.formatNumbers(this.mTotalEnergyAdded)
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Output: " + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(this.mTotalEnergyConsumed)
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Costs: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(this.mTotalEnergyLost)
+ + EnumChatFormatting.RESET
+ + " EU", };
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ // TODO Auto-generated method stub
+ super.explodeMultiblock();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ // TODO Auto-generated method stub
+ super.doExplosion(aExplosionPower);
+ }
+
+ @Override
+ public long getMaxInputVoltage() {
+ return 32768;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return !mIsOutputtingPower;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return mIsOutputtingPower;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return (side == this.getBaseMetaTileEntity()
+ .getBackFacing() && !mIsOutputtingPower);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return (side == this.getBaseMetaTileEntity()
+ .getBackFacing() && mIsOutputtingPower);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 32;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 32;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 32768;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 32768;
+ }
+
+ public final long getAverageEuAdded() {
+ return this.mAverageEuAdded.get();
+ }
+
+ public final long getAverageEuConsumed() {
+ return this.mAverageEuConsumed.get();
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mIsOutputtingPower = !mIsOutputtingPower;
+ if (mIsOutputtingPower) {
+ PlayerUtils.messagePlayer(aPlayer, "Sub-Station is now outputting power from the controller.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Sub-Station is now inputting power into the controller.");
+ }
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return 196;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 191;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(175, 166));
+ }
+
+ private long clientEUIn, clientEUOut, clientEULoss, clientEUStored;
+ private float clientProgress;
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(4, 4)
+ .setSize(149, 149))
+ .widget(new SlotWidget(inventoryHandler, 0).setPos(154, 4))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setPos(154, 22))
+ .widget(
+ SlotGroup.ofItemHandler(new PlayerMainInvWrapper(buildContext.getPlayer().inventory), 9)
+ .endAtSlot(8)
+ .build()
+ .setPos(7, 166))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ ? getBaseMetaTileEntity().isActive() ? "Running perfectly" : "Turn on with Mallet"
+ : "")
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 8))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(
+ new TextWidget("In").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(178, 10))
+ .widget(
+ new TextWidget("Out").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(176, 28))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAverageEuAdded, val -> clientEUIn = val))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Avg In: " + numberFormat.format(clientEUIn) + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAverageEuConsumed, val -> clientEUOut = val))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Avg Out: " + numberFormat.format(clientEUOut) + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30))
+ .widget(new FakeSyncWidget.LongSyncer(this::computeEnergyTax, val -> clientEULoss = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(() -> "Powerloss: " + numberFormat.format(clientEULoss) + " EU per tick")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 40))
+ .widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_ENERGY_FRAME)
+ .setPos(4, 155)
+ .setSize(149, 7))
+ .widget(new FakeSyncWidget.FloatSyncer(this::getProgress, val -> clientProgress = val))
+ .widget(
+ new ProgressBar().setProgress(this::getProgress)
+ .setTexture(GTPP_UITextures.PROGRESSBAR_PSS_ENERGY, 147)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setPos(5, 156)
+ .setSize(147, 5))
+ .widget(
+ new TextWidget("Stored:").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 132))
+ .widget(
+ new FakeSyncWidget.LongSyncer(() -> getBaseMetaTileEntity().getStoredEU(), val -> clientEUStored = val))
+ .widget(new TextWidget().setTextSupplier(() -> {
+ int colorScale = (int) (clientProgress * 100 * 2.55);
+ return new Text(numberFormat.format(clientEUStored) + " EU")
+ .color(Utils.rgbtoHexValue((255 - colorScale), colorScale, 0));
+ })
+ .setPos(10, 142))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(clientProgress * 100) + "%")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(70, 155));
+ }
+
+ private float getProgress() {
+ return (float) getBaseMetaTileEntity().getStoredEU() / getBaseMetaTileEntity().getEUCapacity();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java
new file mode 100644
index 0000000000..141f4bbc43
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java
@@ -0,0 +1,343 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.misc;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_SolarTower;
+
+public class TileEntitySolarHeater extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public boolean mHasTower = false;
+ private GregtechMetaTileEntity_SolarTower mTower = null;
+
+ private int mTX, mTY, mTZ;
+ private Byte mRequiredFacing;
+
+ public TileEntitySolarHeater(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public TileEntitySolarHeater(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(this.mDescriptionArray, "Point me at a Solar Tower", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_LuV) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_LuV) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new TileEntitySolarHeater(this.mName, this.mTier, this.mDescriptionArray, this.mTextures, 0);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Testificate" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ public boolean allowCoverOnSide(final byte aSide, final int aCoverID) {
+ return false;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ /*
+ * aNBT.setBoolean("mHasTower", mHasTower); if (this.mHasTower) { aNBT.setInteger("mTX", mTX);
+ * aNBT.setInteger("mTY", mTY); aNBT.setInteger("mTZ", mTZ); }
+ */
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ /*
+ * this.mHasTower = aNBT.getBoolean("mHasTower"); if (this.mHasTower) { if (aNBT.hasKey("mTX")) this.mTX =
+ * aNBT.getInteger("mTX"); if (aNBT.hasKey("mTY")) this.mTY = aNBT.getInteger("mTY"); if (aNBT.hasKey("mTZ"))
+ * this.mTZ = aNBT.getInteger("mTZ"); }
+ */
+ }
+
+ @Override
+ public long getInputTier() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputTier() {
+ return 0;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onExplosion() {}
+
+ public boolean hasSolarTower() {
+ return mHasTower;
+ }
+
+ public GregtechMetaTileEntity_SolarTower getSolarTower() {
+ if (this.mHasTower) {
+ return mTower;
+ }
+ return null;
+ }
+
+ public boolean canSeeSky() {
+ if (this.getBaseMetaTileEntity()
+ .getWorld()
+ .canBlockSeeTheSky(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord() + 1,
+ this.getBaseMetaTileEntity()
+ .getZCoord())) {
+ return true;
+ }
+ return false;
+ }
+
+ public boolean setSolarTower(GregtechMetaTileEntity_SolarTower aTowerTile) {
+ if (!hasSolarTower()) {
+ this.mTX = aTowerTile.getBaseMetaTileEntity()
+ .getXCoord();
+ this.mTY = (int) aTowerTile.getBaseMetaTileEntity()
+ .getYCoord();
+ this.mTZ = aTowerTile.getBaseMetaTileEntity()
+ .getZCoord();
+ this.mHasTower = true;
+ this.mTower = aTowerTile;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean clearSolarTower() {
+ if (mHasTower || mRequiredFacing != null || this.mTower != null) {
+ this.mTX = 0;
+ this.mTY = 0;
+ this.mTZ = 0;
+ this.mRequiredFacing = null;
+ this.mTower = null;
+ this.mHasTower = false;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public void onFacingChange() {
+ super.onFacingChange();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {}
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java
new file mode 100644
index 0000000000..07a63a6ba4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_TieredChest extends GT_MetaTileEntity_TieredMachineBlock implements IAddUIWidgets {
+
+ public int mItemCount = 0;
+ public ItemStack mItemStack = null;
+ private static final double mStorageFactor = (270000.0D / 16);
+
+ public GT_MetaTileEntity_TieredChest(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ "This Chest stores " + (int) (Math.pow(6.0D, (double) aTier) * mStorageFactor) + " Items",
+ new ITexture[0]);
+ }
+
+ public GT_MetaTileEntity_TieredChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TieredChest(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()
+ && this.getBaseMetaTileEntity()
+ .isAllowedToWork()) {
+ if (this.getItemCount() <= 0) {
+ this.mItemStack = null;
+ this.mItemCount = 0;
+ }
+
+ if (this.mItemStack == null && this.mInventory[0] != null) {
+ this.mItemStack = this.mInventory[0].copy();
+ }
+
+ if (this.mInventory[0] != null && this.mItemCount < this.getMaxItemCount()
+ && GT_Utility.areStacksEqual(this.mInventory[0], this.mItemStack)) {
+ this.mItemCount += this.mInventory[0].stackSize;
+ if (this.mItemCount > this.getMaxItemCount()) {
+ this.mInventory[0].stackSize = this.mItemCount - this.getMaxItemCount();
+ this.mItemCount = this.getMaxItemCount();
+ } else {
+ this.mInventory[0] = null;
+ }
+ }
+
+ if (this.mInventory[1] == null && this.mItemStack != null) {
+ this.mInventory[1] = this.mItemStack.copy();
+ this.mInventory[1].stackSize = Math.min(this.mItemStack.getMaxStackSize(), this.mItemCount);
+ this.mItemCount -= this.mInventory[1].stackSize;
+ } else if (this.mItemCount > 0 && GT_Utility.areStacksEqual(this.mInventory[1], this.mItemStack)
+ && this.mInventory[1].getMaxStackSize() > this.mInventory[1].stackSize) {
+ int tmp = Math
+ .min(this.mItemCount, this.mInventory[1].getMaxStackSize() - this.mInventory[1].stackSize);
+ this.mInventory[1].stackSize += tmp;
+ this.mItemCount -= tmp;
+ }
+
+ if (this.mItemStack != null) {
+ this.mInventory[2] = this.mItemStack.copy();
+ this.mInventory[2].stackSize = Math.min(this.mItemStack.getMaxStackSize(), this.mItemCount);
+ } else {
+ this.mInventory[2] = null;
+ }
+ }
+ }
+
+ private int getItemCount() {
+ return this.mItemCount;
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ this.mItemCount = aCount;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mItemCount + (this.mInventory[0] == null ? 0 : this.mInventory[0].stackSize)
+ + (this.mInventory[1] == null ? 0 : this.mInventory[1].stackSize);
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return this.getMaxItemCount();
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ return (int) (Math.pow(6.0D, (double) this.mTier) * mStorageFactor - 128.0D);
+ }
+
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 1;
+ }
+
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 0 && (this.mInventory[0] == null || GT_Utility.areStacksEqual(this.mInventory[0], aStack));
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return this.mItemStack == null
+ ? new String[] { "Super Storage Chest", "Stored Items:", "No Items", Integer.toString(0),
+ Integer.toString(this.getMaxItemCount()) }
+ : new String[] { "Super Storage Chest", "Stored Items:", this.mItemStack.getDisplayName(),
+ Integer.toString(this.mItemCount), Integer.toString(this.getMaxItemCount()) };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mItemCount", this.mItemCount);
+ if (this.mItemStack != null) {
+ aNBT.setTag("mItemStack", this.mItemStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (aNBT.hasKey("mItemCount")) {
+ this.mItemCount = aNBT.getInteger("mItemCount");
+ }
+
+ if (aNBT.hasKey("mItemStack")) {
+ this.mItemStack = ItemStack.loadItemStackFromNBT((NBTTagCompound) aNBT.getTag("mItemStack"));
+ }
+ }
+
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ return aBaseMetaTileEntity.getFrontFacing() == ForgeDirection.DOWN && side == ForgeDirection.WEST
+ ? new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_QCHEST) }
+ : (side == aBaseMetaTileEntity.getFrontFacing()
+ ? new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_QCHEST) }
+ : new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1] });
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(
+ new SlotWidget(inventoryHandler, 0)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 52))
+ .widget(
+ SlotWidget.phantom(inventoryHandler, 2)
+ .disableInteraction()
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(59, 42))
+ .widget(
+ new TextWidget("Item Amount").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(mItemCount))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
new file mode 100644
index 0000000000..a9fc7a3fd4
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_TieredTank extends GT_MetaTileEntity_BasicTank {
+
+ public GT_MetaTileEntity_TieredTank(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ "Stores " + GT_Utility.formatNumbers(((int) (Math.pow(2, aTier) * 32000))) + "L of fluid");
+ }
+
+ public GT_MetaTileEntity_TieredTank(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ List<String> description = new ArrayList<>(Arrays.asList(this.mDescriptionArray));
+ description.add("A portable tank.");
+ if (this.mFluid != null) {
+ description.add("Fluid: " + mFluid.getLocalizedName() + " " + mFluid.amount + "L");
+ }
+ description.add(CORE.GT_Tooltip.get());
+ return description.toArray(new String[0]);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == ForgeDirection.UP
+ ? new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER_ACTIVE) }
+ : new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER) };
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("mFluid")) {
+ final FluidStack tContents = FluidStack
+ .loadFluidStackFromNBT(stack.stackTagCompound.getCompoundTag("mFluid"));
+ if (tContents != null && tContents.amount > 0) {
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization(
+ "TileEntity_TANK_INFO",
+ "Contains Fluid: ",
+ !GregTech_API.sPostloadFinished) + EnumChatFormatting.YELLOW
+ + tContents.getLocalizedName()
+ + EnumChatFormatting.GRAY);
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization(
+ "TileEntity_TANK_AMOUNT",
+ "Fluid Amount: ",
+ !GregTech_API.sPostloadFinished) + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(tContents.amount)
+ + " L"
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public final byte getUpdateData() {
+ return 0x00;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ if (this.mFluid == null) {
+ return new String[] { GT_Values.VOLTAGE_NAMES[this.mTier] + " Fluid Tank", "Stored Fluid:", "No Fluid",
+ 0 + "L", this.getCapacity() + "L" };
+ }
+ return new String[] { GT_Values.VOLTAGE_NAMES[this.mTier] + " Fluid Tank", "Stored Fluid:",
+ this.mFluid.getLocalizedName(), this.mFluid.amount + "L", this.getCapacity() + "L" };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TieredTank(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return (int) (Math.pow(2, this.mTier) * 32000);
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ if (mFluid != null) {
+ Logger.WARNING("Setting item fluid nbt");
+ aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ if (aNBT.hasKey("mFluid")) {
+ Logger.WARNING("Set mFluid to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java
new file mode 100644
index 0000000000..17b2d77756
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java
@@ -0,0 +1,439 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaEnergyBuffer extends GregtechMetaTileEntity {
+
+ protected byte aCurrentOutputAmperage = 4;
+
+ public GregtechMetaEnergyBuffer(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaEnergyBuffer(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Defaults 4A In/Out", "Change output Amperage with a screwdriver",
+ "Now Portable!", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ /*
+ * MACHINE_STEEL_SIDE
+ */
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Screen_Logo) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Screen_Logo) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaEnergyBuffer(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[this.mTier] * 2;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[this.mTier] * 250000;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return aCurrentOutputAmperage;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return aCurrentOutputAmperage;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setByte("aCurrentOutputAmperage", aCurrentOutputAmperage);
+ long aEU = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (aEU > 0) {
+ aNBT.setLong("aStoredEU", aEU);
+ if (aNBT.hasKey("aStoredEU")) {
+ Logger.WARNING("Set aStoredEU to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ aCurrentOutputAmperage = aNBT.getByte("aCurrentOutputAmperage");
+ if (aNBT.hasKey("aStoredEU")) {
+ this.setEUVar(aNBT.getLong("aStoredEU"));
+ }
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ Logger.WARNING("Right Click on MTE by Player");
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+
+ Logger.WARNING("MTE is Client-side");
+ this.showEnergy(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ protected void showEnergy(final World worldIn, final EntityPlayer playerIn) {
+ final long tempStorage = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ final double c = ((double) tempStorage / this.maxEUStore()) * 100;
+ final double roundOff = Math.round(c * 100.00) / 100.00;
+ PlayerUtils.messagePlayer(
+ playerIn,
+ "Energy: " + GT_Utility.formatNumbers(tempStorage) + " EU at " + V[this.mTier] + "v (" + roundOff + "%)");
+ PlayerUtils.messagePlayer(playerIn, "Amperage: " + GT_Utility.formatNumbers(maxAmperesOut()) + "A");
+ }
+ // Utils.LOG_WARNING("Begin Show Energy");
+ /*
+ * //Utils.LOG_INFO("getProgresstime: "+tempStorage+" maxProgresstime: "+maxEUStore()+" C: "+c);
+ * Utils.LOG_INFO("getProgressTime: "+getProgresstime()); Utils.LOG_INFO("maxProgressTime: "+maxProgresstime());
+ * Utils.LOG_INFO("getMinimumStoredEU: "+getMinimumStoredEU()); Utils.LOG_INFO("maxEUStore: "+maxEUStore());
+ */
+ /*
+ * final long d = (tempStorage * 100L) / maxEUStore();
+ * Utils.LOG_INFO("getProgresstime: "+tempStorage+" maxProgresstime: "+maxEUStore()+" D: "+d); final double
+ * roundOff2 = Math.round(d * 100.00) / 100.00; Utils.messagePlayer(playerIn, "Energy: " + tempStorage +
+ * " EU at "+V[mTier]+"v ("+roundOff2+"%)"); Utils.LOG_WARNING("Making new instance of Guihandler"); GuiHandler
+ * block = new GuiHandler(); Utils.LOG_WARNING("Guihandler.toString(): "+block.toString());
+ * block.getClientGuiElement(1, playerIn, worldIn, (int) playerIn.posX, (int) playerIn.posY, (int) playerIn.posZ);
+ */
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String cur = GT_Utility.formatNumbers(
+ this.getBaseMetaTileEntity()
+ .getStoredEU());
+ String max = GT_Utility.formatNumbers(
+ this.getBaseMetaTileEntity()
+ .getEUCapacity());
+
+ // Right-align current storage with maximum storage
+ String fmt = String.format("%%%ds", max.length());
+ cur = String.format(fmt, cur);
+
+ return new String[] { cur + " EU stored", max + " EU capacity" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return super.getInventoryName();
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setByte("aCurrentOutputAmperage", aCurrentOutputAmperage);
+ long aEU = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (aEU > 0) {
+ aNBT.setLong("aStoredEU", aEU);
+ if (aNBT.hasKey("aStoredEU")) {
+ Logger.WARNING("Set aStoredEU to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ byte aTest = (byte) (aCurrentOutputAmperage + 1);
+ if (aTest > 16 || aTest <= 0) {
+ aTest = 1;
+ }
+ aCurrentOutputAmperage = aTest;
+ PlayerUtils.messagePlayer(aPlayer, "Now handling " + aCurrentOutputAmperage + " Amps.");
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java
new file mode 100644
index 0000000000..2dca8d5c30
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage.creative;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredChest;
+
+public class GT_MetaTileEntity_InfiniteItemHolder extends GT_MetaTileEntity_TieredChest {
+
+ public GT_MetaTileEntity_InfiniteItemHolder(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_InfiniteItemHolder(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.getWorld().isRemote) {
+ return false;
+ }
+
+ if (!KeyboardUtils.isShiftKeyDown()) {
+ if (this.mItemStack == null) {
+ if (aPlayer.getHeldItem() != null) {
+ this.mItemStack = aPlayer.getHeldItem()
+ .copy();
+ this.mItemCount = Short.MAX_VALUE;
+ aPlayer.setCurrentItemOrArmor(0, null);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Now holding " + this.mItemStack.getDisplayName() + " x" + Short.MAX_VALUE + ".");
+ return true;
+ }
+ } else {
+ if (aPlayer.getHeldItem() == null) {
+ aPlayer.entityDropItem(mItemStack, 1);
+ this.mItemStack = null;
+ this.mItemCount = 0;
+ PlayerUtils.messagePlayer(aPlayer, "Emptying.");
+ return true;
+ }
+ }
+ }
+
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Currently holding: " + (this.mItemStack != null ? this.mItemStack.getDisplayName() : "Nothing")
+ + " x"
+ + this.mItemCount);
+ return true;
+ // return super.onRightclick(aBaseMetaTileEntity, aPlayer);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (mItemStack != null) {
+ setItemCount(0);
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ super.setItemCount(Short.MAX_VALUE);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_InfiniteItemHolder(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java
new file mode 100644
index 0000000000..6af3a61487
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java
@@ -0,0 +1,175 @@
+package gtPlusPlus.xmod.gregtech.common.tools;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures.ItemIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gregtech.common.tools.GT_Tool;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+
+public class TOOL_Gregtech_AngleGrinder extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays
+ .asList(new String[] { EntityIronGolem.class.getName(), "EntityTowerGuardian" });
+
+ @Override
+ public float getNormalDamageAgainstEntity(final float aOriginalDamage, final Entity aEntity, final ItemStack aStack,
+ final EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf(".") + 1);
+ return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 8.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.8F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.RANDOM_ANVIL_USE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.RANDOM_ANVIL_BREAK.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isWrench() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(final Block aBlock, final byte aMetaData) {
+ final String tTool = aBlock.getHarvestTool(aMetaData);
+ return (tTool != null) && (tTool.equals("sword") || tTool.equals("file"));
+ }
+
+ @Override
+ public int convertBlockDrops(final List<ItemStack> aDrops, final ItemStack aStack, final EntityPlayer aPlayer,
+ final Block aBlock, final int aX, final int aY, final int aZ, final byte aMetaData, final int aFortune,
+ final boolean aSilkTouch, final BlockEvent.HarvestDropsEvent aEvent) {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return (IIconContainer) (aIsToolHead ? TexturesGtTools.ANGLE_GRINDER : ItemIcons.POWER_UNIT_HV);
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Materials.TungstenSteel.mRGBa;
+ }
+
+ @Override
+ public void onToolCrafted(final ItemStack aStack, final EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "tools");
+ GT_Mod.achievements.issueAchievement(aPlayer, "unitool");
+ } catch (final Exception e) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(final EntityLivingBase aPlayer, final EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been Ground out of existence by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ @Override
+ public void onStatsAddedToTool(final GT_MetaGenerated_Tool aItem, final int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_None());
+ }
+
+ @Override
+ public boolean isGrafter() {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java
new file mode 100644
index 0000000000..25ad03548a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.common.tools;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures.ItemIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.tools.GT_Tool_WireCutter;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+
+public class TOOL_Gregtech_ElectricSnips extends GT_Tool_WireCutter {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.4F;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return (IIconContainer) (aIsToolHead ? TexturesGtTools.ELECTRIC_SNIPS : ItemIcons.POWER_UNIT_MV);
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Materials.TungstenSteel.mRGBa;
+ }
+
+ @Override
+ public void onToolCrafted(final ItemStack aStack, final EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "tools");
+ GT_Mod.achievements.issueAchievement(aPlayer, "unitool");
+ } catch (final Exception e) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(final EntityLivingBase aPlayer, final EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been Snipped out of existence by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java
new file mode 100644
index 0000000000..1a3d07f510
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks2;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks3;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks4;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks5;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks6;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocksPipeGearbox;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMachineCasings;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings2;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaTieredCasingBlocks1;
+
+public class Gregtech_Blocks {
+
+ public static void run() {
+
+ // Casing Blocks
+ ModBlocks.blockCasingsMisc = new GregtechMetaCasingBlocks();
+ ModBlocks.blockCasings2Misc = new GregtechMetaCasingBlocks2();
+ ModBlocks.blockCasings3Misc = new GregtechMetaCasingBlocks3();
+ ModBlocks.blockCasings4Misc = new GregtechMetaCasingBlocks4();
+ ModBlocks.blockCasings5Misc = new GregtechMetaCasingBlocks5();
+ ModBlocks.blockCasings6Misc = new GregtechMetaCasingBlocks6();
+
+ ModBlocks.blockCasingsTieredGTPP = new GregtechMetaTieredCasingBlocks1();
+ ModBlocks.blockSpecialMultiCasings = new GregtechMetaSpecialMultiCasings();
+ ModBlocks.blockSpecialMultiCasings2 = new GregtechMetaSpecialMultiCasings2();
+ ModBlocks.blockCustomMachineCasings = new GregtechMetaSpecialMachineCasings();
+ ModBlocks.blockCustomPipeGearCasings = new GregtechMetaCasingBlocksPipeGearbox();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java
new file mode 100644
index 0000000000..e2723e5248
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_ModHandler.RecipeBits;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class ProcessingAngleGrinder implements Interface_OreRecipeRegistrator, Runnable {
+
+ public ProcessingAngleGrinder() {
+ GregtechOrePrefixes.toolAngleGrinder.add(this);
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
+ if (aMaterial != Materials.Rubber) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))) {}
+ }
+ }
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void materialsLoops() {
+ final Materials[] i = Materials.values();
+ final int size = i.length;
+ Logger.MATERIALS("Materials to attempt tool gen. with: " + size);
+ int used = 0;
+ Materials aMaterial = null;
+ for (Materials materials : i) {
+ aMaterial = materials;
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)
+ && (aMaterial != Materials.Rubber)
+ && (aMaterial != Materials._NULL)) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))
+ && (!aMaterial.contains(SubTag.TRANSPARENT))
+ && (!aMaterial.contains(SubTag.FLAMMABLE))
+ && (!aMaterial.contains(SubTag.MAGICAL))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ Logger.MATERIALS("Generating Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ // Input 1
+
+ final ItemStack plate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L);
+ final ItemStack longrod = GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L);
+
+ if ((null != plate && longrod != null)) {
+ addRecipe(aMaterial, 1600000L, 3, ItemList.Battery_RE_HV_Lithium.get(1));
+ addRecipe(aMaterial, 1200000L, 3, ItemList.Battery_RE_HV_Cadmium.get(1));
+ addRecipe(aMaterial, 800000L, 3, ItemList.Battery_RE_HV_Sodium.get(1));
+ used++;
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Plate or Long Rod may be invalid. Invalid | Plate? "
+ + (plate == null)
+ + " | Rod? "
+ + (longrod == null)
+ + " |");
+ }
+ // GT_ModHandler.addCraftingRecipe(,
+ // GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS |
+ // GT_ModHandler.RecipeBits.BUFFERED, new Object[]{"P H", "PIP", " I ",
+ // Character.valueOf('I'), OrePrefixes.ingot.get(aMaterial),
+ // Character.valueOf('P'), OrePrefixes.plate.get(aMaterial),
+ // Character.valueOf('H'), OrePrefixes.toolHeadHammer.get(aMaterial)});
+ } else {
+ Logger
+ .MATERIALS("Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ } else {
+ Logger.MATERIALS("Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ }
+
+ Logger.INFO("Materials used for tool gen: " + used);
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Generating Angle Grinders for all valid GT Materials.");
+ this.materialsLoops();
+ }
+
+ public boolean addRecipe(Materials aMaterial, long aBatteryStorage, int aVoltageTier, ItemStack aBattery) {
+
+ ItemStack aOutputStack = MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ANGLE_GRINDER,
+ 1,
+ aMaterial,
+ Materials.Titanium,
+ new long[] { aBatteryStorage, GT_Values.V[aVoltageTier], 3L, -1L });
+
+ long aDura = MetaGeneratedGregtechTools.getToolMaxDamage(aOutputStack);
+ if (aDura <= 32000) {
+ Logger.MATERIALS(
+ "Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Durability: "
+ + aDura);
+ return false;
+ }
+
+ return GT_ModHandler.addCraftingRecipe(
+ aOutputStack,
+ RecipeBits.DISMANTLEABLE | RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | RecipeBits.BUFFERED,
+ new Object[] { "SXL", "GMG", "PBP", 'X', ItemList.Component_Grinder_Tungsten.get(1), 'M',
+ CI.getElectricMotor(aVoltageTier, 1), 'S', OrePrefixes.screw.get(Materials.Titanium), 'L',
+ OrePrefixes.stickLong.get(aMaterial), 'P', OrePrefixes.plate.get(aMaterial), 'G',
+ ELEMENT.STANDALONE.BLACK_METAL.getGear(1), 'B', aBattery });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java
new file mode 100644
index 0000000000..9a60f2c6bf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class ProcessingElectricSnips implements Interface_OreRecipeRegistrator, Runnable {
+
+ public ProcessingElectricSnips() {
+ GregtechOrePrefixes.toolElectricSnips.add(this);
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
+ if (aMaterial != Materials.Rubber) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))) {}
+ }
+ }
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void materialsLoops() {
+ final Materials[] i = Materials.values();
+ final int size = i.length;
+ Logger.MATERIALS("Materials to attempt tool gen. with: " + size);
+ int used = 0;
+ Materials aMaterial = null;
+ for (Materials materials : i) {
+ aMaterial = materials;
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)
+ && (aMaterial != Materials.Rubber)
+ && (aMaterial != Materials._NULL)) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))
+ && (!aMaterial.contains(SubTag.TRANSPARENT))
+ && (!aMaterial.contains(SubTag.FLAMMABLE))
+ && (!aMaterial.contains(SubTag.MAGICAL))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ Logger.MATERIALS("Generating Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ // Input 1
+
+ final ItemStack plate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L);
+
+ if ((null != plate)) {
+ addRecipe(aMaterial, 1600000L, 3, ItemList.Battery_RE_HV_Lithium.get(1));
+ addRecipe(aMaterial, 1200000L, 3, ItemList.Battery_RE_HV_Cadmium.get(1));
+ addRecipe(aMaterial, 800000L, 3, ItemList.Battery_RE_HV_Sodium.get(1));
+ used++;
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Plate or Long Rod may be invalid. Invalid | Plate? "
+ + (plate == null)
+ + " | Rod? "
+ + " |");
+ }
+ // GT_ModHandler.addCraftingRecipe(,
+ // GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS |
+ // GT_ModHandler.RecipeBits.BUFFERED, new Object[]{"P H", "PIP", " I ",
+ // Character.valueOf('I'), OrePrefixes.ingot.get(aMaterial),
+ // Character.valueOf('P'), OrePrefixes.plate.get(aMaterial),
+ // Character.valueOf('H'), OrePrefixes.toolHeadHammer.get(aMaterial)});
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ } else {
+ Logger.MATERIALS("Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ }
+
+ Logger.INFO("Materials used for tool gen: " + used);
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Generating Electric Snips for all valid GT Materials.");
+ this.materialsLoops();
+ }
+
+ public boolean addRecipe(Materials aMaterial, long aBatteryStorage, int aVoltageTier, ItemStack aBattery) {
+
+ ItemStack aOutputStack = MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ELECTRIC_SNIPS,
+ 1,
+ aMaterial,
+ Materials.Titanium,
+ new long[] { aBatteryStorage, GT_Values.V[aVoltageTier], 3L, -1L });
+
+ ItemStack aInputCutter = GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WIRECUTTER, 1, aMaterial, aMaterial, null);
+
+ long aDura = MetaGeneratedGregtechTools.getToolMaxDamage(aOutputStack);
+ if (aDura <= 32000) {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Durability: "
+ + aDura);
+ return false;
+ }
+ return RecipeUtils.addShapedRecipe(
+ OrePrefixes.wireFine.get(Materials.Electrum),
+ aInputCutter,
+ OrePrefixes.wireFine.get(Materials.Electrum),
+ ELEMENT.STANDALONE.WHITE_METAL.getGear(1),
+ CI.getElectricMotor(aVoltageTier, 1),
+ ELEMENT.STANDALONE.WHITE_METAL.getGear(1),
+ OrePrefixes.plate.get(aMaterial),
+ aBattery,
+ OrePrefixes.plate.get(aMaterial),
+ aOutputStack);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java
new file mode 100644
index 0000000000..d455697330
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java
@@ -0,0 +1,63 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_AlloySmelter extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_AlloySmelter(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ final int tVoltageMultiplier = material.vVoltageMultiplier;
+
+ // Nuggets
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getNugget(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getIngot(1),
+ ItemList.Shape_Mold_Nugget.get(0),
+ material.getNugget(9),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+
+ // Gears
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getGear(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getIngot(8),
+ ItemList.Shape_Mold_Gear.get(0),
+ material.getGear(1),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+
+ // Ingot
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getNugget(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getNugget(9),
+ ItemList.Shape_Mold_Ingot.get(0),
+ material.getIngot(1),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java
new file mode 100644
index 0000000000..1594568d23
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Assembler extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Assembler(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ // Frame Box
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { material.getRod(1), material.getFrameBox(1) }))
+ GT_Values.RA.addAssemblerRecipe(
+ material.getRod(4),
+ ItemUtils.getGregtechCircuit(4),
+ material.getFrameBox(1),
+ 60,
+ material.vVoltageMultiplier);
+
+ // Rotor
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { material.getPlate(1), material.getRing(1), material.getRotor(1) }))
+ addAssemblerRecipe(
+ material.getPlate(4),
+ material.getRing(1),
+ material.getRotor(1),
+ 240,
+ material.vVoltageMultiplier);
+ }
+
+ private static void addAssemblerRecipe(final ItemStack input1, final ItemStack input2, final ItemStack output1,
+ final int seconds, final int euCost) {
+ GT_Values.RA.addAssemblerRecipe(
+ input1,
+ input2,
+ FluidUtils.getFluidStack("molten.solderingalloy", 16),
+ output1,
+ seconds,
+ euCost);
+ GT_Values.RA
+ .addAssemblerRecipe(input1, input2, FluidUtils.getFluidStack("molten.tin", 32), output1, seconds, euCost);
+ GT_Values.RA
+ .addAssemblerRecipe(input1, input2, FluidUtils.getFluidStack("molten.lead", 48), output1, seconds, euCost);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java
new file mode 100644
index 0000000000..d000889757
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+
+public abstract class RecipeGen_Base implements RunnableWithInfo<Material> {
+
+ protected Material toGenerate;
+ protected boolean disableOptional;
+
+ @Override
+ public Material getInfoData() {
+ return toGenerate;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java
new file mode 100644
index 0000000000..2d573c9fb7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java
@@ -0,0 +1,321 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeCategories;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeGen_BlastSmelter extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_BlastSmelter(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateARecipe(this.toGenerate);
+ }
+
+ private void generateARecipe(final Material M) {
+
+ // Add a Blast Smelting Recipe, Let's go!
+ ItemStack tStack;
+ if (null != (tStack = M.getDust(1))) {
+
+ final Material[] badMaterials = { FLUORIDES.THORIUM_HEXAFLUORIDE, FLUORIDES.THORIUM_TETRAFLUORIDE,
+ ALLOY.BLOODSTEEL, NUCLIDE.LiFBeF2ThF4UF4, NUCLIDE.LiFBeF2ZrF4UF4, NUCLIDE.LiFBeF2ZrF4U235 };
+ for (final Material R : badMaterials) {
+ if (M == R) {
+ return;
+ }
+ }
+
+ // Prepare some Variables
+ ItemStack[] components;
+ ArrayList<MaterialStack> tMaterial = new ArrayList<>();
+ int inputStackCount = 0;
+ int fluidAmount = 0;
+ final boolean doTest = true;
+ tMaterial = M.getComposites();
+
+ // This Bad boy here is what dictates unique recipes.
+ ItemStack circuitGT;
+
+ // Set a duration - OLD
+ /*
+ * int duration = 0; if (M.getMeltingPointK() > 150){ duration = (int) Math.max(M.getMass() / 50L, 1L) *
+ * M.getMeltingPointK(); } else { duration = (int) Math.max(M.getMass() / 50L, 1L) * 150; }
+ */
+
+ long aVoltage = MaterialUtils.getVoltageForTier(M.vTier);
+
+ // Set a duration - NEW
+ int duration = 120 * M.vTier * 10;
+
+ if (M.vTier <= 4) {
+ duration = 20 * M.vTier * 10;
+ }
+
+ int mMaterialListSize = 0;
+
+ int mTotalPartsCounter = M.smallestStackSizeWhenProcessing;
+
+ if (M.getComposites() != null) {
+ for (final gtPlusPlus.core.material.MaterialStack ternkfsdf : M.getComposites()) {
+ if (ternkfsdf != null) {
+ mMaterialListSize++;
+ // mTotalPartsCounter += ternkfsdf.getSmallestStackSizes()[0];
+ }
+ }
+ } else {
+ mMaterialListSize = 1;
+ }
+
+ if (duration <= 0) {
+ final int second = 20;
+ duration = 14 * second * mMaterialListSize * 8;
+ }
+
+ Logger.WARNING("[BAS] Size: " + mMaterialListSize);
+
+ // Make a simple one Material MaterialStack[] and log it for validity.
+ circuitGT = ItemUtils.getGregtechCircuit(1);
+ final ItemStack[] tItemStackTest = new ItemStack[] { circuitGT, tStack };
+ inputStackCount = 1;
+ fluidAmount = 144 * inputStackCount;
+ Logger.WARNING(
+ "[BAS] Adding an Alloy Blast Smelter Recipe for " + M.getLocalizedName()
+ + ". Gives "
+ + fluidAmount
+ + "L of molten metal.");
+ for (int das = 0; das < tItemStackTest.length; das++) {
+ if (tItemStackTest[das] != null) {
+ Logger.WARNING(
+ "[BAS] tMaterial[" + das
+ + "]: "
+ + tItemStackTest[das].getDisplayName()
+ + " Meta: "
+ + tItemStackTest[das].getItemDamage()
+ + ", Amount: "
+ + tItemStackTest[das].stackSize);
+ }
+ }
+
+ final boolean hasMoreInputThanACircuit = (tItemStackTest.length > 1);
+
+ // Generate Recipes for all singular materials that can be made molten.
+ if (hasMoreInputThanACircuit) {
+ if (M.requiresBlastFurnace()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tItemStackTest)
+ .fluidOutputs(M.getFluidStack(fluidAmount))
+ .duration(duration / (mTotalPartsCounter > 0 ? mTotalPartsCounter : 1))
+ .eut(aVoltage)
+ .recipeCategory(GTPPRecipeCategories.absNonAlloyRecipes)
+ .addTo(GTPPRecipeMaps.alloyBlastSmelterRecipes);
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ } else {
+ if (CORE.RA.addBlastSmelterRecipe(
+ tItemStackTest,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration / (mTotalPartsCounter > 0 ? mTotalPartsCounter : 1) / 2,
+ (int) aVoltage)) {
+ Logger.WARNING("[BAS] Success.");
+ if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ingot.get(0),
+ M.getFluidStack(144),
+ M.getIngot(1),
+ duration / 2,
+ 60)) {
+ Logger.WARNING("[BAS] Success, Also added a Fluid solidifier recipe.");
+ /*
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getIngot(1), null, M.getFluidStack(144), 100,
+ * duration/2, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); } if
+ * (GT_Values.RA.addFluidExtractionRecipe(M.getNugget(1), null, M.getFluidStack(16), 100,
+ * duration/2/9, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ */
+ /*
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getSmallDust(1), null, M.getFluid(36), 100,
+ * duration/2/4, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getTinyDust(1), null, M.getFluid(16), 100,
+ * duration/2/9, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ */
+ }
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ }
+
+ if (tMaterial != null) {
+ // Reset the Variables for compounds if last recipe was a success.
+ inputStackCount = 0;
+
+ // If this Material has some kind of compound list, proceed
+ if (mMaterialListSize > 1) {
+ final gtPlusPlus.core.material.MaterialStack[] tempStack = new gtPlusPlus.core.material.MaterialStack[mMaterialListSize];
+ circuitGT = ItemUtils.getGregtechCircuit(mMaterialListSize);
+ // Just double checking
+ if (tempStack.length > 1) {
+
+ // Builds me a MaterialStack[] from the MaterialList of M.
+ int ooo = 0;
+ for (final gtPlusPlus.core.material.MaterialStack xMaterial : M.getComposites()) {
+ if (xMaterial != null) {
+ if (xMaterial.getStackMaterial() != null) {
+ Logger.WARNING(
+ "[BAS] FOUND: " + xMaterial.getStackMaterial()
+ .getLocalizedName());
+ Logger.WARNING(
+ "[BAS] ADDING: " + xMaterial.getStackMaterial()
+ .getLocalizedName());
+ }
+ tempStack[ooo] = xMaterial;
+ }
+ ooo++;
+ }
+
+ // Builds me an ItemStack[] of the materials. - Without a circuit - this gets a good count for
+ // the 144L fluid multiplier
+ components = new ItemStack[9];
+ inputStackCount = 0;
+ FluidStack componentsFluid = null;
+ for (int irc = 0; irc < M.getComposites()
+ .size(); irc++) {
+ if (M.getComposites()
+ .get(irc) != null) {
+ final int r = (int) M.vSmallestRatio[irc];
+ inputStackCount = inputStackCount + r;
+ if ((M.getComposites()
+ .get(irc)
+ .getStackMaterial()
+ .getState() != MaterialState.SOLID)
+ || !ItemUtils.checkForInvalidItems(
+ M.getComposites()
+ .get(irc)
+ .getDustStack(r))) {
+ final int xr = r;
+ if ((xr > 0) && (xr <= 100)) {
+ final int mathmatics = (r * 1000);
+ componentsFluid = FluidUtils.getFluidStack(
+ M.getComposites()
+ .get(irc)
+ .getStackMaterial()
+ .getFluidStack(mathmatics),
+ mathmatics);
+ }
+ } else {
+ components[irc] = M.getComposites()
+ .get(irc)
+ .getUnificatedDustStack(r);
+ }
+ }
+ }
+
+ // Adds a circuit
+ if ((mMaterialListSize < 9) && (mMaterialListSize != 0)) {
+ final ItemStack[] components_NoCircuit = components;
+ // Builds me an ItemStack[] of the materials. - With a circuit
+ components = new ItemStack[components_NoCircuit.length + 1];
+ for (int fr = 0; fr < components.length; fr++) {
+ if (fr == 0) {
+ components[0] = circuitGT;
+ } else {
+ components[fr] = components_NoCircuit[fr - 1];
+ }
+ }
+ Logger.WARNING(
+ "[BAS] Should have added a circuit. mMaterialListSize: " + mMaterialListSize
+ + " | circuit: "
+ + components[0].getDisplayName());
+ } else {
+ Logger.WARNING("[BAS] Did not add a circuit. mMaterialListSize: " + mMaterialListSize);
+ }
+
+ // Set Fluid output
+ fluidAmount = 144 * inputStackCount;
+
+ Logger.WARNING(
+ "[BAS] Adding an Alloy Blast Smelter Recipe for " + M.getLocalizedName()
+ + " using it's compound dusts. This material has "
+ + inputStackCount
+ + " parts. Gives "
+ + fluidAmount
+ + "L of molten metal.");
+ Logger.WARNING("[BAS] tMaterial.length: " + components.length + ".");
+ for (int das = 0; das < components.length; das++) {
+ if (components[das] != null) {
+ Logger.WARNING(
+ "[BAS] tMaterial[" + das
+ + "]: "
+ + components[das].getDisplayName()
+ + " Meta: "
+ + components[das].getItemDamage()
+ + ", Amount: "
+ + components[das].stackSize);
+ }
+ }
+
+ // Adds Recipe
+ if (M.requiresBlastFurnace()) {
+ if (CORE.RA.addBlastSmelterRecipe(
+ components,
+ componentsFluid,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration,
+ (int) aVoltage)) {
+ Logger.WARNING("[BAS] Success.");
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ } else {
+ if (CORE.RA.addBlastSmelterRecipe(
+ components,
+ componentsFluid,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration,
+ (int) aVoltage / 2)) {
+ Logger.WARNING("[BAS] Success.");
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ }
+ }
+ }
+ } else {
+ Logger.WARNING("[BAS] doTest: " + doTest + " | tMaterial != null: " + (tMaterial != null));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java
new file mode 100644
index 0000000000..5398a6a0b5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java
@@ -0,0 +1,252 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.ItemStackData;
+import gtPlusPlus.api.recipe.GTPPRecipeCategories;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_BlastSmelterGT_GTNH {
+
+ private static Map<String, FluidStack> mCachedIngotToFluidRegistry = new HashMap<>();
+ private static Map<String, String> mCachedHotToColdRegistry = new HashMap<>();
+
+ private static synchronized void setIngotToFluid(final ItemStackData stack, final FluidStack fluid) {
+ if (stack != null && fluid != null) {
+ mCachedIngotToFluidRegistry.put(stack.getUniqueDataIdentifier(), fluid);
+ }
+ }
+
+ private static synchronized void setHotToCold(final ItemStackData hot, final ItemStackData cold) {
+ if (hot != null && cold != null) {
+ mCachedHotToColdRegistry.put(hot.getUniqueDataIdentifier(), cold.getUniqueDataIdentifier());
+ }
+ }
+
+ private static synchronized FluidStack getFluidFromIngot(final ItemStackData ingot) {
+ ItemStackData h = ingot;
+ if (mCachedIngotToFluidRegistry.containsKey(h.getUniqueDataIdentifier())) {
+ Logger.MACHINE_INFO("[ABS] mCachedIngotToFluidRegistry contains Output Ingot.");
+ return mCachedIngotToFluidRegistry.get(h.getUniqueDataIdentifier());
+ }
+ if (mCachedHotToColdRegistry.containsKey(h.getUniqueDataIdentifier())) {
+ Logger.MACHINE_INFO("[ABS] mCachedHotToColdRegistry contains Output Ingot.");
+ return mCachedIngotToFluidRegistry.get(mCachedHotToColdRegistry.get(h.getUniqueDataIdentifier()));
+ }
+ Logger.MACHINE_INFO("[ABS] Neither Cache contains Output Ingot.");
+ return null;
+ }
+
+ private static boolean isValid(final ItemStack[] inputs, final ItemStack outputs[], final FluidStack[] fluidIn,
+ final FluidStack fluidOut) {
+ if (inputs != null && outputs != null
+ && fluidIn != null
+ && fluidOut != null
+ && inputs.length > 0
+ && outputs.length > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ public static synchronized boolean generateGTNHBlastSmelterRecipesFromEBFList() {
+
+ // Make a counting object
+ int mSuccess = 0;
+
+ Logger.INFO("[ABS] Starting recipe generation based on EBF recipe map.");
+ Logger.INFO("[ABS] Caching Ingots and their Molten fluid..");
+ // Ingots/Dusts -> Fluids
+ for (GT_Recipe x : RecipeMaps.fluidExtractionRecipes.getAllRecipes()) {
+ ItemStack validInput = null;
+ FluidStack validOutput = null;
+ // If there aren't both non empty inputs and outputs, we skip
+ if (ArrayUtils.isEmpty(x.mInputs) || ArrayUtils.isEmpty(x.mFluidOutputs)) {
+ continue;
+ }
+
+ for (int tag : OreDictionary.getOreIDs(x.mInputs[0])) {
+ String oreName = OreDictionary.getOreName(tag)
+ .toLowerCase();
+ String mType = "ingot";
+ if (oreName.startsWith(mType) && !oreName.contains("double")
+ && !oreName.contains("triple")
+ && !oreName.contains("quad")
+ && !oreName.contains("quintuple")) {
+ validInput = x.mInputs[0];
+ }
+ }
+
+ validOutput = x.mFluidOutputs[0];
+
+ if (validInput != null) {
+ ItemStackData R = new ItemStackData(validInput);
+ setIngotToFluid(R, validOutput);
+ Logger.MACHINE_INFO(
+ "[ABS][I2F] Cached " + validInput.getDisplayName()
+ + " to "
+ + validOutput.getLocalizedName()
+ + ". Stored Under ID of "
+ + R.getUniqueDataIdentifier());
+ }
+ }
+
+ Logger.INFO("[ABS] Caching Ingots and their Hot form...");
+ // Hot Ingots -> Cold Ingots
+ for (GT_Recipe x : RecipeMaps.vacuumFreezerRecipes.getAllRecipes()) {
+ ItemStack validInput = null;
+ ItemStack validOutput = null;
+ // If we the input is an ingot and it and the output are valid, map it to cache.
+ if (ArrayUtils.isNotEmpty(x.mInputs) && x.mInputs[0] != null) {
+ validInput = x.mInputs[0];
+ }
+ if (ArrayUtils.isNotEmpty(x.mOutputs) && x.mOutputs[0] != null) {
+ validOutput = x.mOutputs[0];
+ }
+ if (validInput != null && validOutput != null) {
+ ItemStackData R1 = new ItemStackData(validInput);
+ ItemStackData R2 = new ItemStackData(validOutput);
+ setHotToCold(R1, R2);
+ Logger.MACHINE_INFO(
+ "[ABS][H2C] Cached " + validInput.getDisplayName()
+ + " to "
+ + validOutput.getDisplayName()
+ + ". Stored Under ID of "
+ + R1.getUniqueDataIdentifier()
+ + ", links to ID "
+ + R2.getUniqueDataIdentifier());
+ }
+ }
+
+ Logger.INFO("[ABS] Generating recipes based on existing EBF recipes.");
+ // Okay, so now lets Iterate existing EBF recipes.
+ for (GT_Recipe x : RecipeMaps.blastFurnaceRecipes.getAllRecipes()) {
+ ItemStack[] inputs, outputs;
+ FluidStack[] inputsF;
+ int voltage, time, special;
+ boolean enabled;
+ inputs = x.mInputs.clone();
+ outputs = x.mOutputs.clone();
+ inputsF = x.mFluidInputs.clone();
+ voltage = x.mEUt;
+ time = x.mDuration;
+ enabled = x.mEnabled;
+ special = x.mSpecialValue;
+
+ // continue to next recipe if the Temp is too high.
+ if (special > 3600) {
+ Logger.MACHINE_INFO("[ABS] Skipping ABS addition for GTNH due to temp.");
+ continue;
+ } else {
+ FluidStack mMoltenStack = null;
+ int mMoltenCount = 0;
+ // If We have a valid Output, let's try use our cached data to get it's molten form.
+ if (x.mOutputs != null && x.mOutputs[0] != null) {
+ mMoltenCount = x.mOutputs[0].stackSize;
+ ItemStackData R = new ItemStackData(x.mOutputs[0]);
+ Logger.MACHINE_INFO(
+ "[ABS] Found " + x.mOutputs[0].getDisplayName()
+ + " as valid EBF output, finding it's fluid from the cache. We will require "
+ + (144 * mMoltenCount)
+ + "L. Looking for ID "
+ + R.getUniqueDataIdentifier());
+ FluidStack tempFluid = getFluidFromIngot(R);
+ if (tempFluid != null) {
+ // Logger.MACHINE_INFO("[ABS] Got Fluid from Cache.");
+ mMoltenStack = FluidUtils.getFluidStack(tempFluid, mMoltenCount * 144);
+ } else {
+ Logger.MACHINE_INFO("[ABS] Failed to get Fluid from Cache.");
+ }
+ }
+ // If this recipe is enabled and we have a valid molten fluidstack, let's try add this recipe.
+ if (enabled && isValid(inputs, outputs, inputsF, mMoltenStack)) {
+ // Boolean to decide whether or not to create a new circuit later
+ boolean circuitFound = false;
+
+ // Build correct input stack
+ ArrayList<ItemStack> aTempList = new ArrayList<>();
+ for (ItemStack recipeItem : inputs) {
+ if (ItemUtils.isControlCircuit(recipeItem)) {
+ circuitFound = true;
+ }
+ aTempList.add(recipeItem);
+ }
+
+ inputs = aTempList.toArray(new ItemStack[aTempList.size()]);
+ int inputLength = inputs.length;
+ // If no circuit was found, increase array length by 1 to add circuit at newInput[0]
+ if (!circuitFound) {
+ inputLength++;
+ }
+
+ ItemStack[] newInput = new ItemStack[inputLength];
+
+ int l = 0;
+ // If no circuit was found, add a circuit here
+ if (!circuitFound) {
+ l = 1;
+ newInput[0] = CI.getNumberedCircuit(inputs.length);
+ }
+
+ for (ItemStack y : inputs) {
+ newInput[l++] = y;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(newInput)
+ .fluidInputs(inputsF)
+ .fluidOutputs(mMoltenStack)
+ .duration(MathUtils.roundToClosestInt(time * 0.8))
+ .eut(voltage)
+ .recipeCategory(
+ inputLength <= 2 ? GTPPRecipeCategories.absNonAlloyRecipes
+ : GTPPRecipeMaps.alloyBlastSmelterRecipes.getDefaultRecipeCategory())
+ .addTo(GTPPRecipeMaps.alloyBlastSmelterRecipes);
+ } else {
+ if (!enabled) {
+ Logger.MACHINE_INFO("[ABS] Failure. EBF recipe was not enabled.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] Failure. Invalid Inputs or Outputs.");
+ if (inputs == null) {
+ Logger.MACHINE_INFO("[ABS] Inputs were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] inputs size: " + inputs.length);
+ }
+ if (outputs == null) {
+ Logger.MACHINE_INFO("[ABS] Outputs were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] outputs size: " + outputs.length);
+ }
+ if (inputsF == null) {
+ Logger.MACHINE_INFO("[ABS] Input Fluids were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] inputsF size: " + inputsF.length);
+ }
+ if (mMoltenStack == null) {
+ Logger.MACHINE_INFO("[ABS] Output Fluid were not Valid.");
+ }
+ }
+ }
+ }
+ }
+
+ Logger.INFO("[ABS] Processed " + mSuccess + " recipes.");
+ return mSuccess > 0;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java
new file mode 100644
index 0000000000..1499ea3cad
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java
@@ -0,0 +1,448 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_DustGeneration extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_DustGeneration(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_DustGeneration(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ final ItemStack normalDust = M.getDust(1);
+ final ItemStack smallDust = M.getSmallDust(1);
+ final ItemStack tinyDust = M.getTinyDust(1);
+ if (tinyDust != null && normalDust != null) {
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.INFO("9 Tiny dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("9 Tiny dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, M.getTinyDust(9))) {
+ Logger.INFO("9 Tiny dust from 1 Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("9 Tiny dust from 1 Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ }
+
+ if (smallDust != null && normalDust != null) {
+ if (RecipeUtils.addShapedRecipe(
+ smallDust,
+ smallDust,
+ null,
+ smallDust,
+ smallDust,
+ null,
+ null,
+ null,
+ null,
+ normalDust)) {
+ Logger.INFO("4 Small dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("4 Small dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, M.getSmallDust(4))) {
+ Logger.INFO("4 Small dust from 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("4 Small dust from 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+
+ Logger.INFO("Generating Shaped Crafting recipes for " + material.getLocalizedName());
+
+ final ItemStack normalDust = material.getDust(1);
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ final ItemStack[] inputStacks = material.getMaterialComposites();
+ final ItemStack outputStacks = material.getDust(material.smallestStackSizeWhenProcessing);
+
+ // Macerate blocks back to dusts.
+ final ItemStack materialBlock = material.getBlock(1);
+ final ItemStack materialFrameBox = material.getFrameBox(1);
+
+ if (ItemUtils.checkForInvalidItems(materialBlock)) {
+ GT_ModHandler.addPulverisationRecipe(materialBlock, material.getDust(9));
+ }
+
+ if (ItemUtils.checkForInvalidItems(materialFrameBox)) {
+ GT_ModHandler.addPulverisationRecipe(materialFrameBox, material.getDust(2));
+ }
+
+ if (ItemUtils.checkForInvalidItems(smallDust) && ItemUtils.checkForInvalidItems(tinyDust)) {
+ generatePackagerRecipes(material);
+ }
+
+ ItemStack ingot = material.getIngot(1);
+ if (ItemUtils.checkForInvalidItems(normalDust) && ItemUtils.checkForInvalidItems(ingot)) {
+ addFurnaceRecipe(material);
+ addMacerationRecipe(material);
+ }
+
+ // Is this a composite?
+ if ((inputStacks != null) && !disableOptional) {
+ // Is this a composite?
+ Logger.WARNING("mixer length: " + inputStacks.length);
+ if ((inputStacks.length != 0) && (inputStacks.length <= 4)) {
+ // Log Input items
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+ final long[] inputStackSize = material.vSmallestRatio;
+ Logger.WARNING("mixer is stacksizeVar null? " + (inputStackSize != null));
+ // Is smallest ratio invalid?
+ if (inputStackSize != null) {
+ // set stack sizes on an input ItemStack[]
+ for (short x = 0; x < inputStacks.length; x++) {
+ if ((inputStacks[x] != null) && (inputStackSize[x] != 0)) {
+ inputStacks[x].stackSize = (int) inputStackSize[x];
+ }
+ }
+ // Relog input values, with stack sizes
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+
+ // Get us four ItemStacks to input into the mixer
+ ItemStack[] input = new ItemStack[4];
+
+ input[0] = (inputStacks.length >= 1) ? ((inputStacks[0] == null) ? null : inputStacks[0]) : null;
+ input[1] = (inputStacks.length >= 2) ? ((inputStacks[1] == null) ? null : inputStacks[1]) : null;
+ input[2] = (inputStacks.length >= 3) ? ((inputStacks[2] == null) ? null : inputStacks[2]) : null;
+ input[3] = (inputStacks.length >= 4) ? ((inputStacks[3] == null) ? null : inputStacks[3]) : null;
+
+ if (inputStacks.length == 1) {
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+ } else if (inputStacks.length == 2) {
+ input[2] = input[1];
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+
+ } else if (inputStacks.length == 3) {
+ input[3] = input[2];
+ input[2] = input[1];
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+ }
+
+ /*
+ * for (int g = 0; g<4; g++) { if(inputStacks.length > g) { input[g] = inputStacks[g] != null ?
+ * inputStacks[g] : null; } else { input[g] = CI.getNumberedCircuit(g+10); break; } }
+ */
+
+ // Add mixer Recipe
+ FluidStack oxygen = GT_Values.NF;
+ if (material.getComposites() != null) {
+ for (final MaterialStack x : material.getComposites()) {
+ if (!material.getComposites()
+ .isEmpty()) {
+ if (x != null) {
+ if (x.getStackMaterial() != null) {
+ if (x.getStackMaterial()
+ .getDust(1) == null) {
+ if (x.getStackMaterial()
+ .getState() != MaterialState.SOLID
+ && x.getStackMaterial()
+ .getState() != MaterialState.ORE
+ && x.getStackMaterial()
+ .getState() != MaterialState.PLASMA) {
+ oxygen = x.getStackMaterial()
+ .getFluidStack(1000);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ input = ItemUtils.cleanItemStackArray(input);
+
+ // Add mixer Recipe
+ if (GT_Values.RA.addMixerRecipe(
+ input[0],
+ input[1],
+ input[2],
+ input[3],
+ oxygen,
+ null,
+ outputStacks,
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) // Was 6, but let's try 2. This makes Potin LV, for example.
+ {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Add Shapeless recipe for low tier alloys.
+ /*
+ * if (tVoltageMultiplier <= 30){ if (RecipeUtils.addShapedGregtechRecipe(inputStacks,
+ * outputStacks)){
+ * Logger.WARNING("Dust Shapeless Recipe: "+material.getLocalizedName()+" - Success"); } else {
+ * Logger.WARNING("Dust Shapeless Recipe: "+material.getLocalizedName()+" - Failed"); } }
+ */
+ }
+ }
+ }
+ }
+
+ public static boolean addMixerRecipe_Standalone(final Material material) {
+ final ItemStack[] inputStacks = material.getMaterialComposites();
+ final ItemStack outputStacks = material.getDust(material.smallestStackSizeWhenProcessing);
+ // Is this a composite?
+ if ((inputStacks != null)) {
+ // Is this a composite?
+ Logger.WARNING("mixer length: " + inputStacks.length);
+ if ((inputStacks.length >= 1) && (inputStacks.length <= 4)) {
+ // Log Input items
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+ final long[] inputStackSize = material.vSmallestRatio;
+ Logger.WARNING("mixer is stacksizeVar not null? " + (inputStackSize != null));
+ // Is smallest ratio invalid?
+ if (inputStackSize != null) {
+ // set stack sizes on an input ItemStack[]
+ for (short x = 0; x < inputStacks.length; x++) {
+ if ((inputStacks[x] != null) && (inputStackSize[x] != 0)) {
+ inputStacks[x].stackSize = (int) inputStackSize[x];
+ }
+ }
+ // Relog input values, with stack sizes
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+
+ // Get us four ItemStacks to input into the mixer
+ ItemStack input1, input2, input3, input4;
+ input1 = inputStacks[0];
+ input2 = (inputStacks.length >= 2) ? (input2 = (inputStacks[1] == null) ? null : inputStacks[1])
+ : null;
+ input3 = (inputStacks.length >= 3) ? (input3 = (inputStacks[2] == null) ? null : inputStacks[2])
+ : null;
+ input4 = (inputStacks.length >= 4) ? (input4 = (inputStacks[3] == null) ? null : inputStacks[3])
+ : null;
+
+ if (inputStacks.length == 1) {
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+ } else if (inputStacks.length == 2) {
+ input3 = input2;
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+
+ } else if (inputStacks.length == 3) {
+ input4 = input3;
+ input3 = input2;
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+ }
+
+ // Add mixer Recipe
+ FluidStack oxygen = GT_Values.NF;
+ if (material.getComposites() != null) {
+ int compSlot = 0;
+ for (final MaterialStack x : material.getComposites()) {
+ if (!material.getComposites()
+ .isEmpty()) {
+ if (x != null) {
+ if (x.getStackMaterial() != null) {
+ if (x.getStackMaterial()
+ .getDust(1) == null) {
+ MaterialState f = x.getStackMaterial()
+ .getState();
+ if (f == MaterialState.GAS || f == MaterialState.LIQUID
+ || f == MaterialState.PURE_LIQUID
+ || f == MaterialState.PURE_GAS) {
+ oxygen = x.getStackMaterial()
+ .getFluidStack((int) (material.vSmallestRatio[compSlot] * 1000));
+ }
+ }
+ }
+ }
+ }
+ compSlot++;
+ }
+ }
+
+ // Add mixer Recipe
+ try {
+ if (GT_Values.RA.addMixerRecipe(
+ input1,
+ input2,
+ input3,
+ input4,
+ oxygen,
+ null,
+ outputStacks,
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) // Was 6, but let's try 2. This makes Potin LV, for
+ // example.
+ {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Success");
+ return true;
+ } else {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Failed");
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else {
+ Logger.WARNING("inputStackSize == NUll - " + material.getLocalizedName());
+ }
+ } else {
+ Logger.WARNING("InputStacks is out range 1-4 - " + material.getLocalizedName());
+ }
+ } else {
+ Logger.WARNING("InputStacks == NUll - " + material.getLocalizedName());
+ }
+ return false;
+ }
+
+ public static boolean generatePackagerRecipes(Material aMatInfo) {
+ AutoMap<Boolean> aResults = new AutoMap<>();
+ // Small Dust
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(
+ GT_Utility.copyAmount(4L, new Object[] { aMatInfo.getSmallDust(4) }),
+ ItemList.Schematic_Dust.get(0L, new Object[0]),
+ aMatInfo.getDust(1),
+ 100,
+ 4));
+ // Tiny Dust
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(
+ GT_Utility.copyAmount(9L, new Object[] { aMatInfo.getTinyDust(9) }),
+ ItemList.Schematic_Dust.get(0L, new Object[0]),
+ aMatInfo.getDust(1),
+ 100,
+ 4));
+
+ for (boolean b : aResults) {
+ if (!b) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void addMacerationRecipe(Material aMatInfo) {
+ try {
+ Logger.MATERIALS("Adding Maceration recipe for " + aMatInfo.getLocalizedName() + " Ingot -> Dusts");
+ final int chance = (aMatInfo.vTier * 10) / MathUtils.randInt(10, 20);
+ GT_ModHandler.addPulverisationRecipe(aMatInfo.getIngot(1), aMatInfo.getDust(1), null, chance);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private void addFurnaceRecipe(Material aMatInfo) {
+
+ ItemStack aDust = aMatInfo.getDust(1);
+ ItemStack aOutput;
+ try {
+ if (aMatInfo.requiresBlastFurnace()) {
+ aOutput = aMatInfo.getHotIngot(1);
+ if (ItemUtils.checkForInvalidItems(aOutput)) {
+ if (addBlastFurnaceRecipe(aMatInfo, aDust, null, aOutput, null, aMatInfo.getMeltingPointK())) {
+ Logger
+ .MATERIALS("Successfully added a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ } else {
+ Logger.MATERIALS("Failed to add a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ } else {
+ Logger.MATERIALS("Failed to add a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ } else {
+ aOutput = aMatInfo.getIngot(1);
+ if (ItemUtils.checkForInvalidItems(aOutput)) {
+ if (CORE.RA.addSmeltingAndAlloySmeltingRecipe(aDust, aOutput)) {
+ Logger.MATERIALS("Successfully added a furnace recipe for " + aMatInfo.getLocalizedName());
+ } else {
+ Logger.MATERIALS("Failed to add a furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ }
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private boolean addBlastFurnaceRecipe(Material aMatInfo, final ItemStack input1, final ItemStack input2,
+ final ItemStack output1, final ItemStack output2, final int tempRequired) {
+
+ try {
+ int timeTaken = 125 * aMatInfo.vTier * 10;
+
+ if (aMatInfo.vTier <= 4) {
+ timeTaken = 25 * aMatInfo.vTier * 10;
+ }
+ int aSlot = aMatInfo.vTier;
+ if (aSlot < 2) {
+ aSlot = 2;
+ }
+ long aVoltage = aMatInfo.vVoltageMultiplier;
+
+ return GT_Values.RA.addBlastRecipe(
+ input1,
+ input2,
+ GT_Values.NF,
+ GT_Values.NF,
+ output1,
+ output2,
+ timeTaken,
+ (int) aVoltage,
+ tempRequired);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java
new file mode 100644
index 0000000000..a69a96b925
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Extruder extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Extruder(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ final ItemStack itemIngot = material.getIngot(1);
+ final ItemStack itemPlate = material.getPlate(1);
+ final ItemStack itemGear = material.getGear(1);
+
+ final ItemStack shape_Plate = ItemList.Shape_Extruder_Plate.get(0);
+ final ItemStack shape_Ring = ItemList.Shape_Extruder_Ring.get(0);
+ final ItemStack shape_Gear = ItemList.Shape_Extruder_Gear.get(0);
+ final ItemStack shape_Rod = ItemList.Shape_Extruder_Rod.get(0);
+ final ItemStack shape_Bolt = ItemList.Shape_Extruder_Bolt.get(0);
+ final ItemStack shape_Block = ItemList.Shape_Extruder_Block.get(0);
+ final ItemStack shape_Ingot = ItemList.Shape_Extruder_Ingot.get(0);
+
+ Logger.WARNING("Generating Extruder recipes for " + material.getLocalizedName());
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getBlock(1))) {
+ // Ingot Recipe
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getBlock(1),
+ shape_Ingot,
+ material.getIngot(9),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Block Recipe
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(9),
+ shape_Block,
+ material.getBlock(1),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Plate Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ if (GT_Values.RA.addExtruderRecipe(itemIngot, shape_Plate, itemPlate, 10, material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Plate Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Plate Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Ring Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRing(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Ring,
+ material.getRing(4),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Gear Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getGear(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(4),
+ shape_Gear,
+ itemGear,
+ (int) Math.max(material.getMass() * 5L, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Rod Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Rod,
+ material.getRod(2),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bolt Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getBolt(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Bolt,
+ material.getBolt(8),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Rotor Recipe
+ // Shape_Extruder_Rotor
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getRotor(1)))
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(5),
+ ItemList.Shape_Extruder_Rotor.get(0),
+ material.getRotor(1),
+ (int) Math.max(material.getMass() * 5L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java
new file mode 100644
index 0000000000..fb6dc807ef
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class RecipeGen_FluidCanning implements Runnable {
+
+ public static void init() {
+ FluidCanningRunnableHandler x = new FluidCanningRunnableHandler();
+ x.run();
+ }
+
+ private static class FluidCanningRunnableHandler implements RunnableWithInfo<String> {
+
+ @Override
+ public void run() {
+ mHasRun = true;
+ for (RecipeGen_FluidCanning aRecipe : mCache) {
+ aRecipe.run();
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ return "Fluid Canning Recipes";
+ }
+ }
+
+ private static boolean mHasRun = false;
+
+ private static HashSet<RecipeGen_FluidCanning> mCache = new HashSet<>();
+
+ private static void addRunnableToRecipeCache(RecipeGen_FluidCanning r) {
+ if (mHasRun) {
+ CORE.crash();
+ }
+ mCache.add(r);
+ }
+
+ protected boolean disableOptional;
+
+ private final GT_Recipe recipe;
+ private final boolean isValid;
+
+ public boolean valid() {
+ return isValid;
+ }
+
+ // Alternative Constructor
+ public RecipeGen_FluidCanning(boolean aExtracting, ItemStack aEmpty, ItemStack aFull, FluidStack aFluidIn,
+ FluidStack aFluidOut, Integer aDuration, Integer aEUt) {
+ ItemStack aInput;
+ ItemStack aOutput;
+ FluidStack aFluidInput;
+ FluidStack aFluidOutput;
+
+ // Safety check on the duration
+ if (aDuration == null || aDuration <= 0) {
+ aDuration = (aFluidIn != null) ? (aFluidIn.amount / 62)
+ : ((aFluidOut != null) ? (aFluidOut.amount / 62) : 10);
+ }
+
+ // Safety check on the EU
+ if (aEUt == null || aEUt <= 0) {
+ if (aExtracting) {
+ aEUt = 2;
+ } else {
+ aEUt = 1;
+ }
+ }
+
+ // Set Item stacks correctly, invert if extraction recipe.
+ if (aExtracting) {
+ aInput = aFull;
+ aOutput = aEmpty;
+ aFluidInput = GT_Values.NF;
+ aFluidOutput = aFluidIn;
+ } else {
+ aInput = aEmpty;
+ aOutput = aFull;
+ aFluidInput = aFluidIn;
+ aFluidOutput = aFluidOut != null ? aFluidOut : GT_Values.NF;
+ }
+
+ // Check validity
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+
+ // Check Valid
+ boolean aTempValidityCheck = false;
+ // Logger.INFO("Validity Check.");
+ if (aExtracting) {
+ Logger.INFO("Extracting.");
+ if (aInput != null && aFluidOutput != null) {
+ // Logger.INFO("Pass.");
+ aTempValidityCheck = true;
+ }
+ } else {
+ // Logger.INFO("Canning.");
+ if (aInput != null && aOutput != null && (aFluidInput != null || aFluidOutput != null)) {
+ // Logger.INFO("Pass.");
+ aTempValidityCheck = true;
+ }
+ }
+
+ if (aTempValidityCheck) {
+ // Valid Recipe
+ recipe = aRecipe;
+ disableOptional = aExtracting;
+ isValid = true;
+ addRunnableToRecipeCache(this);
+ } else {
+ // Logger.INFO("Failed Validity Check.");
+ isValid = false;
+ disableOptional = aExtracting;
+ aRecipe.mEnabled = false;
+ aRecipe.mHidden = true;
+ recipe = null;
+ }
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Processing Recipe with Hash: " + recipe.hashCode());
+ generateRecipes();
+ }
+
+ private void generateRecipes() {
+ if (isValid && recipe != null) {
+ if (this.disableOptional) {
+ addFluidExtractionRecipe(recipe);
+ } else {
+ addFluidCannerRecipe(recipe);
+ }
+ }
+ }
+
+ private void addFluidExtractionRecipe(GT_Recipe aRecipe) {
+ CORE.crash();
+ Logger.INFO(
+ "[FE-Debug] " + aRecipe.mFluidOutputs[0].amount
+ + "L of "
+ + aRecipe.mFluidOutputs[0].getLocalizedName()
+ + " fluid extractor from 1 "
+ + aRecipe.mInputs[0].getDisplayName()
+ + " - Success. Time: "
+ + aRecipe.mDuration
+ + ", Voltage: "
+ + aRecipe.mEUt);
+ int aCount1 = getMapSize(RecipeMaps.fluidExtractionRecipes);
+ int aCount2 = aCount1;
+ RecipeMaps.fluidExtractionRecipes.addRecipe(aRecipe);
+ aCount1 = getMapSize(RecipeMaps.fluidExtractionRecipes);
+ if (aCount1 <= aCount2) {
+ Logger.INFO(
+ "[ERROR] Failed adding Extraction recipe for " + ItemUtils.getArrayStackNames(aRecipe.mInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mOutputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidOutputs));
+ dumpStack();
+ }
+ }
+
+ private void addFluidCannerRecipe(GT_Recipe aRecipe) {
+ boolean result;
+ int aCount1 = getMapSize(RecipeMaps.fluidCannerRecipes);
+ int aCount2 = aCount1;
+ RecipeMaps.fluidCannerRecipes.addRecipe(aRecipe);
+ aCount1 = getMapSize(RecipeMaps.fluidCannerRecipes);
+ if (aCount1 <= aCount2) {
+ Logger.INFO(
+ "[ERROR] Failed adding Canning recipe for " + ItemUtils.getArrayStackNames(aRecipe.mInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mOutputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidOutputs));
+ dumpStack();
+ }
+ }
+
+ private void dumpStack() {
+ int parents = 2;
+ for (int i = 0; i < 6; i++) {
+ Logger.INFO(
+ (disableOptional ? "EXTRACTING" : "CANNING") + " DEBUG | "
+ + (i == 0 ? "Called from: " : "Parent: ")
+ + ReflectionUtils.getMethodName(i + parents));
+ }
+ }
+
+ private int getMapSize(RecipeMap<?> aMap) {
+ return aMap.getAllRecipes()
+ .size();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java
new file mode 100644
index 0000000000..dd0c1b505c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java
@@ -0,0 +1,212 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Fluids extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Fluids(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_Fluids(final Material M, final boolean dO) {
+ this.toGenerate = M;
+ this.disableOptional = dO;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean dO) {
+
+ if (material == null) {
+ return;
+ }
+
+ // Melting Shapes to fluid
+ if (material.getFluidStack(1) != null && !material.getFluidStack(1)
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("plasma")) {
+
+ // Making Shapes from fluid
+
+ // Ingot
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ingot.get(0), // Item Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getIngot(1), // output
+ 32, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("144l fluid molder for 1 ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("144l fluid molder for 1 ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Plate
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Plate.get(0), // Item Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getPlate(1), // output
+ 32, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("144l fluid molder for 1 plate Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("144l fluid molder for 1 plate Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Nugget
+ if (ItemUtils.checkForInvalidItems(material.getNugget(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Nugget.get(0), // Item Shape
+ material.getFluidStack(16), // Fluid Input
+ material.getNugget(1), // output
+ 16, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("16l fluid molder for 1 nugget Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("16l fluid molder for 1 nugget Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Gears
+ if (ItemUtils.checkForInvalidItems(material.getGear(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Gear.get(0), // Item Shape
+ material.getFluidStack(576), // Fluid Input
+ material.getGear(1), // output
+ 128, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("576l fluid molder for 1 gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("576l fluid molder for 1 gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Blocks
+ if (ItemUtils.checkForInvalidItems(material.getBlock(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Block.get(0), // Item Shape
+ material.getFluidStack(144 * 9), // Fluid Input
+ material.getBlock(1), // output
+ 288, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // GTNH
+
+ // Rod
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rod.get(0), // Item Shape
+ material.getFluidStack(72), // Fluid Input
+ material.getRod(1), // output
+ 150, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rod Long
+ if (ItemUtils.checkForInvalidItems(material.getLongRod(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rod_Long.get(0), // Item
+ // Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getLongRod(1), // output
+ 300, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod long Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod long Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bolt
+ if (ItemUtils.checkForInvalidItems(material.getBolt(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Bolt.get(0), // Item Shape
+ material.getFluidStack(18), // Fluid Input
+ material.getBolt(1), // output
+ 50, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Screw
+ if (ItemUtils.checkForInvalidItems(material.getScrew(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Screw.get(0), // Item Shape
+ material.getFluidStack(18), // Fluid Input
+ material.getScrew(1), // output
+ 50, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Ring
+ if (ItemUtils.checkForInvalidItems(material.getRing(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ring.get(0), // Item Shape
+ material.getFluidStack(36), // Fluid Input
+ material.getRing(1), // output
+ 100, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rotor
+ if (ItemUtils.checkForInvalidItems(material.getRotor(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rotor.get(0), // Item Shape
+ material.getFluidStack(612), // Fluid Input
+ material.getRotor(1), // output
+ 100, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java
new file mode 100644
index 0000000000..a3ba819fb6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java
@@ -0,0 +1,267 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_Fluorite extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Fluorite(final Material material) {
+ this.toGenerate = material;
+ mRecipeGenMap.add(this);
+
+ /**
+ * Shaped Crafting
+ */
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedPurified(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustPurified(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushed(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustImpure(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedCentrifuged(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDust(1));
+
+ final ItemStack normalDust = material.getDust(1);
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, material.getTinyDust(9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(smallDust, smallDust, null, smallDust, smallDust, null, null, null, null, normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, material.getSmallDust(4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ public static void generateRecipes(final Material material) {
+
+ int tVoltageMultiplier = MaterialUtils.getVoltageForTier(material.vTier);
+
+ final ItemStack dustStone = ItemUtils.getItemStackOfAmountFromOreDict("dustStone", 1);
+
+ ItemStack tinyDustA = FLUORIDES.FLUORITE.getTinyDust(1);
+ ItemStack tinyDustB = FLUORIDES.FLUORITE.getTinyDust(1);
+ ItemStack matDust = FLUORIDES.FLUORITE.getDust(1);
+ ItemStack matDustA = FLUORIDES.FLUORITE.getDust(1);
+
+ /**
+ * Package
+ */
+ // Allow ore dusts to be packaged
+ if (ItemUtils.checkForInvalidItems(material.getSmallDust(1))
+ && ItemUtils.checkForInvalidItems(material.getTinyDust(1))) {
+ RecipeGen_DustGeneration.generatePackagerRecipes(material);
+ }
+
+ /**
+ * Macerate
+ */
+ // Macerate ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate ore to Crushed ore'");
+ }
+ // Macerate raw ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getRawOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate raw ore to Crushed ore'");
+ }
+
+ // Macerate Centrifuged to Pure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedCentrifuged(1),
+ new ItemStack[] { matDust, matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Centrifuged ore to Pure Dust'");
+ }
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushedPurified(1),
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ tinyDustA,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore' | Input: "
+ + material.getCrushedPurified(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + tinyDustA.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+
+ GT_Values.RA.addChemicalBathRecipe(
+ FLUORIDES.FLUORITE.getCrushed(2),
+ FluidUtils.getFluidStack("hydrogen", 2000),
+ FLUORIDES.FLUORITE.getCrushedPurified(8),
+ FLUORIDES.FLUORITE.getDustImpure(4),
+ FLUORIDES.FLUORITE.getDustPurified(2),
+ new int[] { 10000, 5000, 1000 },
+ 30 * 20,
+ 240);
+
+ /**
+ * Forge Hammer
+ */
+ if (GT_Values.RA.addForgeHammerRecipe(material.getCrushedCentrifuged(1), matDust, 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Centrifuged to Pure Dust'");
+ }
+
+ /**
+ * Centrifuge
+ */
+ // Purified Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustPurified(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ tinyDustA,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 10000 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Purified Dust to Clean Dust");
+ }
+
+ // Impure Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustImpure(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ tinyDustB,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 10000 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Inpure Dust to Clean Dust");
+ }
+
+ // CaF2 + H2SO4 → CaSO4(solid) + 2 HF
+ FluidStack aGregtechHydro = FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 16000);
+ if (aGregtechHydro == null) {
+ aGregtechHydro = FluidUtils.getFluidStack("hydrofluoricacid", 16000);
+ }
+
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(5), FLUORIDES.FLUORITE.getDust(37), },
+ FluidUtils.getFluidStack("sulfuricacid", 8000),
+ aGregtechHydro, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumSulfate", 15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSilver", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGold", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 2) },
+ new int[] { 10000, 1000, 1000, 3000, 2000 },
+ 10 * 60 * 20,
+ 240); // EU
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java
new file mode 100644
index 0000000000..83bbe6a6d7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java
@@ -0,0 +1,318 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_MaterialProcessing extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_MaterialProcessing(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_MaterialProcessing(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+ if (disableOptional) {
+ return;
+ }
+
+ if (material.getMaterialComposites().length > 1) {
+ Logger.MATERIALS("[Recipe Generator Debug] [" + material.getLocalizedName() + "]");
+ final int tVoltageMultiplier = material.vVoltageMultiplier;
+ int[] partSizes = new int[99];
+ if (material.vSmallestRatio != null) {
+ partSizes = new int[material.vSmallestRatio.length];
+ for (int hu = 0; hu < material.vSmallestRatio.length; hu++) {
+ partSizes[hu] = (int) material.vSmallestRatio[hu];
+ }
+ }
+ AutoMap<Pair<Integer, Material>> componentMap = new AutoMap<>();
+ int alnsnfds = 0;
+ for (MaterialStack r : material.getComposites()) {
+ if (r != null) {
+ componentMap.put(new Pair<>(partSizes[alnsnfds], r.getStackMaterial()));
+ }
+ alnsnfds++;
+ }
+
+ /**
+ * Centrifuge
+ */
+
+ // Process Dust
+ if (componentMap.size() > 0 && componentMap.size() <= 6) {
+ ItemStack mInternalOutputs[] = new ItemStack[6];
+ int mChances[] = new int[6];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Centrifuge] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Centrifuge] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Centrifuge] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Centrifuge] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Centrifuge] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Centrifuge] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Centrifuge] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Centrifuge] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Centrifuge] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (addCentrifgeRecipe(
+ mainDust,
+ emptyCell, // input 2
+ null, // Input fluid 1
+ null, // Output fluid 1
+ mInternalOutputs[0],
+ mInternalOutputs[1],
+ mInternalOutputs[2],
+ mInternalOutputs[3],
+ mInternalOutputs[4],
+ mInternalOutputs[5],
+ mChances,
+ 20 * 1 * (tVoltageMultiplier / 10),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS(
+ "[Centrifuge] Generated Centrifuge recipe for " + material.getDust(1)
+ .getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Failed to generate Centrifuge recipe for " + material.getDust(1)
+ .getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else if (componentMap.size() > 6 && componentMap.size() <= 9) {
+ Logger.MATERIALS(
+ "[Issue][Electrolyzer] " + material.getLocalizedName()
+ + " is composed of over 6 materials, so an electrolyzer recipe for processing cannot be generated. Trying to create one for the Dehydrator instead.");
+
+ ItemStack mInternalOutputs[] = new ItemStack[9];
+ int mChances[] = new int[9];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Dehydrator] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Dehydrator] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = CI.emptyCells(mCellCount);
+ Logger.MATERIALS("[Dehydrator] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Dehydrator] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+
+ if (CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { mainDust, emptyCell },
+ null,
+ null,
+ mInternalOutputs,
+ mChances,
+ 20 * 1 * (tVoltageMultiplier / 10),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS(
+ "[Dehydrator] Generated Dehydrator recipe for " + material.getDust(1)
+ .getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Failed to generate Dehydrator recipe for " + material.getDust(1)
+ .getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Deprecated
+ public static boolean addCentrifgeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ return GT_Values.RA.addCentrifugeRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ aChances,
+ aDuration,
+ aEUt);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java
new file mode 100644
index 0000000000..f11b97cbda
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java
@@ -0,0 +1,112 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_MetalRecipe extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_MetalRecipe(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ Logger.WARNING("Generating Metal recipes for " + material.getLocalizedName());
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getBlock(1)))
+ if (GT_ModHandler.addCompressionRecipe(material.getIngot(9), material.getBlock(1))) {
+ Logger.WARNING("Compress Block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Compress Block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_Values.RA.addLatheRecipe(
+ material.getIngot(1),
+ material.getRod(1),
+ material.getSmallDust(2),
+ (int) Math.max(material.getMass() / 8L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Lathe Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Lathe Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getRod(1)) && ItemUtils.checkForInvalidItems(material.getBolt(1)))
+ if (GT_Values.RA.addCutterRecipe(
+ material.getRod(1),
+ material.getBolt(4),
+ null,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cut Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cut Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getHotIngot(1)))
+ if (CORE.RA.addVacuumFreezerRecipe(
+ material.getHotIngot(1),
+ material.getIngot(1),
+ (int) Math.max(material.getMass() * 3L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cool Hot Ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cool Hot Ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))
+ && ItemUtils.checkForInvalidItems(material.getLongRod(1))) {
+ if (GT_Values.RA.addForgeHammerRecipe(
+ material.getRod(2),
+ material.getLongRod(1),
+ (int) Math.max(material.getMass(), 1L),
+ 16)) {
+ Logger.WARNING("Hammer Long Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Hammer Long Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ GT_Values.RA.addCutterRecipe(
+ material.getLongRod(1),
+ material.getRod(2),
+ null,
+ (int) Math.max(material.getMass(), 1L),
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getBolt(1)) && ItemUtils.checkForInvalidItems(material.getScrew(1)))
+ if (GT_Values.RA.addLatheRecipe(
+ material.getBolt(1),
+ material.getScrew(1),
+ null,
+ (int) Math.max(material.getMass() / 8L, 1L),
+ 4)) {
+ Logger.WARNING("Lathe Screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Lathe Screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java
new file mode 100644
index 0000000000..208be14c8c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java
@@ -0,0 +1,187 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.recipe.GT_RecipeUtils;
+
+public class RecipeGen_MultisUsingFluidInsteadOfCells {
+
+ private static ItemStack mEmptyCell;
+ private static final AutoMap<ItemStack> mItemsToIgnore = new AutoMap<>();
+ private static boolean mInit = false;
+
+ private static void init() {
+ if (!mInit) {
+ mInit = true;
+ mItemsToIgnore.add(
+ ItemUtils.simpleMetaStack(
+ CI.emptyCells(1)
+ .getItem(),
+ 8,
+ 1));
+ }
+ }
+
+ private static boolean doesItemMatchIgnoringStackSize(ItemStack a, ItemStack b) {
+ if (a == null || b == null) {
+ return false;
+ }
+ if (a.getItem() == b.getItem()) {
+ return a.getItemDamage() == b.getItemDamage();
+ }
+ return false;
+ }
+
+ private static boolean isEmptyCell(ItemStack aCell) {
+ if (aCell == null) {
+ return false;
+ }
+ if (mEmptyCell == null) {
+ mEmptyCell = CI.emptyCells(1);
+ }
+ if (mEmptyCell != null) {
+ ItemStack aTempStack = mEmptyCell.copy();
+ aTempStack.stackSize = aCell.stackSize;
+ return GT_Utility.areStacksEqual(aTempStack, aCell);
+ }
+ return false;
+ }
+
+ private static synchronized FluidStack getFluidFromItemStack(final ItemStack ingot) {
+ if (ingot == null) {
+ return null;
+ }
+ return GT_Utility.getFluidForFilledItem(ingot, true);
+ }
+
+ public static synchronized int generateRecipesNotUsingCells(RecipeMap<?> aInputs, RecipeMap<?> aOutputs) {
+ init();
+ int aRecipesHandled = 0;
+ int aInvalidRecipesToConvert = 0;
+ int aOriginalCount = aInputs.getAllRecipes()
+ .size();
+ ArrayList<GT_Recipe> deDuplicationInputArray = new ArrayList<>();
+
+ recipe: for (GT_Recipe x : aInputs.getAllRecipes()) {
+ if (x != null) {
+
+ ItemStack[] aInputItems = x.mInputs.clone();
+ ItemStack[] aOutputItems = x.mOutputs.clone();
+ FluidStack[] aInputFluids = x.mFluidInputs.clone();
+ FluidStack[] aOutputFluids = x.mFluidOutputs.clone();
+
+ AutoMap<ItemStack> aInputItemsMap = new AutoMap<>();
+ AutoMap<ItemStack> aOutputItemsMap = new AutoMap<>();
+ AutoMap<FluidStack> aInputFluidsMap = new AutoMap<>();
+ AutoMap<FluidStack> aOutputFluidsMap = new AutoMap<>();
+
+ // Iterate Inputs, Convert valid items into fluids
+ for (ItemStack aInputStack : aInputItems) {
+ FluidStack aFoundFluid = getFluidFromItemStack(aInputStack);
+ if (aFoundFluid == null) {
+ for (ItemStack aBadStack : mItemsToIgnore) {
+ if (doesItemMatchIgnoringStackSize(aInputStack, aBadStack)) {
+ continue recipe; // Skip this recipe entirely if we find an item we don't like
+ }
+ }
+ if (!isEmptyCell(aInputStack)) {
+ aInputItemsMap.add(aInputStack);
+ }
+ } else {
+ aFoundFluid.amount = aFoundFluid.amount * aInputStack.stackSize;
+ aInputFluidsMap.add(aFoundFluid);
+ }
+ }
+ // Iterate Outputs, Convert valid items into fluids
+ for (ItemStack aOutputStack : aOutputItems) {
+ FluidStack aFoundFluid = getFluidFromItemStack(aOutputStack);
+ if (aFoundFluid == null) {
+ for (ItemStack aBadStack : mItemsToIgnore) {
+ if (doesItemMatchIgnoringStackSize(aOutputStack, aBadStack)) {
+ continue recipe; // Skip this recipe entirely if we find an item we don't like
+ }
+ }
+ if (!isEmptyCell(aOutputStack)) {
+ aOutputItemsMap.add(aOutputStack);
+ }
+ } else {
+ aFoundFluid.amount = aFoundFluid.amount * aOutputStack.stackSize;
+ aOutputFluidsMap.add(aFoundFluid);
+ }
+ }
+ // Add Input fluids second
+ aInputFluidsMap.addAll(Arrays.asList(aInputFluids));
+ // Add Output fluids second
+ aOutputFluidsMap.addAll(Arrays.asList(aOutputFluids));
+
+ // Make some new Arrays
+ ItemStack[] aNewItemInputs = new ItemStack[aInputItemsMap.size()];
+ ItemStack[] aNewItemOutputs = new ItemStack[aOutputItemsMap.size()];
+ FluidStack[] aNewFluidInputs = new FluidStack[aInputFluidsMap.size()];
+ FluidStack[] aNewFluidOutputs = new FluidStack[aOutputFluidsMap.size()];
+
+ // Add AutoMap contents to Arrays
+ for (int i = 0; i < aInputItemsMap.size(); i++) {
+ aNewItemInputs[i] = aInputItemsMap.get(i);
+ }
+ for (int i = 0; i < aOutputItemsMap.size(); i++) {
+ aNewItemOutputs[i] = aOutputItemsMap.get(i);
+ }
+ for (int i = 0; i < aInputFluidsMap.size(); i++) {
+ aNewFluidInputs[i] = aInputFluidsMap.get(i);
+ }
+ for (int i = 0; i < aOutputFluidsMap.size(); i++) {
+ aNewFluidOutputs[i] = aOutputFluidsMap.get(i);
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aNewItemInputs, aNewItemOutputs)) {
+ aInvalidRecipesToConvert++;
+ continue; // Skip this recipe entirely if we find an item we don't like
+ }
+ GT_Recipe aNewRecipe = new GT_Recipe(
+ false,
+ aNewItemInputs,
+ aNewItemOutputs,
+ x.mSpecialItems,
+ x.mChances,
+ aNewFluidInputs,
+ aNewFluidOutputs,
+ x.mDuration,
+ x.mEUt,
+ x.mSpecialValue);
+ aNewRecipe.owners = new ArrayList<>(x.owners);
+
+ // add all recipes to an intermediate array
+ deDuplicationInputArray.add(aNewRecipe);
+
+ aRecipesHandled++;
+ } else {
+ aInvalidRecipesToConvert++;
+ }
+ }
+ // cast arraylist of input to a regular array and pass it to a duplicate recipe remover.
+ List<GT_Recipe> deDuplicationOutputArray = GT_RecipeUtils
+ .removeDuplicates(deDuplicationInputArray, aOutputs.unlocalizedName);
+ // add each recipe from the above output to the intended recipe map
+ for (GT_Recipe recipe : deDuplicationOutputArray) {
+ aOutputs.add(recipe);
+ }
+ Logger.INFO("Generated Recipes for " + aOutputs.unlocalizedName);
+ Logger.INFO("Original Map contains " + aOriginalCount + " recipes.");
+ Logger.INFO("Output Map contains " + aRecipesHandled + " recipes.");
+ Logger.INFO("There were " + aInvalidRecipesToConvert + " invalid recipes.");
+ return aRecipesHandled;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java
new file mode 100644
index 0000000000..32d6a1066b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java
@@ -0,0 +1,750 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_Ore extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Ore(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_Ore(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private static Material mStone;
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+
+ if (mStone == null) {
+ mStone = MaterialUtils.generateMaterialFromGtENUM(Materials.Stone);
+ }
+
+ // if (material.getMaterialComposites().length > 1){
+ Logger.MATERIALS("[Recipe Generator Debug] [" + material.getLocalizedName() + "]");
+ int tVoltageMultiplier = MaterialUtils.getVoltageForTier(material.vTier);
+
+ final ItemStack dustStone = ItemUtils.getItemStackOfAmountFromOreDict("dustStone", 1);
+ Material bonusA = null; // Ni
+ Material bonusB = null; // Tin
+
+ if (material.getComposites()
+ .size() >= 1
+ && material.getComposites()
+ .get(0) != null) {
+ bonusA = material.getComposites()
+ .get(0)
+ .getStackMaterial();
+ } else {
+ bonusA = material;
+ }
+
+ boolean allFailed = false;
+
+ // Setup Bonuses
+ ArrayList<Material> aMatComp = new ArrayList<>();
+ for (Material j : MaterialUtils.getCompoundMaterialsRecursively(material)) {
+ aMatComp.add(j);
+ }
+
+ if (aMatComp.size() < 3) {
+ while (aMatComp.size() < 3) {
+ aMatComp.add(material);
+ }
+ }
+
+ AutoMap<Material> amJ = new AutoMap<>();
+ int aIndexCounter = 0;
+ for (Material g : aMatComp) {
+ if (g.hasSolidForm()) {
+ if (getDust(g) != null && getTinyDust(g) != null) {
+ amJ.put(g);
+ }
+ }
+ }
+
+ if (amJ.size() < 2) {
+ if (material.getComposites()
+ .size() >= 2
+ && material.getComposites()
+ .get(1) != null) {
+ bonusB = material.getComposites()
+ .get(1)
+ .getStackMaterial();
+ // If Secondary Output has no solid output, try the third (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 3
+ && material.getComposites()
+ .get(2) != null) {
+ bonusB = material.getComposites()
+ .get(2)
+ .getStackMaterial();
+ // If Third Output has no solid output, try the Fourth (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 4
+ && material.getComposites()
+ .get(3) != null) {
+ bonusB = material.getComposites()
+ .get(3)
+ .getStackMaterial();
+ // If Fourth Output has no solid output, try the Fifth (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 5
+ && material.getComposites()
+ .get(4) != null) {
+ bonusB = material.getComposites()
+ .get(4)
+ .getStackMaterial();
+ // If Fifth Output has no solid output, default out to Stone dust.
+ if (!bonusB.hasSolidForm()) {
+ allFailed = true;
+ bonusB = mStone;
+ }
+ }
+ }
+ }
+ } else {
+ allFailed = true;
+ }
+ } else {
+ bonusA = amJ.get(0);
+ bonusB = amJ.get(1);
+ }
+
+ // Default out if it's made of fluids or some stuff.
+ if (bonusA == null) {
+ bonusA = tVoltageMultiplier > 100 ? material : mStone;
+ }
+ // Default out if it's made of fluids or some stuff.
+ if (allFailed || bonusB == null) {
+ bonusB = tVoltageMultiplier > 100 ? material : mStone;
+ }
+
+ AutoMap<Pair<Integer, Material>> componentMap = new AutoMap<>();
+ for (MaterialStack r : material.getComposites()) {
+ if (r != null) {
+ componentMap.put(new Pair<>(r.getPartsPerOneHundred(), r.getStackMaterial()));
+ }
+ }
+
+ // Need two valid outputs
+ if (bonusA == null || bonusB == null || !bonusA.hasSolidForm() || !bonusB.hasSolidForm()) {
+ if (bonusA == null) {
+ bonusA = mStone;
+ }
+ if (bonusB == null) {
+ bonusB = mStone;
+ }
+ if (!bonusA.hasSolidForm()) {
+ bonusA = mStone;
+ }
+ if (!bonusB.hasSolidForm()) {
+ bonusB = mStone;
+ }
+ }
+
+ ItemStack matDust = getDust(material);
+ ItemStack matDustA = getDust(bonusA);
+ ItemStack matDustB = getDust(bonusB);
+
+ /**
+ * Package
+ */
+ // Allow ore dusts to be packaged
+ if (ItemUtils.checkForInvalidItems(material.getSmallDust(1))
+ && ItemUtils.checkForInvalidItems(material.getTinyDust(1))) {
+ RecipeGen_DustGeneration.generatePackagerRecipes(material);
+ }
+
+ /**
+ * Macerate
+ */
+ // Macerate ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate ore to Crushed ore'");
+ }
+ // Macerate raw ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getRawOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate raw ore to Crushed ore'");
+ }
+ // Macerate Crushed to Impure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushed(1),
+ new ItemStack[] { material.getDustImpure(1), matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Crushed ore to Impure Dust'");
+ }
+ // Macerate Washed to Purified Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedPurified(1),
+ new ItemStack[] { material.getDustPurified(1), matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Washed ore to Purified Dust'");
+ }
+ // Macerate Centrifuged to Pure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedCentrifuged(1),
+ new ItemStack[] { matDust, matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Centrifuged ore to Pure Dust'");
+ }
+
+ /**
+ * Wash
+ */
+ // Wash into Purified Crushed
+ /*
+ * if (GT_Values.RA.addOreWasherRecipe(material.getCrushed(1), material.getCrushedPurified(1),
+ * bonusA.getTinyDust(1), dustStone, FluidUtils.getWater(1000), 25*20, 16)){
+ * Logger.MATERIALS("[OreWasher] Added Recipe: 'Wash Crushed ore into Purified Crushed ore'"); }
+ */
+ // .08 compat method
+ if (GT_ModHandler.addOreWasherRecipe(
+ material.getCrushed(1),
+ new int[] { 10000, 1111, 10000 },
+ 1000,
+ material.getCrushedPurified(1),
+ matDustA,
+ dustStone)) {
+ Logger.MATERIALS("[OreWasher] Added Recipe: 'Wash Crushed ore into Purified Crushed ore'");
+ }
+
+ /**
+ * Thermal Centrifuge
+ */
+ /*
+ * //Crushed ore to Centrifuged Ore if (GT_Values.RA.addThermalCentrifugeRecipe(material.getCrushed(1),
+ * material.getCrushedCentrifuged(1), tinyDustB, dustStone, 25*20, 24)){
+ * Logger.MATERIALS("[ThermalCentrifuge] Added Recipe: 'Crushed ore to Centrifuged Ore'"); } //Washed ore to
+ * Centrifuged Ore if (GT_Values.RA.addThermalCentrifugeRecipe(material.getCrushedPurified(1),
+ * material.getCrushedCentrifuged(1), bonusA.getTinyDust(1), dustStone, 25*20, 24)){
+ * Logger.MATERIALS("[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore'"); }
+ */
+
+ Logger.MATERIALS("material.getCrushed(1): " + (material.getCrushed(1) != null));
+ Logger.MATERIALS("material.getCrushedPurified(1): " + (material.getCrushedPurified(1) != null));
+
+ Logger.MATERIALS("material.getTinyDust(1): " + (ItemUtils.getItemName(bonusA.getCrushed(1))));
+ Logger.MATERIALS("material.getTinyDust(1): " + (ItemUtils.getItemName(bonusB.getCrushed(1))));
+
+ try {
+ // .08 compat
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushed(1),
+ new int[] { 10000, 1111, 10000 },
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ matDustB,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Crushed ore to Centrifuged Ore' | Input: "
+ + material.getCrushed(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + matDustB.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+ } catch (Throwable t) {}
+ try {
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushedPurified(1),
+ new int[] { 10000, 1111, 10000 },
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ matDustA,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore' | Input: "
+ + material.getCrushedPurified(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + matDustA.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+ } catch (Throwable t) {}
+
+ /**
+ * Forge Hammer
+ */
+ if (GT_Values.RA.addForgeHammerRecipe(material.getCrushedCentrifuged(1), matDust, 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Centrifuged to Pure Dust'");
+ }
+ if (GT_Values.RA.addForgeHammerRecipe(
+ material.getCrushedPurified(1),
+ material.getDustPurified(1),
+ 10,
+ tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Purified to Purified Dust'");
+ }
+ if (GT_Values.RA.addForgeHammerRecipe(material.getOre(1), material.getCrushed(1), 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Ore to Crushed'");
+ }
+
+ /**
+ * Centrifuge
+ */
+ // Purified Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustPurified(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ matDustA,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 1111 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Purified Dust to Clean Dust");
+ }
+
+ // Impure Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustImpure(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ matDustB,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 1111 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Inpure Dust to Clean Dust");
+ }
+
+ /**
+ * Electrolyzer
+ */
+ if (!disableOptional) {
+ // Process Dust
+ if (componentMap.size() > 0 && componentMap.size() <= 6) {
+
+ ItemStack mInternalOutputs[] = new ItemStack[6];
+ int mChances[] = new int[6];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Electrolyzer] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Electrolyzer] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Electrolyzer] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Electrolyzer] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Electrolyzer] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (addElectrolyzerRecipe(
+ mainDust,
+ emptyCell, // input 2
+ null, // Input fluid 1
+ null, // Output fluid 1
+ mInternalOutputs[0],
+ mInternalOutputs[1],
+ mInternalOutputs[2],
+ mInternalOutputs[3],
+ mInternalOutputs[4],
+ mInternalOutputs[5],
+ mChances,
+ (int) Math.max(material.getMass() * 3L * 1, 1),
+ tVoltageMultiplier)) {
+ Logger
+ .MATERIALS("[Electrolyzer] Generated Electrolyzer recipe for " + matDust.getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Failed to generate Electrolyzer recipe for " + matDust.getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else if (componentMap.size() > 6 && componentMap.size() <= 9) {
+ Logger.MATERIALS(
+ "[Issue][Electrolyzer] " + material.getLocalizedName()
+ + " is composed of over 6 materials, so an electrolyzer recipe for processing cannot be generated. Trying to create one for the Dehydrator instead.");
+
+ ItemStack mInternalOutputs[] = new ItemStack[9];
+ int mChances[] = new int[9];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID
+ && f.getValue()
+ .getState() != MaterialState.ORE) {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Dehydrator] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Dehydrator] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Dehydrator] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Dehydrator] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { mainDust, emptyCell },
+ null,
+ null,
+ mInternalOutputs,
+ mChances,
+ (int) Math.max(material.getMass() * 4L * 1, 1),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS("[Dehydrator] Generated Dehydrator recipe for " + matDust.getDisplayName());
+ Logger.MATERIALS(
+ "Inputs: " + mainDust.getDisplayName()
+ + " x"
+ + mainDust.stackSize
+ + ", "
+ + (emptyCell == null ? "No Cells"
+ : "" + emptyCell.getDisplayName() + " x" + emptyCell.stackSize));
+ Logger.MATERIALS("Outputs " + ItemUtils.getArrayStackNames(mInternalOutputs));
+ Logger.MATERIALS("Time: " + ((int) Math.max(material.getMass() * 4L * 1, 1)));
+ Logger.MATERIALS("EU: " + tVoltageMultiplier);
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Failed to generate Dehydrator recipe for " + matDust.getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Shaped Crafting
+ */
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedPurified(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustPurified(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushed(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustImpure(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedCentrifuged(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ matDust);
+
+ final ItemStack normalDust = matDust;
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, material.getTinyDust(9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(smallDust, smallDust, null, smallDust, smallDust, null, null, null, null, normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, material.getSmallDust(4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // }
+ }
+
+ public static boolean addElectrolyzerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput1 == null) && (aFluidOutput == null))) {
+ Logger.MATERIALS("[Electrolyzer] Either both inputs or outputs are null.");
+ return false;
+ }
+ if ((aInput1 != null) && (aDuration <= 0)) {
+ Logger.MATERIALS("[Electrolyzer] Fail 1.");
+ return false;
+ }
+ if ((aFluidInput != null) && (aDuration <= 0)) {
+ Logger.MATERIALS("[Electrolyzer] Fail 2.");
+ return false;
+ }
+ GT_Values.RA.addElectrolyzerRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ aChances,
+ aDuration,
+ aEUt);
+ Logger.MATERIALS("[Electrolyzer] Recipe added.");
+ return true;
+ }
+
+ public static ItemStack getTinyDust(Material m) {
+ ItemStack x = m.getTinyDust(1);
+ if (x == null) {
+ x = mStone.getDust(1);
+ }
+ return x;
+ }
+
+ public static ItemStack getDust(Material m) {
+ ItemStack x = m.getDust(1);
+ if (x == null) {
+ x = mStone.getDust(1);
+ }
+ return x;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java
new file mode 100644
index 0000000000..01d6f9bb02
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Plasma extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Plasma(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ if (material.getPlasma() != null) {
+ // Cool Plasma
+ ItemStack aPlasmaCell = material.getPlasmaCell(1);
+ ItemStack aCell = material.getCell(1);
+ ItemStack aContainerItem = GT_Utility.getFluidForFilledItem(aPlasmaCell, true) == null
+ ? GT_Utility.getContainerItem(aPlasmaCell, true)
+ : CI.emptyCells(1);
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aPlasmaCell, aContainerItem })) {
+ switch (material.getUnlocalizedName()) {
+ case "Runite":
+ GT_Values.RA.addFuel(GT_Utility.copyAmount(1L, aPlasmaCell), aContainerItem, 350_000, 4);
+ case "CelestialTungsten":
+ GT_Values.RA.addFuel(GT_Utility.copyAmount(1L, aPlasmaCell), aContainerItem, 720_000, 4);
+ default:
+ GT_Values.RA.addFuel(
+ GT_Utility.copyAmount(1L, aPlasmaCell),
+ aContainerItem,
+ (int) Math.max(1024L, 1024L * material.getMass()),
+ 4);
+
+ }
+ }
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aCell, aPlasmaCell })) {
+ GT_Values.RA.addVacuumFreezerRecipe(aPlasmaCell, aCell, (int) Math.max(material.getMass() * 2L, 1L));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java
new file mode 100644
index 0000000000..7eebc16af7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Plates extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Plates(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ final int tVoltageMultiplier = material.getMeltingPointK() >= 2800 ? 60 : 15;
+ final ItemStack ingotStackOne = material.getIngot(1);
+ final ItemStack ingotStackTwo = material.getIngot(2);
+ final ItemStack ingotStackThree = material.getIngot(3);
+ final ItemStack ingotStackNine = material.getIngot(9);
+ final ItemStack shape_Mold = ItemList.Shape_Mold_Plate.get(0);
+ final ItemStack plate_Single = material.getPlate(1);
+ final ItemStack plate_SingleTwo = material.getPlate(2);
+ final ItemStack plate_SingleNine = material.getPlate(9);
+ final ItemStack plate_Double = material.getPlateDouble(1);
+ final ItemStack plate_Dense = material.getPlateDense(1);
+ final ItemStack foil_SingleFour = material.getFoil(4);
+ final ItemStack block = material.getBlock(1);
+
+ Logger.WARNING("Generating Plate recipes for " + material.getLocalizedName());
+
+ // Forge Hammer
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (addForgeHammerRecipe(
+ ingotStackThree,
+ plate_SingleTwo,
+ (int) Math.max(material.getMass(), 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Forge Hammer Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Forge Hammer Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Bender
+ if (ItemUtils.checkForInvalidItems(ingotStackOne) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (addBenderRecipe(
+ ingotStackOne,
+ plate_Single,
+ (int) Math.max(material.getMass() * 1L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ if (ItemUtils.checkForInvalidItems(ingotStackOne) && ItemUtils.checkForInvalidItems(foil_SingleFour))
+ if (addBenderRecipe(
+ ingotStackOne,
+ CI.getNumberedCircuit(10),
+ foil_SingleFour,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Alloy Smelter
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (GT_Values.RA.addAlloySmelterRecipe(
+ ingotStackTwo,
+ shape_Mold,
+ plate_Single,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Alloy Smelter Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Alloy Smelter Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Cutting Machine
+ if (ItemUtils.checkForInvalidItems(block) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (GT_Values.RA.addCutterRecipe(
+ block,
+ plate_SingleNine,
+ null,
+ (int) Math.max(material.getMass() * 10L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cutting Machine Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cutting Machine Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Making Double Plates
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Double))
+ if (addBenderRecipe(
+ ingotStackTwo,
+ plate_Double,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(plate_SingleTwo) && ItemUtils.checkForInvalidItems(plate_Double))
+ if (addBenderRecipe(
+ plate_SingleTwo,
+ plate_Double,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bender
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1)) && ItemUtils.checkForInvalidItems(material.getFoil(1)))
+ if (addBenderRecipe(
+ material.getPlate(1),
+ material.getFoil(4),
+ (int) Math.max(material.getMass(), 1L),
+ material.vVoltageMultiplier)) {
+ GregTech_API.registerCover(
+ material.getFoil(1),
+ new GT_RenderedTexture(material.getTextureSet().mTextures[70], material.getRGBA(), false),
+ null);
+ Logger.WARNING("Bender Foil Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Foil Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Making Dense Plates
+ if (ItemUtils.checkForInvalidItems(ingotStackNine) && ItemUtils.checkForInvalidItems(plate_Dense))
+ if (addBenderRecipe(
+ ingotStackNine,
+ plate_Dense,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(plate_SingleNine) && ItemUtils.checkForInvalidItems(plate_Dense))
+ if (addBenderRecipe(
+ plate_SingleNine,
+ plate_Dense,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ public static boolean addBenderRecipe(final ItemStack aInput1, final ItemStack aOutput1, int aDuration,
+ final int aEUt) {
+ return GT_Values.RA.addBenderRecipe(aInput1, aOutput1, aDuration, aEUt);
+ }
+
+ public static boolean addBenderRecipe(final ItemStack aInput1, final ItemStack aCircuit, final ItemStack aOutput1,
+ int aDuration, final int aEUt) {
+ return GT_Values.RA.addBenderRecipe(aInput1, aCircuit, aOutput1, aDuration, aEUt);
+ }
+
+ public static boolean addExtruderRecipe(final ItemStack aInput, final ItemStack aShape, final ItemStack aOutput,
+ int aDuration, final int aEUt) {
+ if ((aInput == null) || (aShape == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.extruderRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aShape },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ public static boolean addForgeHammerRecipe(final ItemStack aInput1, final ItemStack aOutput1, final int aDuration,
+ final int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.hammerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java
new file mode 100644
index 0000000000..044ce58c62
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java
@@ -0,0 +1,400 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.M;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class RecipeGen_Recycling implements Runnable {
+
+ public static AutoMap<Runnable> mQueuedRecyclingGenerators = new AutoMap<>();
+
+ public static void executeGenerators() {
+ if (mQueuedRecyclingGenerators.size() > 0) {
+ for (Runnable R : mQueuedRecyclingGenerators.values()) {
+ R.run();
+ }
+ }
+ }
+
+ final Material toGenerate;
+ public static Map<String, ItemStack> mNameMap;
+
+ public RecipeGen_Recycling(final Material M) {
+ this.toGenerate = M;
+ if (mNameMap == null) {
+ mNameMap = this.getNameMap();
+ }
+ mQueuedRecyclingGenerators.put(this);
+ }
+
+ @Override
+ public void run() {
+ if (mNameMap != null) {
+ generateRecipes(this.toGenerate);
+ }
+ }
+
+ public static void generateRecipes(final Material material) {
+
+ if (material != null) Logger.WARNING("Generating Recycling recipes for " + material.getLocalizedName());
+
+ final OrePrefixes[] mValidPrefixesAsString = { OrePrefixes.ingot, OrePrefixes.ingotHot, OrePrefixes.nugget,
+ OrePrefixes.plate, OrePrefixes.plateDense, OrePrefixes.plateDouble, OrePrefixes.plateTriple,
+ OrePrefixes.plateQuadruple, OrePrefixes.plateQuintuple, OrePrefixes.stick, OrePrefixes.stickLong,
+ OrePrefixes.bolt, OrePrefixes.screw, OrePrefixes.ring, OrePrefixes.rotor, OrePrefixes.gearGt,
+ OrePrefixes.gearGtSmall, OrePrefixes.gear, OrePrefixes.block, OrePrefixes.cableGt01, OrePrefixes.cableGt02,
+ OrePrefixes.cableGt04, OrePrefixes.cableGt08, OrePrefixes.cableGt12, OrePrefixes.wireFine,
+ OrePrefixes.wireGt01, OrePrefixes.wireGt02, OrePrefixes.wireGt04, OrePrefixes.wireGt08,
+ OrePrefixes.wireGt12, OrePrefixes.wireGt16, OrePrefixes.foil, OrePrefixes.frameGt, OrePrefixes.pipeHuge,
+ OrePrefixes.pipeLarge, OrePrefixes.pipeMedium, OrePrefixes.pipeSmall, OrePrefixes.pipeTiny, };
+
+ int mSlotIndex = 0;
+ Pair<OrePrefixes, ItemStack>[] mValidPairs = new Pair[mValidPrefixesAsString.length];
+
+ for (int r = 0; r < mValidPairs.length; r++) {
+ ItemStack temp = getItemStackOfAmountFromOreDictNoBroken(
+ mValidPrefixesAsString[r].name() + Utils.sanitizeString(material.getLocalizedName()),
+ 1);
+ if (temp != null) {
+ mValidPairs[mSlotIndex++] = new Pair<>(mValidPrefixesAsString[r], temp.copy());
+ }
+ }
+
+ if (mValidPairs.length > 0) {
+ int validCounter = 0;
+ Pair<OrePrefixes, ItemStack>[] temp = mValidPairs;
+ for (Pair<OrePrefixes, ItemStack> temp2 : mValidPairs) {
+ if (temp2 != null) {
+ Logger.WARNING(
+ "Valid: " + temp2.getValue()
+ .getDisplayName());
+ validCounter++;
+ }
+ }
+ Pair<OrePrefixes, ItemStack> temp3[] = new Pair[validCounter];
+ int temp4 = 0;
+ for (Pair<OrePrefixes, ItemStack> r : mValidPairs) {
+ if (r != null) {
+ temp3[temp4++] = r;
+ }
+ }
+ if (temp3.length > 0) {
+ mValidPairs = temp3.clone();
+ }
+ }
+
+ if (mValidPrefixesAsString.length >= 1) {
+ for (final Pair<OrePrefixes, ItemStack> validPrefix : mValidPairs) {
+ try {
+
+ if (material == null || validPrefix == null
+ || (material.getState() != MaterialState.SOLID && material.getState() != MaterialState.LIQUID)
+ || validPrefix.getKey() == OrePrefixes.ingotHot) {
+ continue;
+ }
+
+ final ItemStack tempStack = validPrefix.getValue();
+ final ItemStack mDust = getDust(material, validPrefix.getKey());
+ final Pair<OrePrefixes, ItemStack> mData = getDustData(material, validPrefix.getKey());
+ int mFluidAmount = (int) GT_Utility
+ .translateMaterialToFluidAmount(validPrefix.getKey().mMaterialAmount, true);
+
+ // Maceration
+ if (ItemUtils.checkForInvalidItems(tempStack)) {
+ // mValidItems[mSlotIndex++] = tempStack;
+ if ((mDust != null) && GT_ModHandler.addPulverisationRecipe(tempStack, mDust)) {
+ Logger.WARNING(
+ "Recycle Recipe: " + material.getLocalizedName()
+ + " - Success - Recycle "
+ + tempStack.getDisplayName()
+ + " and obtain "
+ + mDust.getDisplayName());
+ } else {
+ Logger.WARNING("Recycle Recipe: " + material.getLocalizedName() + " - Failed");
+ if (mDust == null) {
+ Logger.WARNING("Invalid Dust output.");
+ }
+ }
+ }
+
+ // Arc Furnace
+ if (ItemUtils.checkForInvalidItems(tempStack)) {}
+
+ // Fluid Extractor
+ if (ItemUtils.checkForInvalidItems(tempStack)) {
+ // mValidItems[mSlotIndex++] = tempStack;
+
+ int aFluidAmount = (int) ((L * validPrefix.getKey().mMaterialAmount)
+ / (M * tempStack.stackSize));
+ int aDuration = (int) Math.max(1, (24 * validPrefix.getKey().mMaterialAmount) / M);
+ boolean aGenFluidExtraction = CORE.RA.addFluidExtractionRecipe(
+ tempStack,
+ material.getFluidStack(aFluidAmount),
+ aDuration,
+ material.vVoltageMultiplier);
+ if (aGenFluidExtraction /*
+ * (mDust != null) && CORE.RA.addFluidExtractionRecipe(tempStack,
+ * material.getFluidStack(mFluidAmount), 30,
+ * material.vVoltageMultiplier)
+ */) {
+ Logger.WARNING(
+ "Fluid Recycle Recipe: " + material.getLocalizedName()
+ + " - Success - Recycle "
+ + tempStack.getDisplayName()
+ + " and obtain "
+ + aFluidAmount
+ + "mb of "
+ + material.getFluidStack(1)
+ .getLocalizedName()
+ + ". Time: "
+ + aDuration
+ + ", Voltage: "
+ + material.vVoltageMultiplier);
+ } else {
+ Logger.WARNING("Fluid Recycle Recipe: " + material.getLocalizedName() + " - Failed");
+ if (mDust == null) {
+ Logger.WARNING("Invalid Dust output.");
+ }
+ }
+ }
+
+ } catch (final Throwable t) {
+ t.printStackTrace();
+ // Utils.LOG_WARNING("Returning Null. Throwable Info:
+ // "+t.getMessage());
+ // Utils.LOG_WARNING("Throwable Info: "+t.toString());
+ // Utils.LOG_WARNING("Throwable Info:
+ // "+t.getCause().toString());
+ }
+ }
+ }
+ }
+
+ public static Pair<OrePrefixes, ItemStack> getDustData(final Material aMaterial, final OrePrefixes aPrefix) {
+ return getDustData(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static Pair<OrePrefixes, ItemStack> getDustData(final Material aMaterial, final long aMaterialAmount) {
+ ItemStack mDust = null;
+ OrePrefixes mPrefix = null;
+
+ if (aMaterial == null || aMaterialAmount <= 0) {
+ return null;
+ }
+ if ((((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 16)))) {
+ mDust = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M);
+ mPrefix = OrePrefixes.dust;
+ }
+ if ((mDust == null) && ((((aMaterialAmount * 4) % M) == 0) || (aMaterialAmount >= (M * 8)))) {
+ mDust = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
+ mPrefix = OrePrefixes.dustSmall;
+ }
+ if ((mDust == null) && (((aMaterialAmount * 9) >= M))) {
+ mDust = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
+ mPrefix = OrePrefixes.dustTiny;
+ }
+
+ if (mPrefix != null && mDust != null) {
+ Logger.WARNING("Built valid dust pair.");
+ return new Pair<>(mPrefix, mDust);
+ } else {
+ Logger.WARNING("mPrefix: " + (mPrefix != null));
+ Logger.WARNING("mDust: " + (mDust != null));
+ }
+ Logger.WARNING("Failed to build valid dust pair.");
+ return null;
+ }
+
+ public static ItemStack getDust(final Material aMaterial, final OrePrefixes aPrefix) {
+ return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static ItemStack getDust(final Material aMaterial, final long aMaterialAmount) {
+ if (aMaterialAmount <= 0) {
+ return null;
+ }
+ ItemStack rStack = null;
+ if ((((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 16)))) {
+ Logger.WARNING("Trying to get a Dust");
+ rStack = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M);
+ }
+ if ((rStack == null) && ((((aMaterialAmount * 4) % M) == 0) || (aMaterialAmount >= (M * 8)))) {
+ Logger.WARNING("Trying to get a Small Dust");
+ rStack = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
+ }
+ if ((rStack == null) && (((aMaterialAmount * 9) >= M))) {
+ Logger.WARNING("Trying to get a Tiny Dust");
+ rStack = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
+ }
+ return rStack;
+ }
+
+ public static ItemStack get(final Object aName, final long aAmount) {
+ return get(aName, null, aAmount, true, true);
+ }
+
+ public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount) {
+ return get(aName, aReplacement, aAmount, true, true);
+ }
+
+ public static ItemStack get(final OrePrefixes aPrefix, final Material aMaterial, final long aAmount) {
+ return get(aPrefix, aMaterial, null, aAmount);
+ }
+
+ public static ItemStack get(final OrePrefixes aPrefix, final Material aMaterial, final ItemStack aReplacement,
+ final long aAmount) {
+ return get(
+ aPrefix.name() + Utils.sanitizeString(aMaterial.getLocalizedName()),
+ aReplacement,
+ aAmount,
+ false,
+ true);
+ }
+
+ public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount,
+ final boolean aMentionPossibleTypos, final boolean aNoInvalidAmounts) {
+ if (aNoInvalidAmounts && (aAmount < 1L)) {
+ Logger.WARNING("Returning Null. Method: " + ReflectionUtils.getMethodName(0));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(4));
+ return null;
+ }
+ if (!mNameMap.containsKey(aName.toString()) && aMentionPossibleTypos) {
+ Logger.WARNING("Unknown Key for Unification, Typo? " + aName);
+ }
+ return GT_Utility.copyAmount(
+ aAmount,
+ new Object[] { mNameMap.get(aName.toString()), getFirstOre(aName, aAmount), aReplacement });
+ }
+
+ public static ItemStack getFirstOre(final Object aName, final long aAmount) {
+ if (GT_Utility.isStringInvalid(aName)) {
+ Logger.WARNING("Returning Null. Method: " + ReflectionUtils.getMethodName(0));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(4));
+ return null;
+ }
+ final ItemStack tStack = mNameMap.get(aName.toString());
+ if (GT_Utility.isStackValid(tStack)) {
+ Logger.WARNING("Found valid stack.");
+ return GT_Utility.copyAmount(aAmount, new Object[] { tStack });
+ }
+ return GT_Utility.copyAmount(aAmount, getOres(aName).toArray());
+ }
+
+ public static ArrayList<ItemStack> getOres(final Object aOreName) {
+ final String aName = (aOreName == null) ? "" : aOreName.toString();
+ final ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStringValid(aName)) {
+ Logger.WARNING("Making a list of all OreDict entries for " + aOreName + ".");
+ if (rList.addAll(OreDictionary.getOres(aName))) {
+ Logger.WARNING("Added " + rList.size() + " elements to list.");
+ } else {
+ Logger.WARNING("Failed to Add Collection from oreDictionary, forcing an entry.");
+ rList.add(ItemUtils.getItemStackOfAmountFromOreDict((String) aOreName, 1));
+ }
+ }
+ return rList;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Map<String, ItemStack> getNameMap() {
+ Map<String, ItemStack> tempMap;
+ try {
+ tempMap = (Map<String, ItemStack>) FieldUtils
+ .readStaticField(GT_OreDictUnificator.class, "sName2StackMap", true);
+ if (tempMap != null) {
+ Logger.WARNING("Found 'sName2StackMap' in GT_OreDictUnificator.class.");
+ return tempMap;
+ }
+ } catch (final IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ Logger.WARNING("Invalid map stored in GT_OreDictUnificator.class, unable to find sName2StackMap field.");
+ return null;
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDictNoBroken(String oredictName, final int amount) {
+
+ try {
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ oredictName = Utils.sanitizeString(oredictName, new char[] { '-', '_' });
+ } else {
+ oredictName = Utils.sanitizeString(oredictName);
+ }
+
+ // Adds a check to grab dusts using GT methodology if possible.
+ ItemStack returnValue = null;
+ if (oredictName.toLowerCase()
+ .contains("dust")) {
+ final String MaterialName = oredictName.toLowerCase()
+ .replace("dust", "");
+ final Materials m = Materials.get(MaterialName);
+ if (m != null && m != Materials._NULL) {
+ returnValue = ItemUtils.getGregtechDust(m, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue;
+ }
+ }
+ }
+ if (returnValue == null) {
+ returnValue = getItemStackOfAmountFromOreDict(oredictName, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+ return null;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDict(String oredictName, final int amount) {
+ String mTemp = oredictName;
+
+ // Banned Materials and replacements for GT5.8 compat.
+
+ if (oredictName.toLowerCase()
+ .contains("ingotclay")) {
+ return ItemUtils.getSimpleStack(Items.clay_ball, amount);
+ }
+
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(mTemp);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack returnValue = oreDictList.get(0)
+ .copy();
+ returnValue.stackSize = amount;
+ return returnValue;
+ }
+ return null;
+ // return getItemStackOfAmountFromOreDictNoBroken(mTemp, amount);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java
new file mode 100644
index 0000000000..3ef1740189
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_ShapedCrafting extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_ShapedCrafting(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ Logger.WARNING("Generating Shaped Crafting recipes for " + material.getLocalizedName()); // TODO
+
+ // Single Plate Shaped/Shapeless
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ if (material.getPlate(1) != null && material.getIngot(1) != null) GT_ModHandler.addCraftingRecipe(
+ material.getPlate(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "h", "B", "I", Character.valueOf('I'), material.getIngot(1), Character.valueOf('B'),
+ material.getIngot(1) });
+
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ GT_ModHandler.addShapelessCraftingRecipe(
+ material.getPlate(1),
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, material.getIngot(1),
+ material.getIngot(1) });
+
+ // Double Plate Shaped/Shapeless
+ if (ItemUtils.checkForInvalidItems(material.getPlateDouble(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ GT_ModHandler.addCraftingRecipe(
+ material.getPlateDouble(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "I", "B", "h", Character.valueOf('I'), material.getPlate(1), Character.valueOf('B'),
+ material.getPlate(1) });
+
+ if (ItemUtils.checkForInvalidItems(material.getPlateDouble(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ GT_ModHandler.addShapelessCraftingRecipe(
+ material.getPlateDouble(1),
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, material.getPlate(1),
+ material.getPlate(1) });
+
+ // Ring Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getRing(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRing(1),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "h ", "fR", 'R', material.getRod(1) })) {
+ Logger.WARNING("GT:NH Ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("GT:NH Ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Framebox Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getFrameBox(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFrameBox(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RRR", "RwR", "RRR", 'R', material.getRod(1) })) {
+ Logger.WARNING("Framebox Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Framebox Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Bolts
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getBolt(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getBolt(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "s ", " R", 'R', material.getRod(1) })) {
+ Logger.WARNING("Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Fine Wire
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getFoil(1))
+ && ItemUtils.checkForInvalidItems(material.getFineWire(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFineWire(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "Fx", 'F', material.getFoil(1) })) {
+ Logger.WARNING("Fine Wire Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Fine Wire Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Foil
+ if (ItemUtils.checkForInvalidItems(material.getFoil(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFoil(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "hP", 'P', material.getPlate(1) })) {
+ Logger.WARNING("Foil Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Foil Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Ingot to Rod
+ if (ItemUtils.checkForInvalidItems(material.getRod(1)) && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRod(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "f ", " I", 'I', material.getIngot(1) })) {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Shaped Recipe - Long Rod to two smalls
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))
+ && ItemUtils.checkForInvalidItems(material.getLongRod(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRod(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "s", "L", 'L', material.getLongRod(1) })) {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Two small to long rod
+ if (ItemUtils.checkForInvalidItems(material.getLongRod(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getLongRod(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RhR", 'R', material.getRod(1) })) {
+ Logger.WARNING("Long Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Long Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rotor Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getRotor(1))
+ && ItemUtils.checkForInvalidItems(material.getRing(1))
+ && !material.isRadioactive
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getScrew(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRotor(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PhP", "SRf", "PdP", 'P', material.getPlate(1), 'S', material.getScrew(1), 'R',
+ material.getRing(1), })) {
+ Logger.WARNING("Rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Gear Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getGear(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getGear(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RPR", "PwP", "RPR", 'P', material.getPlate(1), 'R', material.getRod(1), })) {
+ Logger.WARNING("Gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Screws
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getScrew(1))
+ && ItemUtils.checkForInvalidItems(material.getBolt(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getScrew(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "fB", "B ", 'B', material.getBolt(1), })) {
+ Logger.WARNING("Screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java
new file mode 100644
index 0000000000..aab24db6d3
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java
@@ -0,0 +1,13 @@
+package gtPlusPlus.xmod.gregtech.loaders.misc;
+
+import gregtech.api.util.GT_ProcessingArray_Manager;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+
+public class AddCustomMachineToPA {
+
+ public static void register() {
+
+ // Simple Washers
+ GT_ProcessingArray_Manager.addRecipeMapToPA("simplewasher.01", GTPPRecipeMaps.simpleWasherRecipes);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java
new file mode 100644
index 0000000000..69d79cdc4b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java
@@ -0,0 +1,192 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.WeightedCollection;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeLoader_AlgaeFarm {
+
+ private static final HashMap<Integer, AutoMap<GT_Recipe>> mRecipeCache = new HashMap<>();
+ private static final HashMap<Integer, AutoMap<GT_Recipe>> mRecipeCompostCache = new HashMap<>();
+
+ public static void generateRecipes() {
+ for (int i = 0; i < 10; i++) {
+ getTieredRecipeFromCache(i, false);
+ }
+ for (int i = 0; i < 10; i++) {
+ getTieredRecipeFromCache(i, true);
+ }
+ }
+
+ public static GT_Recipe getTieredRecipeFromCache(int aTier, boolean aCompost) {
+ HashMap<Integer, AutoMap<GT_Recipe>> aMap = aCompost ? mRecipeCompostCache : mRecipeCache;
+ String aComp = aCompost ? "(Compost)" : "";
+
+ AutoMap<GT_Recipe> aTemp = aMap.get(aTier);
+ if (aTemp == null || aTemp.isEmpty()) {
+ aTemp = new AutoMap<>();
+ aMap.put(aTier, aTemp);
+ Logger.INFO("Tier " + aTier + aComp + " had no recipes, initialising new map.");
+ }
+ if (aTemp.size() < 500) {
+ Logger
+ .INFO("Tier " + aTier + aComp + " has less than 500 recipes, generating " + (500 - aTemp.size()) + ".");
+ for (int i = aTemp.size(); i < 500; i++) {
+ aTemp.put(generateBaseRecipe(aCompost, aTier));
+ }
+ }
+ int aIndex = MathUtils.randInt(0, aTemp.isEmpty() ? 1 : aTemp.size());
+ Logger.INFO("Using recipe with index of " + aIndex + ". " + aComp);
+ return aTemp.get(aIndex);
+ }
+
+ public static int compostForTier(int aTier) {
+ return aTier > 1 ? (int) Math.min(64, Math.pow(2, aTier - 1)) : 1;
+ }
+
+ private static GT_Recipe generateBaseRecipe(boolean aUsingCompost, int aTier) {
+
+ // Type Safety
+ if (aTier < 0) {
+ return null;
+ }
+
+ WeightedCollection<Float> aOutputTimeMulti = new WeightedCollection<>();
+ for (int i = 100; i > 0; i--) {
+ float aValue = 0;
+ if (i < 10) {
+ aValue = 3f;
+ } else if (i < 20) {
+ aValue = 2f;
+ } else {
+ aValue = 1f;
+ }
+ aOutputTimeMulti.put(i, aValue);
+ }
+
+ final int[] aDurations = new int[] { 2000, 1800, 1600, 1400, 1200, 1000, 512, 256, 128, 64, 32, 16, 8, 4, 2,
+ 1 };
+
+ ItemStack[] aInputs = new ItemStack[] {};
+
+ if (aUsingCompost) {
+ // Make it use 4 compost per tier if we have some available
+ // Compost consumption maxes out at 1 stack per cycle
+ ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, compostForTier(aTier));
+ aInputs = new ItemStack[] { aCompost };
+ // Boost Tier by one if using compost so it gets a speed boost
+ aTier++;
+ }
+
+ // We set these elsewhere
+ ItemStack[] aOutputs = getOutputsForTier(aTier);
+
+ GT_Recipe tRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ (Object) null,
+ new int[] {},
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { GT_Values.NF },
+ (int) (aDurations[aTier] * aOutputTimeMulti.get() / 2), // Time
+ 0,
+ 0);
+
+ tRecipe.mSpecialValue = tRecipe.hashCode();
+
+ return tRecipe;
+ }
+
+ private static ItemStack[] getOutputsForTier(int aTier) {
+
+ // Create an Automap to dump contents into
+ AutoMap<ItemStack> aOutputMap = new AutoMap<>();
+
+ // Add loot relevant to tier and also add any from lower tiers.
+
+ if (aTier >= 0) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ }
+ }
+
+ if (aTier >= 1) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 2) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 3));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 8));
+ }
+ }
+ if (aTier >= 3) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 1));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 4) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 3));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 5) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 4));
+ }
+ }
+ // Tier 6 is Highest for outputs
+ if (aTier >= 6) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 8));
+ }
+ }
+
+ // Iterate a special loop at higher tiers to provide more Red/Gold Algae.
+ for (int i2 = 0; i2 < 20; i2++) {
+ if (aTier >= (6 + i2)) {
+ int aMulti = i2 + 1;
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, aMulti * 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, aMulti * 3));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, aMulti * 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, aMulti));
+ } else {
+ i2 = 20;
+ }
+ }
+
+ // Map the AutoMap contents to an Itemstack Array.
+ ItemStack[] aOutputs = new ItemStack[aOutputMap.size()];
+ for (int i = 0; i < aOutputMap.size(); i++) {
+ aOutputs[i] = aOutputMap.get(i);
+ }
+
+ // Return filled ItemStack Array.
+ return aOutputs;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java
new file mode 100644
index 0000000000..dfa6d9dea6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java
@@ -0,0 +1,661 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.EternalSingularity;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+import com.github.technus.tectech.thing.block.QuantumGlassBlock;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.CombType;
+import gregtech.loaders.misc.GT_Bees;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RecipeLoader_ChemicalSkips {
+
+ public static void generate() {
+ createRecipes();
+ }
+
+ private static void createRecipes() {
+ quantumTransformerRecipes();
+ fusionReactorRecipes();
+ catalystRecipes();
+ tieredCasingRecipes();
+ }
+
+ // All the recipes that the QFT can do. Each recipe has a machine tier.
+ // -> Tier 1 is UEV (UEV circuits and 1 Eternal Singularity);
+ // -> Tier 2 needs new item from QFT, plus stacks of Infinity;
+ // -> Tier 3 needs new item from QFT, plus stacks of Transcendent Metal;
+ // -> Tier 4 needs new item from QFT, plus stacks of Spacetime;
+ // (Until they are created, the new items are represented by
+ // HSS-G for Tier 2, HSS-S for Tier 3 and HSS-E for Tier 4)
+
+ private static void quantumTransformerRecipes() {
+ ItemStack stemcells = GT_Utility.copyAmountUnsafe(64 * 32, ItemList.Circuit_Chip_Stemcell.get(1));
+ ItemStack biocells = GT_Utility.copyAmountUnsafe(64 * 32, ItemList.Circuit_Chip_Biocell.get(1));
+ // Platline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { WerkstoffLoader.PTMetallicPowder.get(OrePrefixes.dust, 32),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Platinum.getDust(64), Materials.Palladium.getDust(64),
+ Materials.Iridium.getDust(64), Materials.Osmium.getDust(64),
+ WerkstoffLoader.Rhodium.get(OrePrefixes.dust, 64),
+ WerkstoffLoader.Ruthenium.get(OrePrefixes.dust, 64) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Early Plastics
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mPlasticPolymerCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16),
+ Materials.Chlorine.getGas(1000 * 16), Materials.Fluorine.getGas(1000 * 16) },
+ new FluidStack[] { Materials.Plastic.getMolten(144 * 256), Materials.PolyvinylChloride.getMolten(144 * 128),
+ Materials.Polystyrene.getMolten(144 * 64), Materials.Polytetrafluoroethylene.getMolten(144 * 128),
+ Materials.Epoxid.getMolten(144 * 64), Materials.Polybenzimidazole.getMolten(144 * 64) },
+ null,
+ new int[] { 2000, 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_ZPM,
+ 1);
+
+ // Early Rubbers/Cable Materials
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mRubberPolymerCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16),
+ Materials.Chlorine.getGas(1000 * 16) },
+ new FluidStack[] { Materials.Silicone.getMolten(144 * 64),
+ Materials.StyreneButadieneRubber.getMolten(144 * 64),
+ Materials.PolyphenyleneSulfide.getMolten(144 * 128), Materials.Rubber.getMolten(144 * 256) },
+ null,
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_ZPM,
+ 1);
+
+ // Glues and Solders
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(32), Materials.Bismuth.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mAdhesionPromoterCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(10000), Materials.Hydrogen.getGas(10000) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(1000 * 32),
+ Materials.AdvancedGlue.getFluid(1000 * 16), ALLOY.INDALLOY_140.getFluidStack(144 * 64),
+ Materials.SolderingAlloy.getMolten(144 * 128) },
+ new ItemStack[] { ItemList.StableAdhesive.get(1) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Titanium, Tungsten, Indium
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Lead.getDust(16), Materials.Bauxite.getDust(32),
+ Materials.Tungstate.getDust(16), ItemUtils.getSimpleStack(GenericChem.mTitaTungstenIndiumCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Titanium.getDust(64), Materials.TungstenSteel.getDust(64),
+ Materials.TungstenCarbide.getDust(64), Materials.Indium.getDust(64) },
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Thorium, Uranium, Plutonium
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Thorium.getDust(32), Materials.Uranium.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRadioactivityCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { ELEMENT.getInstance().THORIUM232.getDust(64),
+ ELEMENT.getInstance().URANIUM233.getDust(64), Materials.Uranium235.getDust(64),
+ ELEMENT.getInstance().PLUTONIUM238.getDust(64), Materials.Plutonium.getDust(64),
+ Materials.Plutonium241.getDust(64) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Monaline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Monazite.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Cerium.getDust(64), Materials.Gadolinium.getDust(64),
+ Materials.Samarium.getDust(64), getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 11002), // Hafnia
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 11007), // Zirconium
+ ItemList.SuperconductorComposite.get(1) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Bastline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Bastnasite.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 0) },
+ null,
+ null,
+ new ItemStack[] { Materials.Holmium.getDust(64), Materials.Cerium.getDust(64),
+ Materials.Samarium.getDust(64), Materials.Gadolinium.getDust(64), Materials.Lanthanum.getDust(64) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Early Waterline skip (first 4 tiers)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mLimpidWaterCatalyst, 0) },
+ new FluidStack[] { Materials.Water.getFluid(40000L) },
+ new FluidStack[] { Materials.Grade1PurifiedWater.getFluid(20000L),
+ Materials.Grade2PurifiedWater.getFluid(10000L), Materials.Grade3PurifiedWater.getFluid(5000L),
+ Materials.Grade4PurifiedWater.getFluid(1000L) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Stem Cells
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Calcium.getDust(32), Materials.MeatRaw.getDust(32),
+ getModItem(NewHorizonsCoreMod.ID, "GTNHBioItems", 32, 2),
+ ItemUtils.getSimpleStack(GenericChem.mRawIntelligenceCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { Materials.GrowthMediumRaw.getFluid(1000 * 1024),
+ Materials.GrowthMediumSterilized.getFluid(1000 * 512) },
+ new ItemStack[] { stemcells },
+ new int[] { 3333, 3333, 3333 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UEV,
+ 3);
+
+ // Unknown Particles
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mParticleAccelerationCatalyst, 0) },
+ new FluidStack[] { Materials.Hydrogen.getGas(10000L), Materials.Deuterium.getGas(1000L) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.hydrogen", 1000) },
+ new ItemStack[] { Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.GRAVITON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.ELECTRON) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 5 * 20,
+ (int) TierEU.RECIPE_UEV,
+ 3);
+
+ // Lategame Plastics (Missing Radox Polymer and Heavy Radox)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64), Materials.Osmium.getDust(24),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 0) },
+ new FluidStack[] { Materials.Hydrogen.getGas(1000 * 16), Materials.Nitrogen.getGas(1000 * 16) },
+ new FluidStack[] { FluidUtils.getFluidStack("xenoxene", 1000 * 16),
+ FluidUtils.getFluidStack("molten.radoxpoly", 144 * 64),
+ FluidUtils.getFluidStack("heavyradox", 1000 * 16), MaterialsKevlar.Kevlar.getMolten(144 * 64) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Lategame Kevlar using Kevlar bee comb
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_Bees.combs.getStackForType(CombType.KEVLAR, 24), Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 0) },
+ new FluidStack[] { Materials.Nitrogen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16) },
+ new FluidStack[] { MaterialsKevlar.PolyurethaneResin.getFluid(1000 * 32),
+ MaterialsKevlar.LiquidCrystalKevlar.getFluid(144 * 32), MaterialsKevlar.Kevlar.getMolten(144 * 64) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+ // Platline skip using Platline Combs (Palladium, Osmium, Iridium, Platinum)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_Bees.combs.getStackForType(CombType.PLATINUM, 32),
+ GT_Bees.combs.getStackForType(CombType.PALLADIUM, 32),
+ GT_Bees.combs.getStackForType(CombType.OSMIUM, 32), GT_Bees.combs.getStackForType(CombType.IRIDIUM, 32),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { Materials.Osmium.getMolten(144 * 256), Materials.Palladium.getMolten(144 * 256),
+ Materials.Iridium.getMolten(144 * 256), Materials.Platinum.getMolten(144 * 256) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+ // Bio Cells and Mutated Solder
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemList.Circuit_Chip_Stemcell.get(16), Materials.InfinityCatalyst.getDust(4),
+ ItemUtils.getSimpleStack(GenericChem.mBiologicalIntelligenceCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 128),
+ Materials.BioMediumSterilized.getFluid(1000 * 256), Materials.BioMediumRaw.getFluid(1000 * 512) },
+ new ItemStack[] { biocells },
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Advanced Waterline skip (last 4 tiers)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mFlawlessWaterCatalyst, 0) },
+ new FluidStack[] { Materials.Water.getFluid(40000L) },
+ new FluidStack[] { Materials.Grade5PurifiedWater.getFluid(20000L),
+ Materials.Grade6PurifiedWater.getFluid(10000L), Materials.Grade7PurifiedWater.getFluid(5000L),
+ Materials.Grade8PurifiedWater.getFluid(1000L) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Rare Particles
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mSynchrotronCapableCatalyst, 0),
+ GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.hydrogen", 30000), Materials.Helium.getPlasma(30000L),
+ Materials.Americium.getPlasma(30000L),
+ new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 30000) },
+ new FluidStack[] {},
+ new ItemStack[] { Particle.getBaseParticle(Particle.Z_BOSON), Particle.getBaseParticle(Particle.W_BOSON),
+ Particle.getBaseParticle(Particle.LAMBDA), Particle.getBaseParticle(Particle.OMEGA),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 200 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ if (GalaxySpace.isModLoaded()) {
+ // Seaweed
+ ItemStack seaweed = GT_Utility
+ .copyAmountUnsafe(64 * 32, getModItem(GalaxySpace.ID, "tcetiedandelions", 1, 4));
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get("cropSeaweed", 64), Materials.Mytryl.getDust(16),
+ ItemUtils.getSimpleStack(GenericChem.mAlgagenicGrowthPromoterCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("unknowwater", 25_000) },
+ new FluidStack[] { FluidUtils.getFluidStack("seaweedbroth", 50_000),
+ FluidUtils.getFluidStack("iodine", 64_000) },
+ new ItemStack[] { seaweed, getModItem(NewHorizonsCoreMod.ID, "item.TCetiESeaweedExtract", 16) },
+ new int[] { 2_500, 2_500, 2_500, 2_500 },
+ 20 * SECONDS,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+ }
+ }
+
+ private static void fusionReactorRecipes() {
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { Materials.Radon.getPlasma(100), Materials.Nitrogen.getPlasma(100) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 100) },
+ 30 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 1_000_000_000);
+
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { Materials.Americium.getPlasma(100), Materials.Boron.getPlasma(100) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 100) },
+ 30 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 1_000_000_000);
+
+ // MK5 versions
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 288),
+ Materials.Yttrium.getMolten(288) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 288) },
+ 1 * SECONDS + 12 * TICKS,
+ (int) TierEU.RECIPE_UEV,
+ 1_000_000_000);
+
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 288),
+ Materials.Rubidium.getMolten(288) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 288) },
+ 1 * SECONDS + 12 * TICKS,
+ (int) TierEU.RECIPE_UEV,
+ 1_000_000_000);
+ }
+
+ private static void catalystRecipes() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 88), Materials.Osmiridium.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ Materials.Polybenzimidazole.getDust(64), Materials.Polytetrafluoroethylene.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mPlasticPolymerCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Silicone.getDust(64),
+ Materials.StyreneButadieneRubber.getDust(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mRubberPolymerCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ALLOY.INDALLOY_140.getDust(64),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getCell(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mAdhesionPromoterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.TungstenSteel.getDust(64),
+ Materials.Indium.getDust(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mTitaTungstenIndiumCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ ELEMENT.getInstance().URANIUM235.getDust(64), ELEMENT.getInstance().PLUTONIUM241.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mRadioactivityCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Samarium.getDust(64),
+ Materials.Gadolinium.getDust(64), Materials.Silver.getNanite(1) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ WerkstoffLoader.Hedenbergit.get(OrePrefixes.lens, 1),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Silver, 1, false),
+ ItemList.Circuit_Silicon_Wafer6.get(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mLimpidWaterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Naquadah.getDust(64),
+ Materials.Adamantium.getDust(64), Materials.Silver.getNanite(1) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mSimpleNaquadahCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Naquadria.getDust(64),
+ Materials.Trinium.getDust(64), Materials.Gold.getNanite(1) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mAdvancedNaquadahCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ItemList.Circuit_Chip_Stemcell.get(64),
+ Materials.Gold.getNanite(1) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mRawIntelligenceCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ GregtechItemList.Laser_Lens_Special.get(64),
+ GT_ModHandler.getModItem(EternalSingularity.ID, "eternal_singularity", 10) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mParticleAccelerationCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), MaterialsKevlar.Kevlar.getDust(64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ItemList.Circuit_Chip_Biocell.get(64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mBiologicalIntelligenceCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ WerkstoffLoader.Hedenbergit.get(OrePrefixes.lens, 64),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Silver, 64, false),
+ ItemList.Circuit_Silicon_Wafer6.get(64) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mFlawlessWaterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON), Particle.getIon("Helium", 0),
+ Particle.getIon("Hydrogen", 0), MaterialsUEVplus.Eternity.getNanite(16) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mSynchrotronCapableCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ GT_OreDictUnificator.get("blockShirabon", 16), MaterialsUEVplus.Universium.getNanite(1),
+ ItemList.Timepiece.get(1) },
+ Materials.DarkIron.getMolten(92160),
+ ItemUtils.getSimpleStack(GenericChem.TemporalHarmonyCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedCircuit(10),
+ CI.getEmptyCatalyst(1),
+ getModItem(NewHorizonsCoreMod.ID, "item.TCetiESeaweedExtract", 64),
+ GT_OreDictUnificator.get("dustIodine", 64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mAlgagenicGrowthPromoterCatalyst, 1))
+ .fluidInputs(FluidUtils.getFluidStack("molten.shirabon", 92_160))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void tieredCasingRecipes() {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.ForceFieldGlass.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(1), Materials.Carbon.getNanite(4),
+ ItemList.Emitter_UV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 2) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 10), MaterialsUEVplus.ExcitedDTCC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 500),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 500) },
+ GregtechItemList.NeutronPulseManipulator.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.NeutronPulseManipulator.get(1),
+ 2048 * 30 * 20,
+ 2048,
+ (int) TierEU.RECIPE_UV,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(2), Materials.Carbon.getNanite(8),
+ ItemList.Emitter_UEV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUEV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 4), ItemList.StableAdhesive.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 12), MaterialsUEVplus.ExcitedDTPC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 2500),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 2500) },
+ GregtechItemList.CosmicFabricManipulator.get(1),
+ 75 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.CosmicFabricManipulator.get(1),
+ 4096 * 30 * 20,
+ 4096,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(4), Materials.Carbon.getNanite(16),
+ ItemList.Emitter_UIV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUIV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 8),
+ ItemList.SuperconductorComposite.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 15), MaterialsUEVplus.ExcitedDTRC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 1000 * 10),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 1000 * 10) },
+ GregtechItemList.InfinityInfusedManipulator.get(1),
+ 90 * 20,
+ (int) TierEU.RECIPE_UMV);
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.InfinityInfusedManipulator.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(8), Materials.Carbon.getNanite(32),
+ ItemList.Emitter_UMV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 16),
+ ItemList.NaquadriaSupersolid.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 20), MaterialsUEVplus.ExcitedDTEC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 2000 * 10),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 2000 * 10) },
+ GregtechItemList.SpaceTimeContinuumRipper.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_AdvancedRadiationProof.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(1),
+ GT_OreDictUnificator.get("plateDensePreciousMetalsAlloy", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 16),
+ ItemList.Field_Generator_UV.get(1), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getScrew(16) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 10), },
+ GregtechItemList.NeutronShieldingCore.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.NeutronShieldingCore.get(1),
+ 2048 * 30 * 20,
+ 2048,
+ (int) TierEU.RECIPE_UV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(2),
+ GT_OreDictUnificator.get("plateDenseEnrichedNaquadahAlloy", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 16),
+ ItemList.Field_Generator_UEV.get(1),
+ // Radox polymer screw.
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.get("RadoxPoly"), 16),
+ ItemList.StableAdhesive.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 20), },
+ GregtechItemList.CosmicFabricShieldingCore.get(1),
+ 75 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.CosmicFabricShieldingCore.get(1),
+ 4096 * 30 * 20,
+ 4096,
+ (int) TierEU.RECIPE_UHV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(4), ELEMENT.STANDALONE.HYPOGEN.getPlateDense(4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.TranscendentMetal, 16),
+ ItemList.Field_Generator_UIV.get(1), GT_OreDictUnificator.get("screwMetastableOganesson", 16),
+ ItemList.SuperconductorComposite.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 40), },
+ GregtechItemList.InfinityInfusedShieldingCore.get(1),
+ 90 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.InfinityInfusedShieldingCore.get(1),
+ 8192 * 30 * 20,
+ 8192,
+ (int) TierEU.RECIPE_UEV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(8), GT_OreDictUnificator.get("plateDenseShirabon", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 16),
+ ItemList.Field_Generator_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Dilithium, 16),
+ ItemList.NaquadriaSupersolid.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 80), },
+ GregtechItemList.SpaceTimeBendingCore.get(1),
+ 120 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { new ItemStack(QuantumGlassBlock.INSTANCE, 1), ItemList.Field_Generator_ZPM.get(1),
+ ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getLongRod(6), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlate(6) },
+ ALLOY.QUANTUM.getFluidStack(144 * 6),
+ GregtechItemList.ForceFieldGlass.get(1),
+ 10 * 20,
+ (int) TierEU.RECIPE_UEV);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java
new file mode 100644
index 0000000000..4aa13a0072
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java
@@ -0,0 +1,45 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.ELEMENT;
+
+public class RecipeLoader_GTNH {
+
+ public static void generate() {
+ GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ball.get(0L),
+ new FluidStack(FluidRegistry.getFluid("ender"), 250),
+ new ItemStack(Items.ender_pearl, 1, 0),
+ 100,
+ 30);
+ // MK4
+ GT_Values.RA.addFusionReactorRecipe(
+ Materials.Plutonium241.getMolten(144),
+ Materials.Helium.getGas(1000),
+ ELEMENT.getInstance().CURIUM.getFluidStack(144),
+ 96,
+ 98304,
+ 500000000);
+ GT_Values.RA.addFusionReactorRecipe(
+ ELEMENT.getInstance().CURIUM.getFluidStack(144),
+ Materials.Helium.getPlasma(144),
+ ELEMENT.getInstance().CALIFORNIUM.getFluidStack(144),
+ 128,
+ 196608,
+ 750000000);
+ GT_Values.RA.addFusionReactorRecipe(
+ Materials.Plutonium241.getMolten(144),
+ Materials.Calcium.getPlasma(144),
+ Materials.Flerovium.getMolten(144),
+ 160,
+ 196608,
+ 1000000000);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java
new file mode 100644
index 0000000000..a954711fd2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java
@@ -0,0 +1,395 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+
+public class RecipeLoader_GlueLine {
+
+ public static void generate() {
+ createRecipes();
+ }
+
+ private static void createRecipes() {
+ chemicalPlantRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ distillationTowerRecipes();
+ fluidHeaterRecipes();
+ mixerRecipes();
+
+ glueUsageRecipes();
+ }
+
+ private static void chemicalPlantRecipes() {
+ // CO + C3H6O2 = C4H6O3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(GenericChem.mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("carbonmonoxide", 1000),
+ FluidUtils.getFluidStack("methylacetate", 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000) },
+ 10 * 20,
+ 500,
+ 3);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18) },
+ new FluidStack[] { FluidUtils.getFluidStack("aceticacid", 1000), FluidUtils.getFluidStack("chlorine", 1000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(1000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(950) },
+ 150 * 20,
+ 1000,
+ 4);
+
+ // Na2CO3 + NaCN + C2H3O2Cl + 2HCl = C3H3NO2 + 3NaCl + CO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ MISC_MATERIALS.SODIUM_CYANIDE.getDust(3) },
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_ACID.getFluidStack(1000),
+ FluidUtils.getFluidStack("hydrochloricacid_gt5u", 2000) },
+ new ItemStack[] { MISC_MATERIALS.CYANOACETIC_ACID.getDust(9), Materials.Salt.getDust(6) },
+ new FluidStack[] { Materials.CarbonDioxide.getGas(1000), GT_ModHandler.getWater(1000) },
+ 20 * 20,
+ 1000,
+ 4);
+
+ // CuSO4 + 5C3H3NO2 + 5C2H6O = CuSO4·5(H2O) + 5C5H7NO2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 0),
+ MISC_MATERIALS.COPPER_SULFATE.getDust(6), MISC_MATERIALS.CYANOACETIC_ACID.getDust(45) },
+ new FluidStack[] { Materials.Ethanol.getFluid(5000) },
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE_HYDRATED.getDust(11) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(5000) },
+ 500 * 20,
+ 6000,
+ 5);
+
+ // C3H3NO2 + C2H6O = C5H7NO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), MISC_MATERIALS.CYANOACETIC_ACID.getDust(9) },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(1000) },
+ 1000 * 20,
+ 6000,
+ 5);
+
+ BioRecipes.mFormaldehyde = FluidUtils.getFluidStack("fluid.formaldehyde", 1)
+ .getFluid();
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(22), ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 0) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(100),
+ FluidUtils.getFluidStack(BioRecipes.mFormaldehyde, 100) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.CYANOACRYLATE_POLYMER.getFluidStack(100), FluidUtils.getWater(1000) },
+ 10 * 20,
+ 8000,
+ 5);
+
+ // CH4 + NH3 + 3O = HCN + 3H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(23), ItemUtils.getSimpleStack(GenericChem.mPinkCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("methane", 2000), FluidUtils.getFluidStack("ammonia", 2000),
+ FluidUtils.getFluidStack("oxygen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(2000), FluidUtils.getWater(6000) },
+ 10 * 20,
+ 500,
+ 3);
+ }
+
+ private static void chemicalReactorRecipes() {
+ // NaOH + HCN = NaCN + H2O
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 3),
+ MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000),
+ FluidUtils.getWater(1000),
+ MISC_MATERIALS.SODIUM_CYANIDE.getDust(3),
+ 10 * 20);
+ // #addChemicalRecipe won't generate LCR recipe if config >= 10
+ GT_Values.RA.addMultiblockChemicalRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 3) },
+ new FluidStack[] { MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000) },
+ new FluidStack[] { FluidUtils.getWater(1000) },
+ new ItemStack[] { MISC_MATERIALS.SODIUM_CYANIDE.getDust(3) },
+ 10 * 20,
+ 30);
+
+ // CaCO3 + 2HCl = CaCl2 + CO2 + H2O
+ if (BartWorks.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("bartworks:gt.bwMetaGenerateddust:63", 3))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(MISC_MATERIALS.CALCIUM_CHLORIDE.getDust(3))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ // Cu + 2H2SO4 = CuSO4 + SO2 + 2H2O
+ // SO2 + 2H2O -> diluted sulfuric acid
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedCircuit(19),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ FluidUtils.getFluidStack("sulfuricacid", 2000),
+ FluidUtils.getFluidStack("dilutedsulfuricacid", 1000),
+ MISC_MATERIALS.COPPER_SULFATE.getDust(6),
+ 5 * 20);
+ // #addChemicalRecipe won't generate LCR recipe if config >= 10
+ GT_Values.RA.addMultiblockChemicalRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1) },
+ new FluidStack[] { FluidUtils.getFluidStack("sulfuricacid", 2000) },
+ new FluidStack[] { FluidUtils.getFluidStack("dilutedsulfuricacid", 1000) },
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE.getDust(6) },
+ 5 * 20,
+ 30);
+ }
+
+ private static void dehydratorRecipes() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE_HYDRATED.getDust(11), },
+ null,
+ GT_ModHandler.getWater(5000),
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE.getDust(6) },
+ new int[] { 10000, 10000, 10000 },
+ 300 * 20,
+ 10);
+ }
+
+ private static void distillationTowerRecipes() {
+ GT_Values.RA.addDistillationTowerRecipe(
+ MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(1000),
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_ACID.getFluidStack(100),
+ MISC_MATERIALS.DICHLOROACETIC_ACID.getFluidStack(450),
+ MISC_MATERIALS.TRICHLOROACETIC_ACID.getFluidStack(450) },
+ null,
+ 4 * 20,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void fluidHeaterRecipes() {
+
+ CORE.RA.addFluidHeaterRecipe(
+ CI.getNumberedCircuit(16),
+ MISC_MATERIALS.CYANOACRYLATE_POLYMER.getFluidStack(100),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ 30 * 30,
+ 500);
+ }
+
+ private static void mixerRecipes() {
+ GT_Values.RA.addMixerRecipe(
+ CI.getNumberedCircuit(1),
+ MISC_MATERIALS.DICHLOROACETIC_ACID.getCell(1),
+ null,
+ null,
+ MISC_MATERIALS.TRICHLOROACETIC_ACID.getFluidStack(1000),
+ MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(2000),
+ CI.emptyCells(1),
+ 100,
+ 100);
+
+ GT_Values.RA.addMixerRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfurTrioxide", 1),
+ CI.getNumberedCircuit(2),
+ null,
+ null,
+ FluidUtils.getFluidStack("sulfuricacid", 1000),
+ MISC_MATERIALS.SOLID_ACID_MIXTURE.getFluidStack(1000),
+ CI.emptyCells(1),
+ 100,
+ 40);
+ }
+
+ private static void glueUsageRecipes() {
+ // Braintech Tape recipe, PBI and superglue make 16 tape at once
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polybenzimidazole, 1L),
+ GT_ModHandler.getIC2Item("carbonMesh", 1L), CI.getNumberedCircuit(10) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ ItemList.Duct_Tape.get(16L),
+ 120,
+ 30);
+
+ // Maintenance Hatch recipe, using Braintech Tape
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LV.get(1), ItemList.Duct_Tape.get(1), CI.getNumberedCircuit(1) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ ItemList.Hatch_Maintenance.get(1),
+ 120,
+ 30);
+
+ // Graphene recipes from later wafer tiers, using superglue instead of the bronze age glue
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustGraphite", 64),
+ ItemList.Circuit_Silicon_Wafer4.get(2L), CI.getNumberedCircuit(2) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(500),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGraphene", 64),
+ 400,
+ 30720);
+
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustGraphite", 64),
+ ItemList.Circuit_Silicon_Wafer5.get(1L), CI.getNumberedCircuit(2) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(250),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGraphene", 64),
+ 80,
+ 122880);
+
+ GT_Values.RA.addMixerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4L),
+ GT_Values.NI,
+ GT_Values.NI,
+ GT_Utility.getIntegratedCircuit(1),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ null,
+ ItemList.SFMixture.get(32),
+ 1600,
+ 16);
+
+ GT_Values.RA.addMixerRecipe(
+ ItemList.GelledToluene.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Polybenzimidazole, 1L),
+ GT_Values.NI,
+ GT_Values.NI,
+ GT_Utility.getIntegratedCircuit(1),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ null,
+ ItemList.SFMixture.get(64),
+ 1600,
+ 16);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 8),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 32),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(200),
+ new ItemStack(Items.book, 64, 0),
+ 32,
+ 8);
+
+ if (TecTech.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 18),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(144),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32505", 1),
+ 300,
+ 7680);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 6),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(288),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32506", 1),
+ 200,
+ 30720);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 18),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(576),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32507", 1),
+ 300,
+ 122880);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Naquadah, 24),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(1152),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32561", 1),
+ 100,
+ 491520);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahEnriched, 36),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(2304),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32562", 1),
+ 200,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt08, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 48),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(4608),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32563", 1),
+ 300,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 56),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(9216),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32564", 1),
+ 600,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.DraconiumAwakened, 64),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(18432),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32565", 1),
+ 1200,
+ 1966080);
+ }
+ if (NewHorizonsCoreMod.isModLoaded() && GalacticraftCore.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackFromFQRN("GalacticraftMars:item.itemBasicAsteroids:7", 1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Titanium, 8),
+ ItemUtils.getItemStackFromFQRN("dreamcraft:item.TungstenString", 8), CI.getNumberedCircuit(1) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(576),
+ ItemUtils.getItemStackFromFQRN("GalaxySpace:item.ThermalClothT2", 1),
+ 600,
+ 1024);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java
new file mode 100644
index 0000000000..81fde457ae
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+
+public class RecipeLoader_LFTR {
+
+ private static AutoMap<Fluid> mNobleGases;
+ private static AutoMap<Fluid> mFluorideGases;
+ private static AutoMap<Fluid> mSpargeGases;
+
+ private static void configureSparging() {
+ if (mSpargeGases == null) {
+ mSpargeGases = new AutoMap<>();
+ mSpargeGases.add(
+ Materials.Helium.getGas(1)
+ .getFluid());
+ mSpargeGases.add(
+ Materials.Fluorine.getGas(1)
+ .getFluid());
+ }
+ if (mNobleGases == null) {
+ mNobleGases = new AutoMap<>();
+ mNobleGases.add(mSpargeGases.get(0));
+ mNobleGases.add(ELEMENT.getInstance().XENON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().NEON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().ARGON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().KRYPTON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().RADON.getFluid());
+ }
+ if (mFluorideGases == null) {
+ mFluorideGases = new AutoMap<>();
+ mFluorideGases.add(mSpargeGases.get(1));
+ mFluorideGases.add(FLUORIDES.LITHIUM_FLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.NEPTUNIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.TECHNETIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.SELENIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.THORIUM_TETRAFLUORIDE.getFluid());
+ }
+ }
+
+ public static void generate() {
+ // Fli2BeF4 + Thorium TetraFluoride = Uranium233
+ // 72k Ticks/hr
+ // 1l/4t = 1000l/hr
+ // 1l/40t = 1000l/10hr (Probably better) LiFBeF2ThF4UF4
+ // 1l/20t= 1000l/2.5hr LiFBeF2ZrF4UF4
+ // 1l/10t= 1000l/2.5hr LiFBeF2ZrF4U235
+
+ configureSparging();
+ FluidStack Li2BeF4 = NUCLIDE.Li2BeF4.getFluidStack(200);
+
+ // LiFBeF2ThF4UF4 - T3
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 5000, 2500 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(100), NUCLIDE.LiFBeF2ThF4.getFluidStack(200),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(20), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(10) },
+ 100 * 20, // time
+ 0, // cost
+ 32768 * 4 // fuel value
+ );
+
+ // LiFBeF2ZrF4UF4 - T2
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 2500, 1250 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(50), NUCLIDE.LiFBeF2ThF4.getFluidStack(100),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(10), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(5) },
+ 100 * 20, // time
+ 0, // cost
+ 8192 * 4 // fuel value
+ );
+
+ // LiFBeF2ZrF4U235 - T1
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 1000, 500 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(25), NUCLIDE.LiFThF4.getFluidStack(50),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(4), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(2) },
+ 100 * 20, // time
+ 0, // cost
+ 8192 // fuel value
+ );
+
+ // Sparging NEI Recipes
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(0), 1000),
+ NUCLIDE.LiFBeF2UF4FP.getFluidStack(50),
+ NUCLIDE.Sparged_LiFBeF2UF4FP.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mNobleGases.get(1), 10), new FluidStack(mNobleGases.get(2), 10),
+ new FluidStack(mNobleGases.get(3), 10), new FluidStack(mNobleGases.get(4), 10),
+ new FluidStack(mNobleGases.get(5), 10) },
+ new int[] { 20000, 20000, 20000, 20000, 20000 });
+
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(1), 100),
+ NUCLIDE.LiFThF4.getFluidStack(50),
+ NUCLIDE.Sparged_LiFThF4.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mFluorideGases.get(1), 5), new FluidStack(mFluorideGases.get(2), 5),
+ new FluidStack(mFluorideGases.get(3), 5), new FluidStack(mFluorideGases.get(4), 5),
+ new FluidStack(mFluorideGases.get(5), 5) },
+ new int[] { 1000, 1000, 1000, 1000, 1000 });
+
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(1), 100),
+ NUCLIDE.LiFBeF2ThF4.getFluidStack(50),
+ NUCLIDE.Sparged_LiFBeF2ThF4.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mFluorideGases.get(1), 10), new FluidStack(mFluorideGases.get(2), 10),
+ new FluidStack(mFluorideGases.get(3), 10), new FluidStack(mFluorideGases.get(4), 10),
+ new FluidStack(mFluorideGases.get(5), 10) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java
new file mode 100644
index 0000000000..cd576dbc8d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static advsolar.utils.MTRecipeManager.transformerRecipes;
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+import static gregtech.api.enums.Mods.GalaxySpace;
+
+import advsolar.utils.MTRecipeRecord;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeLoader_MolecularTransformer {
+
+ public static void run() {
+
+ for (MTRecipeRecord aRecipe : transformerRecipes) {
+ int aEU = MaterialUtils.getVoltageForTier(5);
+ Logger.INFO("=======================");
+ Logger.INFO("Generating GT recipe for Molecular Transformer.");
+ Logger.INFO(
+ "Input: " + aRecipe.inputStack
+ .getDisplayName() + ", Output: " + aRecipe.outputStack.getDisplayName() + ", EU/t: " + aEU);
+ float aTicks = (float) aRecipe.energyPerOperation / (float) aEU;
+ Logger.INFO("Ticks: " + aTicks);
+ int aTicksRoundedUp = MathUtils.roundToClosestInt(Math.ceil(aTicks));
+ Logger.INFO("Ticks: " + aTicksRoundedUp);
+ Logger.INFO("Total EU equal or greater? " + ((aTicksRoundedUp * aEU) >= aRecipe.energyPerOperation));
+ CORE.RA.addMolecularTransformerRecipe(aRecipe.inputStack, aRecipe.outputStack, aTicksRoundedUp, aEU, 2);
+ Logger.INFO("=======================");
+ }
+
+ transformerRecipes.clear();
+ if (AdvancedSolarPanel.isModLoaded() && GalaxySpace.isModLoaded()) {
+
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 600,
+ 1920,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 0),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 150,
+ 7680,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 1),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 38,
+ 30720,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 2),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 10,
+ 122880,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 3),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 3,
+ 491520,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 4),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 1,
+ 1996080,
+ 2);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java
new file mode 100644
index 0000000000..a25ed99dd2
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java
@@ -0,0 +1,680 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeLoader_Nuclear {
+
+ public static void generate() {
+ createRecipes();
+ RecipeLoader_LFTR.generate();
+ RecipeLoader_NuclearFuelProcessing.generate();
+ }
+
+ private static void createRecipes() {
+ autoclave();
+ blastFurnace();
+ centrifugeRecipes();
+ chemicalBathRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ electroMagneticSeperator();
+ fluidExtractorRecipes();
+ fluidHeater();
+ fusionChainRecipes();
+ macerator();
+ mixerRecipes();
+ sifter();
+ }
+
+ private static void autoclave() {
+
+ GT_Values.RA.addAutoclaveRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 9),
+ FluidUtils.getFluidStack("chlorine", 9 * 4 * 144),
+ ItemUtils.getItemStackOfAmountFromOreDict("pelletZirconium", 9),
+ 0,
+ 120 * 20,
+ 30);
+ }
+
+ private static void blastFurnace() {
+
+ GT_Values.RA.addBlastRecipe(
+ FLUORIDES.LITHIUM_FLUORIDE.getDust(2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getDust(1),
+ GT_Values.NF,
+ GT_Values.NF,
+ NUCLIDE.Li2BeF4.getDust(3),
+ null,
+ 60 * 20,
+ 2000,
+ 3000);
+
+ GT_Values.RA.addBlastRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZrCl4", 1),
+ null,
+ GT_Values.NF,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 1),
+ null,
+ 60 * 20,
+ 340,
+ 300);
+ }
+
+ private static void centrifugeRecipes() {
+
+ // Process Used Fuel Rods for Krypton
+
+ // Uranium
+ for (ItemStack depletedRod : new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumSimpledepleted", 8),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumDualdepleted", 4),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumQuaddepleted", 2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 2L),
+ ELEMENT.getInstance().URANIUM232.getSmallDust(1),
+ ELEMENT.getInstance().URANIUM233.getSmallDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Uranium235, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L))
+ .outputChances(10000, 10000, 1000, 1000, 1000, 500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 60))
+ .duration(4 * MINUTES + 10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+
+ // Mox
+ for (ItemStack depletedRod : new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXSimpledepleted", 8),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXDualdepleted", 4),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXQuaddepleted", 2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium241, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L),
+ ELEMENT.getInstance().PLUTONIUM238.getTinyDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L))
+ .outputChances(10000, 10000, 500, 500, 500, 500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 90))
+ .duration(6 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+
+ // Thorium
+ for (ItemStack depletedRod : new ItemStack[] { ItemList.Depleted_Thorium_1.get(8),
+ ItemList.Depleted_Thorium_2.get(4), ItemList.Depleted_Thorium_4.get(2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 2L),
+ ELEMENT.getInstance().THORIUM232.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lutetium, 1L),
+ ELEMENT.getInstance().POLONIUM.getSmallDust(1),
+ ELEMENT.getInstance().THALLIUM.getTinyDust(1))
+ .outputChances(10000, 10000, 5000, 5000, 5000, 2500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 30))
+ .duration(2 * MINUTES + 5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+ }
+
+ private static void chemicalBathRecipes() {
+
+ int[] chances = { 9000, 6000, 3000 };
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 12),
+ FluidUtils.getFluidStack("chlorine", 2400),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 5),
+ chances,
+ 30 * 20,
+ 480);
+
+ chances = new int[] { 9000, 3000, 1000 };
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRutile", 5),
+ FluidUtils.getFluidStack("chlorine", 4000),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTitanium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1),
+ chances,
+ 30 * 20,
+ 1024);
+
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 10),
+ FluidUtils.getFluidStack("hydrofluoricacid", 10 * 144),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 10),
+ null,
+ null,
+ new int[] {},
+ 90 * 20,
+ 500);
+ }
+
+ private static void chemicalReactorRecipes() {
+
+ ItemStack aGtHydrofluoricAcid = ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken("cellHydrofluoricAcid_GT5U", 2);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 5), // Input
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5), // Input
+ null, // Fluid Input
+ null, // Fluid Output
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLi2CO3CaOH2", 10),
+ 600 * 20);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 5), // Input
+ null, // Input Stack 2
+ FluidUtils.getFluidStack("hydrofluoricacid", 5 * 144),
+ FluidUtils.getFluidStack("water", 5 * 144), // Fluid Output
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 5),
+ 600 * 20);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellOxygen", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 16),
+ FluidUtils.getFluidStack("water", 1000),
+ FluidUtils.getFluidStack("lithiumhydroxide", 2000 + 144 * 4),
+ CI.emptyCells(1),
+ 300 * 20);
+
+ // LFTR Fuel Related Compounds
+ // Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().OXYGEN.getCell(1),
+ ELEMENT.getInstance().HYDROGEN.getFluidStack(1000),
+ MISC_MATERIALS.HYDROXIDE.getFluidStack(1000),
+ CI.emptyCells(1),
+ GT_Values.NI,
+ 8 * 20,
+ 30);
+ // Beryllium Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().BERYLLIUM.getDust(7),
+ MISC_MATERIALS.HYDROXIDE.getFluidStack(1000),
+ FLUORIDES.BERYLLIUM_HYDROXIDE.getFluidStack(2000),
+ GT_Values.NI,
+ 8 * 20,
+ 30);
+ // Ammonium Bifluoride
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 1),
+ MISC_MATERIALS.AMMONIUM.getFluidStack(1000),
+ FLUORIDES.AMMONIUM_BIFLUORIDE.getFluidStack(2000),
+ CI.emptyCells(1),
+ 20 * 20,
+ 30);
+ if (aGtHydrofluoricAcid != null) {
+ // Ammonium Bifluoride
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ aGtHydrofluoricAcid,
+ MISC_MATERIALS.AMMONIUM.getFluidStack(1000),
+ FLUORIDES.AMMONIUM_BIFLUORIDE.getFluidStack(2000),
+ CI.emptyCells(2),
+ 40 * 20,
+ 30);
+ }
+ // Ammonium
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().HYDROGEN.getCell(1),
+ MISC_MATERIALS.AMMONIA.getFluidStack(1000),
+ MISC_MATERIALS.AMMONIUM.getFluidStack(2000),
+ CI.emptyCells(1),
+ GT_Values.NI,
+ 20 * 20,
+ 30);
+
+ // Sodium Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedBioCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 1),
+ FluidUtils.getFluidStack("hydrofluoricacid", 500),
+ FluidUtils.getWater(1000),
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ 60 * 20);
+
+ if (FluidUtils.doesFluidExist("hydrofluoricacid_gt5u")) {
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedBioCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 1),
+ FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 1000),
+ FluidUtils.getWater(1000),
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ 60 * 20);
+ }
+ }
+
+ private static void dehydratorRecipes() {
+
+ // Makes 7-Lithium
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedAdvancedCircuit(14))
+ .fluidInputs(FluidUtils.getFluidStack("sulfuriclithium", 1440))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSulfur", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 4))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(chemicalDehydratorRecipes);
+
+ // Makes Lithium Carbonate
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.emptyCells(12), ItemUtils.getItemStackOfAmountFromOreDict("dustLepidolite", 20) }, // Item
+ // input
+ // (Array,
+ // up
+ // to
+ // 2)
+ FluidUtils.getFluidStack("sulfuricacid", 10000),
+ FluidUtils.getFluidStack("sulfuriclithium", 10000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPotassium", 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellOxygen", 10),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellFluorine", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 3), // LithiumCarbonate
+ }, // Output Array of Items - Upto 9,
+ new int[] { 10000, 10000, 10000, 10000, 10000 },
+ 75 * 20, // Time in ticks
+ 1000); // EU
+
+ // Calcium Hydroxide
+ if (ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ // CaO + H2O = Ca(OH)2
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 2) },
+ FluidUtils.getFluidStack("water", 1000),
+ null, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5) }, // Output
+ new int[] { 10000 },
+ 12 * 20, // Time in ticks
+ 120); // EU
+ } else {
+ Logger.INFO("[dustCalciumHydroxide] FAILED TO LOAD RECIPE");
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ Logger.INFO("Could not find dustQuicklime, cannot make dustCalciumHydroxide.");
+ }
+ }
+
+ // 2 LiOH + CaCO3
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLi2CO3CaOH2", 5) }, // Item
+ null, // Fluid input (slot 1)
+ null, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumCarbonate", 3) }, // Output
+ new int[] { 10000, 10000 },
+ 120 * 20, // Time in ticks
+ 1000); // EU
+
+ // LiOH Liquid to Dust
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22) },
+ FluidUtils.getFluidStack("lithiumhydroxide", 144),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 1) },
+ new int[] { 10000 },
+ 1 * 20, // Time in ticks
+ 64); // EU
+
+ // Zirconium Chloride -> TetraFluoride
+ FluidStack aHydrogenChloride = new FluidStack(GenericChem.HydrochloricAcid, 9000);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(11),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 9), }, // Item
+ FluidUtils.getFluidStack("hydrofluoricacid", 9 * 144),
+ aHydrogenChloride,
+ new ItemStack[] { FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(9) },
+ new int[] { 10000 },
+ 120 * 20, // Time in ticks
+ 500); // EU
+
+ // Zirconium Chloride -> TetraFluoride
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(10),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 9) },
+ FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 18 * 144),
+ aHydrogenChloride,
+ new ItemStack[] { FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(9) },
+ new int[] { 10000 },
+ 240 * 20, // Time in ticks
+ 500); // EU
+
+ // Be(OH)2 + 2 (NH4)HF2 → (NH4)2BeF4 + 2 H2O
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(6), FLUORIDES.AMMONIUM_BIFLUORIDE.getCell(4) },
+ FLUORIDES.BERYLLIUM_HYDROXIDE.getFluidStack(2000), // Fluid input (slot 1)
+ FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE.getFluidStack(6000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellWater", 4) },
+ new int[] { 10000 },
+ 32 * 20, // Time in ticks
+ 64); // EU
+
+ // (NH4)2BeF4 → 2 NH3 + 2 HF + BeF2
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.emptyCells(5) },
+ FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE.getFluidStack(5000),
+ null,
+ new ItemStack[] { MISC_MATERIALS.AMMONIA.getCell(2),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(1) },
+ new int[] { 10000, 10000, 10000 },
+ 5 * 60 * 20,
+ 120);
+ }
+
+ private static void electroMagneticSeperator() {
+
+ // Zirconium
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedBauxite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustBauxite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallRutile", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("nuggetZirconium", 1),
+ new int[] { 10000, 2500, 4000 },
+ 20 * 20,
+ 24);
+
+ // Zircon
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMagnetite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMagnetite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallZircon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyZircon", 1),
+ new int[] { 10000, 1250, 2500 },
+ 20 * 20,
+ 24);
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallZircon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyZircon", 1),
+ new int[] { 10000, 1250, 2500 },
+ 20 * 20,
+ 24);
+ }
+
+ private static void fluidExtractorRecipes() {
+
+ // FLiBe fuel
+ CORE.RA.addFluidExtractionRecipe(NUCLIDE.Li2BeF4.getDust(1), NUCLIDE.Li2BeF4.getFluidStack(144), 100, 500);
+ // Lithium Fluoride
+ CORE.RA.addFluidExtractionRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 1),
+ FLUORIDES.LITHIUM_FLUORIDE.getFluidStack(144),
+ 100,
+ 500);
+ // LFTR Fuel 1
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ZrF4U235.getDust(1),
+ NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(144),
+ 250,
+ 1000);
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ZrF4UF4.getDust(1),
+ NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(144),
+ 150,
+ 1500);
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ThF4UF4.getDust(1),
+ NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(144),
+ 150,
+ 2000);
+
+ // ZIRCONIUM_TETRAFLUORIDE
+ CORE.RA.addFluidExtractionRecipe(
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(1),
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(144),
+ 200,
+ 512 + 256);
+ }
+
+ private static void fusionChainRecipes() {
+ // Mk1
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Boron.getPlasma(144), Materials.Calcium.getPlasma(16))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 100000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 144),
+ Materials.Bedrockium.getMolten(144))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 100000000)
+ .addTo(fusionRecipes);
+
+ // Mk2
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Niobium.getPlasma(144), Materials.Zinc.getPlasma(144))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 144))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 1000))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 1000))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 144),
+ new FluidStack(ALLOY.TITANSTEEL.getFluid(), 8))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 1000))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ // Mk3
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(ELEMENT.getInstance().CURIUM.getFluidStack(144), Materials.Americium.getPlasma(144))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 144))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 1000))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 1000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144),
+ Materials.Tartarite.getMolten(2))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 1000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+ }
+
+ private static void macerator() {
+
+ GT_ModHandler.addPulverisationRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("pelletZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZrCl4", 1));
+ }
+
+ private static void mixerRecipes() {
+
+ GT_Values.RA.addMixerRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium233", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium235", 1),
+ null,
+ null,
+ FluidUtils.getFluidStack("hydrofluoricacid", 5000),
+ FLUORIDES.URANIUM_TETRAFLUORIDE.getFluidStack(5000),
+ null,
+ 3000,
+ 500);
+ }
+
+ private static void sifter() {
+
+ // Zirconium
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedIlmenite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustWroughtIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1) },
+ new int[] { 5000, 278, 1000, 1000, 300, 300 },
+ 20 * 30,
+ 500);
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedTin", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZinc", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1) },
+ new int[] { 10000, 556, 1500, 1000, 500, 500 },
+ 20 * 30,
+ 500);
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedCassiterite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1) },
+ new int[] { 10000, 556, 1500, 1000, 500, 500 },
+ 20 * 30,
+ 500);
+
+ // Radium
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedThorium", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustThorium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 500, 300, 200, 100, 100 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedUranium", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 1000, 500, 500, 500 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedUraninite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustUraninite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 500, 250, 250, 250 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPitchblende", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPitchblende", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 500, 250, 250, 250 },
+ 20 * 30,
+ 500);
+ }
+
+ private static void fluidHeater() {
+
+ CORE.RA.addFluidHeaterRecipe(
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ null,
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(144),
+ 20 * 30,
+ 500);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java
new file mode 100644
index 0000000000..dec6fd426a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java
@@ -0,0 +1,258 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gtPlusPlus.core.item.chemistry.NuclearChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeLoader_NuclearFuelProcessing {
+
+ public static void generate() {
+
+ // Create Fuels
+
+ final FluidStack aLithiumFluoride = FLUORIDES.LITHIUM_FLUORIDE.getFluidStack(100);
+ final FluidStack aBerylliumFluoride = FLUORIDES.BERYLLIUM_FLUORIDE.getFluidStack(100);
+ final FluidStack aThoriumFluoride = FLUORIDES.THORIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aZirconiumFluoride = FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aUraniumTetraFluoride = FLUORIDES.URANIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aUranium235 = ELEMENT.getInstance().URANIUM235.getFluidStack(1000);
+ final FluidStack aLiFBeF2ZrF4U235 = NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(100);
+ final FluidStack aLiFBeF2ZrF4UF4 = NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(100);
+ final FluidStack aLiFBeF2ThF4UF4 = NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(100);
+
+ // 7LiF - BeF2 - ZrF4 - U235 - 590C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 550),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 150),
+ FluidUtils.getFluidStack(aZirconiumFluoride, 60),
+ FluidUtils.getFluidStack(aUranium235, 240),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ZrF4U235, 1000),
+ null,
+ 30 * 60 * 20, // Duration
+ MaterialUtils.getVoltageForTier(4));
+
+ // 7LiF - BeF2 - ZrF4 - UF4 - 650C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 600),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 250),
+ FluidUtils.getFluidStack(aZirconiumFluoride, 80),
+ FluidUtils.getFluidStack(aUraniumTetraFluoride, 70),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ZrF4UF4, 1000),
+ null,
+ 40 * 60 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ // 7liF - BeF2 - ThF4 - UF4 - 566C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 580),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 270),
+ FluidUtils.getFluidStack(aThoriumFluoride, 80),
+ FluidUtils.getFluidStack(aUraniumTetraFluoride, 70),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ThF4UF4, 1000),
+ null,
+ 50 * 60 * 20, // Duration
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reprocess Fuels
+
+ // Reactor Blanket step 1 - Fluorination
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(17),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.LiFThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(5), FLUORIDES.LITHIUM_FLUORIDE.getCell(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 500, 500, 500, 250, 250, 250 },
+ NUCLIDE.UF6F2.getFluidStack(1500),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(18),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.LiFBeF2ThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(4), FLUORIDES.LITHIUM_FLUORIDE.getCell(1),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 10000, 1000, 1000, 1000, 500, 500, 500 },
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reactor Blanket step 1 - Fluorination
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(7),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.Sparged_LiFThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(4), FLUORIDES.LITHIUM_FLUORIDE.getCell(2),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 1000, 1000, 1000, 1000, 1000, 1000 },
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(8),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.Sparged_LiFBeF2ThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(2), FLUORIDES.LITHIUM_FLUORIDE.getCell(2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(2), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 10000, 2000, 2000, 2000, 2000, 2000, 2000 },
+ NUCLIDE.UF6F2.getFluidStack(6000),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reactor Blanket step 2 - Sorption + Cold Trap
+ CORE.RA.addColdTrapRecipe(
+ 8,
+ FLUORIDES.SODIUM_FLUORIDE.getCell(4),
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ new ItemStack[] { ELEMENT.getInstance().FLUORINE.getCell(2), FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(2),
+ ELEMENT.getInstance().URANIUM233.getDust(1), ELEMENT.getInstance().URANIUM233.getDust(1),
+ ELEMENT.getInstance().URANIUM233.getDust(1) },
+ new int[] { 10000, 10000, 3000, 2000, 1000 },
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(2000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(3));
+
+ // LiBeF2UF4FP + F2 = LiFBeF2 & UF6F2FP
+ // Reactor Core step 1 - Process Burnt Salt
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(1),
+ ELEMENT.getInstance().FLUORINE.getCell(1),
+ NUCLIDE.LiFBeF2UF4FP.getFluidStack(1000),
+ new ItemStack[] { NUCLIDE.UF6F2FP.getCell(1) },
+ new int[] { 10000 },
+ FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 1000),
+ 20 * 60 * 120,
+ MaterialUtils.getVoltageForTier(3));
+
+ // LiBeF2UF4FP + F2 = LiFBeF2 & UF6F2FP
+ // Reactor Core step 1 - Process Burnt Salt
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(1),
+ ELEMENT.getInstance().FLUORINE.getCell(3),
+ NUCLIDE.Sparged_LiFBeF2UF4FP.getFluidStack(1000),
+ new ItemStack[] { CI.emptyCells(1), NUCLIDE.UF6F2FP.getCell(2) },
+ new int[] { 10000 },
+ FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 2000),
+ 20 * 60 * 60,
+ MaterialUtils.getVoltageForTier(3));
+
+ // Reactor Core step 2A - Sorption + Cold Trap
+ CORE.RA.addColdTrapRecipe(
+ 8,
+ FLUORIDES.SODIUM_FLUORIDE.getCell(3),
+ NUCLIDE.UF6F2FP.getFluidStack(2000),
+ new ItemStack[] { ELEMENT.getInstance().FLUORINE.getCell(1), FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(2),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1) },
+ new int[] { 10000, 10000, 5000, 5000, 5000, 5000, 5000, 5000 },
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(2000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Reactor Core step 2B - Distillation
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 1000))
+ .fluidOutputs(NUCLIDE.LiFBeF2.getFluidStack(250))
+ .duration(7 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(distillationTowerRecipes);
+
+ // UF6 -> UF4 reduction
+ // UF6 + LiFBeF2 + H2 -> LiFBeF2UF4 + HF
+ GT_Values.RA.stdBuilder()
+ .itemInputs(FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(1), NUCLIDE.LiFBeF2.getCell(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000L))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 2))
+ .fluidOutputs(NUCLIDE.LiFBeF2UF4.getFluidStack(3000))
+ .duration(2 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .metadata(COIL_HEAT, 5400)
+ .addTo(blastFurnaceRecipes);
+ // Alternative recipe to the above, for chemplant, to not use cells
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] {},
+ new FluidStack[] { FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(1000), NUCLIDE.LiFBeF2.getFluidStack(1000),
+ ELEMENT.getInstance().HYDROGEN.getFluidStack(2000) },
+ new ItemStack[] {},
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4.getFluidStack(3000),
+ FluidUtils.getFluidStack("hydrofluoricacid", 2000) },
+ 300 * 10,
+ MaterialUtils.getVoltageForTier(5),
+ 4);
+
+ CORE.RA.addFissionFuel(
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(100),
+ NUCLIDE.LiFBeF2UF4.getFluidStack(900),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(1000),
+ null,
+ 20 * 60 * 12, // Duration
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addFissionFuel(
+ FLUORIDES.THORIUM_TETRAFLUORIDE.getFluidStack(100),
+ NUCLIDE.LiFBeF2UF4.getFluidStack(900),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(1000),
+ null,
+ 20 * 60 * 15, // Duration
+ MaterialUtils.getVoltageForTier(5));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java
new file mode 100644
index 0000000000..28c8b2a337
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java
@@ -0,0 +1,719 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import binnie.extratrees.genetics.ExtraTreeSpecies;
+import forestry.api.arboriculture.EnumGermlingType;
+import forestry.api.arboriculture.EnumWoodType;
+import forestry.api.arboriculture.ITree;
+import forestry.api.arboriculture.TreeManager;
+import forestry.arboriculture.genetics.TreeDefinition;
+import forestry.plugins.PluginArboriculture;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class RecipeLoader_TreeFarm {
+
+ public static void generateRecipes() {
+ generateVanillaTrees();
+
+ if (Mods.IndustrialCraft2.isModLoaded()) generateIC2Trees();
+ if (Mods.TinkerConstruct.isModLoaded()) generateTinkersTrees();
+ if (Mods.GTPlusPlus.isModLoaded()) generateGTPPTrees();
+
+ if (Mods.TwilightForest.isModLoaded()) generateTwilightForestTrees();
+ if (Mods.GalaxySpace.isModLoaded()) generateGalaxySpaceTrees();
+ if (Mods.GalacticraftAmunRa.isModLoaded()) generateAmunRaTrees();
+
+ if (Mods.Thaumcraft.isModLoaded()) generateThaumcraftTrees();
+ if (Mods.ThaumicBases.isModLoaded()) generateThaumicBasesTrees();
+ if (Mods.TaintedMagic.isModLoaded()) generateTaintedMagicTrees();
+ if (Mods.ForbiddenMagic.isModLoaded()) generateForbiddenMagicTrees();
+ if (Mods.Witchery.isModLoaded()) generateWitcheryTrees();
+
+ if (Mods.Natura.isModLoaded()) generateNaturaTrees();
+ if (Mods.BiomesOPlenty.isModLoaded()) generateBOPTrees();
+ if (Mods.PamsHarvestCraft.isModLoaded()) generatePamsTrees();
+ if (Mods.PamsHarvestTheNether.isModLoaded()) generatePamsNetherTrees();
+
+ if (Mods.Forestry.isModLoaded()) generateForestryTrees();
+ if (Mods.ExtraTrees.isModLoaded()) generateExtraTreesTrees();
+ }
+
+ private static void generateVanillaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Oak
+ new ItemStack(Blocks.sapling, 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ new ItemStack(Blocks.leaves, 1, 0),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Spruce
+ new ItemStack(Blocks.sapling, 1, 1),
+ new ItemStack(Blocks.log, 2, 1),
+ new ItemStack(Blocks.leaves, 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Birch
+ new ItemStack(Blocks.sapling, 1, 2),
+ new ItemStack(Blocks.log, 1, 2),
+ new ItemStack(Blocks.leaves, 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Jungle
+ new ItemStack(Blocks.sapling, 1, 3),
+ new ItemStack(Blocks.log, 2, 3),
+ new ItemStack(Blocks.leaves, 1, 3),
+ new ItemStack(Items.dye, 1, 3));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Acacia
+ new ItemStack(Blocks.sapling, 1, 4),
+ new ItemStack(Blocks.log2, 1, 0),
+ new ItemStack(Blocks.leaves2, 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dark Oak
+ new ItemStack(Blocks.sapling, 1, 5),
+ new ItemStack(Blocks.log2, 1, 1),
+ new ItemStack(Blocks.leaves2, 1, 1),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Brown Mushroom
+ new ItemStack(Blocks.brown_mushroom, 1, 0),
+ new ItemStack(Blocks.brown_mushroom_block, 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Red Mushroom
+ new ItemStack(Blocks.red_mushroom, 1, 0),
+ new ItemStack(Blocks.red_mushroom_block, 1, 0),
+ null,
+ null);
+ }
+
+ private static void generateIC2Trees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rubber Tree
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubWood", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "itemHarz", 1, 0));
+ }
+
+ private static void generateTinkersTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Slimy
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.sapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.gel", 1, 1),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.leaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "strangeFood", 1, 0));
+ }
+
+ private static void generateGTPPTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rainforest Oak
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakLog", 3, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakLeaves", 1, 0),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pine
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineLogLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "item.BasicAgrichemItem", 1, 24));
+ }
+
+ private static void generateTwilightForestTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sickly Twilight Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Canopy Tree
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Twilight Mangrove
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 2),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Darkwood
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.DarkLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Robust Twilight Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 4, 0),
+ // Does not drop more robust saplings normally:
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tree of Time
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 5),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 0),
+ // No I am not making this drop clocks.
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tree of Transformation
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 6),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sorting Tree
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 8),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rainbow Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 9),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Thorns
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves3", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThornRose", 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Magic Beans
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "item.magicBeans", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.HugeStalk", 5, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves3", 1, 1),
+ null);
+ }
+
+ private static void generateGalaxySpaceTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Barnarda C
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaCsapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaClog", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaCleaves", 1, 0),
+ null);
+ }
+
+ private static void generateAmunRaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Virilig
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.saplings", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.log1", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.null", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Lumipod
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.saplings", 1, 1),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.wood1", 1, 0),
+ null,
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.wood1", 1, 1));
+ }
+
+ private static void generateNaturaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Redwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "redwood", 5, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 2, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 2, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "redwood", 2, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Eucalyptus
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hopseed
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sakura
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ghostwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Blood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 5),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "bloodwood", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 2),
+ new ItemStack(Items.redstone, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Darkwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 6),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Leaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Natura.netherfood", 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Fusewood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 7),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Leaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Silverbell
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Amaranth
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tigerwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Willow
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "willow", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Green Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "greenGlowshroom", 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Purple Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "purpleGlowshroom", 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Blue Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "blueGlowshroom", 1, 0),
+ null,
+ null);
+ }
+
+ private static void generateBOPTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Apple
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "appleLeaves", 1, 0),
+ new ItemStack(Items.apple, 2, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Yellow Autumn
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 1),
+ new ItemStack(Blocks.log, 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Bamboo
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "bamboo", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 9),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Magic
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dark
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 4),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dying
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 5),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Fir
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 6),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "misc", 1, 13));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ethereal
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 7),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Orange Autumn
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 8),
+ new ItemStack(Blocks.log2, 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Origin
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 9),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pink Cherry
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 10),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 11),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // White Cherry
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 12),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hellbark
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 13),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves4", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Jacaranda
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 14),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves4", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Persimmon
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 15),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "persimmonLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 2, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sacred Oak
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 4, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 2, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 2, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Mangrove
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Palm
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Redwood
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 2, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Willow
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 4),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pine
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 5),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Mahogany
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 6),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Flowering Oak
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 7),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Red Flower Stem
+ new ItemStack(Blocks.red_flower, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "petals", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Yellow Flower Stem
+ new ItemStack(Blocks.yellow_flower, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "petals", 1, 1),
+ null);
+ }
+
+ private static void addPamTree(String name, int meta) {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts(
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pam" + name + "Sapling", 1, 0),
+ new ItemStack(Blocks.log, 1, meta),
+ new ItemStack(Blocks.leaves, 1, meta),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, name + "Item", 2, 0));
+ }
+
+ private static void generatePamsTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Cinnamon
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamappleSapling", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ new ItemStack(Blocks.leaves, 1, 0),
+ new ItemStack(Items.apple, 2, 0));
+
+ addPamTree("almond", 3);
+ addPamTree("apricot", 3);
+ addPamTree("avocado", 0);
+ addPamTree("banana", 3);
+ addPamTree("cashew", 3);
+ addPamTree("cherry", 0);
+ addPamTree("chestnut", 0);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Cinnamon
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamcinnamonSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamCinnamon", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 3),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "cinnamonItem", 2, 0));
+
+ addPamTree("coconut", 3);
+ addPamTree("date", 3);
+ addPamTree("dragonfruit", 3);
+ addPamTree("durian", 3);
+ addPamTree("fig", 3);
+ addPamTree("grapefruit", 3);
+ addPamTree("lemon", 3);
+ addPamTree("lime", 3);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pammapleSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamMaple", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 1),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "maplesyrupItem", 2, 0));
+
+ addPamTree("mango", 3);
+ addPamTree("nutmeg", 0);
+ addPamTree("olive", 0);
+ addPamTree("orange", 3);
+ addPamTree("papaya", 3);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Paperbark
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pampaperbarkSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamPaperbark", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 3),
+ new ItemStack(Items.paper, 1, 0));
+
+ addPamTree("peach", 3);
+ addPamTree("pear", 0);
+ addPamTree("pecan", 3);
+ addPamTree("peppercorn", 3);
+ addPamTree("persimmon", 3);
+ addPamTree("pistachio", 3);
+ addPamTree("plum", 0);
+ addPamTree("pomegranate", 3);
+ addPamTree("starfruit", 3);
+ addPamTree("vanillabean", 3);
+ addPamTree("walnut", 0);
+ addPamTree("gooseberry", 0);
+ }
+
+ private static void generatePamsNetherTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ignis Fruit
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "ignisfruitItem", 2, 0));
+ }
+
+ private static void generateThaumcraftTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Greatwood
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockCustomPlant", 1, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLog", 2, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Silverwood
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockCustomPlant", 1, 1),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 1),
+ null);
+ }
+
+ private static void generateThaumicBasesTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Golden Oak
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Peaceful
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 0),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Nether
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 1),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ender
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 2),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 3),
+ null);
+ }
+
+ private static void generateTaintedMagicTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Warpwood
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodLeaves", 1, 0),
+ null);
+ }
+
+ private static void generateForbiddenMagicTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Warpwood
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintFruit", 1, 0));
+ }
+
+ private static void generateWitcheryTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rowan
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "ingredient", 1, 63));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Alder
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 1),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hawthorn
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 2),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 2),
+ null);
+ }
+
+ /*
+ * Abdiel Kavash: I do not claim the code in the following two methods to be ideal, or to even completely understand
+ * all the details. Much of it has been copied from the previous version, available at
+ * https://github.com/GTNewHorizons/GTplusplus/blob/dca836fee368878cf64ca59e4c7ffc5875a3f489/src/main/java/
+ * gtPlusPlus/xmod/forestry/HANDLER_FR.java#L60. If anybody understands Forestry and/or Extra Trees internals better
+ * than I do, and knows a more straightforward way to retrieve the relevant ItemStacks here, please update this.
+ */
+
+ private static void generateForestryTrees() {
+ for (TreeDefinition tree : TreeDefinition.values()) {
+ String speciesUID = tree.getUID();
+
+ ItemStack sapling = tree.getMemberStack(EnumGermlingType.SAPLING);
+
+ ItemStack log;
+ EnumWoodType woodType = ReflectionUtils.getField(tree, "woodType");
+ if (woodType != null) {
+ log = TreeManager.woodItemAccess.getLog(woodType, false);
+ } else {
+ log = ReflectionUtils.getField(tree, "vanillaWood");
+ }
+
+ ItemStack leaves = new ItemStack(PluginArboriculture.blocks.leaves, 1, 0);
+ if (speciesUID != null) {
+ NBTTagCompound nbtTagCompound = new NBTTagCompound();
+ nbtTagCompound.setString("species", speciesUID);
+ leaves.setTagCompound(nbtTagCompound);
+ }
+
+ ItemStack fruit = null;
+ ITree individual = tree.getIndividual();
+ if (individual.canBearFruit()) {
+ ItemStack[] produceList = individual.getProduceList();
+ if (produceList != null && produceList.length > 0) {
+ fruit = individual.getProduceList()[0];
+ }
+ }
+
+ GregtechMetaTileEntityTreeFarm.registerForestryTree(
+ speciesUID,
+ sapling == null ? null : sapling.copy(),
+ log == null ? null : log.copy(),
+ leaves == null ? null : leaves.copy(),
+ fruit == null ? null : fruit.copy());
+ }
+ }
+
+ private static void generateExtraTreesTrees() {
+ for (ExtraTreeSpecies species : ExtraTreeSpecies.values()) {
+
+ String speciesUID = species.getUID();
+
+ ITree individual = TreeManager.treeRoot.templateAsIndividual(species.getTemplate());
+ ItemStack sapling = TreeManager.treeRoot.getMemberStack(individual, 0);
+
+ ItemStack log = null;
+ if (species.getLog() != null) {
+ log = species.getLog()
+ .getItemStack();
+ }
+
+ ItemStack leaves = new ItemStack(PluginArboriculture.blocks.leaves, 1, 0);
+ if (speciesUID != null) {
+ NBTTagCompound nbtTagCompound = new NBTTagCompound();
+ nbtTagCompound.setString("species", speciesUID);
+ leaves.setTagCompound(nbtTagCompound);
+ }
+
+ ItemStack fruit = null;
+ if (individual.canBearFruit()) {
+ ItemStack[] produceList = individual.getProduceList();
+ if (produceList != null && produceList.length > 0) {
+ fruit = individual.getProduceList()[0];
+ }
+ }
+
+ GregtechMetaTileEntityTreeFarm.registerForestryTree(
+ speciesUID,
+ sapling == null ? null : sapling.copy(),
+ log == null ? null : log.copy(),
+ leaves == null ? null : leaves.copy(),
+ fruit == null ? null : fruit.copy());
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java b/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java
new file mode 100644
index 0000000000..6b4a02e984
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java
@@ -0,0 +1,1220 @@
+package gtPlusPlus.xmod.gregtech.recipes;
+
+import static gregtech.api.enums.GT_Values.RA;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.SemiFluidFuelHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.data.ArrayUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.IGregtech_RecipeAdder;
+import gtPlusPlus.xmod.gregtech.common.helpers.FlotationRecipeHandler;
+
+public class GregtechRecipeAdder implements IGregtech_RecipeAdder {
+
+ @Override
+ public boolean addCokeOvenRecipe(final ItemStack aInput1, final ItemStack aInput2, final FluidStack aFluidInput,
+ final FluidStack aFluidOutput, final ItemStack aOutput, int aDuration, final int aEUt) {
+ if (aInput1 == null || (aOutput == null && aFluidOutput == null)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ if (aOutput != null && (aDuration <= 0)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ if (aFluidOutput != null && (aDuration <= 0)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] {},
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.cokeOvenRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addCokeOvenRecipe(int aCircuit, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt) {
+ return addCokeOvenRecipe(
+ aInput2,
+ CI.getNumberedCircuit(aCircuit),
+ aFluidInputs,
+ aFluidOutputs,
+ aOutputs,
+ aDuration,
+ aEUt);
+ }
+
+ @Override
+ public boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt) {
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ aOutputs,
+ null,
+ new int[] {},
+ aFluidInputs,
+ aFluidOutputs,
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.cokeOvenRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMatterFabricatorRecipe(final FluidStack aFluidInput, final FluidStack aFluidOutput,
+ final int aDuration, final int aEUt) {
+ if (aFluidOutput == null) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ aFluidInput == null ? new FluidStack[] {} : new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addDehydratorRecipe(final ItemStack[] aInput, final FluidStack aFluidInput,
+ final FluidStack aFluidOutput, final ItemStack[] aOutputItems, final int[] aChances, int aDuration,
+ final int aEUt) throws IndexOutOfBoundsException {
+ if (((aInput == null || aInput.length == 0) && (aFluidInput == null))
+ || ((aOutputItems == null || aOutputItems.length == 0) && (aFluidOutput == null))) {
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ aInput,
+ aOutputItems,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.chemicalDehydratorRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aOutput, final int aChance, int aDuration,
+ final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ (FluidStack) null,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ final int aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ final int aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, final int[] aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(aInput, aInputFluid, aOutput, aOutputStack, aChance, aDuration, aEUt, 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, final int[] aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(aInput, aInputFluid, aOutput, aOutputStack, aChance, aDuration, aEUt, 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ true);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ true);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe) {
+ return addBlastSmelterRecipe(
+ aInput,
+ new FluidStack[] { aInputFluid },
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ aOptimizeRecipe);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe) {
+ if ((aInput == null) || (aOutput == null)) {
+ Logger.WARNING("Fail - Input or Output was null.");
+ return false;
+ }
+
+ if (aOutput.isFluidEqual(Materials.PhasedGold.getMolten(1))) {
+ aOutput = Materials.VibrantAlloy.getMolten(aOutput.amount);
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedIron.getMolten(1))) {
+ aOutput = Materials.PulsatingIron.getMolten(aOutput.amount);
+ }
+ if (aDuration <= 0) {
+ Logger.WARNING("Recipe did not register.");
+ return false;
+ }
+
+ aInput = ArrayUtils.removeNulls(aInput);
+ if (aInput.length <= 1) {
+ return false;
+ }
+
+ GTPPRecipeMaps.alloyBlastSmelterRecipes.addRecipe(
+ aOptimizeRecipe,
+ aInput,
+ aOutputStack,
+ null,
+ aChance,
+ aInputFluid,
+ new FluidStack[] { aOutput },
+ aDuration,
+ Math.max(1, aEUt),
+ aSpecialValue);
+ return true;
+ }
+
+ @Override
+ public boolean addQuantumTransformerRecipe(ItemStack[] aInput, FluidStack[] aFluidInput, FluidStack[] aFluidOutput,
+ ItemStack[] aOutputStack, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ if (aInput == null) {
+ aInput = new ItemStack[0];
+ }
+ if (aFluidInput == null) {
+ aFluidInput = new FluidStack[0];
+ }
+ if (aOutputStack == null) {
+ aOutputStack = new ItemStack[0];
+ }
+ if (aFluidOutput == null) {
+ aFluidOutput = new FluidStack[0];
+ }
+
+ GTPPRecipeMaps.quantumForceTransformerRecipes.add(
+ new GT_Recipe(
+ false,
+ aInput,
+ aOutputStack,
+ null,
+ aChances,
+ aFluidInput,
+ aFluidOutput,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ return true;
+ }
+
+ @Override
+ public boolean addFissionFuel(final FluidStack aInput1, final FluidStack aInput2, final FluidStack aInput3,
+ final FluidStack aInput4, final FluidStack aInput5, final FluidStack aInput6, final FluidStack aInput7,
+ final FluidStack aInput8, final FluidStack aInput9, final FluidStack aOutput1, final FluidStack aOutput2,
+ final int aDuration, final int aEUt) {
+ return addFissionFuel(
+ false,
+ aInput1,
+ aInput2,
+ aInput3,
+ aInput4,
+ aInput5,
+ aInput6,
+ aInput7,
+ aInput8,
+ aInput9,
+ aOutput1,
+ aOutput2,
+ aDuration,
+ aEUt);
+ }
+
+ @Override
+ public boolean addFissionFuel(final boolean aOptimise, final FluidStack aInput1, final FluidStack aInput2,
+ final FluidStack aInput3, final FluidStack aInput4, final FluidStack aInput5, final FluidStack aInput6,
+ final FluidStack aInput7, final FluidStack aInput8, final FluidStack aInput9, final FluidStack aOutput1,
+ final FluidStack aOutput2, final int aDuration, final int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null) || (aDuration < 1) || (aEUt < 1)) {
+ return false;
+ }
+ final FluidStack[] inputs = { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 };
+ final FluidStack[] outputs = { aOutput1, aOutput2 };
+
+ GTPPRecipeMaps.fissionFuelProcessingRecipes.addRecipe(
+ aOptimise,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ inputs,
+ outputs,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addCyclotronRecipe(ItemStack aInputs, FluidStack aFluidInput, ItemStack[] aOutputs,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ return addCyclotronRecipe(
+ new ItemStack[] { aInputs },
+ aFluidInput,
+ aOutputs,
+ aFluidOutput,
+ aChances,
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addCyclotronRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack[] aOutput,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ if (aOutput == null || aOutput.length < 1 || !ItemUtils.checkForInvalidItems(aOutput)) {
+ Logger.INFO("Bad output for Cyclotron Recipe.");
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ aInputs,
+ aOutput,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ aSpecialValue);
+ GTPPRecipeMaps.cyclotronRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt) {
+ if ((aInput1 == null && aFluidInput == null) || (aOutput1 == null && aFluidOutput == null)) {
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, aInput3, aInput4 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 },
+ null,
+ new int[] {},
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ RecipeMaps.mixerRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockCentrifugeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Centrifuge recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.centrifugeNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockElectrolyzerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Electrolyzer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.electrolyzerNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addAdvancedFreezerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Adv. Vac Freezer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.advancedFreezerRecipes.addRecipe(aRecipe);
+ return false;
+ }
+
+ public boolean addMultiblockMixerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Mixer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.mixerNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ public boolean addMultiblockChemicalDehydratorRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Chemical Dehydrator recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.chemicalDehydratorNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addSixSlotAssemblingRecipe(ItemStack[] aInputs, FluidStack aInputFluid, ItemStack aOutput1,
+ int aDuration, int aEUt) {
+ return RA.addAssemblerRecipe(aInputs, aInputFluid, aOutput1, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ return RA.addAssemblylineRecipe(aResearchItem, aResearchTime, aInputs, aFluidInputs, aOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ return RA.addAssemblylineRecipe(aResearchItem, aResearchTime, aInputs, aFluidInputs, aOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, int time, int eu) {
+ return addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, null, time, eu);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, Object object, int time, int eu) {
+ return RA.addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, time, eu);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, ItemStack output2, int time) {
+ return RA.addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, output2, time);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, int aCircuit, FluidStack inputFluid,
+ FluidStack outputFluid, ItemStack output, ItemStack output2, int time, int eu) {
+ if (aCircuit < 0 || aCircuit > 24) {
+ aCircuit = 22;
+ }
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { input1, input2 },
+ new ItemStack[] { output, output2 },
+ CI.getNumberedCircuit(aCircuit),
+ new int[] {},
+ new FluidStack[] { inputFluid },
+ new FluidStack[] { outputFluid },
+ time,
+ eu,
+ 0);
+ RecipeMaps.chemicalReactorRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockChemicalRecipe(ItemStack[] itemStacks, FluidStack[] fluidStacks,
+ FluidStack[] fluidStacks2, ItemStack[] outputs, int time, int eu) {
+ return RA.addMultiblockChemicalRecipe(itemStacks, fluidStacks, fluidStacks2, outputs, time, eu);
+ }
+
+ private boolean areItemsAndFluidsBothNull(final ItemStack[] items, final FluidStack[] fluids) {
+ boolean itemsNull = true;
+ if (items != null) {
+ for (final ItemStack itemStack : items) {
+ if (itemStack != null) {
+ itemsNull = false;
+ break;
+ }
+ }
+ }
+ boolean fluidsNull = true;
+ if (fluids != null) {
+ for (final FluidStack fluidStack : fluids) {
+ if (fluidStack != null) {
+ fluidsNull = false;
+ break;
+ }
+ }
+ }
+ return itemsNull && fluidsNull;
+ }
+
+ @Override
+ public boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.compressorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addBrewingRecipe(int aCircuit, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden) {
+ return addBrewingRecipe(CI.getNumberedCircuit(aCircuit), aInput, aOutput, aTime, aEu, aHidden);
+ }
+
+ @Override
+ public boolean addBrewingRecipe(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden) {
+ if (aIngredient == null || aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.brewingRecipes.addRecipe(
+ false,
+ new ItemStack[] { aIngredient },
+ null,
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aTime,
+ aEu,
+ 0);
+ if (aHidden && tRecipe != null) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ /**
+ * Lets me add recipes for GT 5.08 & 5.09, since someone broke the method headers.
+ */
+ @Override
+ public boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aDust, ItemStack aOutput) {
+ return GT_ModHandler.addSmeltingAndAlloySmeltingRecipe(aDust, aOutput, true);
+ }
+
+ @Override
+ public boolean addFluidExtractionRecipe(ItemStack input, FluidStack output, int aTime, int aEu) {
+ return RA.addFluidSmelterRecipe(GT_Utility.copyAmount(1, input), null, output, 10000, aTime, aEu, false);
+ }
+
+ @Override
+ public boolean addFluidExtractionRecipe(ItemStack aEmpty, ItemStack aRemains, FluidStack aFluid, int aDuration,
+ int aEU) {
+ return RA
+ .addFluidSmelterRecipe(GT_Utility.copyAmount(1, aEmpty), aRemains, aFluid, 10000, aDuration, aEU, false);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn) {
+ return MaterialGenerator.addFluidCannerRecipe(aContainer, aFullContainer, rFluidIn, null);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut) {
+ return MaterialGenerator.addFluidCannerRecipe(aContainer, aFullContainer, rFluidIn, rFluidOut);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aFullContainer, ItemStack container, FluidStack rFluidIn,
+ FluidStack rFluidOut, int aTime, int aEu) {
+ return MaterialGenerator.addFluidCannerRecipe(container, aFullContainer, rFluidIn, rFluidOut, aTime, aEu);
+ }
+
+ @Override
+ public boolean addSemifluidFuel(ItemStack aFuelItem, int aFuelValue) {
+ return SemiFluidFuelHandler.addSemiFluidFuel(aFuelItem, aFuelValue);
+ }
+
+ @Override
+ public boolean addSemifluidFuel(FluidStack aFuelItem, int aFuelValue) {
+ return SemiFluidFuelHandler.addSemiFluidFuel(aFuelItem, aFuelValue);
+ }
+
+ @Override
+ public boolean addVacuumFurnaceRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel) {
+ if (aInput1 != null && aOutput1 != null) {
+ return addVacuumFurnaceRecipe(
+ new ItemStack[] { aInput1, aInput2 },
+ new FluidStack[] { aFluidInput },
+ new ItemStack[] { aOutput1, aOutput2 },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ aLevel);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addVacuumFurnaceRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aLevel) {
+ if (aInputs != null && aOutputs != null) {
+ GTPPRecipeMaps.vacuumFurnaceRecipes.addRecipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ new int[] {},
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aLevel);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addUvLaserRecipe(ItemStack aInput1, ItemStack aOutput, int time, long eu) {
+ // Generate Special Laser Recipe
+ GT_Recipe u = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput1, GregtechItemList.Laser_Lens_WoodsGlass.get(0), },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ time,
+ (int) eu,
+ 0);
+ RecipeMaps.laserEngraverRecipes.add(u);
+ return true;
+ }
+
+ @Override
+ public boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aTier) {
+ return addChemicalPlantRecipe(aInputs, aInputFluids, aOutputs, aFluidOutputs, new int[] {}, time, eu, aTier);
+ }
+
+ @Override
+ public boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int time, long eu, int aTier) {
+ if (aInputs.length > 4 || aInputFluids.length > 4 || aOutputs.length > 6 || aFluidOutputs.length > 3) {
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aInputFluids));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ CORE.crash();
+ }
+
+ GTPPRecipeMaps.chemicalPlantRecipes
+ .addRecipe(false, aInputs, aOutputs, null, aChances, aInputFluids, aFluidOutputs, time, (int) eu, aTier);
+ return true;
+ }
+
+ @Override
+ public boolean addBlastRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aHeat) {
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ new int[] {},
+ aInputFluids,
+ aFluidOutputs,
+ time,
+ (int) eu,
+ aHeat);
+
+ RecipeMaps.blastFurnaceRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt) {
+ return RA.addPyrolyseRecipe(aInput, aFluidInput, intCircuit, aOutput, aFluidOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput,
+ ItemStack aSolidOutput, int aDuration, int aEUt, boolean aHidden) {
+ if (aInput != null && aOutput != null) {
+ if (aDuration <= 0) {
+ return false;
+ } else {
+ GT_Recipe tRecipe = RecipeMaps.distilleryRecipes.addRecipe(
+ true,
+ new ItemStack[] { aCircuit },
+ new ItemStack[] { aSolidOutput },
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if (aHidden && tRecipe != null) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ return addExtractorRecipe(aInput, aOutput, 10000, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aChance, int aDuration, int aEUt) {
+ if (aInput != null && aOutput != null) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput.copy() },
+ new ItemStack[] { aOutput.copy() },
+ null,
+ new int[] { aChance },
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ RecipeMaps.extractorRecipes.add(aRecipe);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3) {
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ aOutput2 = GT_OreDictUnificator.get(true, aOutput2);
+ aOutput3 = GT_OreDictUnificator.get(true, aOutput3);
+ if (GT_Utility.isStackInvalid(aInput) || GT_Utility.isStackInvalid(aOutput1)) {
+ return false;
+ }
+ if (GT_Utility.getContainerItem(aInput, false) == null) {
+
+ GT_Utility.addSimpleIC2MachineRecipe(aInput, GT_ModHandler.getMaceratorRecipeList(), null, aOutput1);
+
+ GT_Values.RA.addPulveriserRecipe(
+ aInput,
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ new int[] { 10000, 10000, 10000 },
+ 400,
+ 2);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addMillingRecipe(Materials aMat, int aEU) {
+ return addMillingRecipe(MaterialUtils.generateMaterialFromGtENUM(aMat), aEU);
+ }
+
+ @Override
+ public boolean addMillingRecipe(Material aMat, int aEU) {
+
+ ItemStack aOreStack = aMat.getOre(16);
+ ItemStack aCrushedStack = aMat.getCrushed(16);
+
+ ItemStack aMilledStackOres1 = aMat.getMilled(64);
+ ItemStack aMilledStackCrushed1 = aMat.getMilled(32);
+ ItemStack aMilledStackOres2 = aMat.getMilled(48);
+ ItemStack aMilledStackCrushed2 = aMat.getMilled(16);
+
+ ItemStack aMillingBall_Alumina = GregtechItemList.Milling_Ball_Alumina.get(0);
+ ItemStack aMillingBall_Soapstone = GregtechItemList.Milling_Ball_Soapstone.get(0);
+
+ // Inputs
+ ItemStack[] aInputsOre1 = new ItemStack[] { CI.getNumberedCircuit(10), aOreStack, aMillingBall_Alumina };
+
+ ItemStack[] aInputsOre2 = new ItemStack[] { CI.getNumberedCircuit(11), aOreStack, aMillingBall_Soapstone };
+
+ ItemStack[] aInputsCrushed1 = new ItemStack[] { CI.getNumberedCircuit(10), aCrushedStack,
+ aMillingBall_Alumina };
+
+ ItemStack[] aInputsCrushed2 = new ItemStack[] { CI.getNumberedCircuit(11), aCrushedStack,
+ aMillingBall_Soapstone };
+
+ // Outputs
+ ItemStack[] aOutputsOre1 = new ItemStack[] { aMilledStackOres1 };
+
+ ItemStack[] aOutputsOre2 = new ItemStack[] { aMilledStackOres2 };
+
+ ItemStack[] aOutputsCrushed1 = new ItemStack[] { aMilledStackCrushed1 };
+
+ ItemStack[] aOutputsCrushed2 = new ItemStack[] { aMilledStackCrushed2 };
+
+ ItemStack[][] aInputArray = new ItemStack[][] { aInputsOre1, aInputsOre2, aInputsCrushed1, aInputsCrushed2 };
+ ItemStack[][] aOutputArray = new ItemStack[][] { aOutputsOre1, aOutputsOre2, aOutputsCrushed1,
+ aOutputsCrushed2 };
+ int[] aTime = new int[] { 2400, 3000, 1200, 1500 };
+
+ for (int i = 0; i < 4; i++) {
+ GT_Recipe aOreRecipe = new GT_Recipe(
+ false,
+ aInputArray[i],
+ aOutputArray[i],
+ null,
+ new int[] {},
+ null,
+ null,
+ aTime[i],
+ aEU,
+ 0);
+ GTPPRecipeMaps.millingRecipes.add(aOreRecipe);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addFlotationRecipe(Materials aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU) {
+ return addFlotationRecipe(
+ MaterialUtils.generateMaterialFromGtENUM(aMat),
+ aXanthate,
+ aInputFluids,
+ aOutputFluids,
+ aTime,
+ aEU);
+ }
+
+ @Override
+ public boolean addFlotationRecipe(Material aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU) {
+
+ FlotationRecipeHandler.registerOreType(aMat);
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { ItemUtils.getSimpleStack(aXanthate, 32), aMat.getMilled(64), aMat.getMilled(64),
+ aMat.getMilled(64), aMat.getMilled(64), },
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ aInputFluids,
+ aOutputFluids,
+ aTime,
+ aEU,
+ 0);
+ GTPPRecipeMaps.flotationCellRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addpackagerRecipe(ItemStack aRecipeType, ItemStack aSmallDust, ItemStack aTinyDust,
+ ItemStack aOutputStack1) {
+ AutoMap<Boolean> aResults = new AutoMap<>();
+ // Dust 1
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(GT_Utility.copyAmount(4L, aSmallDust), aRecipeType, aOutputStack1, 100, 4));
+ // Dust 2
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(GT_Utility.copyAmount(9L, aTinyDust), aRecipeType, aOutputStack1, 100, 4));
+ for (boolean b : aResults) {
+ if (!b) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addFuelForRTG(ItemStack aFuelPellet, int aFuelDays, int aVoltage) {
+ GTPPRecipeMaps.rtgFuels.addRecipe(
+ true,
+ new ItemStack[] { aFuelPellet },
+ new ItemStack[] {},
+ null,
+ null,
+ null,
+ 0,
+ aVoltage,
+ aFuelDays);
+ return true;
+ }
+
+ @Override
+ public boolean addColdTrapRecipe(int aCircuit, ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, FluidStack aFluidOutput, int aTime, int aEU) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(aCircuit), aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aTime,
+ aEU,
+ 0);
+
+ GTPPRecipeMaps.coldTrapRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addReactorProcessingUnitRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ ItemStack[] aOutputs, int[] aChances, FluidStack aFluidOutput, int aTime, int aEU) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput1, aInput2 },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aTime,
+ aEU,
+ 0);
+
+ GTPPRecipeMaps.reactorProcessingUnitRecipes.add(aRecipe);
+ return true;
+ }
+
+ public boolean addNuclearSaltProcessingPlantRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Salt Plant recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addFluidHeaterRecipe(ItemStack aInput, FluidStack aFluidInput, FluidStack aOutput, int aDuration,
+ int aEUt) {
+ if ((aInput == null && aFluidInput == null) || aOutput == null) {
+ return false;
+ }
+ RecipeMaps.fluidHeaterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addVacuumFreezerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ aDuration,
+ aEUt,
+ 0);
+
+ RecipeMaps.vacuumFreezerRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ aDuration,
+ aEUt,
+ 0);
+
+ GTPPRecipeMaps.molecularTransformerRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt,
+ int aAmps) {
+ return addMolecularTransformerRecipe(aInput, aOutput, aDuration, aEUt);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java
new file mode 100644
index 0000000000..d08b010e97
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java
@@ -0,0 +1,95 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.GregTech_API;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_ElectricAutoWorkbench;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_CropHarvestor;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GT4Entity_AutoCrafter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GT4Entity_ThermalBoiler;
+
+public class Gregtech4Content {
+
+ // ID Range 828, 829, 833 - 850
+
+ public static void run() {
+ Logger.INFO("Max MTE: " + GregTech_API.METATILEENTITIES.length + " | " + GregTech_API.MAXIMUM_METATILE_IDS);
+ thermalBoiler();
+ multiCrafter();
+ tesseracts();
+ basic();
+ automation();
+ }
+
+ private static void automation() {
+ Logger.INFO("Gregtech 4 Content | Registering Auto Workbenches.");
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31091, 1, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_MV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31092, 2, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31093, 3, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_EV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31094, 4, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31095, 5, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_LuV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31096, 6, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31097, 7, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_UV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31098, 8, "Automatic crafting machine").getStackForm(1L));
+
+ }
+
+ private static void basic() {
+ Logger.INFO("Gregtech 4 Content | Registering Crop Managers.");
+ GregtechItemList.GT4_Crop_Harvester_LV.set(
+ new GT_MetaTileEntity_CropHarvestor(31111, 1, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_MV.set(
+ new GT_MetaTileEntity_CropHarvestor(31112, 2, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_HV.set(
+ new GT_MetaTileEntity_CropHarvestor(31113, 3, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_EV.set(
+ new GT_MetaTileEntity_CropHarvestor(31114, 4, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_IV.set(
+ new GT_MetaTileEntity_CropHarvestor(31115, 5, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_LuV.set(
+ new GT_MetaTileEntity_CropHarvestor(31116, 6, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_ZPM.set(
+ new GT_MetaTileEntity_CropHarvestor(31117, 7, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_UV.set(
+ new GT_MetaTileEntity_CropHarvestor(31118, 8, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ }
+
+ private static void tesseracts() {
+ // Gregtech 4 Tesseracts
+ Logger.INFO("Gregtech 4 Content | Registering Tesseracts.");
+ GregtechItemList.GT4_Tesseract_Generator.set(
+ new GT_MetaTileEntity_TesseractGenerator(833, "tesseract.generator", "Tesseract Generator", 4)
+ .getStackForm(1L));
+ GregtechItemList.GT4_Tesseract_Terminal.set(
+ new GT_MetaTileEntity_TesseractTerminal(834, "tesseract.terminal", "Tesseract Terminal", 4)
+ .getStackForm(1L));
+ }
+
+ private static void thermalBoiler() {
+ // Gregtech 4 Thermal Boiler
+ if (CORE.ConfigSwitches.enableMultiblock_ThermalBoiler) {
+ Logger.INFO("Gregtech 4 Content | Registering Thermal Boiler.");
+ GregtechItemList.GT4_Thermal_Boiler
+ .set(new GT4Entity_ThermalBoiler(875, "gtplusplus.thermal.boiler", "Thermal Boiler").getStackForm(1L));
+ }
+ }
+
+ private static void multiCrafter() {
+ // Gregtech 4 Multiblock Auto-Crafter
+ Logger.INFO("Gregtech 4 Content | Registering Multiblock Crafter.");
+ GregtechItemList.GT4_Multi_Crafter.set(
+ new GT4Entity_AutoCrafter(876, "gtplusplus.autocrafter.multi", "Large Scale Auto-Assembler v1.01")
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java
new file mode 100644
index 0000000000..e77e2b1c54
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.RECIPES_MachineComponents;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_HV;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_LV;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_MV;
+
+public class GregtechAdvancedBoilers {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Advanced Boilers.");
+ run1();
+ }
+
+ private static void run1() {
+ // Boilers
+ GregtechItemList.Boiler_Advanced_LV
+ .set(new GT_MetaTileEntity_Boiler_LV(753, "Advanced Boiler [LV]", 1).getStackForm(1L));
+ GregtechItemList.Boiler_Advanced_MV
+ .set(new GT_MetaTileEntity_Boiler_MV(754, "Advanced Boiler [MV]", 2).getStackForm(1L));
+ GregtechItemList.Boiler_Advanced_HV
+ .set(new GT_MetaTileEntity_Boiler_HV(755, "Advanced Boiler [HV]", 3).getStackForm(1L));
+
+ ItemStack chassisT1 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 0, 1);
+ ItemStack chassisT2 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 1, 1);
+ ItemStack chassisT3 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 2, 1);
+
+ // Make the Coil in each following recipe a hammer and a Screwdriver.
+
+ // Chassis Recipes
+ GT_ModHandler.addCraftingRecipe(
+ chassisT1,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_ULV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.Bronze), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Primitive), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Lead), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Copper) });
+
+ GT_ModHandler.addCraftingRecipe(
+ chassisT2,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.Steel), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Basic), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Steel), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Bronze) });
+
+ GT_ModHandler.addCraftingRecipe(
+ chassisT3,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Good), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Aluminium), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Steel) });
+
+ ItemStack pipeTier1 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier7, 1);
+ ItemStack pipeTier2 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier8, 1);
+ ItemStack pipeTier3 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier9, 1);
+
+ // Boiler Recipes
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_LV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('P'),
+ pipeTier1, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Basic), Character.valueOf('W'),
+ chassisT1, Character.valueOf('G'), OrePrefixes.gear.get(Materials.Steel) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_MV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('P'),
+ pipeTier2, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Good), Character.valueOf('W'),
+ chassisT2, Character.valueOf('G'), ALLOY.SILICON_CARBIDE.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_HV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_HV, Character.valueOf('P'),
+ pipeTier3, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Advanced), Character.valueOf('W'),
+ chassisT3, Character.valueOf('G'), ALLOY.SILICON_CARBIDE.getGear(1) });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java
new file mode 100644
index 0000000000..3c244739f6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.GregTech_API;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_Catalysts;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.algae.GregtechMTE_AlgaePondBase;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.chemplant.GregtechMTE_ChemicalPlant;
+
+public class GregtechAlgaeContent {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Algae Content.");
+ run1();
+ }
+
+ private static void run1() {
+
+ // Algae Pond
+ GregtechItemList.AlgaeFarm_Controller
+ .set(new GregtechMTE_AlgaePondBase(997, "algaefarm.controller.tier.single", "Algae Farm").getStackForm(1L));
+
+ // Chemical Plant
+ GregtechItemList.ChemicalPlant_Controller.set(
+ new GregtechMTE_ChemicalPlant(998, "chemicalplant.controller.tier.single", "ExxonMobil Chemical Plant")
+ .getStackForm(1L));
+
+ GregtechItemList.Bus_Catalysts.set(
+ (new GT_MetaTileEntity_Hatch_Catalysts(31030, "hatch.catalysts", "Catalyst Housing")).getStackForm(1L));
+
+ int aTier = 0;
+ // Bronze
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 0, 10);
+ // Steel
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings2, 0, 16);
+ // Aluminium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 1, 17);
+ // Stainless
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 1, 49);
+ // Titanium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 2, 50);
+ // Tungsten
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 0, 48);
+ // Laurenium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 2, 84);
+ // Botmium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 3, 11);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java
new file mode 100644
index 0000000000..8fc84177ca
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.misc.GMTE_AmazonPackager;
+
+public class GregtechAmazonWarehouse {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Amazon Warehouse Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ // Amazon packager multiblock
+ GregtechItemList.Amazon_Warehouse_Controller.set(
+ new GMTE_AmazonPackager(942, "amazonprime.controller.tier.single", "Amazon Warehousing Depot.")
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java
new file mode 100644
index 0000000000..20df726ebe
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gtPlusPlus.core.recipe.common.CI.bitsd;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DynamoBuffer;
+
+public class GregtechBufferDynamos {
+
+ private static int mID = 899;
+
+ public static void run() {
+ run2();
+ }
+
+ private static void run2() {
+ GregtechItemList.Hatch_Buffer_Dynamo_ULV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.00",
+ "ULV Dynamo Hatch [Buffered]",
+ 0).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_LV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.01",
+ "LV Dynamo Hatch [Buffered]",
+ 1).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_MV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.02",
+ "MV Dynamo Hatch [Buffered]",
+ 2).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_HV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.03",
+ "HV Dynamo Hatch [Buffered]",
+ 3).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_EV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.04",
+ "EV Dynamo Hatch [Buffered]",
+ 4).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.05",
+ "IV Dynamo Hatch [Buffered]",
+ 5).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.06",
+ "LuV Dynamo Hatch [Buffered]",
+ 6).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.07",
+ "ZPM Dynamo Hatch [Buffered]",
+ 7).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.08",
+ "UV Dynamo Hatch [Buffered]",
+ 8).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_MAX.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.09",
+ "UHV Dynamo Hatch [Buffered]",
+ 9).getStackForm(1L));
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_ULV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_ULV, 'T', CI.getTieredCircuit(0), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_LV, 'T', CI.getTieredCircuit(1), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_MV, 'T', CI.getTieredCircuit(2), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_HV, 'T', CI.getTieredCircuit(3), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_EV, 'T', CI.getTieredCircuit(4), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_IV, 'T', CI.getTieredCircuit(5), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Tungsten) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_LuV, 'T', CI.getTieredCircuit(6), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.VanadiumGallium) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_ZPM, 'T', CI.getTieredCircuit(7), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_UV, 'T', CI.getTieredCircuit(8), 'C',
+ OrePrefixes.wireGt12.get((Object) Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_MAX.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_MAX, 'T', CI.getTieredCircuit(9), 'C',
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV) });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java
new file mode 100644
index 0000000000..22d3cd9608
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java
@@ -0,0 +1,1269 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaPipeEntityFluid;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaPipeEntity_Cable;
+
+public class GregtechConduits {
+
+ // 30000-30999
+
+ private static int BaseWireID = 30600;
+ private static int BasePipeID = 30700;
+ private static int BasePipeHexadecupleID = 30100;
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Custom Cables/Wires/Pipes.");
+ if (CORE.ConfigSwitches.enableCustom_Cables) {
+ run1();
+ }
+ if (CORE.ConfigSwitches.enableCustom_Pipes) {
+ run2();
+ run3();
+ }
+ }
+
+ private static void run3() {
+
+ try {
+ Class<GT_MetaPipeEntity_Fluid> aPipeEntity = GT_MetaPipeEntity_Fluid.class;
+ Constructor<GT_MetaPipeEntity_Fluid> constructor = aPipeEntity.getConstructor(
+ int.class,
+ String.class,
+ String.class,
+ float.class,
+ Materials.class,
+ int.class,
+ int.class,
+ boolean.class,
+ int.class);
+ if (constructor != null) {
+ Logger.INFO("Generating Hexadecuple pipes.");
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Copper,
+ MaterialUtils.getMaterialName(Materials.Copper),
+ "Copper",
+ BasePipeHexadecupleID++,
+ 60,
+ 1000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Bronze,
+ MaterialUtils.getMaterialName(Materials.Bronze),
+ "Bronze",
+ BasePipeHexadecupleID++,
+ 120,
+ 2000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Steel,
+ MaterialUtils.getMaterialName(Materials.Steel),
+ "Steel",
+ BasePipeHexadecupleID++,
+ 240,
+ 2500,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.StainlessSteel,
+ MaterialUtils.getMaterialName(Materials.StainlessSteel),
+ "Stainless Steel",
+ BasePipeHexadecupleID++,
+ 360,
+ 3000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Titanium,
+ MaterialUtils.getMaterialName(Materials.Titanium),
+ "Titanium",
+ BasePipeHexadecupleID++,
+ 480,
+ 5000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.TungstenSteel,
+ MaterialUtils.getMaterialName(Materials.TungstenSteel),
+ "Tungsten Steel",
+ BasePipeHexadecupleID++,
+ 600,
+ 7500,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Plastic,
+ MaterialUtils.getMaterialName(Materials.Plastic),
+ "Plastic",
+ BasePipeHexadecupleID++,
+ 360,
+ 350,
+ true);
+
+ Materials aPTFE = Materials.get("Polytetrafluoroethylene");
+ if (aPTFE != null) {
+ generateFluidMultiPipes(
+ constructor,
+ aPTFE,
+ MaterialUtils.getMaterialName(aPTFE),
+ "PTFE",
+ BasePipeHexadecupleID++,
+ 480,
+ 600,
+ true);
+ }
+ } else {
+ Logger.INFO("Failed during Hexadecuple pipe generation.");
+ }
+
+ } catch (NoSuchMethodException | SecurityException e) {
+ Logger.INFO("Failed during Hexadecuple pipe generation. [Ecx]");
+ e.printStackTrace();
+ }
+
+ // Generate Heat Pipes
+ // GregtechItemList.HeatPipe_Tier_1.set(new GT_MetaPipeEntity_Heat(31021, "gtpp.pipe.heat.basic.01", "Lead Heat
+ // Pipe (500C)", Materials.Lead, 500).getStackForm(1L));
+ // GregtechItemList.HeatPipe_Tier_2.set(new GT_MetaPipeEntity_Heat(31022, "gtpp.pipe.heat.basic.02", "Iron Heat
+ // Pipe (500C)", Materials.Iron, 500).getStackForm(1L));
+ // GregtechItemList.HeatPipe_Tier_3.set(new GT_MetaPipeEntity_Heat(31023, "gtpp.pipe.heat.basic.03", "Silver
+ // Heat Pipe (1500C)", Materials.Silver, 1500).getStackForm(1L));
+
+ }
+
+ private static void generateFluidMultiPipes(Constructor<GT_MetaPipeEntity_Fluid> aClazz, Materials aMaterial,
+ String name, String displayName, int startID, int transferRatePerSec, int heatCapacity, boolean gasProof) {
+ GT_MetaPipeEntity_Fluid aPipe;
+ final int transferRatePerTick = transferRatePerSec / 20;
+ try {
+ aPipe = aClazz.newInstance(
+ startID,
+ "GT_Pipe_" + name + "_Hexadecuple",
+ "Hexadecuple " + displayName + " Fluid Pipe",
+ 1.0F,
+ aMaterial,
+ transferRatePerTick,
+ heatCapacity,
+ gasProof,
+ 16);
+ if (aPipe == null) {
+ Logger.INFO("Failed to Generate " + aMaterial + " Hexadecuple pipes.");
+ } else {
+ Logger.INFO("Generated " + aMaterial + " Hexadecuple pipes.");
+ GT_OreDictUnificator.registerOre("pipeHexadecuple" + aMaterial, aPipe.getStackForm(1L));
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ Logger.INFO("Failed to Generate " + aMaterial + " Hexadecuple pipes. [Ecx]");
+ e.printStackTrace();
+ }
+ }
+
+ private static void run1() {
+
+ wireFactory("RedstoneAlloy", 32, BaseWireID + 45, 0, 2, 1, new short[] { 178, 34, 34, 0 });
+
+ // need to go back id because fluid pipes already occupy
+ makeCustomWires(ELEMENT.STANDALONE.HYPOGEN, BaseWireID - 15, 0, 0, 8, GT_Values.V[11], false, true);
+
+ }
+
+ private static void run2() {
+ generateNonGTFluidPipes(GT_Materials.Staballoy, ALLOY.STABALLOY, BasePipeID, 12500, 7500, true);
+ generateNonGTFluidPipes(GT_Materials.Tantalloy60, ALLOY.TANTALLOY_60, BasePipeID + 5, 10000, 4250, true);
+ generateNonGTFluidPipes(GT_Materials.Tantalloy61, ALLOY.TANTALLOY_61, BasePipeID + 10, 12000, 5800, true);
+ if (Thaumcraft.isModLoaded()) {
+ generateNonGTFluidPipes(GT_Materials.Void, null, BasePipeID + 15, 1600, 25000, true);
+ }
+ generateGTFluidPipes(Materials.Europium, BasePipeID + 20, 12000, 7500, true);
+ generateNonGTFluidPipes(GT_Materials.Potin, ALLOY.POTIN, BasePipeID + 25, 500, 2000, true);
+ generateNonGTFluidPipes(GT_Materials.MaragingSteel300, ALLOY.MARAGING300, BasePipeID + 30, 14000, 2500, true);
+ generateNonGTFluidPipes(GT_Materials.MaragingSteel350, ALLOY.MARAGING350, BasePipeID + 35, 16000, 2500, true);
+ generateNonGTFluidPipes(GT_Materials.Inconel690, ALLOY.INCONEL_690, BasePipeID + 40, 15000, 4800, true);
+ generateNonGTFluidPipes(GT_Materials.Inconel792, ALLOY.INCONEL_792, BasePipeID + 45, 16000, 5500, true);
+ generateNonGTFluidPipes(GT_Materials.HastelloyX, ALLOY.HASTELLOY_X, BasePipeID + 50, 20000, 4200, true);
+
+ generateGTFluidPipes(Materials.Tungsten, BasePipeID + 55, 4320, 7200, true);
+ if (EnderIO.isModLoaded()) {
+ generateGTFluidPipes(Materials.DarkSteel, BasePipeID + 60, 2320, 2750, true);
+ }
+ generateGTFluidPipes(Materials.Clay, BasePipeID + 65, 100, 500, false);
+ generateGTFluidPipes(Materials.Lead, BasePipeID + 70, 350, 1200, true);
+
+ generateNonGTFluidPipes(
+ GT_Materials.TriniumNaquadahCarbonite,
+ ALLOY.TRINIUM_NAQUADAH_CARBON,
+ 30500,
+ 20,
+ 250000,
+ true);
+ }
+
+ private static void wireFactory(final String Material, final int Voltage, final int ID, final long insulatedLoss,
+ final long uninsulatedLoss, final long Amps, final short[] rgb) {
+ final Materials T = Materials.get(Material);
+ int V = GT_Utility.getTier(Voltage);
+ if (V == -1) {
+ Logger.ERROR("Failed to set voltage on " + Material + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material + " has defaulted to 8v.");
+ V = 0;
+ }
+ makeWires(T, ID, insulatedLoss, uninsulatedLoss, Amps, GT_Values.V[V], true, false, rgb);
+ }
+
+ private static void makeWires(final Materials aMaterial, final int aStartID, final long aLossInsulated,
+ final long aLoss, final long aAmperage, final long aVoltage, final boolean aInsulatable,
+ final boolean aAutoInsulated, final short[] aRGB) {
+ Logger.WARNING("Gregtech5u Content | Registered " + aMaterial.mName + " as a new material for Wire & Cable.");
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 0,
+ "wire." + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.125F,
+ aMaterial,
+ aLoss,
+ 1L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 1,
+ "wire." + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.25F,
+ aMaterial,
+ aLoss,
+ 2L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 2,
+ "wire." + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.375F,
+ aMaterial,
+ aLoss,
+ 4L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 3,
+ "wire." + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.50F,
+ aMaterial,
+ aLoss,
+ 8L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 4,
+ "wire." + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.625F,
+ aMaterial,
+ aLoss,
+ 12L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 5,
+ "wire." + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.75F,
+ aMaterial,
+ aLoss,
+ 16L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ if (aInsulatable) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 6,
+ "cable." + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.25F,
+ aMaterial,
+ aLossInsulated,
+ 1L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 7,
+ "cable." + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.375F,
+ aMaterial,
+ aLossInsulated,
+ 2L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 8,
+ "cable." + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.5F,
+ aMaterial,
+ aLossInsulated,
+ 4L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 9,
+ "cable." + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.625F,
+ aMaterial,
+ aLossInsulated,
+ 8L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 10,
+ "cable." + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.75F,
+ aMaterial,
+ aLossInsulated,
+ 12L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 11,
+ "cable." + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.875f,
+ aMaterial,
+ aLossInsulated,
+ 16L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ }
+ }
+
+ private static void customWireFactory(final Material Material, final int Voltage, final int ID,
+ final long insulatedLoss, final long uninsulatedLoss, final long Amps) {
+ int V = GT_Utility.getTier(Voltage);
+ if (V == -1) {
+ Logger.ERROR("Failed to set voltage on " + Material + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material + " has defaulted to 8v.");
+ V = 0;
+ }
+ makeCustomWires(Material, ID, insulatedLoss, uninsulatedLoss, Amps, GT_Values.V[V], true, false);
+ }
+
+ private static void makeCustomWires(final Material aMaterial, final int aStartID, final long aLossInsulated,
+ final long aLoss, final long aAmperage, final long aVoltage, final boolean aInsulatable,
+ final boolean aAutoInsulated) {
+ Logger.WARNING(
+ "Gregtech5u Content | Registered " + aMaterial.getLocalizedName() + " as a new material for Wire & Cable.");
+ registerOre(
+ OrePrefixes.wireGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 0,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".01",
+ "1x " + aMaterial.getLocalizedName() + " Wire",
+ 0.125F,
+ aLoss,
+ 1L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 1,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".02",
+ "2x " + aMaterial.getLocalizedName() + " Wire",
+ 0.25F,
+ aLoss,
+ 2L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 2,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".04",
+ "4x " + aMaterial.getLocalizedName() + " Wire",
+ 0.375F,
+ aLoss,
+ 4L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 3,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".08",
+ "8x " + aMaterial.getLocalizedName() + " Wire",
+ 0.50F,
+ aLoss,
+ 8L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 4,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".12",
+ "12x " + aMaterial.getLocalizedName() + " Wire",
+ 0.625F,
+ aLoss,
+ 12L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 5,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".16",
+ "16x " + aMaterial.getLocalizedName() + " Wire",
+ 0.75F,
+ aLoss,
+ 16L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ if (aInsulatable) {
+ registerOre(
+ OrePrefixes.cableGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 6,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".01",
+ "1x " + aMaterial.getLocalizedName() + " Cable",
+ 0.25F,
+ aLossInsulated,
+ 1L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 7,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".02",
+ "2x " + aMaterial.getLocalizedName() + " Cable",
+ 0.375F,
+ aLossInsulated,
+ 2L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 8,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".04",
+ "4x " + aMaterial.getLocalizedName() + " Cable",
+ 0.5F,
+ aLossInsulated,
+ 4L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 9,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".08",
+ "8x " + aMaterial.getLocalizedName() + " Cable",
+ 0.625F,
+ aLossInsulated,
+ 8L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 10,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".12",
+ "12x " + aMaterial.getLocalizedName() + " Cable",
+ 0.75F,
+ aLossInsulated,
+ 12L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 11,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".16",
+ "16x " + aMaterial.getLocalizedName() + " Cable",
+ 0.875f,
+ aLossInsulated,
+ 16L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ }
+ }
+
+ private static void superConductorFactory(final GT_Materials Material, final int Voltage, final int ID,
+ final long insulatedLoss, final long uninsulatedLoss, final long Amps) {
+ final GT_Materials T = Material;
+ int V = 0;
+ if (Voltage == 8) {
+ V = 0;
+ } else if (Voltage == 32) {
+ V = 1;
+ } else if (Voltage == 128) {
+ V = 2;
+ } else if (Voltage == 512) {
+ V = 3;
+ } else if (Voltage == 2048) {
+ V = 4;
+ } else if (Voltage == 8196) {
+ V = 5;
+ } else if (Voltage == 32768) {
+ V = 6;
+ } else if (Voltage == 131072) {
+ V = 7;
+ } else if (Voltage == 524288) {
+ V = 8;
+ } else if (Voltage == Integer.MAX_VALUE) {
+ V = 9;
+ } else {
+ Logger.ERROR("Failed to set voltage on " + Material.name() + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material.name() + " has defaulted to 8v.");
+ V = 0;
+ }
+ }
+
+ private static void generateGTFluidPipes(final Materials material, final int startID, final int transferRatePerSec,
+ final int heatResistance, final boolean isGasProof) {
+ final int transferRatePerTick = transferRatePerSec / 20;
+ final long mass = material.getMass();
+ final long voltage = material.mMeltingPoint >= 2800 ? 64 : 16;
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeTiny.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Tiny",
+ "Tiny " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.25F,
+ material,
+ transferRatePerTick * 2,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 1,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Small",
+ "Small " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.375F,
+ material,
+ transferRatePerTick * 4,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 2,
+ "GT_Pipe_" + material.mDefaultLocalName + "",
+ "" + material.mDefaultLocalName + " Fluid Pipe",
+ 0.5F,
+ material,
+ transferRatePerTick * 12,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 3,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Large",
+ "Large " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.75F,
+ material,
+ transferRatePerTick * 24,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 4,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Huge",
+ "Huge " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.875F,
+ material,
+ transferRatePerTick * 48,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ // generatePipeRecipes(material.mDefaultLocalName, mass, voltage);
+ }
+
+ private static void generateNonGTFluidPipes(final GT_Materials material, final Material myMaterial,
+ final int startID, final int transferRatePerSec, final int heatResistance, final boolean isGasProof) {
+ final int transferRatePerTick = transferRatePerSec / 20;
+ long mass;
+ if (myMaterial != null) {
+ mass = myMaterial.getMass();
+ } else {
+ mass = ELEMENT.getInstance().IRON.getMass();
+ }
+
+ int tVoltageMultiplier = (material.mBlastFurnaceTemp >= 2800) ? 64 : 16;
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeTiny.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Tiny",
+ "Tiny " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.25F,
+ material,
+ transferRatePerTick * 2,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 1,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Small",
+ "Small " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.375F,
+ material,
+ transferRatePerTick * 4,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 2,
+ "GT_Pipe_" + material.mDefaultLocalName + "",
+ "" + material.mDefaultLocalName + " Fluid Pipe",
+ 0.5F,
+ material,
+ transferRatePerTick * 12,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 3,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Large",
+ "Large " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.75F,
+ material,
+ transferRatePerTick * 24,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 4,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Huge",
+ "Huge " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.875F,
+ material,
+ transferRatePerTick * 48,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ // generatePipeRecipes(material.mDefaultLocalName, mass, tVoltageMultiplier);
+
+ }
+
+ public static void generatePipeRecipes(final String materialName, final long Mass, final long vMulti) {
+
+ String output = materialName.substring(0, 1)
+ .toUpperCase() + materialName.substring(1);
+ output = Utils.sanitizeString(output);
+
+ if (output.equals("VoidMetal")) {
+ output = "Void";
+ }
+
+ Logger.INFO("Generating " + output + " pipes & respective recipes.");
+
+ ItemStack pipeIngot = ItemUtils.getItemStackOfAmountFromOreDict("ingot" + output, 1);
+ ItemStack pipePlate = ItemUtils.getItemStackOfAmountFromOreDict("plate" + output, 1);
+
+ if (pipeIngot == null) {
+ if (pipePlate != null) {
+ pipeIngot = pipePlate;
+ }
+ }
+
+ // Check all pipes are not null
+ Logger.WARNING(
+ "Generated pipeTiny from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Tiny" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeSmall from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeNormal from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeLarge from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeHuge from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1) != null) ? true : false));
+
+ int eut = 120;
+ eut = (int) (8 * vMulti);
+
+ // Add the Three Shaped Recipes First
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ "craftingToolWrench",
+ pipePlate,
+ pipePlate,
+ null,
+ pipePlate,
+ pipePlate,
+ "craftingToolHardHammer",
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 6));
+
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ pipePlate,
+ pipePlate,
+ "craftingToolWrench",
+ null,
+ "craftingToolHardHammer",
+ pipePlate,
+ pipePlate,
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 2));
+
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ "craftingToolHardHammer",
+ pipePlate,
+ pipePlate,
+ null,
+ pipePlate,
+ pipePlate,
+ "craftingToolWrench",
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1));
+
+ if (pipeIngot != null && ItemUtils.checkForInvalidItems(pipeIngot)) {
+ // 1 Clay Plate = 1 Clay Dust = 2 Clay Ball
+ int inputMultiplier = materialName.equals("Clay") ? 2 : 1;
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 1 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Tiny.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("pipe" + "Tiny" + output, 2),
+ 5,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 1 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Small.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 1),
+ 10,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 3 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Medium.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 1),
+ 1 * 20,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 6 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Large.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1),
+ 2 * 20,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 12 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Huge.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1),
+ 4 * 20,
+ eut);
+ }
+
+ if ((eut < 512) && !output.equals("Void")) {
+ try {
+ final ItemStack pipePlateDouble = ItemUtils.getItemStackOfAmountFromOreDict("plateDouble" + output, 1)
+ .copy();
+ if (pipePlateDouble != null) {
+ RecipeUtils.addShapedRecipe(
+ pipePlateDouble,
+ "craftingToolHardHammer",
+ pipePlateDouble,
+ pipePlateDouble,
+ null,
+ pipePlateDouble,
+ pipePlateDouble,
+ "craftingToolWrench",
+ pipePlateDouble,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1));
+ } else {
+ Logger.INFO(
+ "Failed to add a recipe for " + materialName
+ + " Huge pipes. Double plates probably do not exist.");
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ public static boolean registerOre(OrePrefixes aPrefix, Material aMaterial, ItemStack aStack) {
+ return registerOre(aPrefix.get(Utils.sanitizeString(aMaterial.getLocalizedName())), aStack);
+ }
+
+ public static boolean registerOre(Object aName, ItemStack aStack) {
+ if ((aName == null) || (GT_Utility.isStackInvalid(aStack))) return false;
+ String tName = aName.toString();
+ if (GT_Utility.isStringInvalid(tName)) return false;
+ ArrayList<ItemStack> tList = GT_OreDictUnificator.getOres(tName);
+ for (ItemStack itemStack : tList)
+ if (GT_Utility.areStacksEqual((ItemStack) itemStack, aStack, true)) return false;
+ OreDictionary.registerOre(tName, GT_Utility.copyAmount(1L, new Object[] { aStack }));
+ return true;
+ }
+
+ public static boolean generateWireRecipes(Material aMaterial) {
+
+ ItemStack aPlate = aMaterial.getPlate(1);
+ ItemStack aIngot = aMaterial.getIngot(1);
+ ItemStack aRod = aMaterial.getRod(1);
+ ItemStack aWire01 = aMaterial.getWire01(1);
+ ItemStack aWire02 = aMaterial.getWire02(1);
+ ItemStack aWire04 = aMaterial.getWire04(1);
+ ItemStack aWire08 = aMaterial.getWire08(1);
+ ItemStack aWire12 = aMaterial.getWire12(1);
+ ItemStack aWire16 = aMaterial.getWire16(1);
+ ItemStack aCable01 = aMaterial.getCable01(1);
+ ItemStack aCable02 = aMaterial.getCable02(1);
+ ItemStack aCable04 = aMaterial.getCable04(1);
+ ItemStack aCable08 = aMaterial.getCable08(1);
+ ItemStack aCable12 = aMaterial.getCable12(1);
+ ItemStack aCable16 = aMaterial.getCable16(1);
+ ItemStack aFineWire = aMaterial.getFineWire(1);
+
+ // Adds manual crafting recipe
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aPlate, aWire01 })) {
+ RecipeUtils
+ .addShapedRecipe(aPlate, CI.craftingToolWireCutter, null, null, null, null, null, null, null, aWire01);
+ }
+
+ // Wire mill
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { aIngot, aWire01, aWire02, aWire04, aWire08, aWire12, aWire16 })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getWire01(2),
+ 100,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(2),
+ aMaterial.getWire02(1),
+ 150,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(2),
+ GT_Utility.getIntegratedCircuit(4),
+ aMaterial.getWire04(1),
+ 200,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(4),
+ GT_Utility.getIntegratedCircuit(8),
+ aMaterial.getWire08(1),
+ 250,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(6),
+ GT_Utility.getIntegratedCircuit(12),
+ aMaterial.getWire12(1),
+ 300,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(8),
+ GT_Utility.getIntegratedCircuit(16),
+ aMaterial.getWire16(1),
+ 350,
+ 4);
+ }
+
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { aRod, aWire01, aWire02, aWire04, aWire08, aWire12, aWire16 })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getWire01(1),
+ 50,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(2),
+ GT_Utility.getIntegratedCircuit(2),
+ aMaterial.getWire02(1),
+ 100,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(4),
+ GT_Utility.getIntegratedCircuit(4),
+ aMaterial.getWire04(1),
+ 150,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(8),
+ GT_Utility.getIntegratedCircuit(8),
+ aMaterial.getWire08(1),
+ 200,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(12),
+ GT_Utility.getIntegratedCircuit(12),
+ aMaterial.getWire12(1),
+ 250,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(16),
+ GT_Utility.getIntegratedCircuit(16),
+ aMaterial.getWire16(1),
+ 300,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aIngot, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(3),
+ aMaterial.getFineWire(8),
+ 100,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aRod, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(1),
+ GT_Utility.getIntegratedCircuit(3),
+ aMaterial.getFineWire(4),
+ 50,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getWire01(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getFineWire(4),
+ 200,
+ 8);
+ }
+
+ // Extruder
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aIngot, aWire01 })) {
+ GT_Values.RA
+ .addExtruderRecipe(aIngot, ItemList.Shape_Extruder_Wire.get(0), aMaterial.getWire01(2), 196, 96);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aCable01, aWire01 })) {
+ GT_Values.RA.addUnboxingRecipe(aCable01, aWire01, null, 100, 8);
+ }
+
+ // Shapeless Down-Crafting
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire02 }, aMaterial.getWire01(2));
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04 }, aMaterial.getWire01(4));
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire08 }, aMaterial.getWire01(8));
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire12 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire12 }, aMaterial.getWire01(12));
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire16 }, aMaterial.getWire01(16));
+ }
+
+ // 1x -> 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire01, aWire01 }, aWire02);
+ }
+
+ // 2x -> 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire02, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire02, aWire02 }, aWire04);
+ }
+
+ // 4x -> 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire04 }, aWire08);
+ }
+
+ // 8x -> 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire08, aWire12 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire08 }, aWire12);
+ }
+
+ // 12x -> 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire12, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire12 }, aWire16);
+ }
+
+ // 8x -> 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire08, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire08, aWire08 }, aWire16);
+ }
+
+ // 1x -> 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire01, aWire01, aWire01, aWire01 }, aWire04);
+ }
+
+ // 1x -> 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { aWire01, aWire01, aWire01, aWire01, aWire01, aWire01, aWire01, aWire01 },
+ aWire08);
+ }
+
+ // Wire to Cable
+ // 1x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aCable01 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire01,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 144),
+ aCable01,
+ 100,
+ 8);
+ }
+
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire02, aCable02 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire02,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 144),
+ aCable02,
+ 100,
+ 8);
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aCable04 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire04,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 288),
+ aCable04,
+ 100,
+ 8);
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire08, aCable08 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire08,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 432),
+ aCable08,
+ 100,
+ 8);
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire12, aCable12 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire12,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 576),
+ aCable12,
+ 100,
+ 8);
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire16, aCable16 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire16,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 720),
+ aCable16,
+ 100,
+ 8);
+ }
+
+ // Assemble small wires into bigger wires
+
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(2), CI.getNumberedCircuit(2), null, aWire02, 100, 8);
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(4), CI.getNumberedCircuit(4), null, aWire04, 100, 8);
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(8), CI.getNumberedCircuit(8), null, aWire08, 100, 8);
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(12), CI.getNumberedCircuit(12), null, aWire12, 100, 8);
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(16), CI.getNumberedCircuit(16), null, aWire16, 100, 8);
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java
new file mode 100644
index 0000000000..148ea9bc68
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java
@@ -0,0 +1,278 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ChiselBus;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake_Extreme;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler_Adv;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Naquadah;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Reservoir;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Solidifier;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_TurbineProvider;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SuperBus_Input;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SuperBus_Output;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+
+public class GregtechCustomHatches {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Custom Fluid Hatches.");
+ run1();
+ if (PollutionUtils.isPollutionEnabled()) {
+ run2();
+ }
+ run3();
+ run4(); // Chisel buses
+ run6(); // Solidifier hatches
+ }
+
+ private static void run1() {
+
+ GregtechItemList.Hatch_Input_Cryotheum.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getFluidStack("cryotheum", 1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 128000, // Capacity
+ 967, // ID
+ "hatch.cryotheum.input.tier.00", // unlocal name
+ "Cryotheum Cooling Hatch" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Pyrotheum.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getFluidStack("pyrotheum", 1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 128000, // Capacity
+ 968, // ID
+ "hatch.pyrotheum.input.tier.00", // unlocal name
+ "Pyrotheum Heating Vent" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Naquadah.set(
+ new GT_MetaTileEntity_Hatch_Naquadah(
+ 969, // ID
+ "hatch.naquadah.input.tier.00", // unlocal name
+ "Naquadah Reactor Input hatch" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_TurbineHousing.set(
+ new GT_MetaTileEntity_Hatch_TurbineProvider(
+ 31025, // ID
+ "hatch.turbine.input.tier.00", // unlocal name
+ "Turbine Housing", // Local name
+ 8).getStackForm(1L));
+
+ // Multiblock Air Intake Hatch
+ GregtechItemList.Hatch_Air_Intake.set(
+ new GT_MetaTileEntity_Hatch_AirIntake(861, "hatch.air.intake.tier.00", "Air Intake Hatch", 5)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Air_Intake_Extreme.set(
+ new GT_MetaTileEntity_Hatch_AirIntake_Extreme(
+ 31070,
+ "hatch.air.intake.tier.01",
+ "Extreme Air Intake Hatch",
+ 6).getStackForm(1L));
+
+ // Multiblock Reservoir Hatch
+ GregtechItemList.Hatch_Reservoir.set(
+ new GT_MetaTileEntity_Hatch_Reservoir(31071, "hatch.water.intake.tier.00", "Reservoir Hatch", 4)
+ .getStackForm(1L));
+
+ // Steam Hatch
+ GregtechItemList.Hatch_Input_Steam.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getSteam(1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 64000, // Capacity
+ 31040, // ID
+ "hatch.steam.input.tier.00", // unlocal name
+ "Steam Hatch" // Local name
+ ).getStackForm(1L));
+ }
+
+ private static void run2() {
+ GregtechItemList.Hatch_Muffler_Adv_LV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30001,
+ "hatch.muffler.adv.tier.01",
+ "Advanced Muffler Hatch (LV)",
+ 1)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_MV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30002,
+ "hatch.muffler.adv.tier.02",
+ "Advanced Muffler Hatch (MV)",
+ 2)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_HV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30003,
+ "hatch.muffler.adv.tier.03",
+ "Advanced Muffler Hatch (HV)",
+ 3)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_EV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30004,
+ "hatch.muffler.adv.tier.04",
+ "Advanced Muffler Hatch (EV)",
+ 4)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_IV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30005,
+ "hatch.muffler.adv.tier.05",
+ "Advanced Muffler Hatch (IV)",
+ 5)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_LuV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30006,
+ "hatch.muffler.adv.tier.06",
+ "Advanced Muffler Hatch (LuV)",
+ 6)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_ZPM.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30007,
+ "hatch.muffler.adv.tier.07",
+ "Advanced Muffler Hatch (ZPM)",
+ 7)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_UV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30008,
+ "hatch.muffler.adv.tier.08",
+ "Advanced Muffler Hatch (UV)",
+ 8)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_MAX.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30009,
+ "hatch.muffler.adv.tier.09",
+ "Advanced Muffler Hatch (UHV)",
+ 9)).getStackForm(1L));
+ }
+
+ private static void run3() {
+ /*
+ * Super Input Busses
+ */
+
+ int aStartID = 30022;
+
+ GregtechItemList.Hatch_SuperBus_Input_LV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.01", "Super Bus (I) (LV)", 1))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_MV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.02", "Super Bus (I) (MV)", 2))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_HV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.03", "Super Bus (I) (HV)", 3))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_EV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.04", "Super Bus (I) (EV)", 4))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_IV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.05", "Super Bus (I) (IV)", 5))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_LuV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.06", "Super Bus (I) (LuV)", 6))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_ZPM.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.07", "Super Bus (I) (ZPM)", 7))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_UV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.08", "Super Bus (I) (UV)", 8))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_MAX.set(
+ ((IMetaTileEntity) makeInputBus(aStartID, "hatch.superbus.input.tier.09", "Super Bus (I) (UHV)", 9))
+ .getStackForm(1L));
+
+ /*
+ * Super Output Busses
+ */
+ aStartID = 30032;
+ GregtechItemList.Hatch_SuperBus_Output_LV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.01", "Super Bus (O) (LV)", 1))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_MV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.02", "Super Bus (O) (MV)", 2))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_HV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.03", "Super Bus (O) (HV)", 3))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_EV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.04", "Super Bus (O) (EV)", 4))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_IV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.05", "Super Bus (O) (IV)", 5))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_LuV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.06", "Super Bus (O) (LuV)", 6))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_ZPM.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.07", "Super Bus (O) (ZPM)", 7))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_UV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.08", "Super Bus (O) (UV)", 8))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_MAX.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID, "hatch.superbus.output.tier.09", "Super Bus (O) (UHV)", 9))
+ .getStackForm(1L));
+ }
+
+ private static GT_MetaTileEntity_SuperBus_Input makeInputBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_SuperBus_Input(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static GT_MetaTileEntity_SuperBus_Output makeOutputBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_SuperBus_Output(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static GT_MetaTileEntity_ChiselBus makeChiselBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_ChiselBus(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static void run4() {
+ int aID = 31778; // 31778 - 31780
+
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_LV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.01", "Chisel Bus I", 1)).getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_MV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.02", "Chisel Bus II", 2)).getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_HV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.03", "Chisel Bus III", 3)).getStackForm(1L));
+
+ }
+
+ private static void run6() {
+ int aID = 31781; // 31781-31784
+
+ GregtechItemList.GT_MetaTileEntity_Solidifier_I.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.05", "Solidifier Hatch I", 5)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_II.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.06", "Solidifier Hatch II", 6)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_III.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.07", "Solidifier Hatch III", 7)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_IV.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID, "hatch.solidifier.tier.08", "Solidifier Hatch IV", 8)
+ .getStackForm(1L));
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java
new file mode 100644
index 0000000000..7a8c160feb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java
@@ -0,0 +1,19 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_Cyclotron;
+
+public class GregtechCyclotron {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering COMET Cyclotron.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.COMET_Cyclotron.set(
+ new GregtechMetaTileEntity_Cyclotron(828, "cyclotron.tier.single", "COMET - Compact Cyclotron", 6)
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java
new file mode 100644
index 0000000000..4fccef139e
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java
@@ -0,0 +1,199 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT;
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL;
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TierEU;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialDehydrator;
+
+public class GregtechDehydrator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Chemical Dehydrators.");
+ if (CORE.ConfigSwitches.enableMachine_Dehydrators) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ ItemStack coilT1 = new ItemStack(ModItems.itemDehydratorCoil, 1, 0);
+ ItemStack coilT2 = new ItemStack(ModItems.itemDehydratorCoil, 1, 1);
+ ItemStack coilT3 = new ItemStack(ModItems.itemDehydratorCoil, 1, 2);
+ ItemStack coilT4 = new ItemStack(ModItems.itemDehydratorCoil, 1, 3);
+
+ // Make some coils by wrapping wire around a spool.
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Bronze, 1))
+ .itemOutputs(coilT1)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Steel, 1))
+ .itemOutputs(coilT2)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 2),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.StainlessSteel, 1))
+ .itemOutputs(coilT3)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 3),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Titanium, 1))
+ .itemOutputs(coilT4)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_EV / 2)
+ .addTo(assemblerRecipes);
+
+ // Basic
+ GregtechItemList.GT_Dehydrator_MV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 911,
+ "machine.dehydrator.tier.00",
+ "Basic Dehydrator I",
+ 2,
+ new String[] { "This dehydrates your Grapes into Raisins.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E',
+ OrePrefixes.wireFine.get(Materials.RedAlloy), 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Copper), 'G', OrePrefixes.gearGt.get(Materials.Steel) })
+ .setRecipeCatalystPriority(6)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_HV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 912,
+ "machine.dehydrator.tier.01",
+ "Basic Dehydrator II",
+ 3,
+ new String[] { "This dehydrates your Grapes into Raisins.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E',
+ OrePrefixes.wireFine.get(Materials.Electrum), 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Silver), 'G', ALLOY.POTIN.getGear(1) })
+ .setRecipeCatalystPriority(5)
+ .getStackForm(1L));
+
+ // Chemical
+ GregtechItemList.GT_Dehydrator_EV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 813,
+ "advancedmachine.dehydrator.tier.01",
+ "Chemical Dehydrator I",
+ 4,
+ new String[] { "A hangover is the way your body reacts to dehydration.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT1, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Aluminium), 'G', ALLOY.TUMBAGA.getGear(1) })
+ .setRecipeCatalystPriority(4)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 814,
+ "advancedmachine.dehydrator.tier.02",
+ "Chemical Dehydrator II",
+ 5,
+ new String[] { "A hangover is the way your body reacts to dehydration.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT2, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Tungsten), 'G', ALLOY.INCONEL_690.getGear(1) })
+ .setRecipeCatalystPriority(3)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_LuV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 815,
+ "advancedmachine.dehydrator.tier.03",
+ "Chemical Dehydrator III",
+ 6,
+ new String[] { "You could probably make space icecream with this..", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT3, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Naquadah), 'G', ALLOY.HASTELLOY_N.getGear(1) })
+ .setRecipeCatalystPriority(2)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 816,
+ "advancedmachine.dehydrator.tier.04",
+ "Chemical Dehydrator IV",
+ 7,
+ new String[] { "You can definitely make space icecream with this..", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT4, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Osmium), 'G', ALLOY.ZERON_100.getGear(1) })
+ .setRecipeCatalystPriority(1)
+ .getStackForm(1L));
+
+ // Advanced
+ GregtechItemList.Controller_Vacuum_Furnace.set(
+ new GregtechMetaTileEntity_IndustrialDehydrator(995, "multimachine.adv.vacuumfurnace", "Utupu-Tanuri")
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java
new file mode 100644
index 0000000000..4aebd8a7b5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java
@@ -0,0 +1,149 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOreDictNames;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GregtechMetaEnergyBuffer;
+
+public class GregtechEnergyBuffer {
+
+ // Misc Items
+ // public static Item itemBufferCore;
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Energy Buffer Blocks.");
+ run1();
+ }
+
+ private static void run1() {
+
+ // itemBufferCore = new
+ // Item().setUnlocalizedName("itemBufferCore").setCreativeTab(AddToCreativeTab.tabMisc).setTextureName(GTPlusPlus.ID
+ // + ":itemBufferCore");
+
+ // Registry
+ // GameRegistry.registerItem(itemBufferCore, "itemBufferCore");
+ // LanguageRegistry.addName(itemBufferCore, "Buffer Core");
+ // OreDictionary.registerOre("itemBufferCore", itemBufferCore);
+
+ // Energy Buffers
+ GregtechItemList.Energy_Buffer_1by1_ULV.set(
+ new GregtechMetaEnergyBuffer(770, "energybuffer.tier.00", "Ultra Low Voltage Energy Buffer", 0, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_LV.set(
+ new GregtechMetaEnergyBuffer(771, "energybuffer.tier.01", "Low Voltage Energy Buffer", 1, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_MV.set(
+ new GregtechMetaEnergyBuffer(772, "energybuffer.tier.02", "Medium Voltage Energy Buffer", 2, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_HV.set(
+ new GregtechMetaEnergyBuffer(773, "energybuffer.tier.03", "High Voltage Energy Buffer", 3, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_EV.set(
+ new GregtechMetaEnergyBuffer(774, "energybuffer.tier.04", "Extreme Voltage Energy Buffer", 4, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_IV.set(
+ new GregtechMetaEnergyBuffer(775, "energybuffer.tier.05", "Insane Voltage Energy Buffer", 5, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_LuV.set(
+ new GregtechMetaEnergyBuffer(776, "energybuffer.tier.06", "Ludicrous Voltage Energy Buffer", 6, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_ZPM.set(
+ new GregtechMetaEnergyBuffer(777, "energybuffer.tier.07", "ZPM Voltage Energy Buffer", 7, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_UV.set(
+ new GregtechMetaEnergyBuffer(778, "energybuffer.tier.08", "Ultimate Voltage Energy Buffer", 8, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_MAX.set(
+ new GregtechMetaEnergyBuffer(779, "energybuffer.tier.09", "MAX Voltage Energy Buffer", 9, "", 1)
+ .getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_ULV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_ULV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Lead), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_LV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Tin), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_MV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.AnyCopper), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_HV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_HV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Gold), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Aluminium), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Tungsten), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_ZPM.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_ZPM, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_UV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_UV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_MAX.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_MAX, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.SuperconductorUHV), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ /*
+ * GT_ModHandler.addCraftingRecipe( GregtechItemList.Energy_Buffer_1by1_MAX.get(1L, new Object[0]),
+ * GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE |
+ * GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED, new Object[] { "WTW", "WMW",
+ * Character.valueOf('M'), ItemList.Hull_MAX, Character.valueOf('W'),
+ * OrePrefixes.wireGt08.get(Materials.Superconductor), Character.valueOf('T'), GregtechOreDictNames.buffer_core
+ * });
+ */
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java
new file mode 100644
index 0000000000..6117631244
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialVacuumFreezer;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_DistillationTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_EBF;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Fusion_MK4;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Fusion_MK5;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Implosion;
+
+public class GregtechFactoryGradeReplacementMultis {
+
+ public static void run() {
+ run1();
+ }
+
+ private static void run1() {
+ Logger.INFO("Gregtech 5 Content | Registering Advanced GT Multiblock replacements.");
+ GregtechItemList.Machine_Adv_BlastFurnace
+ .set(new GregtechMetaTileEntity_Adv_EBF(963, "multimachine.adv.blastfurnace", "Volcanus").getStackForm(1L));
+ GregtechItemList.Machine_Adv_ImplosionCompressor.set(
+ new GregtechMetaTileEntity_Adv_Implosion(964, "multimachine.adv.implosioncompressor", "Density^2")
+ .getStackForm(1L));
+ GregtechItemList.Industrial_Cryogenic_Freezer.set(
+ new GregtechMetaTileEntity_IndustrialVacuumFreezer(
+ 910,
+ "multimachine.adv.industrialfreezer",
+ "Cryogenic Freezer").getStackForm(1L));
+ GregtechItemList.FusionComputer_UV2.set(
+ new GregtechMetaTileEntity_Adv_Fusion_MK4(965, "fusioncomputer.tier.09", "FusionTech MK IV")
+ .getStackForm(1L));
+ GregtechItemList.FusionComputer_UV3.set(
+ new GregtechMetaTileEntity_Adv_Fusion_MK5(975, "fusioncomputer.tier.10", "FusionTech MK V")
+ .getStackForm(1L));
+
+ // 31021
+ GregtechItemList.Machine_Adv_DistillationTower.set(
+ new GregtechMetaTileEntity_Adv_DistillationTower(
+ 31021,
+ "multimachine.adv.distillationtower",
+ "Dangote Distillus").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java
new file mode 100644
index 0000000000..2e012ee7f9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntityGeothermalGenerator;
+
+public class GregtechGeothermalThermalGenerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Geothermal Engines.");
+ if (CORE.ConfigSwitches.enableMachine_GeothermalEngines) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Geothermal_Engine_EV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 830,
+ "advancedgenerator.geothermalFuel.tier.01",
+ "Basic Geothermal Engine",
+ 4).getStackForm(1L));
+ GregtechItemList.Geothermal_Engine_IV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 831,
+ "advancedgenerator.geothermalFuel.tier.02",
+ "Turbo Geothermal Engine",
+ 5).getStackForm(1L));
+ GregtechItemList.Geothermal_Engine_LuV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 832,
+ "advancedgenerator.geothermalFuel.tier.03",
+ "Vulcan Geothermal Engine",
+ 6).getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('P'),
+ ItemList.Electric_Piston_EV, Character.valueOf('E'), ItemList.Electric_Motor_EV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Ultimate), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Aluminium), Character.valueOf('G'),
+ ALLOY.TANTALLOY_61.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('P'),
+ ItemList.Electric_Piston_IV, Character.valueOf('E'), ItemList.Electric_Motor_IV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Platinum), Character.valueOf('G'), ALLOY.STELLITE.getGear(1) });
+
+ final ItemStack INGREDIENT_1 = CI.electricPiston_LuV;
+ final ItemStack INGREDIENT_2 = CI.electricMotor_LuV;
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('P'),
+ INGREDIENT_1, Character.valueOf('E'), INGREDIENT_2, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Infinite), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Tungsten), Character.valueOf('G'), ALLOY.ZERON_100.getGear(1) });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java
new file mode 100644
index 0000000000..2587cb8524
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java
@@ -0,0 +1,163 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTransformerHiAmp;
+
+public class GregtechHiAmpTransformer {
+
+ public static void run() {
+
+ long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ int mID = 877;
+
+ String mHammerName = "Mallet";
+
+ GregtechItemList.Transformer_HA_LV_ULV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.00",
+ "ULV Hi-Amp Transformer",
+ 0,
+ "LV -> ULV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_MV_LV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.01",
+ "LV Hi-Amp Transformer",
+ 1,
+ "MV -> LV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_HV_MV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.02",
+ "MV Hi-Amp Transformer",
+ 2,
+ "HV -> MV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_EV_HV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.03",
+ "HV Hi-Amp Transformer",
+ 3,
+ "EV -> HV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_IV_EV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.04",
+ "EV Hi-Amp Transformer",
+ 4,
+ "IV -> EV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_LuV_IV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.05",
+ "IV Hi-Amp Transformer",
+ 5,
+ "LuV -> IV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_ZPM_LuV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.06",
+ "LuV Hi-Amp Transformer",
+ 6,
+ "ZPM -> LuV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_UV_ZPM.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.07",
+ "ZPM Hi-Amp Transformer",
+ 7,
+ "UV -> ZPM (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_MAX_UV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.08",
+ "UV Hi-Amp Transformer",
+ 8,
+ "UHV -> UV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ ItemStack mItem_1;
+ ItemStack mItem_2;
+ ItemStack mItem_3;
+
+ mItem_1 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 3,
+ 1);
+ mItem_2 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 4,
+ 1);
+ mItem_3 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 9,
+ 1);
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_LV_ULV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_LV_ULV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Tin), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_MV_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_MV_LV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.AnyCopper), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_HV_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_HV_MV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Gold), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_EV_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_EV_HV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Aluminium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Gold), Character.valueOf('K'), ItemList.Casing_Coil_Cupronickel });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_IV_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_IV_EV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Tungsten), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Aluminium), Character.valueOf('K'), ItemList.Casing_Coil_Kanthal });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_LuV_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_LuV_IV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.VanadiumGallium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Tungsten), Character.valueOf('K'), ItemList.Casing_Coil_Nichrome });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_ZPM_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_ZPM_LuV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Naquadah), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.VanadiumGallium), Character.valueOf('K'), mItem_1 });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_UV_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_UV_ZPM,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Naquadah), Character.valueOf('K'), mItem_2 });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_MAX_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_MAX_UV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Bedrockium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), Character.valueOf('K'), mItem_3 });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java
new file mode 100644
index 0000000000..dc176e7356
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialAlloySmelter;
+
+public class GregtechIndustrialAlloySmelter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Alloy Smelter Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_AlloySmelter.set(
+ new GregtechMetaTileEntity_IndustrialAlloySmelter(
+ 31023,
+ "industrialalloysmelter.controller.tier.single",
+ "Zyngen").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java
new file mode 100644
index 0000000000..3de3da7f88
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialArcFurnace;
+
+public class GregtechIndustrialArcFurnace {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Arc Furnace Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ // Industrial Arc Furnace Multiblock
+ GregtechItemList.Industrial_Arc_Furnace.set(
+ new GregtechMetaTileEntity_IndustrialArcFurnace(
+ 862,
+ "industrialarcfurnace.controller.tier.single",
+ "High Current Industrial Arc Furnace").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java
new file mode 100644
index 0000000000..e457575391
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_AlloyBlastSmelter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.mega.GregTechMetaTileEntity_MegaAlloyBlastSmelter;
+
+public class GregtechIndustrialBlastSmelter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Alloy Blast Smelter Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Alloy Blast Smelter Multiblock
+ GregtechItemList.Industrial_AlloyBlastSmelter.set(
+ new GregtechMetaTileEntity_AlloyBlastSmelter(
+ 810,
+ "industrialsalloyamelter.controller.tier.single",
+ "Alloy Blast Smelter").getStackForm(1L));
+ GregtechItemList.Mega_AlloyBlastSmelter.set(
+ new GregTechMetaTileEntity_MegaAlloyBlastSmelter(
+ 31150,
+ "industrialsalloyamelter.controller.tier.mega",
+ "Mega Alloy Blast Smelter").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java
new file mode 100644
index 0000000000..bc51aaae51
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCentrifuge;
+
+public class GregtechIndustrialCentrifuge {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Centrifuge Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Centrifuge Multiblock
+ GregtechItemList.Industrial_Centrifuge.set(
+ new GregtechMetaTileEntity_IndustrialCentrifuge(
+ 790,
+ "industrialcentrifuge.controller.tier.single",
+ "Industrial Centrifuge").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java
new file mode 100644
index 0000000000..ae0e2483cf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaTileEntity_AutoChisel;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialChisel;
+
+public class GregtechIndustrialChisel {
+
+ public static void run() {
+ GregtechItemList.GT_Chisel_LV.set(
+ new GregtechMetaTileEntity_AutoChisel(31066, "chisel.tier.01", "Basic Auto-Chisel", 1).getStackForm(1L));
+ GregtechItemList.GT_Chisel_MV.set(
+ new GregtechMetaTileEntity_AutoChisel(31067, "chisel.tier.02", "Advanced Auto-Chisel", 2).getStackForm(1L));
+ GregtechItemList.GT_Chisel_HV.set(
+ new GregtechMetaTileEntity_AutoChisel(31068, "chisel.tier.03", "Precision Auto-Chisel", 3)
+ .getStackForm(1L));
+
+ GregtechItemList.Controller_IndustrialAutoChisel.set(
+ new GregtechMetaTileEntity_IndustrialChisel(
+ 31069,
+ "multimachine.adv.chisel",
+ "Industrial 3D Copying Machine").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java
new file mode 100644
index 0000000000..af941e58db
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCokeOven;
+
+public class GregtechIndustrialCokeOven {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Coke Oven Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Centrifuge Multiblock
+ GregtechItemList.Industrial_CokeOven.set(
+ new GregtechMetaTileEntity_IndustrialCokeOven(
+ 791,
+ "industrialcokeoven.controller.tier.single",
+ "Industrial Coke Oven").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java
new file mode 100644
index 0000000000..c5ff4a9928
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCuttingMachine;
+
+public class GregtechIndustrialCuttingFactory {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Cutting Factory Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Wire Factory Multiblock
+ GregtechItemList.Industrial_CuttingFactoryController.set(
+ new GregtechMetaTileEntity_IndustrialCuttingMachine(
+ 992,
+ "industrialcuttingmachine.controller.tier.01",
+ "Cutting Factory Controller").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java
new file mode 100644
index 0000000000..a114aaf3cd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialElectrolyzer;
+
+public class GregtechIndustrialElectrolyzer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Electrolyzer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Electrolyzer Multiblock
+ GregtechItemList.Industrial_Electrolyzer.set(
+ new GregtechMetaTileEntity_IndustrialElectrolyzer(
+ 796,
+ "industrialelectrolyzer.controller.tier.single",
+ "Industrial Electrolyzer").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java
new file mode 100644
index 0000000000..222a3e7689
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_ElementalDataOrbHolder;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_ElementalDuplicator;
+
+public class GregtechIndustrialElementDuplicator {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Elemental Duplicator Multiblock.");
+
+ GregtechItemList.Controller_ElementalDuplicator.set(
+ new GregtechMTE_ElementalDuplicator(31050, "gtpp.multimachine.replicator", "Elemental Duplicator")
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Input_Elemental_Duplicator.set(
+ new GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(
+ 31051,
+ "hatch.input_bus.elementalorbholder",
+ "Data Orb Repository",
+ 7).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java
new file mode 100644
index 0000000000..817858a4a0
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialExtruder;
+
+public class GregtechIndustrialExtruder {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Extrusion Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Presser Multiblock
+ GregtechItemList.Industrial_Extruder.set(
+ new GregtechMetaTileEntity_IndustrialExtruder(
+ 859,
+ "industrialextruder.controller.tier.single",
+ "Industrial Extrusion Machine").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java
new file mode 100644
index 0000000000..182662bfbc
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_IndustrialFishingPond;
+
+public class GregtechIndustrialFishPond {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Fishing Pond Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_FishingPond.set(
+ new GregtechMetaTileEntity_IndustrialFishingPond(
+ 829,
+ "industrial.fishpond.controller.tier.single",
+ "Zhuhai - Fishing Port").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java
new file mode 100644
index 0000000000..e25ef2fcae
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialFluidHeater;
+
+public class GregtechIndustrialFluidHeater {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Thermal Centrifuge Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_IndustrialFluidHeater.set(
+ new GregtechMetaTileEntity_IndustrialFluidHeater(
+ 31077,
+ "industrialfluidheater.controller.tier.single",
+ "Thermic Heating Device").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java
new file mode 100644
index 0000000000..a73b9fd873
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialForgeHammer;
+
+public class GregtechIndustrialForgeHammer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Forge Hammer Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_IndustrialForgeHammer.set(
+ new GregtechMetaTileEntity_IndustrialForgeHammer(
+ 31075,
+ "industrialhammer.controller.tier.single",
+ "Industrial Sledgehammer").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java
new file mode 100644
index 0000000000..e45f593c7a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_Refinery;
+
+public class GregtechIndustrialFuelRefinery {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Fuel Processing and Refinery Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_NuclearFuelRefinery) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Maceration Stack Multiblock
+ GregtechItemList.Industrial_FuelRefinery.set(
+ new GregtechMetaTileEntity_Refinery(
+ 835,
+ "industrialrefinery.controller.tier.single",
+ "Reactor Fuel Processing Plant").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java
new file mode 100644
index 0000000000..0912660cc1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMacerator;
+
+public class GregtechIndustrialMacerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Maceration Stack Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Maceration Stack Multiblock
+ GregtechItemList.Industrial_MacerationStack.set(
+ new GregtechMetaTileEntity_IndustrialMacerator(
+ 797,
+ "industrialmacerator.controller.tier.single",
+ "Maceration Stack Controller").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java
new file mode 100644
index 0000000000..92b7182426
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_MassFabricator;
+
+public class GregtechIndustrialMassFabricator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Matter Fabricator Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_MatterFabricator) {
+ generateRecipes();
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Matter Fabricator Multiblock
+ GregtechItemList.Industrial_MassFab.set(
+ new GregtechMetaTileEntity_MassFabricator(
+ 799,
+ "industrialmassfab.controller.tier.single",
+ "Matter Fabrication CPU").getStackForm(1L));
+ }
+
+ private static void generateRecipes() {
+
+ // Generate Scrap->UUA Recipes
+
+ // Basic UUA1
+ GT_Recipe UUA_From_Scrap = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(9), ItemUtils.getSimpleStack(getScrapPile(), 9) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUAmplifier.getFluid(1) },
+ 9 * 20,
+ 32,
+ 0);
+ // Basic UUA2
+ GT_Recipe UUA_From_ScrapBoxes = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getSimpleStack(getScrapBox(), 1) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUAmplifier.getFluid(1) },
+ 9 * 20,
+ 32,
+ 0);
+
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(UUA_From_Scrap);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(UUA_From_ScrapBoxes);
+
+ // Basic UUM
+ GT_Recipe generateUUM_LV = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(1) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUMatter.getFluid(16) },
+ 160 * 20,
+ 4096,
+ 0);
+
+ // Basic UUM
+ GT_Recipe generateUUMFromUUA_LV = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(2) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(16) },
+ new FluidStack[] { Materials.UUMatter.getFluid(16) },
+ 40 * 20,
+ 4096,
+ 0);
+
+ // Advanced UUM
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(3) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUMatter.getFluid(256) },
+ 160 * 20,
+ 65536,
+ 0));
+
+ // Advanced UUM
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(4) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(256) },
+ new FluidStack[] { Materials.UUMatter.getFluid(256) },
+ 40 * 20,
+ 65536,
+ 0));
+
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(generateUUM_LV);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(generateUUMFromUUA_LV);
+
+ Logger.INFO(
+ "Generated " + GTPPRecipeMaps.multiblockMassFabricatorRecipes.getAllRecipes()
+ .size() + " Matter Fabricator recipes.");
+ }
+
+ public static ItemStack getScrapPile() {
+ return ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrap"));
+ }
+
+ public static ItemStack getScrapBox() {
+ return ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrapbox"));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java
new file mode 100644
index 0000000000..07d0432213
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMixer;
+
+public class GregtechIndustrialMixer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Mixer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Mixer Multiblock
+ GregtechItemList.Industrial_Mixer.set(
+ new GregtechMetaTileEntity_IndustrialMixer(
+ 811,
+ "industrialmixer.controller.tier.single",
+ "Industrial Mixing Machine").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java
new file mode 100644
index 0000000000..9ba8810c55
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMultiMachine;
+
+public class GregtechIndustrialMultiMachine {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Multi-Machine Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_MultiMachine.set(
+ new GregtechMetaTileEntity_IndustrialMultiMachine(
+ 860,
+ "industrialmultimachine.controller.tier.single",
+ "Large Processing Factory").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java
new file mode 100644
index 0000000000..60d93e4cb7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialPlatePress;
+
+public class GregtechIndustrialPlatePress {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Press Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Presser Multiblock
+ GregtechItemList.Industrial_PlatePress.set(
+ new GregtechMetaTileEntity_IndustrialPlatePress(
+ 792,
+ "industrialbender.controller.tier.single",
+ "Industrial Material Press").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java
new file mode 100644
index 0000000000..3e9efb38cf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_IndustrialRockBreaker;
+
+public class GregtechIndustrialRockBreaker {
+
+ public static void run() {
+ GregtechItemList.Controller_IndustrialRockBreaker.set(
+ new GregtechMetaTileEntity_IndustrialRockBreaker(
+ 31065,
+ "industrialrockcrusher.controller.tier.single",
+ "Boldarnator").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java
new file mode 100644
index 0000000000..87f8cc5e44
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialSifter;
+
+public class GregtechIndustrialSifter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Sifter Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialSifter) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_Sifter.set(
+ new GregtechMetaTileEntity_IndustrialSifter(
+ 840,
+ "industrialsifter.controller.tier.single",
+ "Large Sifter Control Block").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java
new file mode 100644
index 0000000000..cf8b585ae9
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialThermalCentrifuge;
+
+public class GregtechIndustrialThermalCentrifuge {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Thermal Centrifuge Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_ThermalCentrifuge.set(
+ new GregtechMetaTileEntity_IndustrialThermalCentrifuge(
+ 849,
+ "industrialthermalcentrifuge.controller.tier.single",
+ "Large Thermal Refinery").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java
new file mode 100644
index 0000000000..82a0369516
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class GregtechIndustrialTreeFarm {
+
+ public static void run() {
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ Logger.INFO("Gregtech5u Content | Registering Tree Farm Multiblock.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_TreeFarm.set(
+ new GregtechMetaTileEntityTreeFarm(836, "treefarm.controller.tier.single", "Tree Growth Simulator")
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java
new file mode 100644
index 0000000000..982695b02c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialWashPlant;
+
+public class GregtechIndustrialWashPlant {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Wash Plant Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_WashPlant.set(
+ new GregtechMetaTileEntity_IndustrialWashPlant(
+ 850,
+ "industrialwashplant.controller.tier.single",
+ "Ore Washing Plant").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java
new file mode 100644
index 0000000000..853013834b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialWireMill;
+
+public class GregtechIndustrialWiremill {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Wire Factory Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Wire Factory Multiblock
+ GregtechItemList.Industrial_WireFactory.set(
+ new GregtechMetaTileEntity_IndustrialWireMill(
+ 798,
+ "industrialwiremill.controller.tier.single",
+ "Wire Factory Controller").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java
new file mode 100644
index 0000000000..d1719d4b74
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_MillingBalls;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IsaMill;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_FrothFlotationCell;
+
+public class GregtechIsaMill {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Milling Content.");
+
+ GregtechItemList.Controller_IsaMill.set(
+ new GregtechMetaTileEntity_IsaMill(31027, "gtpp.multimachine.isamill", "IsaMill Grinding Machine")
+ .getStackForm(1L));
+ GregtechItemList.Controller_Flotation_Cell.set(
+ new GregtechMTE_FrothFlotationCell(31028, "gtpp.multimachine.flotationcell", "Flotation Cell Regulator")
+ .getStackForm(1L));
+
+ // Milling Ball Bus
+ GregtechItemList.Bus_Milling_Balls
+ .set((new GT_MetaTileEntity_Hatch_MillingBalls(31029, "hatch.milling", "Ball Housing")).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java
new file mode 100644
index 0000000000..3a77c3f569
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_SpargeTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_NuclearReactor;
+
+public class GregtechLFTR {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Liquid Fluorine Thorium Reactor [LFTR].");
+ if (CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // LFTR
+ GregtechItemList.ThoriumReactor.set(
+ new GregtechMTE_NuclearReactor(751, "lftr.controller.single", "Thorium Reactor [LFTR]").getStackForm(1L));
+ // Reactor Processing Units
+ GregtechItemList.ReactorProcessingUnit_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31031,
+ "rpu.tier.01",
+ "Reactor Processing Unit I",
+ 5,
+ new String[] { "Processes Nuclear things", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "REACTOR_PROCESSING_UNIT",
+ null).getStackForm(1L));
+ GregtechItemList.ReactorProcessingUnit_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31032,
+ "rpu.tier.02",
+ "Reactor Processing Unit II",
+ 7,
+ new String[] { "Processes Nuclear things", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "REACTOR_PROCESSING_UNIT",
+ null).getStackForm(1L));
+ // Cold Traps
+ GregtechItemList.ColdTrap_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31033,
+ "coldtrap.tier.01",
+ "Cold Trap I",
+ 5,
+ new String[] { "Just like the Arctic", "Does not require ice cubes", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.coldTrapRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "COLD_TRAP",
+ null).getStackForm(1L));
+ GregtechItemList.ColdTrap_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31034,
+ "coldtrap.tier.02",
+ "Cold Trap II",
+ 7,
+ new String[] { "Just like the Arctic", "Does not require ice cubes", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.coldTrapRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "COLD_TRAP",
+ null).getStackForm(1L));
+ // Sparge Tower
+ GregtechItemList.Controller_Sparge_Tower.set(
+ new GregtechMetaTileEntity_SpargeTower(31035, "sparge.controller.single", "Sparge Tower Controller")
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java
new file mode 100644
index 0000000000..b75573a9cf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java
@@ -0,0 +1,48 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.GoodGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_HeatExchanger;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Gas;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Plasma;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_SCSteam;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_SHSteam;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Steam;
+
+public class GregtechLargeTurbinesAndHeatExchanger {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Larger Turbines & Extra Large Heat Exchanger.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Large_Steam_Turbine.set(
+ new GT_MTE_LargeTurbine_Steam(865, "multimachine.largerturbine", "XL Turbo Steam Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_HPSteam_Turbine.set(
+ new GT_MTE_LargeTurbine_SHSteam(866, "multimachine.largerhpturbine", "XL Turbo HP Steam Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_Gas_Turbine.set(
+ new GT_MTE_LargeTurbine_Gas(31073, "multimachine.largergasturbine", "XL Turbo Gas Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_Plasma_Turbine.set(
+ new GT_MTE_LargeTurbine_Plasma(31074, "multimachine.largerplasmaturbine", "XL Turbo Plasma Turbine")
+ .getStackForm(1L));
+ if (GoodGenerator.isModLoaded()) {
+ GregtechItemList.Large_SCSteam_Turbine.set(
+ new GT_MTE_LargeTurbine_SCSteam(31076, "multimachine.largerscturbine", "XL Turbo SC Steam Turbine")
+ .getStackForm(1L));
+ }
+ GregtechItemList.Hatch_Turbine_Rotor
+ .set(new GT_MetaTileEntity_Hatch_Turbine(30010, "hatch.turbine", "Rotor Assembly", 8).getStackForm(1L));
+ GregtechItemList.XL_HeatExchanger.set(
+ new GregtechMetaTileEntity_Adv_HeatExchanger(
+ 31079,
+ "multimachine.reallybigheatexchanger",
+ "Whakawhiti Wera XL").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java
new file mode 100644
index 0000000000..ebb0bde1cf
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMolecularTransformer;
+
+public class GregtechMolecularTransformer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Molecular Transformer Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_MolecularTransformer.set(
+ new GregtechMetaTileEntity_IndustrialMolecularTransformer(
+ 31072,
+ "moleculartransformer.controller.tier.single",
+ "Molecular Transformer").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java
new file mode 100644
index 0000000000..0122f525c6
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_NuclearSaltProcessingPlant;
+
+public class GregtechNuclearSaltProcessingPlant {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Nuclear Salt Processing Plant Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_NuclearSaltProcessingPlant) {
+ // Nuclear Salt Processing Plant Multiblock
+ GregtechItemList.Nuclear_Salt_Processing_Plant.set(
+ new GregtechMetaTileEntity_NuclearSaltProcessingPlant(
+ 749,
+ "nuclearsaltprocessingplant.controller.tier.single",
+ "Nuclear Salt Processing Plant").getStackForm(1L));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java
new file mode 100644
index 0000000000..fc62698789
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaAtmosphericReconditioner;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionCreator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionDetector;
+
+public class GregtechPollutionDevices {
+
+ public static void run() {
+ if (PollutionUtils.isPollutionEnabled()) {
+ Logger.INFO("Gregtech5u Content | Registering Anti-Pollution Devices.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ // 759
+ GregtechItemList.Pollution_Detector.set(
+ new GregtechMetaPollutionDetector(
+ 756,
+ "pollutiondetector.01.tier.single",
+ "Pollution Detection Device",
+ 0,
+ "Tells you if you're living in Gwalior yet.",
+ 0).getStackForm(1L));
+ GregtechItemList.Pollution_Creator.set(
+ new GregtechMetaPollutionCreator(
+ 951,
+ "pollutioncreator.01.tier.single",
+ "Smog Device",
+ 4,
+ "Polluting the skies.",
+ 0).getStackForm(1L));
+
+ GregtechItemList.Pollution_Cleaner_LV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 758,
+ "pollutioncleaner.02.tier.single",
+ "Upgraded Pollution Scrubber",
+ 1).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_MV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 759,
+ "pollutioncleaner.03.tier.single",
+ "Advanced Pollution Scrubber",
+ 2).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_HV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 760,
+ "pollutioncleaner.04.tier.single",
+ "Precision Pollution Scrubber",
+ 3).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_EV.set(
+ new GregtechMetaAtmosphericReconditioner(761, "pollutioncleaner.05.tier.single", "Air Recycler", 4)
+ .getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_IV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 762,
+ "pollutioncleaner.06.tier.single",
+ "Upgraded Air Recycler",
+ 5).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_LuV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 763,
+ "pollutioncleaner.07.tier.single",
+ "Advanced Air Recycler",
+ 6).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_ZPM.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 764,
+ "pollutioncleaner.08.tier.single",
+ "Precision Air Recycler",
+ 7).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_UV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 765,
+ "pollutioncleaner.09.tier.single",
+ "Atmospheric Cleaner",
+ 8).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_MAX.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 766,
+ "pollutioncleaner.10.tier.single",
+ "Biosphere Cleanser",
+ 9).getStackForm(1L));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java
new file mode 100644
index 0000000000..3fd906b261
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBattery;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechPowerSubStation {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Power Substation Node.");
+ if (CORE.ConfigSwitches.enableMultiblock_PowerSubstation) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Steam Condensors
+ GregtechItemList.PowerSubStation.set(
+ new GregtechMetaTileEntity_PowerSubStationController(
+ 812,
+ "substation.01.input.single",
+ "Power Station Control Node").getStackForm(1L));
+ int tID = 886;
+ GregtechItemList.Hatch_Input_Battery_MV.set(
+ new GT_MetaTileEntity_Hatch_InputBattery(tID++, "hatch.input_battery.tier.00", "Charging Bus (MV)", 2)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Input_Battery_EV.set(
+ new GT_MetaTileEntity_Hatch_InputBattery(tID++, "hatch.input_battery.tier.01", "Charging Bus (EV)", 4)
+ .getStackForm(1L));
+
+ GregtechItemList.Hatch_Output_Battery_MV.set(
+ new GT_MetaTileEntity_Hatch_OutputBattery(tID++, "hatch.output_battery.tier.00", "Discharging Bus (MV)", 2)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Output_Battery_EV.set(
+ new GT_MetaTileEntity_Hatch_OutputBattery(tID++, "hatch.output_battery.tier.01", "Discharging Bus (EV)", 4)
+ .getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Input_Battery_MV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "C", "M", 'M', ItemList.Hull_MV, 'C', ItemList.Battery_Buffer_2by2_MV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Input_Battery_EV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "C", "M", 'M', ItemList.Hull_EV, 'C', ItemList.Battery_Buffer_4by4_EV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Output_Battery_MV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "M", "C", 'M', ItemList.Hull_MV, 'C', ItemList.Battery_Buffer_2by2_MV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Output_Battery_EV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "M", "C", 'M', ItemList.Hull_EV, 'C', ItemList.Battery_Buffer_4by4_EV });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java
new file mode 100644
index 0000000000..5943f3bd28
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_QuantumForceTransformer;
+
+public class GregtechQuantumForceTransformer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Quantum Force Transformer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_QuantumForceTransformer) {
+ GregtechItemList.QuantumForceTransformer.set(
+ new GregtechMetaTileEntity_QuantumForceTransformer(
+ 31151,
+ "quantumforcetransformer.controller.tier.single",
+ "Quantum Force Transformer").getStackForm(1L));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java
new file mode 100644
index 0000000000..5eb148a287
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntity_RTG;
+
+public class GregtechRTG {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering RTG.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.RTG.set(
+ new GregtechMetaTileEntity_RTG(
+ 869,
+ "basicgenerator.rtg.tier.01",
+ "Radioisotope Thermoelectric Generator",
+ 3).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java
new file mode 100644
index 0000000000..b2f53d46ba
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java
@@ -0,0 +1,98 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntityRocketFuelGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_LargeRocketEngine;
+
+public class GregtechRocketFuelGenerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Rocket Engines.");
+ if (CORE.ConfigSwitches.enableMachine_RocketEngines) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_RocketEngine.set(
+ new GregtechMetaTileEntity_LargeRocketEngine(
+ 996,
+ "gtpp.multimachine.rocketengine",
+ "Rocketdyne F-1A Engine").getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Controller_RocketEngine.get(1L),
+ CI.bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Machine_Multi_DieselEngine.get(1), 'P',
+ ItemList.Electric_Piston_IV, 'E', ItemList.Field_Generator_EV, 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'W', OrePrefixes.cableGt08.get(Materials.Platinum), 'G',
+ ALLOY.MARAGING350.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_RocketEngine.get(1L),
+ CI.bitsd,
+ new Object[] { "PhP", "RFR", "PWP", 'R', OrePrefixes.pipeMedium.get(Materials.TungstenSteel), 'F',
+ ItemList.Casing_RobustTungstenSteel, 'P', ALLOY.NITINOL_60.getGear(1), 'W',
+ OrePrefixes.stickLong.get(Materials.TungstenSteel) });
+
+ GregtechItemList.Rocket_Engine_EV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 793,
+ "advancedgenerator.rocketFuel.tier.01",
+ "Basic Rocket Engine",
+ 4).getStackForm(1L));
+ GregtechItemList.Rocket_Engine_IV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 794,
+ "advancedgenerator.rocketFuel.tier.02",
+ "Advanced Rocket Engine",
+ 5).getStackForm(1L));
+ GregtechItemList.Rocket_Engine_LuV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 795,
+ "advancedgenerator.rocketFuel.tier.03",
+ "Turbo Rocket Engine",
+ 6).getStackForm(1L));
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('P'),
+ ItemList.Electric_Piston_EV, Character.valueOf('E'), ItemList.Electric_Motor_EV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Elite), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Aluminium), Character.valueOf('G'),
+ ALLOY.TANTALLOY_61.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('P'),
+ ItemList.Electric_Piston_IV, Character.valueOf('E'), ItemList.Electric_Motor_IV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Master), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Platinum), Character.valueOf('G'), ALLOY.STELLITE.getGear(1) });
+ final ItemStack INGREDIENT_1 = CI.electricPiston_LuV;
+ final ItemStack INGREDIENT_2 = CI.electricMotor_LuV;
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('P'),
+ INGREDIENT_1, Character.valueOf('E'), INGREDIENT_2, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Ultimate), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Tungsten), Character.valueOf('G'), ALLOY.ZERON_100.getGear(1) });
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java
new file mode 100644
index 0000000000..be349d2a81
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_SemiFluidGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_LargeSemifluidGenerator;
+
+public class GregtechSemiFluidgenerators {
+
+ public static void run() {
+ GregtechItemList.Generator_SemiFluid_LV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 837,
+ "basicgenerator.semifluid.tier.01",
+ "Basic Semi-Fluid Generator",
+ 1).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_MV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 838,
+ "basicgenerator.semifluid.tier.02",
+ "Advanced Semi-Fluid Generator",
+ 2).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_HV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 839,
+ "basicgenerator.semifluid.tier.03",
+ "Turbo Semi-Fluid Generator",
+ 3).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_EV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 993,
+ "basicgenerator.semifluid.tier.04",
+ "Turbo Semi-Fluid Generator II",
+ 4).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_IV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 994,
+ "basicgenerator.semifluid.tier.05",
+ "Turbo Semi-Fluid Generator III",
+ 5).getStackForm(1L));
+ GregtechItemList.Controller_LargeSemifluidGenerator.set(
+ new GregtechMetaTileEntity_LargeSemifluidGenerator(
+ 31026,
+ "gtpp.multimachine.semifluidgenerator",
+ "Large Semifluid Burner").getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java
new file mode 100644
index 0000000000..15d54a7c6d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java
@@ -0,0 +1,166 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
+import com.google.common.collect.ImmutableList;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.data.Quad;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GregtechSimpleWasher {
+
+ public static void run() {
+ if (CORE.ConfigSwitches.enableMachine_SimpleWasher) {
+ generateDirtyDustRecipes();
+ generateDirtyCrushedRecipes();
+ // Register the Simple Washer Entity.
+
+ // The unlocalized names here have inconsistent numbering because there only used to be a simple washer
+ // every other tier, and they were numbered numerically. In order to maintain backwards compatibility,
+ // the tier numbers need to stay as they were.
+ List<Quad<GregtechItemList, Integer, String, String>> washers = ImmutableList.of(
+ new Quad<>(GregtechItemList.SimpleDustWasher_LV, 31790, "simplewasher.01.tier.06", "Simple Washer I"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_MV, 31017, "simplewasher.01.tier.02", "Simple Washer II"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_HV, 31791, "simplewasher.01.tier.07", "Simple Washer III"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_EV, 31018, "simplewasher.01.tier.03", "Simple Washer IV"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_IV, 31792, "simplewasher.01.tier.08", "Simple Washer V"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_LuV, 31019, "simplewasher.01.tier.04", "Simple Washer VI"),
+ new Quad<>(
+ GregtechItemList.SimpleDustWasher_ZPM,
+ 31793,
+ "simplewasher.01.tier.09",
+ "Simple Washer VII"),
+ new Quad<>(
+ GregtechItemList.SimpleDustWasher_UV,
+ 31020,
+ "simplewasher.01.tier.05",
+ "Simple Washer VIII"));
+
+ GregtechItemList.SimpleDustWasher_ULV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 767,
+ "simplewasher.01.tier.01",
+ "Deprecated ULV Simple Washer",
+ 0,
+ new String[] { "It's like an automatic Cauldron for washing dusts.",
+ "§cDEPRECATED: No recipe.§r Make a Simple Washer I.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.simpleWasherRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIMPLE_WASHER",
+ null).setRecipeCatalystPriority(-11)
+ .getStackForm(1L));
+
+ for (int i = 0; i < washers.size(); i++) {
+ Quad<GregtechItemList, Integer, String, String> washer = washers.get(i);
+ int tier = i + 1;
+ washer.getKey()
+ .set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ washer.getValue_1(),
+ washer.getValue_2(),
+ washer.getValue_3(),
+ tier,
+ new String[] { "It's like an automatic Cauldron for washing dusts.",
+ CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.simpleWasherRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIMPLE_WASHER",
+ null).setRecipeCatalystPriority(-tier)
+ .getStackForm(1L));
+ }
+ }
+ }
+
+ private static boolean generateDirtyDustRecipes() {
+ int mRecipeCount = 0;
+ // Generate Recipe Map for the Dust Washer.
+ ItemStack dustClean;
+ ItemStack dustDirty;
+ ItemStack dustPure;
+ for (Materials v : Materials.values()) {
+ if (v == Materials.Platinum || v == Materials.Osmium
+ || v == Materials.Iridium
+ || v == Materials.Palladium) {
+ continue;
+ }
+
+ dustClean = GT_OreDictUnificator.get(OrePrefixes.dust, v, 1L);
+ dustDirty = GT_OreDictUnificator.get(OrePrefixes.dustImpure, v, 1L);
+ dustPure = GT_OreDictUnificator.get(OrePrefixes.dustPure, v, 1L);
+ addSimpleWashRecipe(dustDirty, dustClean);
+ addSimpleWashRecipe(dustPure, dustClean);
+ }
+
+ for (Werkstoff v : Werkstoff.werkstoffHashSet) {
+ dustClean = v.hasItemType(OrePrefixes.dust) ? v.get(OrePrefixes.dust) : null;
+ dustDirty = v.hasItemType(OrePrefixes.dustImpure) ? v.get(OrePrefixes.dustImpure) : null;
+ dustPure = v.hasItemType(OrePrefixes.dustPure) ? v.get(OrePrefixes.dustPure) : null;
+ addSimpleWashRecipe(dustDirty, dustClean);
+ addSimpleWashRecipe(dustPure, dustClean);
+ }
+
+ return GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size() > mRecipeCount;
+ }
+
+ private static boolean generateDirtyCrushedRecipes() {
+ int mRecipeCount = GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size();
+ // Generate Recipe Map for the Dust Washer.
+ ItemStack crushedClean;
+ ItemStack crushedDirty;
+ for (Materials v : Materials.values()) {
+ crushedClean = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, v, 1L);
+ crushedDirty = GT_OreDictUnificator.get(OrePrefixes.crushed, v, 1L);
+ addSimpleWashRecipe(crushedDirty, crushedClean);
+ }
+
+ for (Werkstoff v : Werkstoff.werkstoffHashSet) {
+ crushedClean = v.hasItemType(OrePrefixes.crushedPurified) ? v.get(OrePrefixes.crushedPurified) : null;
+ crushedDirty = v.hasItemType(OrePrefixes.crushed) ? v.get(OrePrefixes.crushed) : null;
+ addSimpleWashRecipe(crushedDirty, crushedClean);
+ }
+
+ return GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size() > mRecipeCount;
+ }
+
+ private static void addSimpleWashRecipe(ItemStack aInput, ItemStack aOutput) {
+ if (aInput != null && aOutput != null) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("water", 100) },
+ new FluidStack[] {},
+ 5,
+ 8,
+ 0);
+ GTPPRecipeMaps.simpleWasherRecipes.addRecipe(aRecipe);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java
new file mode 100644
index 0000000000..466e56181b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_SolarTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.misc.TileEntitySolarHeater;
+
+public class GregtechSolarTower {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Solar Tower.");
+ run1();
+ }
+
+ private static void run1() {
+ // Solar Tower
+ GregtechItemList.Industrial_Solar_Tower.set(
+ new GregtechMetaTileEntity_SolarTower(863, "solartower.controller.tier.single", "Solar Tower")
+ .getStackForm(1L));
+ GregtechItemList.Solar_Tower_Reflector.set(
+ new TileEntitySolarHeater(
+ 864,
+ "solarreflector.simple.single",
+ "Solar Reflector",
+ 8,
+ "Part of the Clean Green energy movement",
+ 0).getStackForm(1L));
+
+ // NEI recipe
+ GTPPRecipeMaps.solarTowerRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ new FluidStack[] { MISC_MATERIALS.SOLAR_SALT_COLD.getFluidStack(1000) },
+ new FluidStack[] { MISC_MATERIALS.SOLAR_SALT_HOT.getFluidStack(1000) },
+ 0,
+ 0,
+ 0);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java
new file mode 100644
index 0000000000..9c3a73092b
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusOutput;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam.GregtechMetaTileEntity_SteamCompressor;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam.GregtechMetaTileEntity_SteamMacerator;
+
+public class GregtechSteamMultis {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Steam Multiblocks.");
+
+ GregtechItemList.Controller_SteamMaceratorMulti.set(
+ new GregtechMetaTileEntity_SteamMacerator(31041, "gtpp.multimachine.steam.macerator", "Steam Grinder")
+ .getStackForm(1L));
+ GregtechItemList.Controller_SteamCompressorMulti.set(
+ new GregtechMetaTileEntity_SteamCompressor(31078, "gtpp.multimachine.steam.compressor", "Steam Squasher")
+ .getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Bus_Steam.set(
+ new GT_MetaTileEntity_Hatch_Steam_BusInput(31046, "hatch.input_bus.tier.steam", "Input Bus (Steam)", 0)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Output_Bus_Steam.set(
+ new GT_MetaTileEntity_Hatch_Steam_BusOutput(31047, "hatch.output_bus.tier.steam", "Output Bus (Steam)", 0)
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java
new file mode 100644
index 0000000000..51ff8c879c
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredChest;
+
+public class GregtechSuperChests {
+
+ public static void run() {
+ int mId = 946;
+
+ String aSuffix = " [Disabled]";
+
+ GregtechItemList.Super_Chest_LV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.01", "Super Chest I" + aSuffix, 1))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_MV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.02", "Super Chest II" + aSuffix, 2))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_HV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.03", "Super Chest III" + aSuffix, 3))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_EV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.04", "Super Chest IV" + aSuffix, 4))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_IV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.05", "Super Chest V" + aSuffix, 5))
+ .getStackForm(1L));
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java
new file mode 100644
index 0000000000..a8c8a8fa6d
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java
@@ -0,0 +1,29 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionCreator;
+
+public class GregtechThaumcraftDevices {
+
+ public static void run() {
+ if (Thaumcraft.isModLoaded()) {
+ Logger.INFO("Gregtech5u Content | Registering Thaumcraft content.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // 956-960
+ GregtechItemList.Thaumcraft_Researcher.set(
+ new GregtechMetaPollutionCreator(
+ 956,
+ "thaumcraft.gtpp.machine.01",
+ "Arcane Researcher",
+ 5,
+ "Thinking for you.",
+ 0).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java
new file mode 100644
index 0000000000..695ae84b38
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java
@@ -0,0 +1,13 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.creative.GT_MetaTileEntity_InfiniteItemHolder;
+
+public class GregtechThreadedBuffers {
+
+ public static void run() {
+ GregtechItemList.Infinite_Item_Chest.set(
+ (new GT_MetaTileEntity_InfiniteItemHolder(31010, "infinite.chest.tier.01", "Infinite Item Chest", 1))
+ .getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java
new file mode 100644
index 0000000000..b5db00d058
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredTank;
+
+public class GregtechTieredFluidTanks {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Portable Fluid Tanks.");
+ if (CORE.ConfigSwitches.enableMachine_FluidTanks) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ int ID = 817;
+ Logger.INFO("Only loading ULV-IV tier tanks for New Horizons Modpack.");
+ GregtechItemList.GT_FluidTank_ULV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.00", "Ultra Low Voltage Fluid Tank", 0)
+ .getStackForm(1L));
+ GregtechItemList.GT_FluidTank_LV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.01", "Low Voltage Fluid Tank", 1).getStackForm(1L));
+ GregtechItemList.GT_FluidTank_MV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.02", "Medium Voltage Fluid Tank", 2)
+ .getStackForm(1L));
+ GregtechItemList.GT_FluidTank_HV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.03", "High Voltage Fluid Tank", 3).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java
new file mode 100644
index 0000000000..8b1d4be6ee
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaTreeFarmerStructural;
+
+public class GregtechTreeFarmerTE {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Tree Farmer Structural Block.");
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.TreeFarmer_Structural
+ .set(new GregtechMetaTreeFarmerStructural(752, "treefarmer.structural", "Farm Keeper", 0).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java
new file mode 100644
index 0000000000..452c9117ed
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger;
+
+public class GregtechWirelessChargers {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Wireless Chargers.");
+
+ long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ int mID = 890;
+
+ Utils.registerEvent(new ChargingHelper());
+
+ GregtechItemList.Charger_LV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.01.tier.single",
+ "Wireless Charger MK I",
+ 1,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_MV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.02.tier.single",
+ "Wireless Charger MK II",
+ 2,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_HV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.03.tier.single",
+ "Wireless Charger MK III",
+ 3,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_EV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.04.tier.single",
+ "Wireless Charger MK IV",
+ 4,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_IV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.05.tier.single",
+ "Wireless Charger MK V",
+ 5,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_LuV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.06.tier.single",
+ "Wireless Charger MK VI",
+ 6,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_ZPM.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.07.tier.single",
+ "Wireless Charger MK VII",
+ 7,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_UV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.08.tier.single",
+ "Wireless Charger MK VIII",
+ 8,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_UHV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.09.tier.single",
+ "Wireless Charger MK IX",
+ 9,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java b/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java
new file mode 100644
index 0000000000..4d7c19792f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.ic2;
+
+import net.minecraftforge.common.util.EnumHelper;
+
+import ic2.core.init.InternalName;
+
+public class CustomInternalName {
+
+ public static InternalName aHazmatHelmetEx;
+ public static InternalName aHazmatChestEx;
+ public static InternalName aHazmatLegsEx;
+ public static InternalName aHazmatBootsEx;
+
+ public static void init() {
+ aHazmatHelmetEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatHelmetEx", new Class[] {}, new Object[] {});
+ aHazmatChestEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatChestplateEx", new Class[] {}, new Object[] {});
+ aHazmatLegsEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatLeggingsEx", new Class[] {}, new Object[] {});
+ aHazmatBootsEx = EnumHelper.addEnum(InternalName.class, "itemArmorRubBootsEx", new Class[] {}, new Object[] {});
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java b/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java
new file mode 100644
index 0000000000..475d8d5feb
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.ic2;
+
+import gtPlusPlus.xmod.ic2.item.IC2_Items;
+import gtPlusPlus.xmod.ic2.recipe.RECIPE_IC2;
+
+public class HANDLER_IC2 {
+
+ public static void preInit() {
+ IC2_Items.register();
+ }
+
+ public static void postInit() {
+ RECIPE_IC2.initRecipes();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java b/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java
new file mode 100644
index 0000000000..82daf41c90
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.xmod.ic2.item;
+
+import static gregtech.api.enums.Mods.EnderIO;
+
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import ic2.api.item.IKineticRotor;
+import ic2.core.IC2;
+import ic2.core.block.kineticgenerator.gui.GuiWaterKineticGenerator;
+import ic2.core.block.kineticgenerator.gui.GuiWindKineticGenerator;
+
+public class CustomKineticRotor extends Item implements IKineticRotor {
+
+ private final int mTier;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon[] mTextures;
+
+ private static final String[] mRegistrationNames = new String[] { "itemwoodrotor", "itemironrotor",
+ "itemsteelrotor", "itemwcarbonrotor" };
+
+ private static final String[] mUnlocalNames = new String[] { "itemEnergeticRotor", "itemTungstenSteelRotor",
+ "itemVibrantRotor", "itemIridiumRotor", "itemMagnaliumRotor", "itemUltimetRotor", };
+ private static final int[] mMaxDurability = new int[] { 512000, 809600, 1600000, 3200000 };
+ private static final int[] mRadius = new int[] { 9, 11, 13, 15 };
+ private static final float[] mEfficiency = new float[] { 0.9f, 1.0f, 1.2f, 1.5f };
+ private static final int[] mMinWindStrength = new int[] { 12, 14, 16, 18 };
+ private static final int[] mMaxWindStrength = new int[] { 80, 120, 160, 320 };
+
+ private static final ResourceLocation[] mResourceLocations = new ResourceLocation[] {
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorEnergeticModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorTungstenSteelModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorVibrantModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorIridiumModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorMagnaliumModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorUltimetModel.png"), };
+
+ private final int maxWindStrength;
+ private final int minWindStrength;
+ private final int radius;
+ private final float efficiency;
+ private final ResourceLocation renderTexture;
+
+ public CustomKineticRotor(int aTier) {
+ mTier = aTier;
+ this.setMaxStackSize(1);
+ // Handle Differences if EIO is not loaded
+ if (!EnderIO.isModLoaded() && (aTier == 0 || aTier == 2)) {
+ this.renderTexture = mResourceLocations[(aTier == 0 ? 4 : 5)];
+ this.setUnlocalizedName(mUnlocalNames[(aTier == 0 ? 4 : 5)]);
+ } else {
+ this.renderTexture = mResourceLocations[aTier];
+ this.setUnlocalizedName(mUnlocalNames[aTier]);
+ }
+ this.setMaxDamage(mMaxDurability[aTier]);
+ this.radius = mRadius[aTier];
+ this.efficiency = mEfficiency[aTier];
+ this.minWindStrength = mMinWindStrength[aTier];
+ this.maxWindStrength = mMaxWindStrength[aTier];
+ this.setNoRepair();
+ this.setCreativeTab(IC2.tabIC2);
+ GameRegistry.registerItem(this, mRegistrationNames[aTier]);
+ }
+
+ @Override
+ public void setDamage(final ItemStack stack, final int damage) {
+ if (mTier < 3) {
+ super.setDamage(stack, damage);
+ }
+ }
+
+ @Override
+ public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List info, final boolean b) {
+
+ info.add(
+ StatCollector.translateToLocalFormatted(
+ "ic2.itemrotor.wind.info",
+ new Object[] { this.minWindStrength, this.maxWindStrength }));
+
+ GearboxType type = null;
+ if (Minecraft.getMinecraft().currentScreen != null
+ && Minecraft.getMinecraft().currentScreen instanceof GuiWaterKineticGenerator) {
+ type = GearboxType.WATER;
+ } else if (Minecraft.getMinecraft().currentScreen != null
+ && Minecraft.getMinecraft().currentScreen instanceof GuiWindKineticGenerator) {
+ type = GearboxType.WIND;
+ }
+
+ if (type != null) {
+ info.add(StatCollector.translateToLocal("ic2.itemrotor.fitsin." + this.isAcceptedType(itemStack, type)));
+ }
+ }
+
+ @Override
+ public int getDiameter(final ItemStack stack) {
+ return this.radius;
+ }
+
+ @Override
+ public ResourceLocation getRotorRenderTexture(final ItemStack stack) {
+ return this.renderTexture;
+ }
+
+ @Override
+ public float getEfficiency(final ItemStack stack) {
+ return this.efficiency;
+ }
+
+ @Override
+ public int getMinWindStrength(final ItemStack stack) {
+ return this.minWindStrength;
+ }
+
+ @Override
+ public int getMaxWindStrength(final ItemStack stack) {
+ return this.maxWindStrength;
+ }
+
+ @Override
+ public boolean isAcceptedType(final ItemStack stack, final IKineticRotor.GearboxType type) {
+ return (type == IKineticRotor.GearboxType.WIND) || (type == IKineticRotor.GearboxType.WATER);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "ic2." + super.getUnlocalizedName().substring(5);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack itemStack) {
+ return this.getUnlocalizedName();
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack itemStack) {
+ return StatCollector.translateToLocal(this.getUnlocalizedName(itemStack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return mTier < 3;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(int meta) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconIndex(ItemStack aIndex) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamageForRenderPass(int aDmg, int aPass) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ protected String getIconString() {
+ return super.getIconString();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return super.getDurabilityForDisplay(stack);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(ItemStack stack, int pass) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ public void registerIcons(IIconRegister iconRegister) {
+ int aIndex = 0;
+ mTextures = new IIcon[6];
+ for (String y : mUnlocalNames) {
+ mTextures[aIndex++] = iconRegister.registerIcon(IC2.textureDomain + ":" + "rotors/" + y);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java b/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java
new file mode 100644
index 0000000000..3dacc657de
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.xmod.ic2.item;
+
+import static gregtech.api.enums.Mods.EnderIO;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+import gtPlusPlus.core.item.wearable.hazmat.ItemArmorHazmatEx;
+
+public class IC2_Items {
+
+ public static ItemStack rotor_Material_1; // Energetic Alloy
+ public static ItemStack rotor_Material_2; // TungstenSteel
+ public static ItemStack rotor_Material_3; // Vibrant Alloy
+ public static ItemStack rotor_Material_4; // Iridium
+
+ public static ItemStack rotor_Blade_Material_1;
+ public static ItemStack rotor_Blade_Material_2;
+ public static ItemStack rotor_Blade_Material_3;
+ public static ItemStack rotor_Blade_Material_4;
+
+ public static ItemStack shaft_Material_1; // Energetic Alloy
+ public static ItemStack shaft_Material_2; // TungstenSteel
+ public static ItemStack shaft_Material_3; // Vibrant Alloy
+ public static ItemStack shaft_Material_4; // Iridium
+
+ private static final String[] mData1 = new String[] { "itemEnergeticRotorBlade", "itemMagnaliumRotorBlade" };
+ private static final String[] mData2 = new String[] { "itemEnergeticShaft", "itemMagnaliumShaft" };
+ private static final String[] mData3 = new String[] { "itemVibrantRotorBlade", "itemUltimetRotorBlade" };
+ private static final String[] mData4 = new String[] { "itemVibrantShaft", "itemUltimetShaft" };
+
+ public static void register() {
+
+ int aIndexEIO = (EnderIO.isModLoaded() ? 0 : 1);
+
+ // Rotor Blades
+ rotor_Blade_Material_1 = new ItemStack(
+ new CoreItem(mData1[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_2 = new ItemStack(
+ new CoreItem(
+ "itemTungstenSteelRotorBlade",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_3 = new ItemStack(
+ new CoreItem(mData3[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_4 = new ItemStack(
+ new CoreItem(
+ "itemIridiumRotorBlade",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+
+ // Rotor Shafts
+ shaft_Material_1 = new ItemStack(
+ new CoreItem(mData2[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ shaft_Material_2 = new ItemStack(
+ new CoreItem(
+ "itemTungstenSteelShaft",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+ shaft_Material_3 = new ItemStack(
+ new CoreItem(mData4[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ shaft_Material_4 = new ItemStack(
+ new CoreItem("itemIridiumShaft", AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+
+ // Rotors
+ rotor_Material_1 = new ItemStack(new CustomKineticRotor(0));
+ rotor_Material_2 = new ItemStack(new CustomKineticRotor(1));
+ rotor_Material_3 = new ItemStack(new CustomKineticRotor(2));
+ rotor_Material_4 = new ItemStack(new CustomKineticRotor(3));
+
+ ItemArmorHazmatEx.init();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java b/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java
new file mode 100644
index 0000000000..47ec1afe0f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java
@@ -0,0 +1,365 @@
+package gtPlusPlus.xmod.ic2.recipe;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gtPlusPlus.core.recipe.RECIPES_Tools.craftingToolHardHammer;
+import static gtPlusPlus.core.recipe.RECIPES_Tools.craftingToolWrench;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.ic2.item.IC2_Items;
+import ic2.core.Ic2Items;
+
+public class RECIPE_IC2 {
+
+ public static String plate_T1 = "plateEnergeticAlloy";
+ public static String plate_T2 = "plateTungstenSteel";
+ public static String plate_T3 = "plateVibrantAlloy";
+ public static String plate_T4 = "plateAlloyIridium";
+
+ public static ItemStack block_T1 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.EnergeticAlloy, 1L);
+ public static ItemStack block_T2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L);
+ public static ItemStack block_T3 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.VibrantAlloy, 1L);
+ public static ItemStack block_T4 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L);
+
+ public static ItemStack shaft_block_T1 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.EnergeticAlloy, 1L);
+ public static ItemStack shaft_block_T2 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.TungstenSteel, 1L);
+ public static ItemStack shaft_block_T3 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.VibrantAlloy, 1L);
+ public static ItemStack shaft_block_T4 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iridium, 1L);
+
+ public static String ingot_T1 = "ingotEnergeticAlloy";
+ public static String ingot_T2 = "ingotTungstenSteel";
+ public static String ingot_T3 = "ingotVibrantAlloy";
+ public static String ingot_T4 = "ingotIridium";
+
+ public static String ring_T1 = "ringStainlessSteel";
+ public static String ring_T2 = "ringTungstenSteel";
+ public static String ring_T3 = "ringChrome";
+ public static String ring_T4 = "ringOsmiridium";
+
+ private static ItemStack rotor_blade_T1 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_1.getItem());
+ private static ItemStack rotor_blade_T2 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_2.getItem());
+ private static ItemStack rotor_blade_T3 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_3.getItem());
+ private static ItemStack rotor_blade_T4 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_4.getItem());
+
+ private static ItemStack shaft_T1 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_1.getItem());
+ private static ItemStack shaft_T2 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_2.getItem());
+ private static ItemStack shaft_T3 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_3.getItem());
+ private static ItemStack shaft_T4 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_4.getItem());
+
+ private static ItemStack rotor_T1 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_1.getItem());
+ private static ItemStack rotor_T2 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_2.getItem());
+ private static ItemStack rotor_T3 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_3.getItem());
+ private static ItemStack rotor_T4 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_4.getItem());
+
+ private static boolean checkForEnderIO() {
+ if (!EnderIO.isModLoaded()) {
+ plate_T1 = "plateMagnalium";
+ plate_T2 = "plateTungstenSteel";
+ plate_T3 = "plateUltimet";
+ plate_T4 = "plateAlloyIridium";
+
+ block_T1 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Magnalium, 1L);
+ block_T2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L);
+ block_T3 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Ultimet, 1L);
+ block_T4 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L);
+
+ ingot_T1 = "ingotMagnalium";
+ ingot_T2 = "ingotTungstenSteel";
+ ingot_T3 = "ingotUltimet";
+ ingot_T4 = "ingotIridium";
+ return true;
+ }
+ return false;
+ }
+
+ public static void initRecipes() {
+
+ checkForEnderIO();
+ addAdvancedHazmat();
+
+ RecipeUtils.addShapedRecipe(
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ ring_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ rotor_blade_T1);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ ring_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ rotor_blade_T2);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ ring_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ rotor_blade_T3);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ ring_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ rotor_blade_T4);
+
+ // Shaft Extruder Recipe
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.DarkSteel), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.DarkSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.TungstenSteel), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.Molybdenum), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.Molybdenum) });
+ Logger.INFO("Added recipe item for GT5 Extruder: Shaft Shape");
+
+ // Custm Recipes for Iron and Steel
+ ItemStack mShaftIron = ItemList.IC2_ShaftIron.get(1);
+ ItemStack mShaftSteel = ItemList.IC2_ShaftSteel.get(1);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.WroughtIron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftSteel,
+ 64 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Steel, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftSteel,
+ 64 * 20,
+ 120);
+
+ // Shaft Recipes
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T1),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T1,
+ 2560,
+ 250);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T1),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T1,
+ 2560,
+ 250);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Energetic]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T2),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T2,
+ 5120,
+ 500);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T2),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T2,
+ 5120,
+ 500);
+
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [TungstenSteel]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T3),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T3,
+ 10240,
+ 2000);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T3),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T3,
+ 10240,
+ 2000);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Vibrant]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T4),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T4,
+ 20480,
+ 4000);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T4),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T4,
+ 20480,
+ 4000);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Iridium]");
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T1,
+ rotor_blade_T1,
+ craftingToolHardHammer,
+ rotor_blade_T1,
+ ring_T1,
+ rotor_blade_T1,
+ craftingToolWrench,
+ rotor_blade_T1,
+ shaft_T1,
+ rotor_T1);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T2,
+ rotor_blade_T2,
+ craftingToolHardHammer,
+ rotor_blade_T2,
+ ring_T2,
+ rotor_blade_T2,
+ craftingToolWrench,
+ rotor_blade_T2,
+ shaft_T2,
+ rotor_T2);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T3,
+ rotor_blade_T3,
+ craftingToolHardHammer,
+ rotor_blade_T3,
+ ring_T3,
+ rotor_blade_T3,
+ craftingToolWrench,
+ rotor_blade_T3,
+ shaft_T3,
+ rotor_T3);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T4,
+ rotor_blade_T4,
+ craftingToolHardHammer,
+ rotor_blade_T4,
+ ring_T4,
+ rotor_blade_T4,
+ craftingToolWrench,
+ rotor_blade_T4,
+ shaft_T4,
+ rotor_T4);
+ }
+
+ private static void addAdvancedHazmat() {
+
+ ItemStack[] aBasicHazmatPieces = new ItemStack[] { Ic2Items.hazmatHelmet.copy(),
+ Ic2Items.hazmatChestplate.copy(), Ic2Items.hazmatLeggings.copy(), Ic2Items.hazmatBoots.copy() };
+
+ Material aRubber = MaterialUtils.generateMaterialFromGtENUM(Materials.Rubber);
+ ItemStack aYellowWool = ItemUtils.getSimpleStack(Blocks.wool, 4, 1);
+ ItemStack aBlackWool = ItemUtils.getSimpleStack(Blocks.wool, 15, 1);
+ ItemStack aCoilIC2 = Ic2Items.coil;
+ ItemStack aPlateCobalt = CI.getTieredComponentOfMaterial(Materials.Cobalt, OrePrefixes.plate, 1);
+ ItemStack aGearSmallSteel = CI.getTieredComponentOfMaterial(Materials.Steel, OrePrefixes.gearGtSmall, 1);
+ ItemStack aGearSmallAluminium = CI
+ .getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.gearGtSmall, 1);
+ ItemStack aGearPotin = ALLOY.TUMBAGA.getGear(1);
+ ItemStack aGearSiliconCarbide = ALLOY.SILICON_CARBIDE.getGear(1);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[0],
+ ItemUtils.getSimpleStack(aYellowWool, 16), ItemUtils.getSimpleStack(aPlateCobalt, 4),
+ ItemUtils.getSimpleStack(aCoilIC2, 8), ItemUtils.getSimpleStack(aGearSmallAluminium, 4), },
+ aRubber.getFluidStack(144 * 4),
+ GregtechItemList.Armour_Hazmat_Advanced_Helmet.get(1),
+ 30 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[1],
+ ItemUtils.getSimpleStack(aYellowWool, 64), ItemUtils.getSimpleStack(aCoilIC2, 32),
+ ItemUtils.getSimpleStack(aPlateCobalt, 16), ItemUtils.getSimpleStack(aGearSiliconCarbide, 8), },
+ aRubber.getFluidStack(144 * 10),
+ GregtechItemList.Armour_Hazmat_Advanced_Chest.get(1),
+ 90 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[2],
+ ItemUtils.getSimpleStack(aYellowWool, 32), ItemUtils.getSimpleStack(aCoilIC2, 16),
+ ItemUtils.getSimpleStack(aPlateCobalt, 8), ItemUtils.getSimpleStack(aGearSiliconCarbide, 4), },
+ aRubber.getFluidStack(144 * 8),
+ GregtechItemList.Armour_Hazmat_Advanced_Legs.get(1),
+ 75 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[3],
+ ItemUtils.getSimpleStack(aBlackWool, 16), ItemUtils.getSimpleStack(aCoilIC2, 6),
+ ItemUtils.getSimpleStack(aGearSmallSteel, 8), ItemUtils.getSimpleStack(aGearPotin, 4), },
+ aRubber.getFluidStack(144 * 6),
+ GregtechItemList.Armour_Hazmat_Advanced_Boots.get(1),
+ 45 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java b/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java
new file mode 100644
index 0000000000..ee51f28eaa
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.xmod.pamsharvest.fishtrap;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class FishTrapHandler {
+
+ static final String prefix = "food";
+ static final String suffix = "raw";
+ static final String greenheartFish = "foodGreenheartfish";
+ private static final String[] harvestcraftFish = { "Anchovy", "Bass", "Calamari", "Carp", "Catfish", "Charr",
+ "Clam", "Crab", "Crayfish", "Eel", "Frog", "Grouper", "Herring", "Jellyfish", "Mudfish", "Octopus", "Perch",
+ "Scallop", "Shrimp", "Snail", "Snapper", "Tilapia", "Trout", "Tuna", "Turtle", "Walley" };
+
+ public static void pamsHarvestCraftCompat() {
+ for (String fish : harvestcraftFish) {
+ final String itemName = prefix + fish + suffix;
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken(itemName, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBone", 1))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("methane", 48))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("fishoil", 50))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+ }
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken(greenheartFish, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBone", 1))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("methane", 48))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("fishoil", 50))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java b/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java
new file mode 100644
index 0000000000..4efa85992a
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java
@@ -0,0 +1,217 @@
+package gtPlusPlus.xmod.railcraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.BaseItemBurnable;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.railcraft.utils.RailcraftUtils;
+
+public class HANDLER_Railcraft {
+
+ public static void preInit() {
+ // Register Custom Coal Coke
+ ModItems.itemCoalCoke = new BaseItemBurnable(
+ "itemCoalCoke",
+ "Coking Coal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for metallurgy.",
+ "fuelCoke",
+ 3200,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCoalCoke");
+
+ // Add in things that once existed in 1.5.2
+ ModItems.itemCactusCharcoal = new BaseItemBurnable(
+ "itemCactusCharcoal",
+ "Cactus Charcoal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelCactusCharcoal",
+ 400,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCharcoal");
+ ModItems.itemSugarCharcoal = new BaseItemBurnable(
+ "itemSugarCharcoal",
+ "Sugar Charcoal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelSugarCharcoal",
+ 400,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCharcoal");
+ ModItems.itemCactusCoke = new BaseItemBurnable(
+ "itemCactusCoke",
+ "Cactus Coke",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelCactusCoke",
+ 800,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCoke");
+ ModItems.itemSugarCoke = new BaseItemBurnable(
+ "itemSugarCoke",
+ "Sugar Coke",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelSugarCoke",
+ 800,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCoke");
+
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal), "itemCharcoalCactus");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCoke), "itemCokeCactus");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal), "itemCharcoalSugar");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCoke), "itemCokeSugar");
+ }
+
+ public static void postInit() {
+ generateCokeOvenRecipes();
+ }
+
+ private static void generateCokeOvenRecipes() {
+ ItemStack[] aInputs1 = new ItemStack[] { ItemUtils.getSimpleStack(Blocks.cactus),
+ ItemUtils.getSimpleStack(Items.reeds) };
+ ItemStack[] aInputs2 = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal),
+ ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal) };
+ ItemStack[] aOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCoke),
+ ItemUtils.getSimpleStack(ModItems.itemSugarCoke) };
+ for (int i = 0; i < aOutputs.length; i++) {
+ // Recipes for the Charcoals and Cokes, outputting either Creosote or Charcoal Byproducts depending on the
+ // fluid input
+ CORE.RA.addCokeOvenRecipe(
+ aInputs1[i],
+ CI.getNumberedCircuit(3),
+ null,
+ FluidUtils.getFluidStack("creosote", 100),
+ aInputs2[i],
+ 20,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs1[i],
+ CI.getNumberedCircuit(4),
+ FluidUtils.getFluidStack("nitrogen", 100),
+ FluidUtils.getFluidStack("charcoal_byproducts", 200),
+ aInputs2[i],
+ 10,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs2[i],
+ CI.getNumberedCircuit(3),
+ null,
+ FluidUtils.getFluidStack("creosote", 200),
+ aOutputs[i],
+ 40,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs2[i],
+ CI.getNumberedCircuit(4),
+ FluidUtils.getFluidStack("nitrogen", 50),
+ FluidUtils.getFluidStack("charcoal_byproducts", 100),
+ aOutputs[i],
+ 20,
+ 16);
+
+ // Generate Wood Tar and Wood Gas from these Cokes
+ CORE.RA.addCokeOvenRecipe(
+ aOutputs[i],
+ CI.getNumberedCircuit(5),
+ FluidUtils.getFluidStack("steam", 100),
+ Materials.WoodTar.getFluid(200),
+ Materials.Ash.getDustSmall(1),
+ 60,
+ 240);
+ CORE.RA.addCokeOvenRecipe(
+ aOutputs[i],
+ CI.getNumberedCircuit(6),
+ FluidUtils.getFluidStack("steam", 100),
+ Materials.WoodGas.getFluid(300),
+ Materials.Ash.getDustSmall(1),
+ 60,
+ 240);
+
+ // Fluid Extracting the Charcoals for Wood Tar
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i])
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L))
+ .outputChances(1000)
+ .fluidOutputs(Materials.WoodTar.getFluid(50L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+
+ // Processing the Charcoals with Oxygen to get CO and CO2
+ // C + O = CO
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(500))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(500))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+ // C + 2O = CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+ }
+ if (Railcraft.isModLoaded()) {
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addCokeOvenRecipe(
+ aInputs1[i],
+ true,
+ true,
+ aInputs2[i],
+ FluidUtils.getFluidStack("creosote", 30),
+ 500);
+ }
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addCokeOvenRecipe(
+ aInputs2[i],
+ true,
+ true,
+ aOutputs[i],
+ FluidUtils.getFluidStack("creosote", 30),
+ 500);
+ }
+
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs1[i], true, true, aInputs2[i], 20);
+ }
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs2[i], true, true, aOutputs[i], 20);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java b/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java
new file mode 100644
index 0000000000..f2f538ab38
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.railcraft.utils;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import mods.railcraft.common.util.crafting.BlastFurnaceCraftingManager;
+import mods.railcraft.common.util.crafting.CokeOvenCraftingManager;
+
+public class RailcraftUtils {
+
+ public static void addCokeOvenRecipe(ItemStack input, boolean matchDamage, boolean matchNBT, ItemStack output,
+ FluidStack fluidOutput, int cookTime) {
+ CokeOvenCraftingManager.getInstance()
+ .addRecipe(input, matchDamage, matchNBT, output, fluidOutput, cookTime);
+ }
+
+ public static void addAdvancedCokeOvenRecipe(ItemStack input, boolean matchDamage, boolean matchNBT,
+ ItemStack output, int cookTime) {
+ BlastFurnaceCraftingManager.getInstance()
+ .addRecipe(input, matchDamage, matchNBT, cookTime, output);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java b/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java
new file mode 100644
index 0000000000..5dcc27e592
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.thaumcraft.commands;
+
+import static gtPlusPlus.core.util.minecraft.PlayerUtils.messagePlayer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.commands.CommandUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.thaumcraft.objects.ThreadAspectScanner;
+
+public class CommandDumpAspects implements ICommand {
+
+ private final List<String> aliases;
+ public static long mLastScanTime = System.currentTimeMillis();
+
+ public CommandDumpAspects() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("DA");
+ this.aliases.add("da");
+ this.aliases.add("dumpaspects");
+ this.aliases.add("dumptc");
+ Logger.INFO("Registered Aspect Dump Command.");
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ return 0;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "DumpAspects";
+ }
+
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/DumpAspects";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ final long T = System.currentTimeMillis();
+ final long D = T - mLastScanTime;
+ final int Z = (int) (D / 1000);
+ if (Z >= 30) {
+ // Lets process this in the Background on a new Thread.
+ Thread t = createNewThread();
+ messagePlayer(P, "Beginning to dump information about all items/blocks & their aspects to file.");
+ messagePlayer(
+ P,
+ "Please do not close your game during this process, you will be notified upon completion.");
+ t.start();
+ } else {
+ messagePlayer(
+ P,
+ "Your last run of DA was less than 30 seconds ago, please wait " + (30 - Z)
+ + " seconds before trying again.");
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ final EntityPlayer P = CommandUtils.getPlayer(var1);
+ return P != null && PlayerUtils.isPlayerOP(P);
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ return false;
+ }
+
+ private static Thread createNewThread() {
+ return new ThreadAspectScanner();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java b/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java
new file mode 100644
index 0000000000..1f053220ab
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.xmod.thaumcraft.objects;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.FileUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.thaumcraft.commands.CommandDumpAspects;
+
+public class ThreadAspectScanner extends Thread {
+
+ public static boolean mDoWeScan = false;
+ private static final Map<String, AutoMap<ItemStack>> mAllGameContent = new HashMap<>();
+ public final File mAspectCacheFile;
+
+ public ThreadAspectScanner() {
+ mAspectCacheFile = FileUtils.getFile("config/GTplusplus", "AspectInfo", "txt");
+ mDoWeScan = true;
+ }
+
+ private void tryCacheObject(ItemStack aStack) {
+ if (aStack == null) {
+ return;
+ }
+ String nameKey;
+ try {
+ nameKey = ItemUtils.getUnlocalizedItemName(aStack);
+ } catch (NullPointerException n) {
+ try {
+ nameKey = Utils.sanitizeString(
+ aStack.getDisplayName()
+ .toLowerCase());
+ } catch (NullPointerException n2) {
+ try {
+ nameKey = aStack.getItem()
+ .getUnlocalizedName();
+ } catch (NullPointerException n3) {
+ nameKey = "BadItemsGalore";
+ }
+ }
+ }
+ AutoMap<ItemStack> m = new AutoMap<>();
+ if (mAllGameContent.containsKey(nameKey)) {
+ m = mAllGameContent.get(nameKey);
+ }
+ m.put(aStack);
+ mAllGameContent.put(nameKey, m);
+ }
+
+ @SuppressWarnings({ "rawtypes" })
+ @Override
+ public void run() {
+ if (mDoWeScan) {
+ Iterator iterator;
+ Logger.INFO("Finding Blocks and Items to scan for Aspect data.");
+ long mBlocksCounter = 0;
+ long mItemsCounter = 0;
+
+ // First, find blocks
+ iterator = Block.blockRegistry.getKeys()
+ .iterator();
+ while (iterator.hasNext()) {
+ String s = (String) iterator.next();
+ Block block = (Block) Block.blockRegistry.getObject(s);
+ if (block != null) {
+ tryCacheObject(ItemUtils.getSimpleStack(block));
+ mBlocksCounter++;
+ }
+ }
+ Logger.INFO("Completed Block Scan. Counted " + mBlocksCounter);
+
+ // Second Find items, Skipping things that exist.
+ iterator = Item.itemRegistry.getKeys()
+ .iterator();
+ while (iterator.hasNext()) {
+ String s = (String) iterator.next();
+ Item item = (Item) Item.itemRegistry.getObject(s);
+ if (item != null) {
+ if (item.getHasSubtypes()) {
+ List q1 = new ArrayList();
+ item.getSubItems(item, item.getCreativeTab(), q1);
+ if (q1 != null && q1.size() > 0) {
+ for (int e = 0; e < q1.size(); e++) {
+ ItemStack check = ItemUtils.simpleMetaStack(item, e, 1);
+ if (check != null) {
+ tryCacheObject(check);
+ mItemsCounter++;
+ }
+ }
+ } else {
+ tryCacheObject(ItemUtils.getSimpleStack(item));
+ mItemsCounter++;
+ }
+ } else {
+ tryCacheObject(ItemUtils.getSimpleStack(item));
+ mItemsCounter++;
+ }
+ }
+ }
+ Logger.INFO("Completed Item Scan. Counted " + mItemsCounter);
+
+ Set<String> y = mAllGameContent.keySet();
+ Logger.INFO("Beginning iteration of " + y.size() + " itemstacks for aspect information.");
+
+ for (String key : y) {
+ // Logger.INFO("Looking for key: "+key);
+ if (mAllGameContent.containsKey(key)) {
+ AutoMap<ItemStack> group = mAllGameContent.get(key);
+ if (group == null || group.size() <= 0) {
+ continue;
+ }
+ for (ItemStack stack : group) {
+ thaumcraft.api.aspects.AspectList a = thaumcraft.common.lib.crafting.ThaumcraftCraftingManager
+ .getObjectTags(stack);
+ if (a == null) {
+ continue;
+ } else {
+ AutoMap<Pair<String, Integer>> aspectPairs = new AutoMap<>();
+ for (thaumcraft.api.aspects.Aspect c : a.getAspectsSortedAmount()) {
+ if (c != null) {
+ aspectPairs.put(new Pair<>(c.getName(), a.getAmount(c)));
+ }
+ }
+ try {
+ List<String> mList = new ArrayList<>();
+ mList.add(
+ stack.getDisplayName() + " | Meta: "
+ + stack.getItemDamage()
+ + " | Unlocal: "
+ + stack.getUnlocalizedName());
+ for (Pair<String, Integer> r : aspectPairs) {
+ if (r != null) {
+ mList.add(r.getKey() + " x" + r.getValue());
+ }
+ }
+ mList.add("");
+ if (mAspectCacheFile != null && mList.size() >= 3) {
+ FileUtils.appendListToFile(mAspectCacheFile, mList);
+ }
+ } catch (Throwable t) {
+ Logger.INFO("Error while iterating one item. " + t);
+ }
+ }
+ }
+ }
+ }
+ Logger.INFO(
+ "Completed Aspect Iteration. AspectInfo.txt is now available to process in the GTplusplus configuration folder.");
+ CommandDumpAspects.mLastScanTime = System.currentTimeMillis();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java
new file mode 100644
index 0000000000..460a5e9fbe
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java
@@ -0,0 +1,36 @@
+package gtPlusPlus.xmod.thermalfoundation;
+
+import static gregtech.api.enums.Mods.COFHCore;
+
+import gtPlusPlus.xmod.thermalfoundation.block.TF_Blocks;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+import gtPlusPlus.xmod.thermalfoundation.item.TF_Items;
+import gtPlusPlus.xmod.thermalfoundation.recipe.TF_Gregtech_Recipes;
+
+public class HANDLER_TF {
+
+ public static void preInit() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.preInit();
+ TF_Items.preInit();
+ TF_Blocks.preInit();
+ }
+ }
+
+ public static void init() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.init();
+ TF_Blocks.init();
+ TF_Items.init();
+ }
+ }
+
+ public static void postInit() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.postInit();
+ TF_Items.postInit();
+ TF_Blocks.postInit();
+ TF_Gregtech_Recipes.run();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java
new file mode 100644
index 0000000000..b48be445e5
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java
@@ -0,0 +1,178 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.monster.EntitySnowman;
+import net.minecraft.entity.monster.EntityZombie;
+import net.minecraft.init.Blocks;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.core.fluid.BlockFluidInteractive;
+import cofh.lib.util.BlockWrapper;
+import cofh.lib.util.helpers.DamageHelper;
+import cofh.lib.util.helpers.ServerHelper;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Cryotheum extends BlockFluidInteractive {
+
+ public static final Material materialFluidCryotheum = new MaterialLiquid(MapColor.iceColor);
+ private static boolean enableSourceFall = true;
+ private static boolean effect = true;
+
+ public TF_Block_Fluid_Cryotheum() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidCryotheum, materialFluidCryotheum, "cryotheum");
+ this.setQuantaPerBlock(5);
+ this.setTickRate(15);
+
+ this.setHardness(1000.0F);
+ this.setLightOpacity(1);
+ this.setParticleColor(0.15F, 0.7F, 1.0F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidCryotheum");
+
+ this.addInteraction(Blocks.grass, Blocks.dirt);
+ this.addInteraction(Blocks.water, 0, Blocks.ice);
+ this.addInteraction(Blocks.water, Blocks.snow);
+ this.addInteraction(Blocks.flowing_water, 0, Blocks.ice);
+ this.addInteraction(Blocks.flowing_water, Blocks.snow);
+ this.addInteraction(Blocks.lava, 0, Blocks.obsidian);
+ this.addInteraction(Blocks.lava, Blocks.stone);
+ this.addInteraction(Blocks.flowing_lava, 0, Blocks.obsidian);
+ this.addInteraction(Blocks.flowing_lava, Blocks.stone);
+ this.addInteraction(Blocks.leaves, Blocks.air);
+ this.addInteraction(Blocks.tallgrass, Blocks.air);
+ this.addInteraction(Blocks.fire, Blocks.air);
+
+ effect = true;
+ enableSourceFall = true;
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3, final Entity paramEntity) {
+ paramEntity.extinguish();
+ if (!effect) {
+ return;
+ }
+ if ((paramEntity.motionY < -0.05D) || (paramEntity.motionY > 0.05D)) {
+ paramEntity.motionY *= 0.05D;
+ }
+ if ((paramEntity.motionZ < -0.05D) || (paramEntity.motionZ > 0.05D)) {
+ paramEntity.motionZ *= 0.05D;
+ }
+ if ((paramEntity.motionX < -0.05D) || (paramEntity.motionX > 0.05D)) {
+ paramEntity.motionX *= 0.05D;
+ }
+ if (ServerHelper.isClientWorld(paramWorld)) {
+ return;
+ }
+ if ((paramWorld.getTotalWorldTime() % 8L) != 0L) {
+ return;
+ }
+ if (((paramEntity instanceof EntityZombie)) || ((paramEntity instanceof EntityCreeper))) {
+ final EntitySnowman localEntitySnowman = new EntitySnowman(paramWorld);
+ localEntitySnowman.setLocationAndAngles(
+ paramEntity.posX,
+ paramEntity.posY,
+ paramEntity.posZ,
+ paramEntity.rotationYaw,
+ paramEntity.rotationPitch);
+ paramWorld.spawnEntityInWorld(localEntitySnowman);
+
+ paramEntity.setDead();
+ } else if (
+ /* ((paramEntity instanceof EntityBlizz)) || */ ((paramEntity instanceof EntitySnowman))) {
+ ((EntityLivingBase) paramEntity).addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120, 0));
+ ((EntityLivingBase) paramEntity).addPotionEffect(new PotionEffect(Potion.regeneration.id, 120, 0));
+ } else if ((paramEntity instanceof EntityBlaze)) {
+ paramEntity.attackEntityFrom(DamageHelper.cryotheum, 10.0F);
+ } else {
+ final boolean bool = paramEntity.velocityChanged;
+ paramEntity.attackEntityFrom(DamageHelper.cryotheum, 2.0F);
+ paramEntity.velocityChanged = bool;
+ }
+ }
+
+ @Override
+ public int getLightValue(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ return TF_Fluids.fluidCryotheum.getLuminosity();
+ }
+
+ @Override
+ public void updateTick(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final Random paramRandom) {
+ if (effect) {
+ this.checkForInteraction(paramWorld, paramInt1, paramInt2, paramInt3);
+ }
+ if ((enableSourceFall) && (paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3) == 0)) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ if ((localBlock == this) && (i != 0)) {
+ paramWorld.setBlock(paramInt1, paramInt2 + this.densityDir, paramInt3, this, 0, 3);
+ paramWorld.setBlockToAir(paramInt1, paramInt2, paramInt3);
+ return;
+ }
+ }
+ super.updateTick(paramWorld, paramInt1, paramInt2, paramInt3, paramRandom);
+ }
+
+ protected void checkForInteraction(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (paramWorld.getBlock(paramInt1, paramInt2, paramInt3) != this) {
+ return;
+ }
+ int i = paramInt1;
+ int j = paramInt2;
+ int k = paramInt3;
+ for (int m = 0; m < 6; m++) {
+ i = paramInt1 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][0];
+ j = paramInt2 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][1];
+ k = paramInt3 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][2];
+
+ this.interactWithBlock(paramWorld, i, j, k);
+ }
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 + 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 + 1);
+ }
+
+ protected void interactWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2, paramInt3);
+ if ((localBlock == Blocks.air) || (localBlock == this)) {
+ return;
+ }
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3);
+ if (this.hasInteraction(localBlock, i)) {
+ final BlockWrapper localBlockWrapper = this.getInteraction(localBlock, i);
+ paramWorld
+ .setBlock(paramInt1, paramInt2, paramInt3, localBlockWrapper.block, localBlockWrapper.metadata, 3);
+ } else if ((paramWorld.isSideSolid(paramInt1, paramInt2, paramInt3, ForgeDirection.UP))
+ && (paramWorld.isAirBlock(paramInt1, paramInt2 + 1, paramInt3))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + 1, paramInt3, Blocks.snow_layer, 0, 3);
+ }
+ }
+
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java
new file mode 100644
index 0000000000..9f89d01250
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraft.entity.Entity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cofh.core.fluid.BlockFluidCoFHBase;
+import cofh.core.util.CoreUtils;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Ender extends BlockFluidCoFHBase {
+
+ public static final Material materialFluidEnder = new MaterialLiquid(MapColor.greenColor);
+ private static boolean effect = true;
+
+ public TF_Block_Fluid_Ender() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidEnder, materialFluidEnder, "ender");
+ setQuantaPerBlock(4);
+ setTickRate(20);
+
+ setHardness(2000.0F);
+ setLightOpacity(7);
+ setParticleColor(0.05F, 0.2F, 0.2F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidEnder");
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World paramWorld, int paramInt1, int paramInt2, int paramInt3,
+ Entity paramEntity) {
+ if ((!effect) || (paramWorld.isRemote)) {
+ return;
+ }
+ if (paramWorld.getTotalWorldTime() % 8L == 0L) {
+ int i = paramInt1 - 8 + paramWorld.rand.nextInt(17);
+ int j = paramInt2 + paramWorld.rand.nextInt(8);
+ int k = paramInt3 - 8 + paramWorld.rand.nextInt(17);
+ if (!paramWorld.getBlock(i, j, k)
+ .getMaterial()
+ .isSolid()) {
+ CoreUtils.teleportEntityTo(paramEntity, i, j, k);
+ }
+ }
+ }
+
+ @Override
+ public int getLightValue(IBlockAccess paramIBlockAccess, int paramInt1, int paramInt2, int paramInt3) {
+ return TF_Fluids.fluidEnder.getLuminosity();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java
new file mode 100644
index 0000000000..90c8be8bf7
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java
@@ -0,0 +1,192 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.core.fluid.BlockFluidInteractive;
+import cofh.lib.util.BlockWrapper;
+import cofh.lib.util.helpers.ServerHelper;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Pyrotheum extends BlockFluidInteractive {
+
+ Random random = new Random();
+ private static boolean effect = true;
+ private static boolean enableSourceFall = true;
+
+ public TF_Block_Fluid_Pyrotheum() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidPyrotheum, Material.lava, "pyrotheum");
+ this.setQuantaPerBlock(5);
+ this.setTickRate(10);
+
+ this.setHardness(1000.0F);
+ this.setLightOpacity(1);
+ this.setParticleColor(1.0F, 0.7F, 0.15F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidPyrotheum");
+
+ this.addInteraction(Blocks.cobblestone, Blocks.stone);
+ this.addInteraction(Blocks.grass, Blocks.dirt);
+ this.addInteraction(Blocks.sand, Blocks.glass);
+ this.addInteraction(Blocks.water, Blocks.stone);
+ this.addInteraction(Blocks.flowing_water, Blocks.stone);
+ this.addInteraction(Blocks.clay, Blocks.hardened_clay);
+ this.addInteraction(Blocks.ice, Blocks.stone);
+ this.addInteraction(Blocks.snow, Blocks.air);
+ this.addInteraction(Blocks.snow_layer, Blocks.air);
+ for (int i = 0; i < 8; i++) {
+ this.addInteraction(Blocks.stone_stairs, i, Blocks.stone_brick_stairs, i);
+ }
+ final String str1 = "Fluid.Pyrotheum";
+ String str2 = "Enable this for Fluid Pyrotheum to be worse than lava.";
+ effect = true;
+
+ str2 = "Enable this for Fluid Pyrotheum Source blocks to gradually fall downwards.";
+ enableSourceFall = true;
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3, final Entity paramEntity) {
+ if (!effect) {
+ return;
+ }
+ if (ServerHelper.isClientWorld(paramWorld)) {
+ return;
+ }
+ if (!(paramEntity instanceof EntityPlayer)) {
+ if ((paramEntity instanceof EntityCreeper)) {
+ paramWorld.createExplosion(
+ paramEntity,
+ paramEntity.posX,
+ paramEntity.posY,
+ paramEntity.posZ,
+ 6.0F,
+ paramEntity.worldObj.getGameRules()
+ .getGameRuleBooleanValue("mobGriefing"));
+ paramEntity.setDead();
+ }
+ }
+ }
+
+ @Override
+ public int getLightValue(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ return TF_Fluids.fluidPyrotheum.getLuminosity();
+ }
+
+ @Override
+ public int getFireSpreadSpeed(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return effect ? 800 : 0;
+ }
+
+ @Override
+ public int getFlammability(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return 0;
+ }
+
+ @Override
+ public boolean isFlammable(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return (effect) && (paramForgeDirection.ordinal() > ForgeDirection.UP.ordinal())
+ && (paramIBlockAccess.getBlock(paramInt1, paramInt2 - 1, paramInt3) != this);
+ }
+
+ @Override
+ public boolean isFireSource(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final ForgeDirection paramForgeDirection) {
+ return effect;
+ }
+
+ @Override
+ public void updateTick(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final Random paramRandom) {
+ if (effect) {
+ this.checkForInteraction(paramWorld, paramInt1, paramInt2, paramInt3);
+ }
+ if ((enableSourceFall) && (paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3) == 0)) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ if (((localBlock == this) && (i != 0)) || (localBlock
+ .isFlammable(paramWorld, paramInt1, paramInt2 + this.densityDir, paramInt3, ForgeDirection.UP))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + this.densityDir, paramInt3, this, 0, 3);
+ paramWorld.setBlockToAir(paramInt1, paramInt2, paramInt3);
+ return;
+ }
+ }
+ super.updateTick(paramWorld, paramInt1, paramInt2, paramInt3, paramRandom);
+ }
+
+ protected void checkForInteraction(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (paramWorld.getBlock(paramInt1, paramInt2, paramInt3) != this) {
+ return;
+ }
+ int i = paramInt1;
+ int j = paramInt2;
+ int k = paramInt3;
+ for (int m = 0; m < 6; m++) {
+ i = paramInt1 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][0];
+ j = paramInt2 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][1];
+ k = paramInt3 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][2];
+
+ this.interactWithBlock(paramWorld, i, j, k);
+ }
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 + 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 + 1);
+ }
+
+ protected void interactWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2, paramInt3);
+ if ((localBlock == Blocks.air) || (localBlock == this)) {
+ return;
+ }
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3);
+ if (this.hasInteraction(localBlock, i)) {
+ final BlockWrapper localBlockWrapper = this.getInteraction(localBlock, i);
+ paramWorld
+ .setBlock(paramInt1, paramInt2, paramInt3, localBlockWrapper.block, localBlockWrapper.metadata, 3);
+ this.triggerInteractionEffects(paramWorld, paramInt1, paramInt2, paramInt3);
+ } else if (localBlock.isFlammable(paramWorld, paramInt1, paramInt2, paramInt3, ForgeDirection.UP)) {
+ paramWorld.setBlock(paramInt1, paramInt2, paramInt3, Blocks.fire);
+ } else if ((paramWorld.isSideSolid(paramInt1, paramInt2, paramInt3, ForgeDirection.UP))
+ && (paramWorld.isAirBlock(paramInt1, paramInt2 + 1, paramInt3))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + 1, paramInt3, Blocks.fire, 0, 3);
+ }
+ }
+
+ protected void triggerInteractionEffects(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (this.random.nextInt(16) == 0) {
+ paramWorld.playSoundEffect(
+ paramInt1 + 0.5F,
+ paramInt2 + 0.5F,
+ paramInt3 + 0.5F,
+ "random.fizz",
+ 0.5F,
+ 2.2F + ((paramWorld.rand.nextFloat() - paramWorld.rand.nextFloat()) * 0.8F));
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java
new file mode 100644
index 0000000000..38fed4c137
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import cofh.core.fluid.BlockFluidCoFHBase;
+
+public class TF_Blocks {
+
+ public static BlockFluidCoFHBase blockFluidPyrotheum;
+ public static BlockFluidCoFHBase blockFluidCryotheum;
+ public static BlockFluidCoFHBase blockFluidEnder;
+
+ public static void preInit() {
+ blockFluidPyrotheum = new TF_Block_Fluid_Pyrotheum();
+ blockFluidCryotheum = new TF_Block_Fluid_Cryotheum();
+ blockFluidEnder = new TF_Block_Fluid_Ender();
+ blockFluidPyrotheum.preInit();
+ blockFluidCryotheum.preInit();
+ blockFluidEnder.preInit();
+ }
+
+ public static void init() {}
+
+ public static void postInit() {}
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java
new file mode 100644
index 0000000000..27a0c8e080
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.thermalfoundation.fluid;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class TF_Fluids {
+
+ public static Fluid fluidPyrotheum;
+ public static Fluid fluidCryotheum;
+ public static Fluid fluidEnder;
+
+ public static void preInit() {
+ Logger.INFO("Adding in our own versions of Thermal Foundation Fluids - Non-GT");
+ final Fluid pyrotheum = FluidRegistry.getFluid("pyrotheum");
+ final Fluid cryotheum = FluidRegistry.getFluid("cryotheum");
+ final Fluid ender = FluidRegistry.getFluid("ender");
+
+ if (pyrotheum == null) {
+ Logger.INFO("Registering Blazing Pyrotheum as it does not exist.");
+ fluidPyrotheum = new Fluid("pyrotheum").setLuminosity(15)
+ .setDensity(2000)
+ .setViscosity(1200)
+ .setTemperature(4000)
+ .setRarity(EnumRarity.rare);
+ registerFluid(fluidPyrotheum, "pyrotheum");
+ } else {
+ Logger.INFO("Registering Blazing Pyrotheum as it is an already existing Fluid.");
+ fluidPyrotheum = pyrotheum;
+ }
+ if (cryotheum == null) {
+ Logger.INFO("Registering Gelid Cryotheum as it does not exist.");
+ fluidCryotheum = new Fluid("cryotheum").setLuminosity(0)
+ .setDensity(4000)
+ .setViscosity(3000)
+ .setTemperature(50)
+ .setRarity(EnumRarity.rare);
+ registerFluid(fluidCryotheum, "cryotheum");
+ } else {
+ Logger.INFO("Registering Gelid Cryotheum as it is an already existing Fluid.");
+ fluidCryotheum = cryotheum;
+ }
+
+ if (ender == null) {
+ Logger.INFO("Registering Resonant Ender as it does not exist.");
+ fluidEnder = new Fluid("ender").setLuminosity(3)
+ .setDensity(4000)
+ .setViscosity(3000)
+ .setTemperature(300)
+ .setRarity(EnumRarity.uncommon);
+ registerFluid(fluidEnder, "ender");
+ } else {
+ Logger.INFO("Registering Resonant Ender as it is an already existing Fluid.");
+ fluidEnder = ender;
+ }
+ }
+
+ public static void init() {}
+
+ public static void postInit() {}
+
+ public static void registerFluid(final Fluid paramFluid, final String paramString) {
+ if (!FluidRegistry.isFluidRegistered(paramString)) {
+ FluidRegistry.registerFluid(paramFluid);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java
new file mode 100644
index 0000000000..d2ea7ea2d1
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java
@@ -0,0 +1,75 @@
+package gtPlusPlus.xmod.thermalfoundation.item;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+
+import cofh.core.item.ItemBase;
+import cofh.core.item.ItemBucket;
+import cofh.core.util.energy.FurnaceFuelHandler;
+import cofh.core.util.fluid.BucketHandler;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.thermalfoundation.block.TF_Blocks;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Items {
+
+ public static ItemBase itemMaterial;
+ public static ItemStack rodBlizz;
+ public static ItemStack dustBlizz;
+ public static ItemStack dustPyrotheum;
+ public static ItemStack dustCryotheum;
+ public static ItemBucket itemBucket;
+ public static ItemStack bucketPyrotheum;
+ public static ItemStack bucketCryotheum;
+ public static ItemStack bucketEnder;
+
+ public static ItemStack itemDustBlizz;
+ public static ItemStack itemDustPyrotheum;
+ public static ItemStack itemDustCryotheum;
+ public static ItemStack itemRodBlizz;
+
+ public static void preInit() {
+
+ itemBucket = (ItemBucket) new ItemBucket("MiscUtils").setUnlocalizedName("bucket")
+ .setCreativeTab(AddToCreativeTab.tabMisc);
+ itemMaterial = (ItemBase) new ItemBase("MiscUtils").setUnlocalizedName("material")
+ .setCreativeTab(AddToCreativeTab.tabMisc);
+
+ bucketPyrotheum = itemBucket.addOreDictItem(1, "bucketPyrotheum");
+ bucketCryotheum = itemBucket.addOreDictItem(2, "bucketCryotheum");
+ bucketEnder = itemBucket.addOreDictItem(3, "bucketEnder", 1);
+ rodBlizz = itemMaterial.addOreDictItem(1, "rodBlizz");
+ dustBlizz = itemMaterial.addOreDictItem(2, "dustBlizz");
+ dustPyrotheum = itemMaterial.addOreDictItem(3, "dustPyrotheum");
+ dustCryotheum = itemMaterial.addOreDictItem(4, "dustCryotheum");
+
+ if (ReflectionUtils.doesClassExist("cofh.core.util.energy.FurnaceFuelHandler")) {
+ FurnaceFuelHandler.registerFuel(dustPyrotheum, 2400); // cofh.core.util.energy.FurnaceFuelHandler.registerFuel(ItemStack,
+ // int)
+ }
+
+ ItemUtils.addItemToOreDictionary(rodBlizz, "stickBlizz");
+
+ itemRodBlizz = ItemUtils.simpleMetaStack(itemMaterial, 1, 1);
+ itemDustBlizz = ItemUtils.simpleMetaStack(itemMaterial, 2, 1);
+ itemDustPyrotheum = ItemUtils.simpleMetaStack(itemMaterial, 3, 1);
+ itemDustCryotheum = ItemUtils.simpleMetaStack(itemMaterial, 4, 1);
+ }
+
+ public static void init() {
+
+ BucketHandler.registerBucket(TF_Blocks.blockFluidPyrotheum, 0, bucketPyrotheum);
+ BucketHandler.registerBucket(TF_Blocks.blockFluidCryotheum, 0, bucketCryotheum);
+ BucketHandler.registerBucket(TF_Blocks.blockFluidEnder, 0, bucketEnder);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidPyrotheum, bucketPyrotheum, FluidContainerRegistry.EMPTY_BUCKET);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidCryotheum, bucketCryotheum, FluidContainerRegistry.EMPTY_BUCKET);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidEnder, bucketEnder, FluidContainerRegistry.EMPTY_BUCKET);
+ }
+
+ public static void postInit() {}
+}
diff --git a/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java b/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java
new file mode 100644
index 0000000000..cd48964d37
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.thermalfoundation.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class TF_Gregtech_Recipes {
+
+ public static void run() {
+ start();
+ }
+
+ private static void start() {
+
+ final FluidStack moltenBlaze = getFluidStack("molten.blaze", 1440);
+
+ // Gelid Cryotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Cinnabar, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cinnabar, 3L))
+ .fluidInputs(getFluidStack("cryotheum", 144))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ // Blizz Powder
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.snowball, 4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .fluidInputs(moltenBlaze)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(chemicalBathRecipes);
+
+ // Blizz Rod
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.blaze_rod))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Blizz, 1L))
+ .duration(((int) Math.max((Materials.Blaze.getMass() * 4) * 3L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Snow, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Niter, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Snow, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+ }
+
+ private static FluidStack getFluidStack(final String fluidName, final int amount) {
+ return FluidUtils.getFluidStack(fluidName, amount);
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java b/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
new file mode 100644
index 0000000000..1023d0325f
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.tinkers;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.xmod.tinkers.material.BaseTinkersMaterial;
+import gtPlusPlus.xmod.tinkers.util.TinkersDryingRecipe;
+import gtPlusPlus.xmod.tinkers.util.TinkersUtils;
+
+public class HANDLER_Tinkers {
+
+ public static AutoMap<BaseTinkersMaterial> mTinkerMaterials = new AutoMap<>();
+
+ public static void postInit() {
+ if (TinkerConstruct.isModLoaded()) {
+
+ Fluid pyrotheumFluid = FluidRegistry.getFluid("pyrotheum");
+ if (pyrotheumFluid != null) {
+ // Enable Pyrotheum as Fuel for the Smeltery
+ TinkersUtils.addSmelteryFuel(pyrotheumFluid, 5000, 70); // pyrotheum lasts 3.5 seconds per 15 mb
+ }
+
+ // Generate Drying Rack recipes
+ TinkersDryingRecipe.generateAllDryingRecipes();
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java b/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java
new file mode 100644
index 0000000000..f57aa64263
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.tinkers.material;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gtPlusPlus.core.util.math.MathUtils.safeCast_LongToInt;
+
+import java.util.HashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.common.event.FMLInterModComms;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.tinkers.HANDLER_Tinkers;
+import gtPlusPlus.xmod.tinkers.util.TinkersUtils;
+
+public class BaseTinkersMaterial {
+
+ private static HashMap<String, Integer> aInternalMaterialIdMap = new HashMap<>();
+ private static int aNextFreeID;
+
+ public final String mLocalName;
+
+ private final String mUnlocalName;
+ private final int mID;
+ private final Material mMaterial;
+
+ static {
+ aNextFreeID = (Short.MAX_VALUE / 2) + 420;
+ }
+
+ public BaseTinkersMaterial(Material aMaterial) {
+ mLocalName = aMaterial.getLocalizedName();
+ mUnlocalName = "material.gtpp." + Utils.sanitizeString(mLocalName);
+ mMaterial = aMaterial;
+ mID = aNextFreeID++;
+ Logger.INFO("[TiCon] Assigning ID " + mID + " to " + mLocalName + ".");
+ aInternalMaterialIdMap.put(mUnlocalName, mID);
+ HANDLER_Tinkers.mTinkerMaterials.put(this);
+ }
+
+ public String getUnlocalName() {
+ return mUnlocalName;
+ }
+
+ private static int calcDurability(Material aMaterial) {
+ return safeCast_LongToInt(aMaterial.vDurability);
+ }
+
+ private static int calcMiningSpeed(Material aMaterial) {
+ return (aMaterial.vHarvestLevel * 2) + aMaterial.vTier;
+ }
+
+ private static int calcHarvestLevel(Material aMaterial) {
+ return aMaterial.vHarvestLevel;
+ }
+
+ private static int calcAttack(Material aMaterial) {
+ return aMaterial.vHarvestLevel + aMaterial.vTier + aMaterial.vRadiationLevel;
+ }
+
+ private static float calcHandleModifier(Material aMaterial) {
+ return 1f;
+ }
+
+ private static int calcReinforced(Material aMaterial) {
+ return aMaterial.getMeltingPointC() / 3600;
+ }
+
+ private static int calcBowProjectileSpeed(Material aMaterial) {
+ return aMaterial.vHarvestLevel + 2;
+ }
+
+ private static int calcBowDrawSpeed(Material aMaterial) {
+ return aMaterial.vHarvestLevel + 8;
+ }
+
+ private static float calcProjectileMass(Material aMaterial) {
+ return (aMaterial.getMeltingPointC() / 1800) * 0.1f;
+ }
+
+ private static float calcProjectileFragility(Material aMaterial) {
+ return 0f;
+ }
+
+ private static String calcStyle(Material aMaterial) {
+ String aReturn;
+ int aTemp = aMaterial.getMeltingPointC();
+ if (aTemp < 3600) {
+ aReturn = "" + EnumChatFormatting.WHITE;
+ } else if (aTemp >= 3600) {
+ aReturn = "" + EnumChatFormatting.YELLOW;
+ } else if (aTemp >= (3600 * 2)) {
+ aReturn = "" + EnumChatFormatting.GREEN;
+ } else if (aTemp >= (3600 * 3)) {
+ aReturn = "" + EnumChatFormatting.RED;
+ } else if (aTemp >= (3600 * 4)) {
+ aReturn = "" + EnumChatFormatting.DARK_RED;
+ } else {
+ aReturn = "" + EnumChatFormatting.GOLD;
+ }
+ return aReturn;
+ }
+
+ private static int calcColour(Material aMaterial) {
+ return aMaterial.getRgbAsHex();
+ }
+
+ public void generate() {
+
+ Logger.INFO("[TiCon] Trying to generate Material: " + mLocalName);
+ int id = mID;
+ if (id > 0) {
+
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("Id", id);
+ tag.setString("Name", mUnlocalName);
+ tag.setString("localizationString", mLocalName);
+ tag.setInteger("Durability", calcDurability(mMaterial)); // 97
+ tag.setInteger("MiningSpeed", calcMiningSpeed(mMaterial)); // 150
+ tag.setInteger("HarvestLevel", calcHarvestLevel(mMaterial)); // 1
+ tag.setInteger("Attack", calcAttack(mMaterial)); // 0
+ tag.setFloat("HandleModifier", calcHandleModifier(mMaterial)); // 1.0f
+ tag.setInteger("Reinforced", calcReinforced(mMaterial)); // 0
+ tag.setFloat("Bow_ProjectileSpeed", calcBowProjectileSpeed(mMaterial)); // 3.0f
+ tag.setInteger("Bow_DrawSpeed", calcBowDrawSpeed(mMaterial)); // 18
+ tag.setFloat("Projectile_Mass", calcProjectileMass(mMaterial)); // 0.69f
+ tag.setFloat("Projectile_Fragility", calcProjectileFragility(mMaterial)); // 0.2f
+ tag.setString("Style", calcStyle(mMaterial));
+ tag.setInteger("Color", calcColour(mMaterial));
+
+ boolean generate = generateRecipes(mMaterial, id);
+
+ if (generate) {
+ Logger.INFO("[TiCon] Sending IMC: addMaterial - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addMaterial", tag);
+
+ ItemStack itemstack = mMaterial.getIngot(1);
+ tag = new NBTTagCompound();
+ tag.setInteger("MaterialId", id);
+ NBTTagCompound item = new NBTTagCompound();
+ itemstack.writeToNBT(item);
+ tag.setTag("Item", item);
+ tag.setInteger("Value", 2); // What is value for?
+
+ Logger.INFO("[TiCon] Sending IMC: addPartBuilderMaterial - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addPartBuilderMaterial", tag);
+
+ tag = new NBTTagCompound();
+ tag.setInteger("MaterialId", id);
+ tag.setInteger("Value", 2); // What is value for?
+ item = new NBTTagCompound();
+ itemstack.writeToNBT(item);
+ tag.setTag("Item", item);
+
+ Logger.INFO("[TiCon] Sending IMC: addMaterialItem - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addMaterialItem", tag);
+ }
+ }
+ }
+
+ private boolean generateRecipes(Material aMaterial, int aID) {
+
+ Block aMatBlock;
+ Integer aMelt;
+ Fluid aFluid;
+
+ try {
+ aMatBlock = aMaterial.getBlock();
+ aMelt = aMaterial.getMeltingPointC();
+ aFluid = aMaterial.getFluidStack(0)
+ .getFluid();
+ } catch (Throwable t) {
+ return false;
+ }
+
+ if (aMatBlock == null || aMelt == null || aFluid == null) {
+ return false;
+ }
+
+ TinkersUtils.registerFluidType(mLocalName, aMatBlock, 0, aMelt, aFluid, true);
+ TinkersUtils.addMelting(aMaterial.getBlock(1), aMatBlock, 0, aMelt, aMaterial.getFluidStack(144 * 9));
+ TinkersUtils.addMelting(aMaterial.getIngot(1), aMatBlock, 0, aMelt, aMaterial.getFluidStack(144));
+ if (aMelt <= 3600) {
+ ItemStack ingotcast = TinkersUtils.getPattern(1);
+ TinkersUtils
+ .addBasinRecipe(aMaterial.getBlock(1), aMaterial.getFluidStack(144 * 9), (ItemStack) null, true, 100);
+ TinkersUtils
+ .addCastingTableRecipe(aMaterial.getIngot(1), aMaterial.getFluidStack(144), ingotcast, false, 50);
+ }
+
+ TinkersUtils.generateCastingRecipes(aMaterial, aID);
+
+ return true;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java b/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java
new file mode 100644
index 0000000000..33dad51510
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java
@@ -0,0 +1,129 @@
+package gtPlusPlus.xmod.tinkers.util;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TinkersDryingRecipe {
+
+ public static AutoMap<TinkersDryingRecipe> recipes = new AutoMap<>();
+
+ public final int time;
+ public final ItemStack input;
+ public final ItemStack result;
+
+ public static void generateAllDryingRecipes() {
+ List<?> aRecipes = TinkersUtils.getDryingRecipes();
+ if (aRecipes != null && aRecipes.size() > 0) {
+ for (Object o : aRecipes) {
+ Logger.INFO(
+ "Trying to generate recipe using object of type " + o.getClass()
+ .getSimpleName());
+ generateFromTinkersRecipeObject(o);
+ }
+ } else {
+ Logger.INFO(
+ "Error generating Drying recipes, map was either null or empty. Null? " + (aRecipes != null)
+ + ", Size: "
+ + aRecipes.size());
+ }
+ if (!recipes.isEmpty()) {
+ Logger.INFO("Adding " + recipes.size() + " drying rack recipes to the dehydrator.");
+ for (TinkersDryingRecipe r : recipes) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(16), r.input },
+ GT_Values.NF,
+ GT_Values.NF,
+ new ItemStack[] { r.result },
+ new int[] {},
+ r.time / 10,
+ 30);
+ }
+ }
+ }
+
+ public static TinkersDryingRecipe generateFromTinkersRecipeObject(Object o) {
+ Field aTime;
+ Field aInput;
+ Field aOutput;
+ Class aTinkerClass = ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe"); // o.getClass();
+ if (aTinkerClass == null || TinkerConstruct.isModLoaded()) {
+ Logger.INFO(
+ "Error generating Drying Recipe, could not find class. Exists? "
+ + ReflectionUtils.doesClassExist("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe"));
+ Class clazz = ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes");
+ Class[] y = clazz.getDeclaredClasses();
+ if (y == null || y.length <= 0) {
+ Logger.INFO("No hidden inner classes.");
+ return null;
+ } else {
+ boolean found = false;
+ for (Class h : y) {
+ Logger.INFO("Found hidden inner class: " + h.getCanonicalName());
+ if (h.getSimpleName()
+ .toLowerCase()
+ .equals("dryingrecipe")) {
+ Logger.INFO("Found correct recipe. Caching at correct location.");
+ ReflectionUtils.mCachedClasses
+ .put("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe", h);
+ aTinkerClass = h;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return null;
+ }
+ }
+ }
+ aTime = ReflectionUtils.getField(aTinkerClass, "time");
+ aInput = ReflectionUtils.getField(aTinkerClass, "input");
+ aOutput = ReflectionUtils.getField(aTinkerClass, "result");
+ try {
+ int time_internal = aTime.getInt(o);
+ ItemStack input_internal = (ItemStack) aInput.get(o);
+ ItemStack result_internal = (ItemStack) aOutput.get(o);
+ return new TinkersDryingRecipe(input_internal, time_internal, result_internal);
+ } catch (Throwable b) {
+ b.printStackTrace();
+ }
+ return null;
+ }
+
+ public TinkersDryingRecipe(final ItemStack input, final int time, final ItemStack result) {
+ this.time = time;
+ this.input = input;
+ this.result = result;
+ Logger.INFO(
+ "Generating Drying Recipe. Input: " + input.getDisplayName() + ", Output: " + result.getDisplayName());
+ recipes.add(this);
+ }
+
+ public boolean matches(ItemStack input) {
+ if (input.hasTagCompound()) {
+ input = input.copy();
+ input.getTagCompound()
+ .removeTag("frypanKill");
+ if (input.getTagCompound()
+ .hasNoTags()) {
+ input.setTagCompound((NBTTagCompound) null);
+ }
+ }
+ return ItemStack.areItemStacksEqual(this.input, input);
+ }
+
+ public ItemStack getResult() {
+ return this.result.copy();
+ }
+}
diff --git a/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java b/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java
new file mode 100644
index 0000000000..8b173d5b62
--- /dev/null
+++ b/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java
@@ -0,0 +1,377 @@
+package gtPlusPlus.xmod.tinkers.util;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TinkersUtils {
+
+ private static final Class<?> mClass_Smeltery;
+ private static final Class<?> mClass_TConstructRegistry;
+ private static final Class<?> mClass_ToolMaterial;
+ private static final Class<?> mClass_IPattern;
+ private static final Class<?> mClass_DynamicToolPart;
+ private static final Class<?> mClass_FluidType;
+ private static final Class<?> mClass_CastingRecipe;
+ private static final Class<?> mClass_TinkerSmeltery;
+
+ private static final Field mField_MoltenIronFluid;
+
+ private static final Method mMethod_getFluidType;
+ private static final Method mMethod_getCastingRecipes;
+
+ private static Object mSmelteryInstance;
+ private static Object mTinkersRegistryInstance;
+
+ private static final HashMap<String, Method> mMethodCache = new LinkedHashMap<>();
+
+ static {
+ mClass_Smeltery = ReflectionUtils.getClass("tconstruct.library.crafting.Smeltery");
+ mClass_TConstructRegistry = ReflectionUtils.getClass("tconstruct.library.TConstructRegistry");
+
+ mClass_ToolMaterial = ReflectionUtils.getClass("tconstruct.library.tools.ToolMaterial");
+ mClass_IPattern = ReflectionUtils.getClass("tconstruct.library.util.IPattern");
+ mClass_DynamicToolPart = ReflectionUtils.getClass("tconstruct.library.tools.DynamicToolPart");
+ mClass_FluidType = ReflectionUtils.getClass("tconstruct.library.crafting.FluidType");
+ mClass_CastingRecipe = ReflectionUtils.getClass("tconstruct.library.crafting.CastingRecipe");
+ mClass_TinkerSmeltery = ReflectionUtils.getClass("tconstruct.smeltery.TinkerSmeltery");
+
+ mField_MoltenIronFluid = ReflectionUtils.getField(mClass_TinkerSmeltery, "moltenIronFluid");
+
+ mMethod_getFluidType = ReflectionUtils.getMethod(mClass_FluidType, "getFluidType", String.class);
+ mMethod_getCastingRecipes = ReflectionUtils
+ .getMethod(getCastingInstance(0), "getCastingRecipes", new Class[] {});
+ }
+
+ private static void setTiConDataInstance() {
+ if (!TinkerConstruct.isModLoaded()) {
+ return;
+ }
+
+ if (mSmelteryInstance == null) {
+ if (mClass_Smeltery != null) {
+ try {
+ mSmelteryInstance = ReflectionUtils.getField(mClass_Smeltery, "instance")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ if (mTinkersRegistryInstance == null) {
+ if (mClass_TConstructRegistry != null) {
+ try {
+ mTinkersRegistryInstance = ReflectionUtils.getField(mClass_TConstructRegistry, "instance")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ }
+
+ /**
+ * Add a new fluid as a valid Smeltery fuel.
+ *
+ * @param fluid The fluid.
+ * @param power The temperature of the fluid. This also influences the melting speed. Lava is 1000.
+ * @param duration How long one "portion" of liquid fuels the smeltery. Lava is 10.
+ */
+ public static void addSmelteryFuel(Fluid fluid, int power, int duration) {
+ setTiConDataInstance();
+ ReflectionUtils.invokeVoid(
+ mSmelteryInstance,
+ "addSmelteryFuel",
+ new Class[] { Fluid.class, int.class, int.class },
+ new Object[] { fluid, power, duration });
+ }
+
+ public static boolean registerFluidType(String name, Block block, int meta, int baseTemperature, Fluid fluid,
+ boolean isToolpart) {
+ if (mMethodCache.get("registerFluidType") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.FluidType"),
+ "registerFluidType",
+ String.class,
+ Block.class,
+ int.class,
+ int.class,
+ Fluid.class,
+ boolean.class);
+ mMethodCache.put("registerFluidType", m);
+ }
+ try {
+ mMethodCache.get("registerFluidType")
+ .invoke(null, name, block, meta, baseTemperature, fluid, isToolpart);
+ return true;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ return false;
+ }
+ }
+
+ public static void addMelting(ItemStack input, Block block, int metadata, int temperature, FluidStack liquid) {
+ if (mMethodCache.get("addMelting") == null) {
+ Method m = ReflectionUtils.getMethod(
+ mClass_Smeltery,
+ "addMelting",
+ ItemStack.class,
+ Block.class,
+ int.class,
+ int.class,
+ FluidStack.class);
+ mMethodCache.put("addMelting", m);
+ }
+ try {
+ mMethodCache.get("addMelting")
+ .invoke(null, input, block, metadata, temperature, liquid);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addMelting(Object type, ItemStack input, int temperatureDifference, int fluidAmount) {
+ if (mMethodCache.get("addMelting") == null) {
+ Method m = ReflectionUtils
+ .getMethod(mClass_Smeltery, "addMelting", mClass_FluidType, ItemStack.class, int.class, int.class);
+ mMethodCache.put("addMelting", m);
+ }
+ try {
+ mMethodCache.get("addMelting")
+ .invoke(null, type, input, temperatureDifference, fluidAmount);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addBasinRecipe(ItemStack output, FluidStack metal, ItemStack cast, boolean consume, int delay) {
+ if (mMethodCache.get("addBasinRecipe") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.LiquidCasting"),
+ "addCastingRecipe",
+ ItemStack.class,
+ FluidStack.class,
+ ItemStack.class,
+ boolean.class,
+ int.class);
+ mMethodCache.put("addBasinRecipe", m);
+ }
+ try {
+ mMethodCache.get("addBasinRecipe")
+ .invoke(getCastingInstance(0), output, metal, cast, consume, delay);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addCastingTableRecipe(ItemStack output, FluidStack metal, ItemStack cast, boolean consume,
+ int delay) {
+ if (mMethodCache.get("addCastingTableRecipe") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.LiquidCasting"),
+ "addCastingRecipe",
+ ItemStack.class,
+ FluidStack.class,
+ ItemStack.class,
+ boolean.class,
+ int.class);
+ mMethodCache.put("addCastingTableRecipe", m);
+ }
+ try {
+ mMethodCache.get("addCastingTableRecipe")
+ .invoke(getCastingInstance(1), output, metal, cast, consume, delay);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ /**
+ * 0 For Table, 1 For Basin.
+ *
+ * @param aType - Casting Type
+ * @return - The casting instance.
+ */
+ public static Object getCastingInstance(int aType) {
+
+ setTiConDataInstance();
+
+ Method m = null;
+ if (aType == 0) {
+ m = ReflectionUtils.getMethod(mTinkersRegistryInstance, "getTableCasting", new Class[] {});
+ } else if (aType == 1) {
+ m = ReflectionUtils.getMethod(mTinkersRegistryInstance, "getBasinCasting", new Class[] {});
+ } // return null;
+
+ if (m != null) {
+ try {
+ return m.invoke(mTinkersRegistryInstance, new Object[] {});
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ private static Item mTinkerMetalPattern;
+
+ public static ItemStack getPattern(int aType) {
+ if (mTinkerMetalPattern == null) {
+ Field m = ReflectionUtils.getField(mClass_TinkerSmeltery, "metalPattern");
+ if (m != null) {
+ try {
+ mTinkerMetalPattern = (Item) m.get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ if (mTinkerMetalPattern != null) {
+ return new ItemStack(mTinkerMetalPattern, aType, 0);
+ }
+ return ItemUtils.getErrorStack(1, "Bad Tinkers Pattern");
+ }
+
+ private static AutoMap<?> mDryingRackRecipes;
+
+ public static List<?> getDryingRecipes() {
+ if (mDryingRackRecipes != null) {
+ return mDryingRackRecipes;
+ }
+ AutoMap<Object> aData = new AutoMap<>();
+ int aCount = 0;
+ try {
+ ArrayList<?> recipes = (ArrayList<?>) ReflectionUtils
+ .getField(ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes"), "recipes")
+ .get(null);
+ if (recipes != null) {
+ for (Object o : recipes) {
+ aData.put(o);
+ aCount++;
+ }
+ Logger.INFO("Found " + aCount + " Tinkers drying rack recipes.");
+ } else {
+ Logger.INFO("Failed to find any Tinkers drying rack recipes.");
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ Logger.INFO("Failed to find any Tinkers drying rack recipes.");
+ }
+ mDryingRackRecipes = aData;
+ return aData;
+ }
+
+ public static List<?> getTableCastingRecipes() {
+ Object aCastingTableHandlerInstance = getCastingInstance(0);
+ List<?> aTemp;
+ try {
+ aTemp = (List<?>) mMethod_getCastingRecipes.invoke(aCastingTableHandlerInstance, new Object[] {});
+ return aTemp;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return new ArrayList<>();
+ }
+
+ public static void generateCastingRecipes(Material aMaterial, int aID) {
+
+ List<CastingRecipeHandler> newRecipies = new LinkedList<>();
+
+ Iterator<?> iterator1 = getTableCastingRecipes().iterator();
+ Fluid aMoltenIron = null;
+ if (aMoltenIron == null) {
+ try {
+ aMoltenIron = (Fluid) mField_MoltenIronFluid.get(null);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ aMoltenIron = Materials.Iron.getMolten(0)
+ .getFluid();
+ }
+ }
+ while (iterator1.hasNext()) {
+ CastingRecipeHandler recipe = new CastingRecipeHandler(iterator1.next());
+ if (recipe == null || !recipe.valid) {
+ continue;
+ }
+ try {
+ if (recipe.castingMetal.getFluid() == aMoltenIron && recipe.cast != null
+ && mClass_IPattern.isInstance(recipe.cast.getItem())
+ && mClass_DynamicToolPart.isInstance(
+ recipe.getResult()
+ .getItem())) {
+ newRecipies.add(recipe);
+ }
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return;
+ }
+ }
+
+ Object ft;
+ try {
+ ft = mMethod_getFluidType.invoke(null, aMaterial.getLocalizedName());
+ for (CastingRecipeHandler newRecipy : newRecipies) {
+ CastingRecipeHandler recipe = new CastingRecipeHandler(newRecipy);
+ if (!recipe.valid) {
+ continue;
+ }
+ // CastingRecipe recipe = (CastingRecipe) i$.next();
+ ItemStack output = recipe.getResult()
+ .copy();
+ output.setItemDamage(aID);
+ FluidStack liquid2 = new FluidStack(
+ aMaterial.getFluidStack(0)
+ .getFluid(),
+ recipe.castingMetal.amount);
+ addCastingTableRecipe(output, liquid2, recipe.cast, recipe.consumeCast, recipe.coolTime);
+ addMelting(ft, output, 0, liquid2.amount / 2);
+ }
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static class CastingRecipeHandler {
+
+ public ItemStack output;
+ public FluidStack castingMetal;
+ public ItemStack cast;
+ public boolean consumeCast;
+ public int coolTime;
+
+ public boolean valid;
+
+ public CastingRecipeHandler(Object aCastingRecipe) {
+ if (mClass_CastingRecipe.isInstance(aCastingRecipe)) {
+ try {
+ Field aF_output = ReflectionUtils.getField(mClass_CastingRecipe, "output");
+ Field aF_castingMetal = ReflectionUtils.getField(mClass_CastingRecipe, "castingMetal");
+ Field aF_cast = ReflectionUtils.getField(mClass_CastingRecipe, "cast");
+ Field aF_consumeCast = ReflectionUtils.getField(mClass_CastingRecipe, "consumeCast");
+ Field aF_coolTime = ReflectionUtils.getField(mClass_CastingRecipe, "coolTime");
+
+ output = (ItemStack) aF_output.get(aCastingRecipe);
+ castingMetal = (FluidStack) aF_castingMetal.get(aCastingRecipe);
+ cast = (ItemStack) aF_cast.get(aCastingRecipe);
+ consumeCast = (boolean) aF_consumeCast.get(aCastingRecipe);
+ coolTime = (int) aF_coolTime.get(aCastingRecipe);
+ valid = true;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ valid = false;
+ }
+ } else {
+ valid = false;
+ }
+ }
+
+ public ItemStack getResult() {
+ return this.output.copy();
+ }
+ }
+}
diff --git a/src/main/resources/META-INF/tectech_at.cfg b/src/main/resources/META-INF/tectech_at.cfg
new file mode 100644
index 0000000000..fa76d13c1f
--- /dev/null
+++ b/src/main/resources/META-INF/tectech_at.cfg
@@ -0,0 +1,17 @@
+public net.minecraft.block.Block field_149781_w #blockResistance
+public net.minecraft.block.Block field_149782_v #blockHardness
+protected net.minecraft.client.gui.FontRenderer field_111274_c #unicodePageLocations
+protected net.minecraft.client.gui.FontRenderer field_78285_g #colorCode
+protected net.minecraft.client.gui.FontRenderer field_78298_i #renderEngine
+protected net.minecraft.client.gui.FontRenderer field_78293_l #unicodeFlag
+protected net.minecraft.client.gui.FontRenderer field_78294_m #bidiFlag
+protected net.minecraft.client.gui.FontRenderer field_78291_n #red
+protected net.minecraft.client.gui.FontRenderer field_78292_o #blue
+protected net.minecraft.client.gui.FontRenderer field_78306_p #green
+protected net.minecraft.client.gui.FontRenderer field_78305_q #alpha
+protected net.minecraft.client.gui.FontRenderer field_78304_r #textColor
+protected net.minecraft.client.gui.FontRenderer field_78303_s #randomStyle
+protected net.minecraft.client.gui.FontRenderer field_78302_t #boldStyle
+protected net.minecraft.client.gui.FontRenderer field_78301_u #italicStyle
+protected net.minecraft.client.gui.FontRenderer field_78300_v #underlineStyle
+protected net.minecraft.client.gui.FontRenderer field_78299_w #strikethroughStyle
diff --git a/src/main/resources/TecTechIcon.png b/src/main/resources/TecTechIcon.png
new file mode 100644
index 0000000000..2e07b61e40
--- /dev/null
+++ b/src/main/resources/TecTechIcon.png
Binary files differ
diff --git a/src/main/resources/TecTechIconSmall.png b/src/main/resources/TecTechIconSmall.png
new file mode 100644
index 0000000000..e49439f14d
--- /dev/null
+++ b/src/main/resources/TecTechIconSmall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/lang/de_DE.lang b/src/main/resources/assets/bartworks/lang/de_DE.lang
new file mode 100644
index 0000000000..23edaf6124
--- /dev/null
+++ b/src/main/resources/assets/bartworks/lang/de_DE.lang
@@ -0,0 +1,152 @@
+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
new file mode 100644
index 0000000000..7ec5d318d0
--- /dev/null
+++ b/src/main/resources/assets/bartworks/lang/en_US.lang
@@ -0,0 +1,202 @@
+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
new file mode 100644
index 0000000000..a9f4964759
--- /dev/null
+++ b/src/main/resources/assets/bartworks/lang/fr_FR.lang
@@ -0,0 +1,160 @@
+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
new file mode 100644
index 0000000000..f3a9ca534d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/lang/zh_CN.lang
@@ -0,0 +1,163 @@
+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
new file mode 100644
index 0000000000..0c1dea7fcc
--- /dev/null
+++ b/src/main/resources/assets/bartworks/sounds.json
@@ -0,0 +1,11 @@
+{
+ "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
new file mode 100644
index 0000000000..754711c999
--- /dev/null
+++ b/src/main/resources/assets/bartworks/sounds/radhatch.ogg
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
new file mode 100644
index 0000000000..aef2e1687b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/brown.png b/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
new file mode 100644
index 0000000000..2db03dff22
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png b/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
new file mode 100644
index 0000000000..c14cfb78ae
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
new file mode 100644
index 0000000000..a8d30a022e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
new file mode 100644
index 0000000000..d7132dcfba
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
new file mode 100644
index 0000000000..4244b6256b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
new file mode 100644
index 0000000000..d051681c1e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
new file mode 100644
index 0000000000..fb7483a9a7
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
new file mode 100644
index 0000000000..5dc78c8271
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
new file mode 100644
index 0000000000..ca3b11d69d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png b/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
new file mode 100644
index 0000000000..34b2b59e0e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
new file mode 100644
index 0000000000..de259fc32a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
new file mode 100644
index 0000000000..8b6425b8cf
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
new file mode 100644
index 0000000000..c2f1271f62
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
new file mode 100644
index 0000000000..e5cf55abd4
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
new file mode 100644
index 0000000000..eb908f863a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png b/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
new file mode 100644
index 0000000000..fc6478c29f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png b/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
new file mode 100644
index 0000000000..4a54ac5781
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
new file mode 100644
index 0000000000..f9e55beeb9
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
new file mode 100644
index 0000000000..3840d7fd45
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
new file mode 100644
index 0000000000..0dfe303cf0
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
new file mode 100644
index 0000000000..7a324ebf38
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png b/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
new file mode 100644
index 0000000000..b302f4e89e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png b/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
new file mode 100644
index 0000000000..4d8405e02c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
new file mode 100644
index 0000000000..73893b9036
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
new file mode 100644
index 0000000000..d5c9ae0825
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png b/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
new file mode 100644
index 0000000000..5b3c3edec0
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png b/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
new file mode 100644
index 0000000000..fc0872b45f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..0e27ddbb62
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
new file mode 100644
index 0000000000..f711908135
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
new file mode 100644
index 0000000000..92ce6cb9a2
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
new file mode 100644
index 0000000000..0cc6e08ae3
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
new file mode 100644
index 0000000000..f230acbe3f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
new file mode 100644
index 0000000000..2febb0540d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
new file mode 100644
index 0000000000..89e0b0d84e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
new file mode 100644
index 0000000000..54c29e5ae9
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..2f58642a18
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png b/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
new file mode 100644
index 0000000000..8922a3d4e2
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png b/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
new file mode 100644
index 0000000000..6e2e7dfe4e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..4710c28436
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..9a87942ef9
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
new file mode 100644
index 0000000000..0fd516231e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
new file mode 100644
index 0000000000..acdb3b4e6a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
new file mode 100644
index 0000000000..1feeb1fd92
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
new file mode 100644
index 0000000000..c6de6719e9
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png b/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
new file mode 100644
index 0000000000..f41b59f820
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..213f8feafd
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..c75fafb933
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png b/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
new file mode 100644
index 0000000000..f5976c093b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..e5be40d5ff
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png b/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
new file mode 100644
index 0000000000..336a7a5b4e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png b/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
new file mode 100644
index 0000000000..5d97902f87
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..9908141e11
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..220e85e57c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png b/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
new file mode 100644
index 0000000000..79801b0471
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png b/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
new file mode 100644
index 0000000000..07618e28aa
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
new file mode 100644
index 0000000000..f66994bcd2
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
new file mode 100644
index 0000000000..1249814be6
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
new file mode 100644
index 0000000000..0bb400b3dc
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
new file mode 100644
index 0000000000..e40c597ceb
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
new file mode 100644
index 0000000000..2ddabd3331
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
new file mode 100644
index 0000000000..617758a4b6
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
new file mode 100644
index 0000000000..a8ab0806e2
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
new file mode 100644
index 0000000000..d3f697ab1f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
new file mode 100644
index 0000000000..543b011c03
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
new file mode 100644
index 0000000000..d69e640fb3
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
new file mode 100644
index 0000000000..48509772ce
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
new file mode 100644
index 0000000000..93dc271b8e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
new file mode 100644
index 0000000000..da2f1deb4a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
new file mode 100644
index 0000000000..4a7a5b4a3f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
new file mode 100644
index 0000000000..fdf64c2958
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
new file mode 100644
index 0000000000..d4110a3b06
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
new file mode 100644
index 0000000000..5622806282
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
new file mode 100644
index 0000000000..c0b5b0da4d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
new file mode 100644
index 0000000000..3c8b4c66d7
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
new file mode 100644
index 0000000000..036adac6f3
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
new file mode 100644
index 0000000000..ea67c34b23
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
new file mode 100644
index 0000000000..1727d6228a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
new file mode 100644
index 0000000000..8795c1dacc
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
new file mode 100644
index 0000000000..f711908135
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
new file mode 100644
index 0000000000..c69982d8e7
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
new file mode 100644
index 0000000000..18eadf45ed
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
new file mode 100644
index 0000000000..269de3edb1
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
new file mode 100644
index 0000000000..198701e1bb
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
new file mode 100644
index 0000000000..9f050cc629
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
new file mode 100644
index 0000000000..4969508f31
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
new file mode 100644
index 0000000000..c73f1f5320
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
new file mode 100644
index 0000000000..f9a450ae2d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
new file mode 100644
index 0000000000..91bcf79e1f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
new file mode 100644
index 0000000000..4b8c71a8ae
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
new file mode 100644
index 0000000000..91bcf79e1f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png b/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
new file mode 100644
index 0000000000..8f49c6b2f3
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/Agarose.png b/src/main/resources/assets/bartworks/textures/items/Agarose.png
new file mode 100644
index 0000000000..fe6add0bb0
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/Agarose.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
new file mode 100644
index 0000000000..ea113e3f22
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png b/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
new file mode 100644
index 0000000000..029d895f31
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png b/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
new file mode 100644
index 0000000000..6b7f9a54d8
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWmotor.png b/src/main/resources/assets/bartworks/textures/items/BWmotor.png
new file mode 100644
index 0000000000..c701227af2
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BWmotor.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWrawtube.png b/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
new file mode 100644
index 0000000000..ab3dd4a2bd
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
new file mode 100644
index 0000000000..73abda00dd
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
new file mode 100644
index 0000000000..eb5e37eaa1
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png b/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
new file mode 100644
index 0000000000..5021c2834e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png b/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
new file mode 100644
index 0000000000..a420873554
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png b/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
new file mode 100644
index 0000000000..99dc1c9b95
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png b/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
new file mode 100644
index 0000000000..7c10790535
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png b/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
new file mode 100644
index 0000000000..92fe5e9d81
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT2Coin.png b/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
new file mode 100644
index 0000000000..c590469aed
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png b/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
new file mode 100644
index 0000000000..b04bb30f5c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png b/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
new file mode 100644
index 0000000000..fd8185056b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
new file mode 100644
index 0000000000..18ab91de32
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
new file mode 100644
index 0000000000..26f20f97f1
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
new file mode 100644
index 0000000000..53c59ec79c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
new file mode 100644
index 0000000000..714b4806dd
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
new file mode 100644
index 0000000000..2be7586764
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
new file mode 100644
index 0000000000..6f95ff5256
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
new file mode 100644
index 0000000000..e29d9dc953
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
new file mode 100644
index 0000000000..1e0c684eb1
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
new file mode 100644
index 0000000000..1cbc98794d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
new file mode 100644
index 0000000000..7858c997d4
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
new file mode 100644
index 0000000000..19b94a07cb
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
new file mode 100644
index 0000000000..324df7101b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
new file mode 100644
index 0000000000..28432d2d9b
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
new file mode 100644
index 0000000000..ada36141c6
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
new file mode 100644
index 0000000000..7054c76741
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
new file mode 100644
index 0000000000..b3b36e3bdc
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
new file mode 100644
index 0000000000..ab142635c9
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
new file mode 100644
index 0000000000..e7ac40c10f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
new file mode 100644
index 0000000000..ea22c17f5c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
new file mode 100644
index 0000000000..b2c8003b5c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
new file mode 100644
index 0000000000..0d026c2492
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/IncubationModule.png b/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
new file mode 100644
index 0000000000..e0ea17749d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png b/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
new file mode 100644
index 0000000000..c0e5b9a822
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png b/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
new file mode 100644
index 0000000000..f51730a7af
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png b/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
new file mode 100644
index 0000000000..0e62fa2621
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png b/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
new file mode 100644
index 0000000000..9c20f554e7
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png b/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
new file mode 100644
index 0000000000..26109fc979
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png b/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
new file mode 100644
index 0000000000..0aea0500cf
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png b/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
new file mode 100644
index 0000000000..6b2835d100
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TransformationModule.png b/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
new file mode 100644
index 0000000000..36b8a44f4d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png b/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
new file mode 100644
index 0000000000..f6d80e292e
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png b/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
new file mode 100644
index 0000000000..a02ee7ad6a
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png b/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
new file mode 100644
index 0000000000..33b1e96bda
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_top.png b/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
new file mode 100644
index 0000000000..0be37504b5
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png b/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
new file mode 100644
index 0000000000..6de5748e32
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/petriDish.png b/src/main/resources/assets/bartworks/textures/items/petriDish.png
new file mode 100644
index 0000000000..467a79f19c
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/petriDish.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
new file mode 100644
index 0000000000..bdb4aafc04
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
new file mode 100644
index 0000000000..13ae5461e8
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
new file mode 100644
index 0000000000..a11f72b76d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
new file mode 100644
index 0000000000..56863186ac
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
new file mode 100644
index 0000000000..a5bb68bb43
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
new file mode 100644
index 0000000000..824697ab3d
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
new file mode 100644
index 0000000000..c00616ed74
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
new file mode 100644
index 0000000000..3171928a82
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
new file mode 100644
index 0000000000..4d0b74c047
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
new file mode 100644
index 0000000000..e60e68040f
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png b/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
new file mode 100644
index 0000000000..5cea540797
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png b/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
new file mode 100644
index 0000000000..24c6cb0573
--- /dev/null
+++ b/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
new file mode 100644
index 0000000000..18e7cd3b3c
--- /dev/null
+++ b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
new file mode 100644
index 0000000000..85b66ad2a5
--- /dev/null
+++ b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
new file mode 100644
index 0000000000..745d1131c3
--- /dev/null
+++ b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
new file mode 100644
index 0000000000..d966674e54
--- /dev/null
+++ b/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/AlvearyFrame.png b/src/main/resources/assets/forestry/AlvearyFrame.png
new file mode 100644
index 0000000000..c69ead8dd0
--- /dev/null
+++ b/src/main/resources/assets/forestry/AlvearyFrame.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/AlvearyMutator.png b/src/main/resources/assets/forestry/AlvearyMutator.png
new file mode 100644
index 0000000000..2225f2748f
--- /dev/null
+++ b/src/main/resources/assets/forestry/AlvearyMutator.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png
new file mode 100644
index 0000000000..f21e59ec96
--- /dev/null
+++ b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png
new file mode 100644
index 0000000000..f21e59ec96
--- /dev/null
+++ b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png
new file mode 100644
index 0000000000..51336c00b9
--- /dev/null
+++ b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png
Binary files differ
diff --git a/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png
new file mode 100644
index 0000000000..51336c00b9
--- /dev/null
+++ b/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png
Binary files differ
diff --git a/src/main/resources/assets/galacticgreg/galacticgreg.png b/src/main/resources/assets/galacticgreg/galacticgreg.png
new file mode 100644
index 0000000000..204bdc8f0d
--- /dev/null
+++ b/src/main/resources/assets/galacticgreg/galacticgreg.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
index a718108566..d9b23a951c 100644
--- a/src/main/resources/assets/gregtech/lang/en_US.lang
+++ b/src/main/resources/assets/gregtech/lang/en_US.lang
@@ -1501,3 +1501,288 @@ gt.time.second.plural=seconds
#Tool modes
gt.wrench.mode.1=Line Mode
+
+# GT++
+# Shit I stole from GTNH~
+
+GT5U.gui.text.no_water=§7Missing water
+GT5U.gui.text.no_lava=§7Missing lava
+GT5U.gui.text.no_air=§7Missing air
+GT5U.gui.text.no_co2=§7Missing CO2
+GT5U.gui.text.no_li2bef4=§7Missing Li2BeF4
+GT5U.gui.text.no_saw=§7Missing saw
+GT5U.gui.text.no_sapling=§7Missing sapling
+GT5U.gui.text.no_oxygen=§7Missing oxygen
+GT5U.gui.text.fuel_blacklisted=§7Fuel blacklisted
+GT5U.gui.text.no_catalyst=§7No valid catalyst found
+GT5U.gui.text.no_milling_ball=§7No milling ball found
+GT5U.gui.text.growing_trees=§aGrowing trees
+GT5U.gui.text.managing_power=§aManaging power
+GT5U.gui.text.no_scrap=§aInput too low quality
+GT5U.gui.text.warm_up=§aWarming up
+GT5U.gui.text.machine_locked_to_different_recipe=§7Machine is already locked to a different recipe
+GT5U.gui.text.no_output_for_sapling=§7This sapling yields no outputs
+GT5U.gui.text.no_tools=§7Missing applicable tools
+
+GTPP.EBF.heat=Heat capacity
+
+GTPP.machines.tier=Tier
+GTPP.machines.input=Input
+GTPP.machines.output=Output
+
+GTPP.multiblock.pollutionreduced=Pollution reduced to
+GTPP.multiblock.pollution=Pollution
+GTPP.multiblock.energy=Stored Energy
+GTPP.multiblock.progress=Progress
+GTPP.multiblock.efficiency=Efficiency
+GTPP.multiblock.problems=Problems
+GTPP.multiblock.mei=Max Energy Income
+GTPP.multiblock.usage=Probably uses
+GTPP.multiblock.generation=Probably generates
+GTPP.multiblock.specialvalue=Special Value
+GTPP.multiblock.duration=Duration
+GTPP.multiblock.multimachine.metal=Metal Mode. Does compressor (circuit 20), lathe (circuit 21) and electromagnetic polarizer (circuit 22).
+GTPP.multiblock.multimachine.fluid=Fluid Mode. Does fermenter (circuit 20), fluid extractor (circuit 21) and extractor (circuit 22).
+GTPP.multiblock.multimachine.misc=Misc. Mode. Does precision laser engraver (circuit 20), autoclave (circuit 21) and fluid solidifier (circuit 22).
+
+
+GTPP.waila.steam.use=Probably uses: §e%s§r L/t Steam
+
+GTPP.CC.machinetier=Control Core Tier
+GTPP.CC.discount=EU Discount
+GTPP.CC.parallel=Maximum Parallel
+
+# Tooltips for the Charger Packs
+GTPP.battpack.tooltip.1=Worn as a Belt within Baubles
+GTPP.battpack.tooltip.2=Drains
+GTPP.battpack.tooltip.3=to charge worn armour
+GTPP.battpack.tooltip.4=Also charges items on the hotbar
+
+# Tooltips for the Personal Healing Bauble
+GTPP.nanohealer.tooltip.1=Worn as a Necklace within Baubles
+GTPP.nanohealer.tooltip.2=Drains
+GTPP.nanohealer.tooltip.3= EU per operation.
+GTPP.nanohealer.tooltip.4=Can restore HP, Hunger and Saturation.
+GTPP.nanohealer.tooltip.5=Will not prevent death.
+GTPP.nanohealer.tooltip.6=Shift+RMB to toggle notifications.
+GTPP.nanohealer.hidden=Hiding Info?
+
+# 10/4/19
+# Tooltips for the Mob Killing Baubles
+GTPP.monsterkiller.tooltip.1=Worn as an Amulet within Baubles
+GTPP.monsterkiller.tooltip.2=Drains
+GTPP.monsterkiller.tooltip.3=per each kill
+GTPP.monsterkiller.tooltip.4=Target Type:
+
+# 17/08/19
+GTPP.container.decaychest.name=Decayables
+
+
+
+
+
+
+
+
+
+
+
+
+# NEI INFORMATION
+GTPP.nei.info=Information
+GTPP.nei.eutick=Eu/t
+GTPP.nei.timetaken=Time Taken
+GTPP.nei.output=Output
+GTPP.nei.input=Input
+GTPP.nei.result=Result
+GTPP.nei.radioation=Radiation Level
+
+# Some Generic Words
+GTPP.info.eu=EU
+GTPP.info.euInfo=EU Information
+GTPP.info.inputLimit=Input Limit
+GTPP.info.currentPower=Current Power
+GTPP.info.hidden=Hidden
+
+# Some Time Words
+GTPP.time.ticks=Ticks
+GTPP.time.seconds=Seconds
+GTPP.time.minutes=Minutes
+GTPP.time.hours=Hours
+GTPP.time.days=Days
+GTPP.time.weeks=Weeks
+GTPP.time.months=Months
+
+# Steam MultiBlock Tooltips
+GTPP.MBTT.SteamHatch=Steam Hatch
+GTPP.MBTT.SteamInputBus=Input Bus (Steam)
+GTPP.MBTT.SteamOutputBus=Output Bus (Steam)
+
+
+
+
+
+
+
+
+# Achievements
+
+# 4/2/19
+achievement.gt.blockmachines.fusioncomputer.tier.09=Fusion Computer Mark IV
+achievement.gtplusplus.blockcasings.3.12=Fusion Casing MK III
+achievement.gtplusplus.blockcasings.3.13=Advanced Magnetic Containment!
+achievement.gtplusplus.blockcasings.3.15=Quantum Containment!
+achievement.gt.blockmachines.fusioncomputer.tier.09.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.12.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.13.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.15.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtplusplus.fusion.single=Alternative Fusion
+achievement.gt.blockmachines.gtplusplus.tank.plasma=Plasma Storage
+achievement.gt.blockmachines.gtplusplus.fusion.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtplusplus.tank.plasma.desc=[AL] Pickup this item to see the recipe in NEI
+
+
+# 5/2/19
+achievement.MU-metaitem.01.32106=Junior Physicist
+achievement.MU-metaitem.01.32107=Graduate Physicist
+achievement.MU-metaitem.01.32108=Scholarly Physicist
+achievement.MU-metaitem.01.32109=Master Physicist
+achievement.MU-metaitem.01.32106.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32107.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32108.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32109.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32066=Proton Containment
+achievement.MU-metaitem.01.32068=Electron Containment
+achievement.MU-metaitem.01.32070=Quark Containment
+achievement.MU-metaitem.01.32110=Graviton Containment
+achievement.MU-metaitem.01.32066.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32068.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32070.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32110.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.personalHealingDevice=Food is for chumps
+achievement.item.personalHealingDevice.desc=[AL] You have upgraded to the nano, the future is yours
+achievement.item.GTPP.BattPack.06.name=Charge Pack Mk I
+achievement.item.GTPP.BattPack.07.name=Charge Pack Mk II
+achievement.item.GTPP.BattPack.08.name=Charge Pack Mk III
+achievement.item.GTPP.BattPack.09.name=Charge Pack Mk IV
+achievement.item.GTPP.BattPack.06.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.07.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.08.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.09.name.desc=[AL] Pickup this item to see the recipe in NEI
+
+
+
+# 14/2/19
+achievement.gtpp.start=Gregtech++
+achievement.gtpp.start.desc=So, think you've got what it takes?
+achievement.hatch.control=This is where you put the Control Core
+achievement.hatch.control.desc=A special hatch required by all GT++ Multiblocks.
+achievement.hatch.dynamo.buffered=Buffered Dynamo Hatch
+achievement.hatch.dynamo.buffered.desc=More energy from the same multi!
+achievement.multi.abs=Alloy Blast Smelter [ABS]
+achievement.multi.abs.desc=Used to create most late game alloys.
+achievement.dust.potin=Potin!
+achievement.dust.potin.desc=Well, you gotta start somewhere...
+achievement.dust.eglin=Eglin Steel!
+achievement.dust.eglin.desc=Progress, albeit slow...
+achievement.dust.staballoy=Staballoy!
+achievement.dust.staballoy.desc=Now we're talking...
+achievement.dust.quantum=Quantum!
+achievement.dust.quantum.desc=Raw Matter.
+achievement.dust.hypogen=Hypogen!
+achievement.dust.hypogen.desc=What even is this material?
+achievement.block.fishtrap=Free Fish
+achievement.block.fishtrap.desc=Better than HarvestCraft.
+achievement.block.withercage=Jail
+achievement.block.withercage.desc=Trap a Wither/Dragon with this.
+achievement.rtg=Radioisotope Thermoelectric Generation!
+achievement.rtg.desc=Probably stolen from Russia, use with care.
+achievement.dehydrate=Dehydration
+achievement.dehydrate.desc=Drink some water.
+achievement.semifluid=It's like a fluid, but it's not
+achievement.semifluid.desc=Semifluids are confusing.
+achievement.earlywasher=Simple Ore Washer
+achievement.earlywasher.desc=Runs on ULV only.
+achievement.advancedsteam=Alternative Steam options
+achievement.advancedsteam.desc=Smart fuel consumption
+achievement.pollutionremoval=Pollution, no more!
+achievement.pollutionremoval.desc=POLLUTION IS BAD
+achievement.hiampxform=High Amp Transformers
+achievement.hiampxform.desc=Advanced power transformation
+achievement.multi.pss=Power Sub-Station [PSS]
+achievement.multi.pss.desc=Grid Power Storage.
+achievement.multi.cyclo=Cyclotron
+achievement.multi.cyclo.desc=Advanced Science
+achievement.multi.sifter=Industrial Sifter
+achievement.multi.sifter.desc=Faster than a turtle.
+achievement.multi.cokeoven=Industrial Coke Oven [ICO]
+achievement.multi.cokeoven.desc=Better than a Pyrolyse
+achievement.multi.boiler.thermal=Thermal Boiler
+achievement.multi.boiler.thermal.desc=Pahoehoe works too!
+achievement.multi.zhuhai=Zhuhai, Fishing Port
+achievement.multi.zhuhai.desc=Actually exists
+achievement.casing.abs=Slow Progress
+achievement.casing.abs.desc=Eventually, you will have your ABS.
+achievement.casing.cyclotron.coil=Slower Progress
+achievement.casing.cyclotron.coil.desc=Consider why you're even doing this..
+achievement.casing.multiuse=I'm going to make lots of these
+achievement.casing.multiuse.desc=Don't start counting.
+achievement.casing.containment=What's this for?
+achievement.casing.containment.desc=I should probably try find out.
+achievement.decay.neptunium238=Neptunium 238
+achievement.decay.neptunium238.desc=Cyclotron Product
+achievement.decay.radium226=Radium 226
+achievement.decay.radium226.desc=Cyclotron Product
+achievement.decay.molybdenum99=Molybdenum 99
+achievement.decay.molybdenum99.desc=Cyclotron Product
+achievement.decay.technetium99m=Technetium 99M
+achievement.decay.technetium99m.desc=Cyclotron Product
+achievement.decay.technetium99=Technetium 99
+achievement.decay.technetium99.desc=Cyclotron Product
+
+# 24/11/19
+achievement.gt.blockmachines.hatch.turbine.input.tier.00=Turbine Housing
+achievement.gt.blockmachines.hatch.turbine.input.tier.00.desc=[AL] Pickup this item to see the recipe in NEI
+
+# Added 6/12/21
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell=Flotation Cell
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtpp.multimachine.isamill=IsaMill
+achievement.gt.blockmachines.gtpp.multimachine.isamill.desc=[AL] Pickup this item to see the recipe in NEI
+
+# 2023-1-13
+achievement.gt.blockmachines.industrialalloysmelter.controller.tier.mega=Fast Pikachu-Alloy at last
+
+# 2023-4-8
+tooltip.flotationCell.lockedTo=Locked to:
+tooltip.large_macerator.tier=Tier: §6%s
+tooltip.large_distill_tower.upgraded=§6Upgraded
+
+# 2023-7-12
+achievement.gtplusplus.blockcasings.5.3=Elemental Confinement Shell
+achievement.gtplusplus.blockcasings.5.3.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.7=Neutron Pulse Manipulator
+achievement.gtplusplus.blockcasings.5.7.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.8=Cosmic Fabric Manipulator
+achievement.gtplusplus.blockcasings.5.8.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.9=Infinity Infused Manipulator
+achievement.gtplusplus.blockcasings.5.9.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.10=SpaceTime Continuum Manipulator
+achievement.gtplusplus.blockcasings.5.10.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.11=Neutron Shielding Core
+achievement.gtplusplus.blockcasings.5.11.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.12=Cosmic Fabric Shielding Core
+achievement.gtplusplus.blockcasings.5.12.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.13=Infinity Infused Shielding Core
+achievement.gtplusplus.blockcasings.5.13.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.14=SpaceTime Bending Core
+achievement.gtplusplus.blockcasings.5.14.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.sparge.controller.single=Sparge Tower
+achievement.gt.blockmachines.sparge.controller.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.industrialsalloyamelter.controller.tier.mega=Mega Alloy Blast Smelter
+achievement.gt.blockmachines.industrialsalloyamelter.controller.tier.mega.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.moleculartransformer.controller.tier.single=Molecular Transformer
+achievement.gt.blockmachines.moleculartransformer.controller.tier.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtpp.multimachine.replicator=Elemental Duplicator
+achievement.gt.blockmachines.gtpp.multimachine.replicator.desc=[AL] Pickup this item to see the recipe in NEI
+
diff --git a/src/main/resources/assets/gregtech/lang/zh_CN.lang b/src/main/resources/assets/gregtech/lang/zh_CN.lang
index f86709e96a..556de18ca9 100644
--- a/src/main/resources/assets/gregtech/lang/zh_CN.lang
+++ b/src/main/resources/assets/gregtech/lang/zh_CN.lang
@@ -1046,3 +1046,227 @@ fluid.sewerage=下水
fluid.fuelgc=GC燃油
fluid.dirtywater=污水
fluid.oilgc=GC石油
+
+# GT++
+# Shit I stole from GTNH~
+
+GTPP.EBF.heat=热容
+
+GTPP.machines.tier=等级
+GTPP.machines.input=输入
+GTPP.machines.output=输出
+
+GTPP.multiblock.pollutionreduced=减少污染至
+GTPP.multiblock.pollution=污染
+GTPP.multiblock.energy=能量存储
+GTPP.multiblock.progress=进程
+GTPP.multiblock.efficiency=效率
+GTPP.multiblock.problems=维护问题
+GTPP.multiblock.mei=最大能量输入
+GTPP.multiblock.usage=NEI功率
+GTPP.multiblock.generation=可能生成
+GTPP.multiblock.specialvalue=特殊值
+GTPP.multiblock.duration=NEI时间
+
+
+
+GTPP.CC.machinetier=控制核心等级
+GTPP.CC.discount=EU损耗
+GTPP.CC.parallel=最大并行
+
+# Tooltips for the Charger Packs
+GTPP.battpack.tooltip.1=在Baubles的腰带栏内使用
+GTPP.battpack.tooltip.2=消耗
+GTPP.battpack.tooltip.3=给穿着的盔甲充能
+GTPP.battpack.tooltip.4=同样给快捷栏内的物品充能
+
+# Tooltips for the Personal Healing Bauble
+GTPP.nanohealer.tooltip.1=在Baubles的项链栏内使用
+GTPP.nanohealer.tooltip.2=每次操作消耗1638400EU
+GTPP.nanohealer.tooltip.3=可以恢复血量,饥饿和饱和度
+GTPP.nanohealer.tooltip.4=不会阻止死亡
+GTPP.nanohealer.tooltip.5=Shift+右键来切换信息
+GTPP.nanohealer.hidden=隐藏信息?
+
+# 10/4/19
+# Tooltips for the Mob Killing Baubles
+GTPP.monsterkiller.tooltip.1=在Baubles的护身符栏内使用
+GTPP.monsterkiller.tooltip.2=产生
+GTPP.monsterkiller.tooltip.3=每击杀一个指定怪物
+GTPP.monsterkiller.tooltip.4=目标类型:
+
+# 17/08/19
+GTPP.container.decaychest.name=可衰变
+
+
+
+
+
+
+
+
+
+
+
+
+# NEI INFORMATION
+GTPP.nei.info=信息
+GTPP.nei.eutick=Eu/t
+GTPP.nei.timetaken=耗时
+GTPP.nei.output=输出
+GTPP.nei.input=输入
+GTPP.nei.result=产物
+GTPP.nei.radioation=辐射等级
+
+# Some Generic Words
+GTPP.info.eu=EU
+GTPP.info.euInfo=EU信息
+GTPP.info.inputLimit=输入限制
+GTPP.info.currentPower=当前能量
+GTPP.info.hidden=隐藏
+
+# Some Time Words
+GTPP.time.ticks=t
+GTPP.time.seconds=秒
+GTPP.time.minutes=分
+GTPP.time.hours=小时
+GTPP.time.days=天
+GTPP.time.weeks=周
+GTPP.time.months=月
+
+# Steam MultiBlock Tooltips
+GTPP.MBTT.SteamHatch=蒸汽仓
+GTPP.MBTT.SteamInputBus=输入总线(蒸汽)
+GTPP.MBTT.SteamOutputBus=输出总线(蒸汽)
+
+
+
+
+
+
+
+
+# Achievements
+
+# 4/2/19
+achievement.gt.blockmachines.fusioncomputer.tier.09=聚变计算机MK IV
+achievement.gtplusplus.blockcasings.3.12=聚变框架MK III
+achievement.gtplusplus.blockcasings.3.13=进阶磁力遏制!
+achievement.gtplusplus.blockcasings.3.15=量子遏制!
+achievement.gt.blockmachines.fusioncomputer.tier.09.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.12.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.13.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.15.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtplusplus.fusion.single=可控聚变
+achievement.gt.blockmachines.gtplusplus.tank.plasma=等离子存储
+achievement.gt.blockmachines.gtplusplus.fusion.single.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtplusplus.tank.plasma.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+
+# 5/2/19
+achievement.MU-metaitem.01.32106=初级物理学家
+achievement.MU-metaitem.01.32107=研究生物理学家
+achievement.MU-metaitem.01.32108=学术物理学家
+achievement.MU-metaitem.01.32109=物理学硕士
+achievement.MU-metaitem.01.32106.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32107.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32108.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32109.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32066=质子遏制
+achievement.MU-metaitem.01.32068=电子遏制
+achievement.MU-metaitem.01.32070=夸克遏制
+achievement.MU-metaitem.01.32110=引力遏制
+achievement.MU-metaitem.01.32066.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32068.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32070.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32110.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.personalHealingDevice=食物是为了笨蛋
+achievement.item.personalHealingDevice.desc=[AL]你已经升级到纳米,未来就是你的
+achievement.item.GTPP.BattPack.06.name=充电工具包Mk I
+achievement.item.GTPP.BattPack.07.name=充电工具包Mk II
+achievement.item.GTPP.BattPack.08.name=充电工具包Mk III
+achievement.item.GTPP.BattPack.09.name=充电工具包Mk IV
+achievement.item.GTPP.BattPack.06.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.07.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.08.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.09.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+
+
+# 14/2/19
+achievement.gtpp.start=Gregtech++
+achievement.gtpp.start.desc=所以,你认为你已经得到了它?
+achievement.hatch.control=这是你放置控制核心的地方
+achievement.hatch.control.desc=所有GT++的多方块都需要特殊的填充.
+achievement.hatch.dynamo.buffered=缓冲后的发电机动力仓
+achievement.hatch.dynamo.buffered.desc=可以在大型涡轮机上使用这些.
+achievement.multi.abs=合金冶炼炉[ABS]
+achievement.multi.abs.desc=用于制造大多数后期合金.
+achievement.dust.potin=铜锌锡合金!
+achievement.dust.potin.desc=好吧,你得从某个地方开始...
+achievement.dust.eglin=埃格林钢铁!
+achievement.dust.eglin.desc=进展虽然缓慢...
+achievement.dust.staballoy=贫铀合金!
+achievement.dust.staballoy.desc=现在我们正在讨论...
+achievement.dust.quantum=量子!
+achievement.dust.quantum.desc=原料.
+achievement.dust.hypogen=海珀珍!
+achievement.dust.hypogen.desc=这甚至是什么材料?
+achievement.block.fishtrap=免费的鱼
+achievement.block.fishtrap.desc=比潘马斯农场好.
+achievement.block.withercage=监狱
+achievement.block.withercage.desc=用此捕捉凋灵/末影龙.
+achievement.rtg=放射性同位素热电发电!
+achievement.rtg.desc=可能盗于俄罗斯,小心使用.
+achievement.dehydrate=脱水
+achievement.dehydrate.desc=喝些水.
+achievement.semifluid=它像是液体,但它不是
+achievement.semifluid.desc=半流体令人困惑.
+achievement.earlywasher=简单的洗矿场
+achievement.earlywasher.desc=只在ULV下工作.
+achievement.advancedsteam=替代蒸汽选项
+achievement.advancedsteam.desc=智能油耗
+achievement.pollutionremoval=污染,没了!
+achievement.pollutionremoval.desc=污染不好
+achievement.hiampxform=高放大变压器
+achievement.hiampxform.desc=进阶电力转换
+achievement.multi.pss=能源站[PSS]
+achievement.multi.pss.desc=电力网络存储.
+achievement.multi.cyclo=回旋加速器
+achievement.multi.cyclo.desc=高级科学
+achievement.multi.sifter=工业筛选机
+achievement.multi.sifter.desc=比乌龟快.
+achievement.multi.cokeoven=工业焦炉[ICO]
+achievement.multi.cokeoven.desc=比热解炉更好
+achievement.multi.boiler.thermal=地热锅炉
+achievement.multi.boiler.thermal.desc=熔岩也有效!
+achievement.multi.zhuhai=珠海,渔场
+achievement.multi.zhuhai.desc=实际存在
+achievement.casing.abs=进展缓慢
+achievement.casing.abs.desc=最终,你将拥有你的合金冶炼炉.
+achievement.casing.cyclotron.coil=进展缓慢
+achievement.casing.cyclotron.coil.desc=考虑为什么你甚至这样做..
+achievement.casing.multiuse=我要做很多这些
+achievement.casing.multiuse.desc=不要开始计数.
+achievement.casing.containment=这个是干什么的?
+achievement.casing.containment.desc=我应该试着找出来.
+achievement.decay.neptunium238=镎238
+achievement.decay.neptunium238.desc=回旋加速器产品
+achievement.decay.radium226=镭226
+achievement.decay.radium226.desc=回旋加速器产品
+achievement.decay.molybdenum99=钼99
+achievement.decay.molybdenum99.desc=回旋加速器产品
+achievement.decay.technetium99m=锝99M
+achievement.decay.technetium99m.desc=回旋加速器产品
+achievement.decay.technetium99=锝99
+achievement.decay.technetium99.desc=回旋加速器产品
+
+# 24/11/19
+achievement.gt.blockmachines.hatch.turbine.input.tier.00=涡轮仓
+achievement.gt.blockmachines.hatch.turbine.input.tier.00.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+# Added 6/12/21
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell=工业浮选机
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtpp.multimachine.isamill=艾萨研磨机
+achievement.gt.blockmachines.gtpp.multimachine.isamill.desc=[AL]捡起此物品以在NEI内解锁该合成表
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..e9b20bd486
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..4469a809e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..012c63a088
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..30856a6284
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..d577f0cbb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..e41790f90f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..f4cce85820
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":5,
+ "frames": [0, 1, 2, 3, 2, 1]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png
new file mode 100644
index 0000000000..e9b20bd486
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..4469a809e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..f090fc04ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..b18cca86b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..590a0e1606
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..f9b78615ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a87d309908
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..11d8fffb7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png
new file mode 100644
index 0000000000..9afeaf4395
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..d997a986df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a9ab34e963
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..8a5c131623
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..b7a77be826
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..8a47157d2b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..1367b80758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 3, 2, 2, 1, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..671bbd7d97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..ae63da7746
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..8447c98f9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a9ab34e963
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..8a5c131623
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..72f22b8b00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..99039b2493
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..72f22b8b00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..99039b2493
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png
Binary files differ
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
index 25580dd223..e29ce83f82 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png
+++ 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.nitrofuel_old.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png
new file mode 100644
index 0000000000..4569cb8af3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta
new file mode 100644
index 0000000000..0df7234a79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png
new file mode 100644
index 0000000000..6aa75eff68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png
new file mode 100644
index 0000000000..b8333cd837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png
new file mode 100644
index 0000000000..daa7f4a2cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png
new file mode 100644
index 0000000000..94fd31b985
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png
new file mode 100644
index 0000000000..bb23e9953e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png
new file mode 100644
index 0000000000..d9f3fbd2b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png
new file mode 100644
index 0000000000..016f84f8af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png
new file mode 100644
index 0000000000..deab155c98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png
new file mode 100644
index 0000000000..a6382d4475
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png
new file mode 100644
index 0000000000..9448ea12bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png
new file mode 100644
index 0000000000..63d8fda631
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png
new file mode 100644
index 0000000000..48985ed510
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png
new file mode 100644
index 0000000000..53faf7d37c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.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/iconsets/EM_BHG.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png
new file mode 100644
index 0000000000..ccbc7a0f11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta
new file mode 100644
index 0000000000..7ab8340b0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":16
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png
new file mode 100644
index 0000000000..fb4943a5c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..7ab8340b0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":16
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png
new file mode 100644
index 0000000000..54da4a849c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.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/iconsets/EM_CANDY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png
new file mode 100644
index 0000000000..bb123c5e6e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.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/iconsets/EM_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.png
new file mode 100644
index 0000000000..3116b8973c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png
new file mode 100644
index 0000000000..4be4639f40
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png
new file mode 100644
index 0000000000..2bb3f0f031
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png
new file mode 100644
index 0000000000..187394cf54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png
new file mode 100644
index 0000000000..9d3bfe7284
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.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/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png
new file mode 100644
index 0000000000..e76cd31b5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.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/iconsets/EM_COLLIDER_SLAVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png
new file mode 100644
index 0000000000..58cb0a9573
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png
new file mode 100644
index 0000000000..bd9186a62f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png
new file mode 100644
index 0000000000..911ef96afa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png
new file mode 100644
index 0000000000..bd0c9c427e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png
new file mode 100644
index 0000000000..093caca191
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png
new file mode 100644
index 0000000000..bd87d400e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta
new file mode 100644
index 0000000000..82555396fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":7
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png
new file mode 100644
index 0000000000..b3d9c37a9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..82555396fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":7
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png
new file mode 100644
index 0000000000..c3b889dc79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png
new file mode 100644
index 0000000000..222b9329ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png
new file mode 100644
index 0000000000..0166c9c7ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png
new file mode 100644
index 0000000000..29bfd12031
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png
new file mode 100644
index 0000000000..2686522d15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.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/EM_DIM_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png
new file mode 100644
index 0000000000..1b451d601f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta
new file mode 100644
index 0000000000..3bebb68ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":9
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png
new file mode 100644
index 0000000000..de94a87e1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png
new file mode 100644
index 0000000000..beb9b871dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta
new file mode 100644
index 0000000000..82555396fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":7
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png
new file mode 100644
index 0000000000..1dbee21f98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta
new file mode 100644
index 0000000000..021e6bc605
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png
new file mode 100644
index 0000000000..31f204eb7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png
new file mode 100644
index 0000000000..bdb1324c4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.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/EM_DIM_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png
new file mode 100644
index 0000000000..b70bf59ee8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png
new file mode 100644
index 0000000000..742c06e70d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.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/iconsets/EM_DIM_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png
new file mode 100644
index 0000000000..c58676b7d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.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/EM_FIELD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png
new file mode 100644
index 0000000000..61fc2a2e36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.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/iconsets/EM_FIELD_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png
new file mode 100644
index 0000000000..aa70ba768c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta
new file mode 100644
index 0000000000..3bebb68ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":9
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png
new file mode 100644
index 0000000000..b13397c596
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png
new file mode 100644
index 0000000000..c11abbe912
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta
new file mode 100644
index 0000000000..82555396fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":7
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png
new file mode 100644
index 0000000000..b1ead1d500
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta
new file mode 100644
index 0000000000..021e6bc605
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png
new file mode 100644
index 0000000000..ad20bc1e1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png
new file mode 100644
index 0000000000..2c34ada99c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.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/EM_FIELD_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png
new file mode 100644
index 0000000000..4a6187d654
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png
new file mode 100644
index 0000000000..4e83937cd4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.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/iconsets/EM_FIELD_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png
new file mode 100644
index 0000000000..937b1af7af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.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/EM_FIELD_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.png
new file mode 100644
index 0000000000..02bbbc95f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png
new file mode 100644
index 0000000000..544c310bec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png
new file mode 100644
index 0000000000..5c18d5317e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.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/iconsets/EM_HOLLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.png
new file mode 100644
index 0000000000..3970b1ec67
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png
new file mode 100644
index 0000000000..d956c9d8cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png
new file mode 100644
index 0000000000..72e277673e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png
new file mode 100644
index 0000000000..798f7b6dbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png
new file mode 100644
index 0000000000..df6c3a0688
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png
new file mode 100644
index 0000000000..8c3c5b621e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png
new file mode 100644
index 0000000000..03d8bad1cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png
new file mode 100644
index 0000000000..aa27ecdd29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png
new file mode 100644
index 0000000000..ee6a7079e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png
new file mode 100644
index 0000000000..c1a1d44471
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png
new file mode 100644
index 0000000000..0be901b802
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png
new file mode 100644
index 0000000000..8754166137
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png
new file mode 100644
index 0000000000..a623e9f1d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png
new file mode 100644
index 0000000000..a623e9f1d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png
new file mode 100644
index 0000000000..86c556706c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png
new file mode 100644
index 0000000000..9f016fecbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.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/iconsets/EM_TELE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png
new file mode 100644
index 0000000000..e4fe6bd313
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.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/EM_TIMESPACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png
new file mode 100644
index 0000000000..ed2770f533
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.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/EM_ULTIMATE_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.png
new file mode 100644
index 0000000000..798f7b6dbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png
new file mode 100644
index 0000000000..4ab1c50315
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.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/iconsets/EM_ULTIMATE_FIELD_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.png
new file mode 100644
index 0000000000..d956c9d8cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png
new file mode 100644
index 0000000000..464121c8fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.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/iconsets/EM_WH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png
new file mode 100644
index 0000000000..cb4828ad05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.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/iconsets/ENDERFLUIDLINK_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png
new file mode 100644
index 0000000000..010bc0888d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png
new file mode 100644
index 0000000000..eef9051d61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png
new file mode 100644
index 0000000000..3266b1aec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta
new file mode 100644
index 0000000000..7ab8340b0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":16
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png
new file mode 100644
index 0000000000..ef00e4b09b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png
new file mode 100644
index 0000000000..ee2cb09345
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png
new file mode 100644
index 0000000000..1158858086
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.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/GODFORGE_SUPPORT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png
new file mode 100644
index 0000000000..ea98b573e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png
new file mode 100644
index 0000000000..0b93539126
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png
new file mode 100644
index 0000000000..1c247db84b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.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/iconsets/GRAVITON_CASING_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png
new file mode 100644
index 0000000000..728b89f8fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.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/GRAVITON_CASING_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png
new file mode 100644
index 0000000000..d296edcad4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png
new file mode 100644
index 0000000000..a21e6d941c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.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
index 3efc74c93d..af2b3b2037 100644
--- 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
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
index 3efc74c93d..af2b3b2037 100644
--- 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
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
index 3efc74c93d..af2b3b2037 100644
--- 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
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png
new file mode 100644
index 0000000000..ad519ab78d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png
new file mode 100644
index 0000000000..ad519ab78d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.png
new file mode 100644
index 0000000000..ad519ab78d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_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
index ddd577f426..27a092adf4 100644
--- 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
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
index ddd577f426..27a092adf4 100644
--- 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
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
index ddd577f426..27a092adf4 100644
--- 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
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
index 3c394b37ce..a2d780dc32 100644
--- 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
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
index 3c394b37ce..a2d780dc32 100644
--- 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
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
index 3c394b37ce..a2d780dc32 100644
--- 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
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
index e326b7b514..a401c3900d 100644
--- 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
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
index e326b7b514..a401c3900d 100644
--- 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
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
index e326b7b514..a401c3900d 100644
--- 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
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
index f80a997fdb..a3564826ac 100644
--- 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
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
index f80a997fdb..a3564826ac 100644
--- 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
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
index f80a997fdb..a3564826ac 100644
--- 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
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png
new file mode 100644
index 0000000000..5b9a8d85c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png
new file mode 100644
index 0000000000..63bea9502a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.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/iconsets/MUFFLER_EM_IDLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.png
new file mode 100644
index 0000000000..bd9fef30a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png
new file mode 100644
index 0000000000..a931c65801
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.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/OVERLAY_EM_D_SIDES.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png
new file mode 100644
index 0000000000..c0851e234c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.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/iconsets/OVERLAY_EM_T_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png
new file mode 100644
index 0000000000..140a461f3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.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/OVERLAY_EM_T_SIDES.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png
new file mode 100644
index 0000000000..e84a0364f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.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/iconsets/OVERLAY_ENERGY_IN_LASER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.png
new file mode 100644
index 0000000000..51f387ba35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.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
index e3371487d0..02393fe829 100644
--- 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
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png
new file mode 100644
index 0000000000..7db32095ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.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_ON_WIRELESS_4A.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png
new file mode 100644
index 0000000000..531db420c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.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_ON_WIRELESS_LASER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png
new file mode 100644
index 0000000000..aef6a37f1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.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_LASER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.png
new file mode 100644
index 0000000000..4706e3cf6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.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
index 459b7159b2..399b32696d 100644
--- 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
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png
new file mode 100644
index 0000000000..6b554f2031
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png
new file mode 100644
index 0000000000..ebf319261a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png
new file mode 100644
index 0000000000..ba8786cf7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png
new file mode 100644
index 0000000000..5c8823e743
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png
new file mode 100644
index 0000000000..43e88d959c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png
new file mode 100644
index 0000000000..c8c32d0ab4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png
new file mode 100644
index 0000000000..a623e9f1d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png
new file mode 100644
index 0000000000..ee04fde165
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png
new file mode 100644
index 0000000000..cfb2f8aaa7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png
new file mode 100644
index 0000000000..af85482d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png
new file mode 100644
index 0000000000..e9ebbf32b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta
new file mode 100644
index 0000000000..3bebb68ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":9
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png
new file mode 100644
index 0000000000..48e7b498fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png
new file mode 100644
index 0000000000..37eb81e18d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta
new file mode 100644
index 0000000000..82555396fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":7
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png
new file mode 100644
index 0000000000..8a19e7e378
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta
new file mode 100644
index 0000000000..021e6bc605
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png
new file mode 100644
index 0000000000..e678fb858e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png
new file mode 100644
index 0000000000..379a12d2ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.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/STABILITY_CASING_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png
new file mode 100644
index 0000000000..495f936c59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png
new file mode 100644
index 0000000000..0efa24aa1f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.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/iconsets/STABILITY_CASING_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png
new file mode 100644
index 0000000000..41353dc3e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.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/TESLA_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.png
new file mode 100644
index 0000000000..fc16be01b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png
new file mode 100644
index 0000000000..5acfa08654
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png
new file mode 100644
index 0000000000..c0de56149e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png
new file mode 100644
index 0000000000..52087f837e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png
new file mode 100644
index 0000000000..5ba1e61487
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png
new file mode 100644
index 0000000000..4401341ad7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png
new file mode 100644
index 0000000000..9ce6223110
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png
new file mode 100644
index 0000000000..aa804773fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png
new file mode 100644
index 0000000000..5f996ca2ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png
new file mode 100644
index 0000000000..14423d1741
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png
new file mode 100644
index 0000000000..266a300698
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png
new file mode 100644
index 0000000000..2f547cf220
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png
new file mode 100644
index 0000000000..f36d636040
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png
new file mode 100644
index 0000000000..503abed157
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png
new file mode 100644
index 0000000000..ccfb85c4cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png
new file mode 100644
index 0000000000..7f2fb33e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png
new file mode 100644
index 0000000000..833597130b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png
new file mode 100644
index 0000000000..fed9a8e282
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png
new file mode 100644
index 0000000000..35a58c88b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png
new file mode 100644
index 0000000000..737b5e7a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png
new file mode 100644
index 0000000000..ad847ef247
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png
new file mode 100644
index 0000000000..2842d9ce1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png
new file mode 100644
index 0000000000..00e30e13fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png
new file mode 100644
index 0000000000..de4ce136e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png
new file mode 100644
index 0000000000..55d9bb5d23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png
new file mode 100644
index 0000000000..b77b4b1e53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png
new file mode 100644
index 0000000000..c437e992e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png
new file mode 100644
index 0000000000..dc5dcd1af0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
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
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png
new file mode 100644
index 0000000000..6e4e79b4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png
new file mode 100644
index 0000000000..0032fdd6e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta
new file mode 100644
index 0000000000..676faf4fb4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 4, 3, 3, 2, 2, 1, 1]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.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
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png
new file mode 100644
index 0000000000..ed3f2f1581
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.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
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png
new file mode 100644
index 0000000000..919d9bb70a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta
new file mode 100644
index 0000000000..d2c3416c73
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.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
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png
new file mode 100644
index 0000000000..3e33d0feec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png
new file mode 100644
index 0000000000..9cb38f3f8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png
new file mode 100644
index 0000000000..4feeed528c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png
new file mode 100644
index 0000000000..055c104f1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png
new file mode 100644
index 0000000000..0bb50256c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png
new file mode 100644
index 0000000000..d229926034
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png
new file mode 100644
index 0000000000..1684ec116b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png
new file mode 100644
index 0000000000..f9838c8829
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.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
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
new file mode 100644
index 0000000000..47a39e7526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.png b/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.png
new file mode 100644
index 0000000000..e95be5c31a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.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
new file mode 100644
index 0000000000..e372f01092
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
new file mode 100644
index 0000000000..b0836b8d41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
new file mode 100644
index 0000000000..bfe6e2288b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
new file mode 100644
index 0000000000..a7d2c341a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
new file mode 100644
index 0000000000..85aa8c19a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
new file mode 100644
index 0000000000..0a71854e05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
new file mode 100644
index 0000000000..4071c6062d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
new file mode 100644
index 0000000000..bafc8a4c8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png
new file mode 100644
index 0000000000..13b37c999d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png
new file mode 100644
index 0000000000..3fd5382926
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png
new file mode 100644
index 0000000000..ffd9d4893b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.png
new file mode 100644
index 0000000000..a08018f561
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.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
new file mode 100644
index 0000000000..e16102588a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
new file mode 100644
index 0000000000..491164695b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
new file mode 100644
index 0000000000..38429ed78d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
new file mode 100644
index 0000000000..3901815927
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
new file mode 100644
index 0000000000..c97ec3384c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
new file mode 100644
index 0000000000..40e5c92817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
new file mode 100644
index 0000000000..10c6f20de0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
new file mode 100644
index 0000000000..968e0745c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
new file mode 100644
index 0000000000..9e22dd6726
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
new file mode 100644
index 0000000000..86411e18bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
new file mode 100644
index 0000000000..57a7c7a932
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
new file mode 100644
index 0000000000..9f68371247
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
new file mode 100644
index 0000000000..7a322b76c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
new file mode 100644
index 0000000000..9fe039db81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
new file mode 100644
index 0000000000..457a51b7a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png
new file mode 100644
index 0000000000..59611725f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png
new file mode 100644
index 0000000000..6b17748ece
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..7cb996d669
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png
new file mode 100644
index 0000000000..172506c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..f9f1162ce6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png
new file mode 100644
index 0000000000..9c310b5b09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png
new file mode 100644
index 0000000000..8a240a574d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3741866149
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png
new file mode 100644
index 0000000000..17859801da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..1918a7fa45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png
new file mode 100644
index 0000000000..7cdf09b174
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0d8c321826
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..79216e0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..a35dccba2b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..03c07f2760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png
new file mode 100644
index 0000000000..cbc30cc68e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png
new file mode 100644
index 0000000000..f6fa0b94cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..dddb4764ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..d8471aed5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png
new file mode 100644
index 0000000000..b63f9c3b35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..c5abe856a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..50d407491e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3561f91a07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..82f557e199
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png
new file mode 100644
index 0000000000..55468929e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png
new file mode 100644
index 0000000000..85f543676f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..c844854d37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..2a63953e92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..896be7f08e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c086bca2bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png
new file mode 100644
index 0000000000..c59ef7b1bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png
new file mode 100644
index 0000000000..f3bcc922b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png
new file mode 100644
index 0000000000..2af89ec304
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..1ebeb9fc43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..037d829395
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..cd358f9d96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..de8ae5af6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..2d7a80f45e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..f73c531239
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png
new file mode 100644
index 0000000000..f52c654ee5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png
new file mode 100644
index 0000000000..5879963ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png
new file mode 100644
index 0000000000..4eefbcd6e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png
new file mode 100644
index 0000000000..f0d87d27df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png
new file mode 100644
index 0000000000..0916369702
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png
new file mode 100644
index 0000000000..c540788917
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..a8170f57d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png
new file mode 100644
index 0000000000..fdb0756839
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..54b47c2224
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png
new file mode 100644
index 0000000000..04634628ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png
new file mode 100644
index 0000000000..8cdc9f196f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..09af435c20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..7f05e61552
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..778916b614
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..318ea2af2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3dbeb7da6e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..7890213e56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..b36140bea2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..225d5d1907
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png
new file mode 100644
index 0000000000..28d51f02af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..9374970a7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..520f1bb48c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..27b69fc23a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..2aea2f961d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..fe6d646dd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..fa0da0ce2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png
new file mode 100644
index 0000000000..5665e03aee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..b9a16a484a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..c95bf030b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..9d0db6f7fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png
new file mode 100644
index 0000000000..59611725f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..d5ce76b80f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_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
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png
new file mode 100644
index 0000000000..c78a1d5570
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png
new file mode 100644
index 0000000000..8a240a574d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png
new file mode 100644
index 0000000000..17859801da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png
new file mode 100644
index 0000000000..b546c4eeec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..ebaf1512a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3fad40a7e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png
new file mode 100644
index 0000000000..8529b87f57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png
new file mode 100644
index 0000000000..235bdd740b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png
new file mode 100644
index 0000000000..9021949091
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png
new file mode 100644
index 0000000000..fdd7cd358a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png
new file mode 100644
index 0000000000..20436f976e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png
new file mode 100644
index 0000000000..e8e1fef899
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png
new file mode 100644
index 0000000000..4b5c1998f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png
new file mode 100644
index 0000000000..14b62252ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png
new file mode 100644
index 0000000000..f18ad52a73
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png
new file mode 100644
index 0000000000..5ca5a9b6ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png
new file mode 100644
index 0000000000..fa9e379c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png
new file mode 100644
index 0000000000..c78a1d5570
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_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
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3741866149
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..1918a7fa45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png
new file mode 100644
index 0000000000..7cdf09b174
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..03c07f2760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png
new file mode 100644
index 0000000000..cbc30cc68e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png
new file mode 100644
index 0000000000..f6fa0b94cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..dddb4764ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..d8471aed5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..c5abe856a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..50d407491e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3561f91a07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..82f557e199
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png
new file mode 100644
index 0000000000..55468929e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..c844854d37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..2a63953e92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..896be7f08e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c086bca2bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png
new file mode 100644
index 0000000000..c59ef7b1bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png
new file mode 100644
index 0000000000..f3bcc922b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png
new file mode 100644
index 0000000000..2af89ec304
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..037d829395
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..cd358f9d96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..de8ae5af6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..2d7a80f45e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..f73c531239
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png
new file mode 100644
index 0000000000..f52c654ee5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png
new file mode 100644
index 0000000000..5879963ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png
new file mode 100644
index 0000000000..f0d87d27df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png
new file mode 100644
index 0000000000..0916369702
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png
new file mode 100644
index 0000000000..c540788917
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..a8170f57d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png
new file mode 100644
index 0000000000..fdb0756839
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..54b47c2224
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png
new file mode 100644
index 0000000000..04634628ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..d5ce76b80f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png
new file mode 100644
index 0000000000..7f49597676
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..819f43c6f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png
new file mode 100644
index 0000000000..e2edcad772
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..75b134d3ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png
new file mode 100644
index 0000000000..9ee7575a02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..9758a35399
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..9ab216d5d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png
new file mode 100644
index 0000000000..4d00229736
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png
new file mode 100644
index 0000000000..5c94fdce69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png
new file mode 100644
index 0000000000..13a798cdc3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..9608d2d182
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..10d9d54e65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..df8b7b9a75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d5845995cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png
new file mode 100644
index 0000000000..e1fe9bed43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png
new file mode 100644
index 0000000000..9021949091
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png
new file mode 100644
index 0000000000..e0a49831b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png
new file mode 100644
index 0000000000..20436f976e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png
new file mode 100644
index 0000000000..78caf2a7ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..88fa0ebcc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..b3441fbf19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..4253929300
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png
new file mode 100644
index 0000000000..574c36552c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png
new file mode 100644
index 0000000000..14b62252ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..99a3fb2e2b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png
new file mode 100644
index 0000000000..3de14933fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png
new file mode 100644
index 0000000000..5ca5a9b6ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png
new file mode 100644
index 0000000000..fa9e379c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_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
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png
new file mode 100644
index 0000000000..6f893e05b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png
new file mode 100644
index 0000000000..12a99bfde1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png
new file mode 100644
index 0000000000..2a7b9e6d6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..ebaf1512a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3fad40a7e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png
new file mode 100644
index 0000000000..8529b87f57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png
new file mode 100644
index 0000000000..721d19529e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png
new file mode 100644
index 0000000000..38a7fc65c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png
new file mode 100644
index 0000000000..fdd7cd358a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png
new file mode 100644
index 0000000000..23b3ac8f76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png
new file mode 100644
index 0000000000..e8e1fef899
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png
new file mode 100644
index 0000000000..4b5c1998f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png
new file mode 100644
index 0000000000..751111417a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png
new file mode 100644
index 0000000000..f18ad52a73
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png
new file mode 100644
index 0000000000..29bd613285
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png
new file mode 100644
index 0000000000..242dbd14fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_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
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
new file mode 100644
index 0000000000..cd6a50eca3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
new file mode 100644
index 0000000000..5fea5be598
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
new file mode 100644
index 0000000000..2b0422489e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
new file mode 100644
index 0000000000..9e388650d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
new file mode 100644
index 0000000000..3e9106f277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
new file mode 100644
index 0000000000..b2bd85bf44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
new file mode 100644
index 0000000000..7c6797718d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
new file mode 100644
index 0000000000..dbf735f4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
new file mode 100644
index 0000000000..66bd26dc46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/lang/de_DE.lang b/src/main/resources/assets/ic2/lang/de_DE.lang
new file mode 100644
index 0000000000..2d562c59e7
--- /dev/null
+++ b/src/main/resources/assets/ic2/lang/de_DE.lang
@@ -0,0 +1,29 @@
+ic2.itemEnergeticRotor=Kinetischer Getriebe-Rotor (Energische Legierung)
+ic2.itemTungstenSteelRotor=Kinetischer Getriebe-Rotor (Wolframstahl)
+ic2.itemVibrantRotor=Kinetischer Getriebe-Rotor (Schwingende Legierung)
+ic2.itemIridiumRotor=Kinetischer Getriebe-Rotor (Iridium)
+
+ic2.itemMagnaliumRotor=Kinetischer Getriebe-Rotor (Magnalium)
+ic2.itemUltimetRotor=Kinetischer Getriebe-Rotor (Ultimet)
+
+ic2.blockGenerator=RTG ENERGIE
+ic2.blockGenerator.0=RTG ENERGIE
+ic2.blockGenerator.1=KINETISCHE ENERGIE
+ic2.blockGenerator.2=FEHLER ENERGIE
+ic2.blockGenerator.3=MEHR FEHLER ENERGIE
+
+ic2.blockRTGenerator2=RTG ENERGIE 2
+ic2.blockKineticGenerator2=KINETISCHE ENERGIE 2
+
+ic2.HydrofluoricAcid=Zelle mit industriell verstärkter Flusssäure
+ic2.SulfurDioxide=Zelle mit Schwefeldioxid
+ic2.SulfuricApatite=Zelle mit schwefligem Apatit
+ic2.SulfurousAcid=Zelle mit Schwefelsäure
+
+ic2.HydrogenChloride=Zelle mit industriell verstärkter Salzsäure
+ic2.LithiumHydroxide=Zelle mit Lithiumhydroxid
+ic2.SulfuricLithium=Zelle mit schwefeligem Lithium
+
+ic2.UraniumHexaFluoride=Zelle mit Uran-Hexafluorid
+ic2.ThoriumTetraFluoride=Zelle mit Thorium-Tetrafluorid
+ic2.UraniumTetraFluoride=Zelle mit Uran-Tetrafluorid
diff --git a/src/main/resources/assets/ic2/lang/en_US.lang b/src/main/resources/assets/ic2/lang/en_US.lang
new file mode 100644
index 0000000000..9b44f2d14e
--- /dev/null
+++ b/src/main/resources/assets/ic2/lang/en_US.lang
@@ -0,0 +1,35 @@
+ic2.itemEnergeticRotor=Kinetic Gearbox Rotor (Energetic Alloy)
+ic2.itemTungstenSteelRotor=Kinetic Gearbox Rotor (TungstenSteel)
+ic2.itemVibrantRotor=Kinetic Gearbox Rotor (Vibrant Alloy)
+ic2.itemIridiumRotor=Kinetic Gearbox Rotor (Iridium)
+
+ic2.itemMagnaliumRotor=Kinetic Gearbox Rotor (Magnalium)
+ic2.itemUltimetRotor=Kinetic Gearbox Rotor (Ultimet)
+
+ic2.blockGenerator=RTG POWARZ
+ic2.blockGenerator.0=RTG POWA
+ic2.blockGenerator.1=KINETIC POWA
+ic2.blockGenerator.2=ERROR POWA
+ic2.blockGenerator.3=MOAR ERROR POWA
+
+ic2.blockRTGenerator2=RTG POWARZ 2
+ic2.blockKineticGenerator2=KINETIC POWA 2
+
+ic2.HydrofluoricAcid=Industrial Strength Hydrofluoric Acid Cell
+ic2.SulfurDioxide=Sulfur Dioxide Cell
+ic2.SulfuricApatite=Sulfuric Apatite Cell
+ic2.SulfurousAcid=Sulfurous Acid Cell
+
+ic2.HydrogenChloride=Industrial Strength Hydrogen Chloride Cell
+ic2.LithiumHydroxide=Lithium Hydroxide Cell
+ic2.SulfuricLithium=Sulfuric Lithium Cell
+
+ic2.UraniumHexaFluoride=Uranium Hexafluoride Cell
+ic2.ThoriumTetraFluoride=Thorium Tetrafluoride Cell
+ic2.UraniumTetraFluoride=Uranium Tetrafluoride Cell
+
+
+ic2.itemArmorHazmatHelmetEx=Advanced Hazmat Helmet
+ic2.itemArmorHazmatChestplateEx=Advanced Hazmat Suit
+ic2.itemArmorHazmatLeggingsEx=Advanced Hazmat Leggings
+ic2.itemArmorRubBootsEx=Advanced Hazmat Boots \ No newline at end of file
diff --git a/src/main/resources/assets/ic2/lang/zh_CN.lang b/src/main/resources/assets/ic2/lang/zh_CN.lang
new file mode 100644
index 0000000000..384e45f1ff
--- /dev/null
+++ b/src/main/resources/assets/ic2/lang/zh_CN.lang
@@ -0,0 +1,35 @@
+ic2.itemEnergeticRotor=动力齿轮转子(充能合金)
+ic2.itemTungstenSteelRotor=动力齿轮转子(钨钢)
+ic2.itemVibrantRotor=动力齿轮转子(脉冲合金)
+ic2.itemIridiumRotor=动力齿轮转子(铱)
+
+ic2.itemMagnaliumRotor=动力齿轮转子(镁铝合金)
+ic2.itemUltimetRotor=动力齿轮转子(哈氏合金)
+
+ic2.blockGenerator=RTG POWARZ
+ic2.blockGenerator.0=RTG POWA
+ic2.blockGenerator.1=KINETIC POWA
+ic2.blockGenerator.2=ERROR POWA
+ic2.blockGenerator.3=MOAR ERROR POWA
+
+ic2.blockRTGenerator2=RTG POWARZ 2
+ic2.blockKineticGenerator2=KINETIC POWA 2
+
+ic2.HydrofluoricAcid=工业强化氢氟酸单元
+ic2.SulfurDioxide=二氧化硫单元
+ic2.SulfuricApatite=硫酸磷灰石单元
+ic2.SulfurousAcid=亚硫酸单元
+
+ic2.HydrogenChloride=工业强化氯化氢单元
+ic2.LithiumHydroxide=氢氧化锂单元
+ic2.SulfuricLithium=硫酸锂单元
+
+ic2.UraniumHexaFluoride=六氟化铀单元
+ic2.ThoriumTetraFluoride=四氟化钍单元
+ic2.UraniumTetraFluoride=四氟化铀单元
+
+
+ic2.itemArmorHazmatHelmetEx=高级防化头盔
+ic2.itemArmorHazmatChestplateEx=高级防化服
+ic2.itemArmorHazmatLeggingsEx=高级防化护腿
+ic2.itemArmorRubBootsEx=高级防化靴子 \ No newline at end of file
diff --git a/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png b/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png
new file mode 100644
index 0000000000..2275007fbe
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png b/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png
new file mode 100644
index 0000000000..758adafdf2
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png b/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png
new file mode 100644
index 0000000000..ed907728d4
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png b/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png
new file mode 100644
index 0000000000..135d293637
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png b/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png
new file mode 100644
index 0000000000..7fefe04c5e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png b/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png
new file mode 100644
index 0000000000..f8bf8329b5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png b/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png
new file mode 100644
index 0000000000..5c62c379ab
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png b/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png
new file mode 100644
index 0000000000..b8d02729ba
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png b/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png
new file mode 100644
index 0000000000..53f8604e13
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png b/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png
new file mode 100644
index 0000000000..413179e396
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png b/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png
new file mode 100644
index 0000000000..2fe0c893fe
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png b/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png
new file mode 100644
index 0000000000..ba2d239308
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png
new file mode 100644
index 0000000000..742d1d7035
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png
new file mode 100644
index 0000000000..5340375595
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png
new file mode 100644
index 0000000000..80cdca9b23
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png b/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png
new file mode 100644
index 0000000000..901a8fbc35
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png
new file mode 100644
index 0000000000..9fef2ec178
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png
new file mode 100644
index 0000000000..1f1770ff1c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png
new file mode 100644
index 0000000000..d1e2970117
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png
new file mode 100644
index 0000000000..aec47b7c6b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png
new file mode 100644
index 0000000000..03704d5d12
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png b/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png
new file mode 100644
index 0000000000..34949af9a6
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png
new file mode 100644
index 0000000000..045470a2b1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png
new file mode 100644
index 0000000000..b967b4f1dd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png
new file mode 100644
index 0000000000..a638c0389f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png
new file mode 100644
index 0000000000..7dd2e69f7e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png
new file mode 100644
index 0000000000..b6c3f36716
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png b/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png
new file mode 100644
index 0000000000..321de66ff9
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg
new file mode 100644
index 0000000000..412fe5c591
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg
new file mode 100644
index 0000000000..91ec4976b9
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg
new file mode 100644
index 0000000000..0bdc21aa52
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg
new file mode 100644
index 0000000000..b7d4429989
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg
new file mode 100644
index 0000000000..c810364be4
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg
new file mode 100644
index 0000000000..4596d850c1
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg
new file mode 100644
index 0000000000..9d60d58843
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg
Binary files differ
diff --git a/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg b/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg
new file mode 100644
index 0000000000..b5134e84d9
--- /dev/null
+++ b/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg
Binary files differ
diff --git a/src/main/resources/assets/miscutils/lang/de_DE.lang b/src/main/resources/assets/miscutils/lang/de_DE.lang
new file mode 100644
index 0000000000..e9e5be9332
--- /dev/null
+++ b/src/main/resources/assets/miscutils/lang/de_DE.lang
@@ -0,0 +1,1899 @@
+//GT++ Items
+
+
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Blöcke
+itemGroup.MiscUtilMiscTab=[GT++] Gegenstände
+itemGroup.MiscUtilCombatTab=[GT++] Kampf
+itemGroup.MiscUtilToolsTab=[GT++] Werkzeuge
+itemGroup.MiscUtilMachineTab=[GT++] Maschinen
+itemGroup.MiscUtilOtherTab=[GT++] Gegenstände II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Gegenstände
+
+//Debug
+item.AAA_Broken.name=[Nicht implementierter Gegenstand] Bitte melde dieses Rezept auf Github.
+item.itemBedLocator_Base.name=Bett-Lokalisierer [NBT Test]
+item.itemBaseItemWithCharge.name=Aufladbarer Basisgegenstand
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Formen
+
+//Fluids
+tile.fluidSludge.name=Stehendes Abwasser
+tile.fluidSludge.0.name=Stehendes Abwasser
+
+//Death Messages
+death.attack.plasmabolt=%s wurde durch brennend heißes Plasma getötet.
+death.attack.plasmabolt.player=%1$s wurde von %2$s mit Hilfe von Plasma getötet.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Platte aus Batterie-Legierung
+item.itemIngotBatteryAlloy.name=Barren aus Batterie-Legierung
+item.itemStickyRubber.name=Gumlet aus klebrigem Gummi
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Leeres Brennelement
+item.itemFuelRod_Thorium.name=Thorium-Brennelement
+item.itemFuelRod_Uranium.name=Uran-Brennelement
+item.itemFuelRod_Plutonium.name=Plutonium-Brennelement
+
+//Entities
+entity.constructStaballoy.name=Stablegierungskonstrukt
+entity.sickBlaze.name=Infizierter Fanatiker
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Werkzeug-Konstrukteur
+
+//Tools
+item.itemBufferCore.name=Pufferkern
+item.itemStaballoyPickaxe.name=Tunnelgräber
+item.itemStaballoyAxe.name=Baumfäller
+item.itemSandstoneHammer.name=Bruchsteinbrecher
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Eimer mit flammendem Pyrotheum
+item.MiscUtils.bucket.bucketCryotheum.name=Eimer mit gelenem Kryotheum
+item.MiscUtils.bucket.bucketEnder.name=Eimer mit resonantem Ender
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheumstaub
+item.MiscUtils.material.dustCryotheum.name=Kryotheumstaub
+item.MiscUtils.material.rodBlizz.name=Blizzrute
+item.MiscUtils.material.dustBlizz.name=Blizzstaub
+tile.MiscUtils.fluid.pyrotheum.name=Flammendes Pyrotheum
+tile.MiscUtils.fluid.cryotheum.name=Gelenes Kryotheum
+tile.miscutils.fluid.ender.name=Resonantes Ender
+
+//Forestry Stuff
+item.frameAccelerated.name=Beschleunigter Rahmen
+item.frameVoid.name=Nichts-Rahmen
+item.frameMutagenic.name=Erbgutverändernder Rahmen
+item.frameBusy.name=Arbeitender Rahmen
+item.frameChocolate.name=Schokoladiger Rahmen
+item.frameRestraint.name=Zurückhaltender Rahmen
+item.frameSoul.name=Seelen-Rahmen
+item.frameHealing.name=Heilender Rahmen
+item.frameNova.name=Nova-Rahmen
+item.frameArborists.name=Försters Rahmen
+item.frameDecaying.name=Zersetzender Rahmen
+item.frameSlowing.name=Lähmender Rahmen
+item.frameStabilizing.name=Stabilisierender Rahmen
+item.frameUseless.name=Nutzloser Ramen
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Rotorblatt aus energischer Legierung
+item.itemTungstenSteelRotorBlade.name=Rotorblatt aus Wolframstahl
+item.itemVibrantRotorBlade.name=Rotorblatt aus schwingender Legierung
+item.itemIridiumRotorBlade.name=Rotorblatt aus Iridium
+item.itemEnergeticShaft.name=Welle aus energischer Legierung
+item.itemTungstenSteelShaft.name=Welle aus Wolframstahl
+item.itemVibrantShaft.name=Welle aus schwingender Legierung
+item.itemIridiumShaft.name=Welle aus Iridium
+item.itemMagnaliumRotorBlade.name=Rotorblatt aus Magnalium
+item.itemUltimetRotorBlade.name=Rotorblatt aus Ultimet
+item.itemMagnaliumShaft.name=Welle aus Magnalium
+item.itemUltimetShaft.name=Welle aus Ultimet
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark-Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Platte aus angereichertem Soularium
+item.itemHeliumBlob.name=Geheimnisvolle Wasserstoffsubstanz
+item.itemAlkalusDisk.name=Alkalus-Schallplatte
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Komprimierter Obsidian (9)
+tile.blockCompressedObsidian.1.name=Doppelt-Komprimierter Obsidian (81)
+tile.blockCompressedObsidian.2.name=Dreifach-Komprimierter Obsidian (729)
+tile.blockCompressedObsidian.3.name=Vierfach-Komprimierter Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Fünffach-Komprimierter Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Umgekehrter Obsidian
+tile.blockNet.name=Netz
+
+
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=Hochwertige Schwefeldioxidzelle
+item.Fertiliser.name=Düngemittelzelle
+item.UN32Fertiliser.name=UN-32 Düngemittelzelle
+item.UN18Fertiliser.name=UN-18 Düngemittelzelle
+item.RaisinJuice.name=Rosinensaftzelle
+
+//Resources
+item.itemStickyRubber.name=Gumlet aus klebrigem Gummi
+item.itemCoalCoke.name=Verkokste Kohle
+item.itemHydrogenBlob.name=Mysteriöses Wasserstofftröpfchen
+item.itemHeliumBlob.name=Mysteriöse Wasserstoffsubstanz
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus-Schallplatte
+item.itemSimpleFiremaker.name=Einfache Zündhilfe
+item.itemFiber.name=Pflanzenfaser
+item.itemRope.name=Tau
+item.BackpackRed.name=Roter Rucksack
+item.BackpackGreen.name=Grüner Rucksack
+item.BackpackBlue.name=Blauer Rucksack
+item.BackpackYellow.name=Gelber Rucksack
+item.BackpackPurple.name=Lila Rucksack
+item.BackpackCyan.name=Cyaner Rucksack
+item.BackpackMaroon.name=Kastanienbrauner Rucksack
+item.BackpackOlive.name=Olivengrüner Rucksack
+item.BackpackDarkGreen.name=Dunkelgrüner Rucksack
+item.BackpackDarkPurple.name=Dunkellila Rucksack
+item.BackpackTeal.name=Blaugrüner Rucksack
+item.BackpackNavy.name=Navy Rucksack
+item.BackpackSilver.name=Silberner Rucksack
+item.BackpackGray.name=Grauer Rucksack
+item.BackpackBlack.name=Schwarzer Rucksack
+item.BackpackWhite.name=Weißer Rucksack
+item.itemBlueprint.name=Blaupause [Ich bin nutzlos]
+item.itemGemShards.name=Diamantscherbe
+item.itemHalfCompleteCasings.name=Halb-fertige Hülle I
+item.itemSulfuricPotion.name=Werfbare Phiole mit Schwefelsäure
+item.itemHydrofluoricPotion.name=Werfbare Phiole mit Flusssäure
+
+
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium-Staub
+item.itemDustSmallGadolinium.name=Kleines Häufchen Gadolinium-Staub
+item.itemDustTinyGadolinium.name=Winziges Häufchen Gadolinium-Staub
+item.itemDustYtterbium.name=Ytterbium-Staub
+item.itemDustSmallYtterbium.name=Kleines Häufchen Ytterbium-Staub
+item.itemDustTinyYtterbium.name=Winziges Häufchen Ytterbium-Staub
+item.itemDustSamarium.name=Samarium-Staub
+item.itemDustSmallSamarium.name=Kleines Häufchen Samarium-Staub
+item.itemDustTinySamarium.name=Winziges Häufchen Samarium-Staub
+item.itemDustLanthanum.name=Lanthan-Staub
+item.itemDustSmallLanthanum.name=Kleines Häufchen Lanthan-Staub
+item.itemDustTinyLanthanum.name=Winziges Häufchen Lanthan-Staub
+item.itemCellNeon.name=Neon-Zelle
+item.itemCellGermanium.name=Germanium-Zelle
+item.itemCellSelenium.name=Selen-Zelle
+item.itemCellBromine.name=Brom-Zelle
+item.itemCellKrypton.name=Krypton-Zelle
+item.itemCellZirconium.name=Zirkonium-Zelle
+item.itemCellTechnetium.name=Technetium-Zelle
+item.itemCellRuthenium.name=Ruthenium-Zelle
+item.itemCellRhodium.name=Rhodium-Zelle
+item.itemCellIodine.name=Iod-Zelle
+item.itemCellXenon.name=Xenon-Zelle
+item.itemCellHafnium.name=Hafnium-Zelle
+item.itemCellRhenium.name=Rhenium-Zelle
+item.itemCellThallium.name=Thallium-Zelle
+item.itemCellPolonium.name=Polonium-Zelle
+item.itemCellAstatine.name=Astat-Zelle
+item.itemCellFrancium.name=Francium-Zelle
+item.itemCellRadium.name=Radium-Zelle
+item.itemCellActinium.name=Actinium-Zelle
+item.itemCellProtactinium.name=Protactinium-Zelle
+item.itemCellNeptunium.name=Neptunium-Zelle
+item.itemCellCurium.name=Curium-Zelle
+item.itemCellBerkelium.name=Berkelium-Zelle
+item.itemCellCalifornium.name=Californium-Zelle
+item.itemCellEinsteinium.name=Einsteinium-Zelle
+item.itemCellFermium.name=Fermium-Zelle
+item.itemCellRefinedTrinium.name=Raffinierte Trinium-Zelle
+item.itemIngotSelenium.name=Selen-Barren
+item.itemDustSelenium.name=Selen-Staub
+item.itemDustTinySelenium.name=Winziges Häufchen Selen-Staub
+item.itemDustSmallSelenium.name=Kleines Häufchen Selen-Staub
+item.itemNuggetSelenium.name=Selen-Nugget
+item.itemPlateSelenium.name=Selen-Platte
+item.itemPlateDoubleSelenium.name=Doppelte Selen-Platte
+item.itemBoltSelenium.name=Selen-Bolzen
+item.itemRodSelenium.name=Selen-Stange
+item.itemRodLongSelenium.name=Lange Selen-Stange
+item.itemRingSelenium.name=Selen-Ring
+item.itemScrewSelenium.name=Selen-Schraube
+item.itemRotorSelenium.name=Selen-Rotor
+item.itemGearSelenium.name=Selen-Zahnrad
+item.itemCellUranium232.name=Uran-232-Zelle
+item.itemCellUranium233.name=Uran-233-Zelle
+item.itemCellThoriumTetrafluoride.name=Thorium-Tetrafluorid-Zelle
+item.itemCellThoriumHexafluoride.name=Thorium-Hexafluorid-Zelle
+item.itemCellUraniumTetrafluoride.name=Uran-Tetrafluorid-Zelle
+item.itemCellUraniumHexafluoride.name=Uran-Hexafluorid-Zelle
+item.itemCellZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Zelle
+item.itemCellBerylliumFluoride.name=Beryllium-Fluorid-Zelle
+item.itemCellLithiumFluoride.name=Lithium-Fluorid-Zelle
+item.itemCellHydroxide.name=Hydroxid-Zelle
+item.itemCellAmmonium.name=Ammonium-Zelle
+item.itemCellAmmoniumBifluoride.name=Ammonium-Bifluorid-Zelle
+item.itemCellBerylliumHydroxide.name=Beryllium-Hydroxid-Zelle
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium-Tetrafluoroberyllat-Zelle
+item.itemCellNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Zelle
+item.itemCellTechnetiumHexafluoride.name=Technetium-Hexafluorid-Zelle
+item.itemCellSeleniumHexafluoride.name=Selen-Hexafluorid-Zelle
+item.itemCellEnergyCrystal.name=Energiekristall-Zelle
+item.itemCellBloodSteel.name=Blutstahl-Zelle
+item.itemCellStaballoy.name=Staballoy-Zelle
+item.itemCellTantalloy60.name=Tantalloy-60-Zelle
+item.itemCellTantalloy61.name=Tantalloy-61-Zelle
+item.itemCellTumbaga.name=Tumbaga-Zelle
+item.itemCellPotin.name=Potin-Zelle
+item.itemCellInconel625.name=Inconel-625-Zelle
+item.itemCellInconel690.name=Inconel-690-Zelle
+item.itemCellInconel792.name=Inconel-792-Zelle
+item.itemCellZeron100.name=Zeron-100-Zelle
+item.itemCellMaragingSteel250.name=Maraging-Stahl-250-Zelle
+item.itemCellMaragingSteel300.name=Maraging-Stahl-300-Zelle
+item.itemCellMaragingSteel350.name=Maraging-Stahl-350-Zelle
+item.itemCellStellite.name=Stellite-Zelle
+item.itemCellTalonite.name=Talonite-Zelle
+item.itemCellHastelloyW.name=Hastelloy-W-Zelle
+item.itemCellHastelloyX.name=Hastelloy-X-Zelle
+item.itemCellHastelloyN.name=Hastelloy-N-Zelle
+item.itemCellHastelloyC276.name=Hastelloy-C276-Zelle
+item.itemCellIncoloy020.name=Incoloy-020-Zelle
+item.itemCellIncoloyDS.name=Incoloy-DS-Zelle
+item.itemCellIncoloyMA956.name=Incoloy-MA956-Zelle
+item.itemCellTungstenCarbide.name=Wolframcarbid-Zelle
+item.itemCellSiliconCarbide.name=Siliziumcarbid-Zelle
+item.itemCellTantalumCarbide.name=Tantalcarbid-Zelle
+item.itemCellZirconiumCarbide.name=Zirkoniumcarbid-Zelle
+item.itemCellNiobiumCarbide.name=Niobcarbid-Zelle
+item.itemCellGrisium.name=Grisium-Zelle
+item.itemCellEglinSteelBaseCompound.name=Eglin-Stahl Base Compound-Zelle
+item.itemCellEglinSteel.name=Eglin-Stahl-Zelle
+item.itemCellHG1223.name=HG-1223-Zelle
+item.itemCellTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Zelle
+item.itemCellTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Zelle
+item.itemCellTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Zelle
+item.itemCellQuantum.name=Quanten-Zelle
+item.itemIngotBromine.name=Brom-Barren
+item.itemDustBromine.name=Brom-Staub
+item.itemDustTinyBromine.name=Winziges Häufchen Brom-Staub
+item.itemDustSmallBromine.name=Kleines Häufchen Brom-Staub
+item.itemNuggetBromine.name=Brom-Nugget
+item.itemPlateBromine.name=Brom-Platte
+item.itemPlateDoubleBromine.name=Doppelte Brom-Platte
+item.itemIngotStrontium.name=Strontium-Barren
+item.itemDustStrontium.name=Strontium-Staub
+item.itemDustTinyStrontium.name=Winziges Häufchen Strontium-Staub
+item.itemDustSmallStrontium.name=Kleines Häufchen Strontium-Staub
+item.itemNuggetStrontium.name=Strontium-Nugget
+item.itemPlateStrontium.name=Strontium-Platte
+item.itemPlateDoubleStrontium.name=Doppelte Strontium-Platte
+item.itemBoltStrontium.name=Strontium-Bolzen
+item.itemRodStrontium.name=Strontium-Stange
+item.itemRodLongStrontium.name=Lange Strontium-Stange
+item.itemRingStrontium.name=Strontium-Ring
+item.itemScrewStrontium.name=Strontium-Schraube
+item.itemRotorStrontium.name=Strontium-Rotor
+item.itemGearStrontium.name=Strontium-Zahnrad
+item.itemIngotZirconium.name=Zirkonium-Barren
+item.itemDustZirconium.name=Zirkonium-Staub
+item.itemDustTinyZirconium.name=Winziges Häufchen Zirkonium-Staub
+item.itemDustSmallZirconium.name=Kleines Häufchen Zirkonium-Staub
+item.itemNuggetZirconium.name=Zirkonium-Nugget
+item.itemPlateZirconium.name=Zirkonium-Platte
+item.itemPlateDoubleZirconium.name=Doppelte Zirkonium-Platte
+item.itemBoltZirconium.name=Zirkonium-Bolzen
+item.itemRodZirconium.name=Zirkonium-Stange
+item.itemRodLongZirconium.name=Lange Zirkonium-Stange
+item.itemRingZirconium.name=Zirkonium-Ring
+item.itemScrewZirconium.name=Zirkonium-Schraube
+item.itemRotorZirconium.name=Zirkonium-Rotor
+item.itemGearZirconium.name=Zirkonium-Zahnrad
+item.itemIngotRuthenium.name=Ruthenium-Barren
+item.itemDustRuthenium.name=Ruthenium-Staub
+item.itemDustTinyRuthenium.name=Winziges Häufchen Ruthenium-Staub
+item.itemDustSmallRuthenium.name=Kleines Häufchen Ruthenium-Staub
+item.itemNuggetRuthenium.name=Ruthenium-Nugget
+item.itemPlateRuthenium.name=Ruthenium-Platte
+item.itemPlateDoubleRuthenium.name=Doppelte Ruthenium-Platte
+item.itemBoltRuthenium.name=Ruthenium-Bolzen
+item.itemRodRuthenium.name=Ruthenium-Stange
+item.itemRodLongRuthenium.name=Lange Ruthenium-Stange
+item.itemRingRuthenium.name=Ruthenium-Ring
+item.itemScrewRuthenium.name=Ruthenium-Schraube
+item.itemRotorRuthenium.name=Ruthenium-Rotor
+item.itemGearRuthenium.name=Ruthenium-Zahnrad
+item.itemIngotIodine.name=Iod-Barren
+item.itemDustIodine.name=Iod-Staub
+item.itemDustTinyIodine.name=Winziges Häufchen Iod-Staub
+item.itemDustSmallIodine.name=Kleines Häufchen Iod-Staub
+item.itemNuggetIodine.name=Iod-Nugget
+item.itemPlateIodine.name=Iod-Platte
+item.itemPlateDoubleIodine.name=Doppelte Iod-Platte
+item.itemBoltIodine.name=Iod-Bolzen
+item.itemRodIodine.name=Iod-Stange
+item.itemRodLongIodine.name=Lange Iod-Stange
+item.itemRingIodine.name=Iod-Ring
+item.itemScrewIodine.name=Iod-Schraube
+item.itemRotorIodine.name=Iod-Rotor
+item.itemGearIodine.name=Iod-Zahnrad
+item.itemIngotHafnium.name=Hafnium-Barren
+item.itemDustHafnium.name=Hafnium-Staub
+item.itemDustTinyHafnium.name=Winziges Häufchen Hafnium-Staub
+item.itemDustSmallHafnium.name=Kleines Häufchen Hafnium-Staub
+item.itemNuggetHafnium.name=Hafnium-Nugget
+item.itemPlateHafnium.name=Hafnium-Platte
+item.itemPlateDoubleHafnium.name=Doppelte Hafnium-Platte
+item.itemBoltHafnium.name=Hafnium-Bolzen
+item.itemRodHafnium.name=Hafnium-Stange
+item.itemRodLongHafnium.name=Lange Hafnium-Stange
+item.itemRingHafnium.name=Hafnium-Ring
+item.itemScrewHafnium.name=Hafnium-Schraube
+item.itemRotorHafnium.name=Hafnium-Rotor
+item.itemGearHafnium.name=Hafnium-Zahnrad
+item.itemIngotDysprosium.name=Dysprosium-Barren
+item.itemDustDysprosium.name=Dysprosium-Staub
+item.itemDustTinyDysprosium.name=Winziges Häufchen Dysprosium-Staub
+item.itemDustSmallDysprosium.name=Kleines Häufchen Dysprosium-Staub
+item.itemNuggetDysprosium.name=Dysprosium-Nugget
+item.itemPlateDysprosium.name=Dysprosium-Platte
+item.itemPlateDoubleDysprosium.name=Doppelte Dysprosium-Platte
+item.itemBoltDysprosium.name=Dysprosium-Bolzen
+item.itemRodDysprosium.name=Dysprosium-Stange
+item.itemRodLongDysprosium.name=Lange Dysprosium-Stange
+item.itemRingDysprosium.name=Dysprosium-Ring
+item.itemScrewDysprosium.name=Dysprosium-Schraube
+item.itemRotorDysprosium.name=Dysprosium-Rotor
+item.itemGearDysprosium.name=Dysprosium-Zahnrad
+item.itemIngotTellurium.name=Tellurium-Barren
+item.itemDustTellurium.name=Tellurium-Staub
+item.itemDustTinyTellurium.name=Winziges Häufchen Tellurium-Staub
+item.itemDustSmallTellurium.name=Kleines Häufchen Tellurium-Staub
+item.itemNuggetTellurium.name=Tellurium-Nugget
+item.itemPlateTellurium.name=Tellurium-Platte
+item.itemPlateDoubleTellurium.name=Doppelte Tellurium-Platte
+item.itemBoltTellurium.name=Tellurium-Bolzen
+item.itemRodTellurium.name=Tellurium-Stange
+item.itemRodLongTellurium.name=Lange Tellurium-Stange
+item.itemRingTellurium.name=Tellurium-Ring
+item.itemScrewTellurium.name=Tellurium-Schraube
+item.itemRotorTellurium.name=Tellurium-Rotor
+item.itemGearTellurium.name=Tellurium-Zahnrad
+item.itemIngotRhodium.name=Rhodium-Barren
+item.itemDustRhodium.name=Rhodium-Staub
+item.itemDustTinyRhodium.name=Winziges Häufchen Rhodium-Staub
+item.itemDustSmallRhodium.name=Kleines Häufchen Rhodium-Staub
+item.itemNuggetRhodium.name=Rhodium-Nugget
+item.itemPlateRhodium.name=Rhodium-Platte
+item.itemPlateDoubleRhodium.name=Doppelte Rhodium-Platte
+item.itemBoltRhodium.name=Rhodium-Bolzen
+item.itemRodRhodium.name=Rhodium-Stange
+item.itemRodLongRhodium.name=Lange Rhodium-Stange
+item.itemRingRhodium.name=Rhodium-Ring
+item.itemScrewRhodium.name=Rhodium-Schraube
+item.itemRotorRhodium.name=Rhodium-Rotor
+item.itemGearRhodium.name=Rhodium-Zahnrad
+item.itemIngotRhenium.name=Rhenium-Barren
+item.itemDustRhenium.name=Rhenium-Staub
+item.itemDustTinyRhenium.name=Winziges Häufchen Rhenium-Staub
+item.itemDustSmallRhenium.name=Kleines Häufchen Rhenium-Staub
+item.itemNuggetRhenium.name=Rhenium-Nugget
+item.itemPlateRhenium.name=Rhenium-Platte
+item.itemPlateDoubleRhenium.name=Doppelte Rhenium-Platte
+item.itemBoltRhenium.name=Rhenium-Bolzen
+item.itemRodRhenium.name=Rhenium-Stange
+item.itemRodLongRhenium.name=Lange Rhenium-Stange
+item.itemRingRhenium.name=Rhenium-Ring
+item.itemScrewRhenium.name=Rhenium-Schraube
+item.itemRotorRhenium.name=Rhenium-Rotor
+item.itemGearRhenium.name=Rhenium-Zahnrad
+item.itemIngotThallium.name=Thallium-Barren
+item.itemDustThallium.name=Thallium-Staub
+item.itemDustTinyThallium.name=Winziges Häufchen Thallium-Staub
+item.itemDustSmallThallium.name=Kleines Häufchen Thallium-Staub
+item.itemNuggetThallium.name=Thallium-Nugget
+item.itemPlateThallium.name=Thallium-Platte
+item.itemPlateDoubleThallium.name=Doppelte Thallium-Platte
+item.itemBoltThallium.name=Thallium-Bolzen
+item.itemRodThallium.name=Thallium-Stange
+item.itemRodLongThallium.name=Lange Thallium-Stange
+item.itemRingThallium.name=Thallium-Ring
+item.itemScrewThallium.name=Thallium-Schraube
+item.itemRotorThallium.name=Thallium-Rotor
+item.itemGearThallium.name=Thallium-Zahnrad
+item.itemIngotTechnetium.name=Technetium-Barren
+item.itemDustTechnetium.name=Technetium-Staub
+item.itemDustTinyTechnetium.name=Winziges Häufchen Technetium-Staub
+item.itemDustSmallTechnetium.name=Kleines Häufchen Technetium-Staub
+item.itemNuggetTechnetium.name=Technetium-Nugget
+item.itemPlateTechnetium.name=Technetium-Platte
+item.itemPlateDoubleTechnetium.name=Doppelte Technetium-Platte
+item.itemIngotPolonium.name=Polonium-Barren
+item.itemDustPolonium.name=Polonium-Staub
+item.itemDustTinyPolonium.name=Winziges Häufchen Polonium-Staub
+item.itemDustSmallPolonium.name=Kleines Häufchen Polonium-Staub
+item.itemNuggetPolonium.name=Polonium-Nugget
+item.itemPlatePolonium.name=Polonium-Platte
+item.itemPlateDoublePolonium.name=Doppelte Polonium-Platte
+item.itemIngotAstatine.name=Astat-Barren
+item.itemDustAstatine.name=Astat-Staub
+item.itemDustTinyAstatine.name=Winziges Häufchen Astat-Staub
+item.itemDustSmallAstatine.name=Kleines Häufchen Astat-Staub
+item.itemNuggetAstatine.name=Astat-Nugget
+item.itemPlateAstatine.name=Astat-Platte
+item.itemPlateDoubleAstatine.name=Doppelte Astat-Platte
+item.itemIngotFrancium.name=Francium-Barren
+item.itemDustFrancium.name=Francium-Staub
+item.itemDustTinyFrancium.name=Winziges Häufchen Francium-Staub
+item.itemDustSmallFrancium.name=Kleines Häufchen Francium-Staub
+item.itemNuggetFrancium.name=Francium-Nugget
+item.itemPlateFrancium.name=Francium-Platte
+item.itemPlateDoubleFrancium.name=Doppelte Francium-Platte
+item.itemIngotRadium.name=Radium-Barren
+item.itemDustRadium.name=Radium-Staub
+item.itemDustTinyRadium.name=Winziges Häufchen Radium-Staub
+item.itemDustSmallRadium.name=Kleines Häufchen Radium-Staub
+item.itemNuggetRadium.name=Radium-Nugget
+item.itemPlateRadium.name=Radium-Platte
+item.itemPlateDoubleRadium.name=Doppelte Radium-Platte
+item.itemIngotActinium.name=Actinium-Barren
+item.itemDustActinium.name=Actinium-Staub
+item.itemDustTinyActinium.name=Winziges Häufchen Actinium-Staub
+item.itemDustSmallActinium.name=Kleines Häufchen Actinium-Staub
+item.itemNuggetActinium.name=Actinium-Nugget
+item.itemPlateActinium.name=Actinium-Platte
+item.itemPlateDoubleActinium.name=Doppelte Actinium-Platte
+item.itemIngotProtactinium.name=Protactinium-Barren
+item.itemDustProtactinium.name=Protactinium-Staub
+item.itemDustTinyProtactinium.name=Winziges Häufchen Protactinium-Staub
+item.itemDustSmallProtactinium.name=Kleines Häufchen Protactinium-Staub
+item.itemNuggetProtactinium.name=Protactinium-Nugget
+item.itemPlateProtactinium.name=Protactinium-Platte
+item.itemPlateDoubleProtactinium.name=Doppelte Protactinium-Platte
+item.itemIngotNeptunium.name=Neptunium-Barren
+item.itemDustNeptunium.name=Neptunium-Staub
+item.itemDustTinyNeptunium.name=Winziges Häufchen Neptunium-Staub
+item.itemDustSmallNeptunium.name=Kleines Häufchen Neptunium-Staub
+item.itemNuggetNeptunium.name=Neptunium-Nugget
+item.itemPlateNeptunium.name=Neptunium-Platte
+item.itemPlateDoubleNeptunium.name=Doppelte Neptunium-Platte
+item.itemIngotCurium.name=Curium-Barren
+item.itemDustCurium.name=Curium-Staub
+item.itemDustTinyCurium.name=Winziges Häufchen Curium-Staub
+item.itemDustSmallCurium.name=Kleines Häufchen Curium-Staub
+item.itemNuggetCurium.name=Curium-Nugget
+item.itemPlateCurium.name=Curium-Platte
+item.itemPlateDoubleCurium.name=Doppelte Curium-Platte
+item.itemIngotBerkelium.name=Berkelium-Barren
+item.itemDustBerkelium.name=Berkelium-Staub
+item.itemDustTinyBerkelium.name=Winziges Häufchen Berkelium-Staub
+item.itemDustSmallBerkelium.name=Kleines Häufchen Berkelium-Staub
+item.itemNuggetBerkelium.name=Berkelium-Nugget
+item.itemPlateBerkelium.name=Berkelium-Platte
+item.itemPlateDoubleBerkelium.name=Doppelte Berkelium-Platte
+item.itemIngotCalifornium.name=Californium-Barren
+item.itemDustCalifornium.name=Californium-Staub
+item.itemDustTinyCalifornium.name=Winziges Häufchen Californium-Staub
+item.itemDustSmallCalifornium.name=Kleines Häufchen Californium-Staub
+item.itemNuggetCalifornium.name=Californium-Nugget
+item.itemPlateCalifornium.name=Californium-Platte
+item.itemPlateDoubleCalifornium.name=Doppelte Californium-Platte
+item.itemIngotEinsteinium.name=Einsteinium-Barren
+item.itemDustEinsteinium.name=Einsteinium-Staub
+item.itemDustTinyEinsteinium.name=Winziges Häufchen Einsteinium-Staub
+item.itemDustSmallEinsteinium.name=Kleines Häufchen Einsteinium-Staub
+item.itemNuggetEinsteinium.name=Einsteinium-Nugget
+item.itemPlateEinsteinium.name=Einsteinium-Platte
+item.itemPlateDoubleEinsteinium.name=Doppelte Einsteinium-Platte
+item.itemIngotFermium.name=Fermium-Barren
+item.itemDustFermium.name=Fermium-Staub
+item.itemDustTinyFermium.name=Winziges Häufchen Fermium-Staub
+item.itemDustSmallFermium.name=Kleines Häufchen Fermium-Staub
+item.itemNuggetFermium.name=Fermium-Nugget
+item.itemPlateFermium.name=Fermium-Platte
+item.itemPlateDoubleFermium.name=Doppelte Fermium-Platte
+item.itemIngotLithium7.name=Lithium-7-Barren
+item.itemDustLithium7.name=Lithium-7-Staub
+item.itemDustTinyLithium7.name=Winziges Häufchen Lithium-7-Staub
+item.itemDustSmallLithium7.name=Kleines Häufchen Lithium-7-Staub
+item.itemNuggetLithium7.name=Lithium-7-Nugget
+item.itemPlateLithium7.name=Lithium-7-Platte
+item.itemPlateDoubleLithium7.name=Doppelte Lithium-7-Platte
+item.itemIngotThorium232.name=Thorium-232-Barren
+item.itemDustThorium232.name=Thorium-232-Staub
+item.itemDustTinyThorium232.name=Winziges Häufchen Thorium-232-Staub
+item.itemDustSmallThorium232.name=Kleines Häufchen Thorium-232-Staub
+item.itemNuggetThorium232.name=Thorium-232-Nugget
+item.itemPlateThorium232.name=Thorium-232-Platte
+item.itemPlateDoubleThorium232.name=Doppelte Thorium-232-Platte
+item.itemIngotUranium232.name=Uran-232-Barren
+item.itemDustUranium232.name=Uran-232-Staub
+item.itemDustTinyUranium232.name=Winziges Häufchen Uran-232-Staub
+item.itemDustSmallUranium232.name=Kleines Häufchen Uran-232-Staub
+item.itemNuggetUranium232.name=Uran-232-Nugget
+item.itemPlateUranium232.name=Uran-232-Platte
+item.itemRodUranium232.name=Uran-232-Stange
+item.itemRodLongUranium232.name=Lange Uran-232-Stange
+item.itemIngotUranium233.name=Uran-233-Barren
+item.itemDustUranium233.name=Uran-233-Staub
+item.itemDustTinyUranium233.name=Winziges Häufchen Uran-233-Staub
+item.itemDustSmallUranium233.name=Kleines Häufchen Uran-233-Staub
+item.itemNuggetUranium233.name=Uran-233-Nugget
+item.itemPlateUranium233.name=Uran-233-Platte
+item.itemRodUranium233.name=Uran-233-Stange
+item.itemRodLongUranium233.name=Lange Uran-233-Stange
+item.itemIngotPlutonium238.name=Plutonium-238-Barren
+item.itemDustPlutonium238.name=Plutonium-238-Staub
+item.itemDustTinyPlutonium238.name=Winziges Häufchen Plutonium-238-Staub
+item.itemDustSmallPlutonium238.name=Kleines Häufchen Plutonium-238-Staub
+item.itemNuggetPlutonium238.name=Plutonium-238-Nugget
+item.itemPlatePlutonium238.name=Plutonium-238-Platte
+item.itemPlateDoublePlutonium238.name=Doppelte Plutonium-238-Platte
+item.itemIngotStrontium90.name=Strontium-90-Barren
+item.itemDustStrontium90.name=Strontium-90-Staub
+item.itemDustTinyStrontium90.name=Winziges Häufchen Strontium-90-Staub
+item.itemDustSmallStrontium90.name=Kleines Häufchen Strontium-90-Staub
+item.itemNuggetStrontium90.name=Strontium-90-Nugget
+item.itemPlateStrontium90.name=Strontium-90-Platte
+item.itemPlateDoubleStrontium90.name=Doppelte Strontium-90-Platte
+item.itemIngotPolonium210.name=Polonium-210-Barren
+item.itemDustPolonium210.name=Polonium-210-Staub
+item.itemDustTinyPolonium210.name=Winziges Häufchen Polonium-210-Staub
+item.itemDustSmallPolonium210.name=Kleines Häufchen Polonium-210-Staub
+item.itemNuggetPolonium210.name=Polonium-210-Nugget
+item.itemPlatePolonium210.name=Polonium-210-Platte
+item.itemPlateDoublePolonium210.name=Doppelte Polonium-210-Platte
+item.itemIngotAmericium241.name=Americium-241-Barren
+item.itemDustAmericium241.name=Americium-241-Staub
+item.itemDustTinyAmericium241.name=Winziges Häufchen Americium-241-Staub
+item.itemDustSmallAmericium241.name=Kleines Häufchen Americium-241-Staub
+item.itemNuggetAmericium241.name=Americium-241-Nugget
+item.itemPlateAmericium241.name=Americium-241-Platte
+item.itemPlateDoubleAmericium241.name=Doppelte Americium-241-Platte
+item.itemIngotSiliconCarbide.name=Siliziumcarbid-Barren
+item.itemDustSiliconCarbide.name=Siliziumcarbid-Staub
+item.itemDustTinySiliconCarbide.name=Winziges Häufchen Siliziumcarbid-Staub
+item.itemDustSmallSiliconCarbide.name=Kleines Häufchen Siliziumcarbid-Staub
+item.itemNuggetSiliconCarbide.name=Siliziumcarbid-Nugget
+item.itemPlateSiliconCarbide.name=Siliziumcarbid-Platte
+item.itemPlateDoubleSiliconCarbide.name=Doppelte Siliziumcarbid-Platte
+item.itemBoltSiliconCarbide.name=Siliziumcarbid-Bolzen
+item.itemRodSiliconCarbide.name=Siliziumcarbid-Stange
+item.itemRodLongSiliconCarbide.name=Lange Siliziumcarbid-Stange
+item.itemRingSiliconCarbide.name=Siliziumcarbid-Ring
+item.itemScrewSiliconCarbide.name=Siliziumcarbid-Schraube
+item.itemRotorSiliconCarbide.name=Siliziumcarbid-Rotor
+item.itemGearSiliconCarbide.name=Siliziumcarbid-Zahnrad
+item.itemIngotZirconiumCarbide.name=Zirkoniumcarbid-Barren
+item.itemHotIngotZirconiumCarbide.name=Hot Zirkoniumcarbid-Barren
+item.itemDustZirconiumCarbide.name=Zirkoniumcarbid-Staub
+item.itemDustTinyZirconiumCarbide.name=Winziges Häufchen Zirkoniumcarbid-Staub
+item.itemDustSmallZirconiumCarbide.name=Kleines Häufchen Zirkoniumcarbid-Staub
+item.itemNuggetZirconiumCarbide.name=Zirkoniumcarbid-Nugget
+item.itemPlateZirconiumCarbide.name=Zirkoniumcarbid-Platte
+item.itemPlateDoubleZirconiumCarbide.name=Doppelte Zirkoniumcarbid-Platte
+item.itemBoltZirconiumCarbide.name=Zirkoniumcarbid-Bolzen
+item.itemRodZirconiumCarbide.name=Zirkoniumcarbid-Stange
+item.itemRodLongZirconiumCarbide.name=Lange Zirkoniumcarbid-Stange
+item.itemRingZirconiumCarbide.name=Zirkoniumcarbid-Ring
+item.itemScrewZirconiumCarbide.name=Zirkoniumcarbid-Schraube
+item.itemRotorZirconiumCarbide.name=Zirkoniumcarbid-Rotor
+item.itemGearZirconiumCarbide.name=Zirkoniumcarbid-Zahnrad
+item.itemIngotTantalumCarbide.name=Tantalcarbid-Barren
+item.itemHotIngotTantalumCarbide.name=Hot Tantalcarbid-Barren
+item.itemDustTantalumCarbide.name=Tantalcarbid-Staub
+item.itemDustTinyTantalumCarbide.name=Winziges Häufchen Tantalcarbid-Staub
+item.itemDustSmallTantalumCarbide.name=Kleines Häufchen Tantalcarbid-Staub
+item.itemNuggetTantalumCarbide.name=Tantalcarbid-Nugget
+item.itemPlateTantalumCarbide.name=Tantalcarbid-Platte
+item.itemPlateDoubleTantalumCarbide.name=Doppelte Tantalcarbid-Platte
+item.itemBoltTantalumCarbide.name=Tantalcarbid-Bolzen
+item.itemRodTantalumCarbide.name=Tantalcarbid-Stange
+item.itemRodLongTantalumCarbide.name=Lange Tantalcarbid-Stange
+item.itemRingTantalumCarbide.name=Tantalcarbid-Ring
+item.itemScrewTantalumCarbide.name=Tantalcarbid-Schraube
+item.itemRotorTantalumCarbide.name=Tantalcarbid-Rotor
+item.itemGearTantalumCarbide.name=Tantalcarbid-Zahnrad
+item.itemIngotNiobiumCarbide.name=Niobcarbid-Barren
+item.itemHotIngotNiobiumCarbide.name=Hot Niobcarbid-Barren
+item.itemDustNiobiumCarbide.name=Niobcarbid-Staub
+item.itemDustTinyNiobiumCarbide.name=Winziges Häufchen Niobcarbid-Staub
+item.itemDustSmallNiobiumCarbide.name=Kleines Häufchen Niobcarbid-Staub
+item.itemNuggetNiobiumCarbide.name=Niobcarbid-Nugget
+item.itemPlateNiobiumCarbide.name=Niobcarbid-Platte
+item.itemPlateDoubleNiobiumCarbide.name=Doppelte Niobcarbid-Platte
+item.itemBoltNiobiumCarbide.name=Niobcarbid-Bolzen
+item.itemRodNiobiumCarbide.name=Niobcarbid-Stange
+item.itemRodLongNiobiumCarbide.name=Lange Niobcarbid-Stange
+item.itemRingNiobiumCarbide.name=Niobcarbid-Ring
+item.itemScrewNiobiumCarbide.name=Niobcarbid-Schraube
+item.itemRotorNiobiumCarbide.name=Niobcarbid-Rotor
+item.itemGearNiobiumCarbide.name=Niobcarbid-Zahnrad
+item.itemIngotBerylliumFluoride.name=Beryllium-Fluorid-Barren
+item.itemDustBerylliumFluoride.name=Beryllium-Fluorid-Staub
+item.itemDustTinyBerylliumFluoride.name=Winziges Häufchen Beryllium-Fluorid-Staub
+item.itemDustSmallBerylliumFluoride.name=Kleines Häufchen Beryllium-Fluorid-Staub
+item.itemNuggetBerylliumFluoride.name=Beryllium-Fluorid-Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium-Fluorid-Platte
+item.itemPlateDoubleBerylliumFluoride.name=Doppelte Beryllium-Fluorid-Platte
+item.itemIngotLithiumFluoride.name=Lithium-Fluorid-Barren
+item.itemDustLithiumFluoride.name=Lithium-Fluorid-Staub
+item.itemDustTinyLithiumFluoride.name=Winziges Häufchen Lithium-Fluorid-Staub
+item.itemDustSmallLithiumFluoride.name=Kleines Häufchen Lithium-Fluorid-Staub
+item.itemNuggetLithiumFluoride.name=Lithium-Fluorid-Nugget
+item.itemPlateLithiumFluoride.name=Lithium-Fluorid-Platte
+item.itemPlateDoubleLithiumFluoride.name=Doppelte Lithium-Fluorid-Platte
+item.itemIngotThoriumTetrafluoride.name=Thorium-Tetrafluorid-Barren
+item.itemDustThoriumTetrafluoride.name=Thorium-Tetrafluorid-Staub
+item.itemDustTinyThoriumTetrafluoride.name=Winziges Häufchen Thorium-Tetrafluorid-Staub
+item.itemDustSmallThoriumTetrafluoride.name=Kleines Häufchen Thorium-Tetrafluorid-Staub
+item.itemNuggetThoriumTetrafluoride.name=Thorium-Tetrafluorid-Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium-Tetrafluorid-Platte
+item.itemPlateDoubleThoriumTetrafluoride.name=Doppelte Thorium-Tetrafluorid-Platte
+item.itemIngotThoriumHexafluoride.name=Thorium-Hexafluorid-Barren
+item.itemDustThoriumHexafluoride.name=Thorium-Hexafluorid-Staub
+item.itemDustTinyThoriumHexafluoride.name=Winziges Häufchen Thorium-Hexafluorid-Staub
+item.itemDustSmallThoriumHexafluoride.name=Kleines Häufchen Thorium-Hexafluorid-Staub
+item.itemNuggetThoriumHexafluoride.name=Thorium-Hexafluorid-Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium-Hexafluorid-Platte
+item.itemPlateDoubleThoriumHexafluoride.name=Doppelte Thorium-Hexafluorid-Platte
+item.itemIngotUraniumTetrafluoride.name=Uran-Tetrafluorid-Barren
+item.itemDustUraniumTetrafluoride.name=Uran-Tetrafluorid-Staub
+item.itemDustTinyUraniumTetrafluoride.name=Winziges Häufchen Uran-Tetrafluorid-Staub
+item.itemDustSmallUraniumTetrafluoride.name=Kleines Häufchen Uran-Tetrafluorid-Staub
+item.itemNuggetUraniumTetrafluoride.name=Uran-Tetrafluorid-Nugget
+item.itemPlateUraniumTetrafluoride.name=Uran-Tetrafluorid-Platte
+item.itemPlateDoubleUraniumTetrafluoride.name=Doppelte Uran-Tetrafluorid-Platte
+item.itemIngotUraniumHexafluoride.name=Uran-Hexafluorid-Barren
+item.itemDustUraniumHexafluoride.name=Uran-Hexafluorid-Staub
+item.itemDustTinyUraniumHexafluoride.name=Winziges Häufchen Uran-Hexafluorid-Staub
+item.itemDustSmallUraniumHexafluoride.name=Kleines Häufchen Uran-Hexafluorid-Staub
+item.itemNuggetUraniumHexafluoride.name=Uran-Hexafluorid-Nugget
+item.itemPlateUraniumHexafluoride.name=Uran-Hexafluorid-Platte
+item.itemPlateDoubleUraniumHexafluoride.name=Doppelte Uran-Hexafluorid-Platte
+item.itemIngotZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Barren
+item.itemDustZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Staub
+item.itemDustTinyZirconiumTetrafluoride.name=Winziges Häufchen Zirkonium-Tetrafluorid-Staub
+item.itemDustSmallZirconiumTetrafluoride.name=Kleines Häufchen Zirkonium-Tetrafluorid-Staub
+item.itemNuggetZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Platte
+item.itemPlateDoubleZirconiumTetrafluoride.name=Doppelte Zirkonium-Tetrafluorid-Platte
+item.itemIngotNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Barren
+item.itemDustNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Staub
+item.itemDustTinyNeptuniumHexafluoride.name=Winziges Häufchen Neptunium-Hexafluorid-Staub
+item.itemDustSmallNeptuniumHexafluoride.name=Kleines Häufchen Neptunium-Hexafluorid-Staub
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Platte
+item.itemPlateDoubleNeptuniumHexafluoride.name=Doppelte Neptunium-Hexafluorid-Platte
+item.itemIngotTechnetiumHexafluoride.name=Technetium-Hexafluorid-Barren
+item.itemDustTechnetiumHexafluoride.name=Technetium-Hexafluorid-Staub
+item.itemDustTinyTechnetiumHexafluoride.name=Winziges Häufchen Technetium-Hexafluorid-Staub
+item.itemDustSmallTechnetiumHexafluoride.name=Kleines Häufchen Technetium-Hexafluorid-Staub
+item.itemNuggetTechnetiumHexafluoride.name=Technetium-Hexafluorid-Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium-Hexafluorid-Platte
+item.itemPlateDoubleTechnetiumHexafluoride.name=Doppelte Technetium-Hexafluorid-Platte
+item.itemIngotSeleniumHexafluoride.name=Selen-Hexafluorid-Barren
+item.itemDustSeleniumHexafluoride.name=Selen-Hexafluorid-Staub
+item.itemDustTinySeleniumHexafluoride.name=Winziges Häufchen Selen-Hexafluorid-Staub
+item.itemDustSmallSeleniumHexafluoride.name=Kleines Häufchen Selen-Hexafluorid-Staub
+item.itemNuggetSeleniumHexafluoride.name=Selen-Hexafluorid-Nugget
+item.itemPlateSeleniumHexafluoride.name=Selen-Hexafluorid-Platte
+item.itemPlateDoubleSeleniumHexafluoride.name=Doppelte Selen-Hexafluorid-Platte
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Barren
+item.itemDustLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Staub
+item.itemDustTinyLiFBeF2ZrF4U235.name=Winziges Häufchen LiFBeF2ZrF4U235-Staub
+item.itemDustSmallLiFBeF2ZrF4U235.name=Kleines Häufchen LiFBeF2ZrF4U235-Staub
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Platte
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Doppelte LiFBeF2ZrF4U235-Platte
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Barren
+item.itemDustLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Staub
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Winziges Häufchen LiFBeF2ZrF4UF4-Staub
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Kleines Häufchen LiFBeF2ZrF4UF4-Staub
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Platte
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Doppelte LiFBeF2ZrF4UF4-Platte
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Barren
+item.itemDustLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Staub
+item.itemDustTinyLiFBeF2ThF4UF4.name=Winziges Häufchen LiFBeF2ThF4UF4-Staub
+item.itemDustSmallLiFBeF2ThF4UF4.name=Kleines Häufchen LiFBeF2ThF4UF4-Staub
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Platte
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Doppelte LiFBeF2ThF4UF4-Platte
+item.itemIngotEnergyCrystal.name=Energy Crystal-Barren
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal-Barren
+item.itemDustEnergyCrystal.name=Energy Crystal-Staub
+item.itemDustTinyEnergyCrystal.name=Winziges Häufchen Energy Crystal-Staub
+item.itemDustSmallEnergyCrystal.name=Kleines Häufchen Energy Crystal-Staub
+item.itemNuggetEnergyCrystal.name=Energy Crystal-Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal-Platte
+item.itemPlateDoubleEnergyCrystal.name=Doppelte Energy Crystal-Platte
+item.itemBoltEnergyCrystal.name=Energy Crystal-Bolzen
+item.itemRodEnergyCrystal.name=Energy Crystal-Stange
+item.itemRodLongEnergyCrystal.name=Lange Energy Crystal-Stange
+item.itemRingEnergyCrystal.name=Energy Crystal-Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal-Schraube
+item.itemRotorEnergyCrystal.name=Energy Crystal-Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal-Zahnrad
+item.itemIngotBloodSteel.name=Blutstahl-Barren
+item.itemDustBloodSteel.name=Blutstahl-Staub
+item.itemDustTinyBloodSteel.name=Winziges Häufchen Blutstahl-Staub
+item.itemDustSmallBloodSteel.name=Kleines Häufchen Blutstahl-Staub
+item.itemNuggetBloodSteel.name=Blutstahl-Nugget
+item.itemPlateBloodSteel.name=Blutstahl-Platte
+item.itemPlateDoubleBloodSteel.name=Doppelte Blutstahl-Platte
+item.itemBoltBloodSteel.name=Blutstahl-Bolzen
+item.itemRodBloodSteel.name=Blutstahl-Stange
+item.itemRodLongBloodSteel.name=Lange Blutstahl-Stange
+item.itemRingBloodSteel.name=Blutstahl-Ring
+item.itemScrewBloodSteel.name=Blutstahl-Schraube
+item.itemRotorBloodSteel.name=Blutstahl-Rotor
+item.itemGearBloodSteel.name=Blutstahl-Zahnrad
+item.itemIngotZeron100.name=Zeron-100-Barren
+item.itemHotIngotZeron100.name=Hot Zeron-100-Barren
+item.itemDustZeron100.name=Zeron-100-Staub
+item.itemDustTinyZeron100.name=Winziges Häufchen Zeron-100-Staub
+item.itemDustSmallZeron100.name=Kleines Häufchen Zeron-100-Staub
+item.itemNuggetZeron100.name=Zeron-100-Nugget
+item.itemPlateZeron100.name=Zeron-100-Platte
+item.itemPlateDoubleZeron100.name=Doppelte Zeron-100-Platte
+item.itemBoltZeron100.name=Zeron-100-Bolzen
+item.itemRodZeron100.name=Zeron-100-Stange
+item.itemRodLongZeron100.name=Lange Zeron-100-Stange
+item.itemRingZeron100.name=Zeron-100-Ring
+item.itemScrewZeron100.name=Zeron-100-Schraube
+item.itemRotorZeron100.name=Zeron-100-Rotor
+item.itemGearZeron100.name=Zeron-100-Zahnrad
+item.itemIngotTumbaga.name=Tumbaga-Barren
+item.itemDustTumbaga.name=Tumbaga-Staub
+item.itemDustTinyTumbaga.name=Winziges Häufchen Tumbaga-Staub
+item.itemDustSmallTumbaga.name=Kleines Häufchen Tumbaga-Staub
+item.itemNuggetTumbaga.name=Tumbaga-Nugget
+item.itemPlateTumbaga.name=Tumbaga-Platte
+item.itemPlateDoubleTumbaga.name=Doppelte Tumbaga-Platte
+item.itemBoltTumbaga.name=Tumbaga-Bolzen
+item.itemRodTumbaga.name=Tumbaga-Stange
+item.itemRodLongTumbaga.name=Lange Tumbaga-Stange
+item.itemRingTumbaga.name=Tumbaga-Ring
+item.itemScrewTumbaga.name=Tumbaga-Schraube
+item.itemRotorTumbaga.name=Tumbaga-Rotor
+item.itemGearTumbaga.name=Tumbaga-Zahnrad
+item.itemIngotPotin.name=Potin-Barren
+item.itemDustPotin.name=Potin-Staub
+item.itemDustTinyPotin.name=Winziges Häufchen Potin-Staub
+item.itemDustSmallPotin.name=Kleines Häufchen Potin-Staub
+item.itemNuggetPotin.name=Potin-Nugget
+item.itemPlatePotin.name=Potin-Platte
+item.itemPlateDoublePotin.name=Doppelte Potin-Platte
+item.itemBoltPotin.name=Potin-Bolzen
+item.itemRodPotin.name=Potin-Stange
+item.itemRodLongPotin.name=Lange Potin-Stange
+item.itemRingPotin.name=Potin-Ring
+item.itemScrewPotin.name=Potin-Schraube
+item.itemRotorPotin.name=Potin-Rotor
+item.itemGearPotin.name=Potin-Zahnrad
+item.itemIngotStaballoy.name=Staballoy-Barren
+item.itemHotIngotStaballoy.name=Hot Staballoy-Barren
+item.itemDustStaballoy.name=Staballoy-Staub
+item.itemDustTinyStaballoy.name=Winziges Häufchen Staballoy-Staub
+item.itemDustSmallStaballoy.name=Kleines Häufchen Staballoy-Staub
+item.itemNuggetStaballoy.name=Staballoy-Nugget
+item.itemPlateStaballoy.name=Staballoy-Platte
+item.itemPlateDoubleStaballoy.name=Doppelte Staballoy-Platte
+item.itemBoltStaballoy.name=Staballoy-Bolzen
+item.itemRodStaballoy.name=Staballoy-Stange
+item.itemRodLongStaballoy.name=Lange Staballoy-Stange
+item.itemRingStaballoy.name=Staballoy-Ring
+item.itemScrewStaballoy.name=Staballoy-Schraube
+item.itemRotorStaballoy.name=Staballoy-Rotor
+item.itemGearStaballoy.name=Staballoy-Zahnrad
+item.itemIngotTantalloy60.name=Tantalloy-60-Barren
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60-Barren
+item.itemDustTantalloy60.name=Tantalloy-60-Staub
+item.itemDustTinyTantalloy60.name=Winziges Häufchen Tantalloy-60-Staub
+item.itemDustSmallTantalloy60.name=Kleines Häufchen Tantalloy-60-Staub
+item.itemNuggetTantalloy60.name=Tantalloy-60-Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60-Platte
+item.itemPlateDoubleTantalloy60.name=Doppelte Tantalloy-60-Platte
+item.itemBoltTantalloy60.name=Tantalloy-60-Bolzen
+item.itemRodTantalloy60.name=Tantalloy-60-Stange
+item.itemRodLongTantalloy60.name=Lange Tantalloy-60-Stange
+item.itemRingTantalloy60.name=Tantalloy-60-Ring
+item.itemScrewTantalloy60.name=Tantalloy-60-Schraube
+item.itemRotorTantalloy60.name=Tantalloy-60-Rotor
+item.itemGearTantalloy60.name=Tantalloy-60-Zahnrad
+item.itemIngotTantalloy61.name=Tantalloy-61-Barren
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61-Barren
+item.itemDustTantalloy61.name=Tantalloy-61-Staub
+item.itemDustTinyTantalloy61.name=Winziges Häufchen Tantalloy-61-Staub
+item.itemDustSmallTantalloy61.name=Kleines Häufchen Tantalloy-61-Staub
+item.itemNuggetTantalloy61.name=Tantalloy-61-Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61-Platte
+item.itemPlateDoubleTantalloy61.name=Doppelte Tantalloy-61-Platte
+item.itemBoltTantalloy61.name=Tantalloy-61-Bolzen
+item.itemRodTantalloy61.name=Tantalloy-61-Stange
+item.itemRodLongTantalloy61.name=Lange Tantalloy-61-Stange
+item.itemRingTantalloy61.name=Tantalloy-61-Ring
+item.itemScrewTantalloy61.name=Tantalloy-61-Schraube
+item.itemRotorTantalloy61.name=Tantalloy-61-Rotor
+item.itemGearTantalloy61.name=Tantalloy-61-Zahnrad
+item.itemIngotInconel625.name=Inconel-625-Barren
+item.itemHotIngotInconel625.name=Hot Inconel-625-Barren
+item.itemDustInconel625.name=Inconel-625-Staub
+item.itemDustTinyInconel625.name=Winziges Häufchen Inconel-625-Staub
+item.itemDustSmallInconel625.name=Kleines Häufchen Inconel-625-Staub
+item.itemNuggetInconel625.name=Inconel-625-Nugget
+item.itemPlateInconel625.name=Inconel-625-Platte
+item.itemPlateDoubleInconel625.name=Doppelte Inconel-625-Platte
+item.itemBoltInconel625.name=Inconel-625-Bolzen
+item.itemRodInconel625.name=Inconel-625-Stange
+item.itemRodLongInconel625.name=Lange Inconel-625-Stange
+item.itemRingInconel625.name=Inconel-625-Ring
+item.itemScrewInconel625.name=Inconel-625-Schraube
+item.itemRotorInconel625.name=Inconel-625-Rotor
+item.itemGearInconel625.name=Inconel-625-Zahnrad
+item.itemIngotInconel690.name=Inconel-690-Barren
+item.itemHotIngotInconel690.name=Hot Inconel-690-Barren
+item.itemDustInconel690.name=Inconel-690-Staub
+item.itemDustTinyInconel690.name=Winziges Häufchen Inconel-690-Staub
+item.itemDustSmallInconel690.name=Kleines Häufchen Inconel-690-Staub
+item.itemNuggetInconel690.name=Inconel-690-Nugget
+item.itemPlateInconel690.name=Inconel-690-Platte
+item.itemPlateDoubleInconel690.name=Doppelte Inconel-690-Platte
+item.itemBoltInconel690.name=Inconel-690-Bolzen
+item.itemRodInconel690.name=Inconel-690-Stange
+item.itemRodLongInconel690.name=Lange Inconel-690-Stange
+item.itemRingInconel690.name=Inconel-690-Ring
+item.itemScrewInconel690.name=Inconel-690-Schraube
+item.itemRotorInconel690.name=Inconel-690-Rotor
+item.itemGearInconel690.name=Inconel-690-Zahnrad
+item.itemIngotInconel792.name=Inconel-792-Barren
+item.itemHotIngotInconel792.name=Hot Inconel-792-Barren
+item.itemDustInconel792.name=Inconel-792-Staub
+item.itemDustTinyInconel792.name=Winziges Häufchen Inconel-792-Staub
+item.itemDustSmallInconel792.name=Kleines Häufchen Inconel-792-Staub
+item.itemNuggetInconel792.name=Inconel-792-Nugget
+item.itemPlateInconel792.name=Inconel-792-Platte
+item.itemPlateDoubleInconel792.name=Doppelte Inconel-792-Platte
+item.itemBoltInconel792.name=Inconel-792-Bolzen
+item.itemRodInconel792.name=Inconel-792-Stange
+item.itemRodLongInconel792.name=Lange Inconel-792-Stange
+item.itemRingInconel792.name=Inconel-792-Ring
+item.itemScrewInconel792.name=Inconel-792-Schraube
+item.itemRotorInconel792.name=Inconel-792-Rotor
+item.itemGearInconel792.name=Inconel-792-Zahnrad
+item.itemDustEglinSteelBaseCompound.name=Eglin-Stahl Base Compound-Staub
+item.itemDustTinyEglinSteelBaseCompound.name=Winziges Häufchen Eglin-Stahl Base Compound-Staub
+item.itemDustSmallEglinSteelBaseCompound.name=Kleines Häufchen Eglin-Stahl Base Compound-Staub
+item.itemIngotEglinSteel.name=Eglin-Stahl-Barren
+item.itemDustEglinSteel.name=Eglin-Stahl-Staub
+item.itemDustTinyEglinSteel.name=Winziges Häufchen Eglin-Stahl-Staub
+item.itemDustSmallEglinSteel.name=Kleines Häufchen Eglin-Stahl-Staub
+item.itemNuggetEglinSteel.name=Eglin-Stahl-Nugget
+item.itemPlateEglinSteel.name=Eglin-Stahl-Platte
+item.itemPlateDoubleEglinSteel.name=Doppelte Eglin-Stahl-Platte
+item.itemBoltEglinSteel.name=Eglin-Stahl-Bolzen
+item.itemRodEglinSteel.name=Eglin-Stahl-Stange
+item.itemRodLongEglinSteel.name=Lange Eglin-Stahl-Stange
+item.itemRingEglinSteel.name=Eglin-Stahl-Ring
+item.itemScrewEglinSteel.name=Eglin-Stahl-Schraube
+item.itemRotorEglinSteel.name=Eglin-Stahl-Rotor
+item.itemGearEglinSteel.name=Eglin-Stahl-Zahnrad
+item.itemIngotMaragingSteel250.name=Maraging-Stahl-250-Barren
+item.itemHotIngotMaragingSteel250.name=Hot Maraging-Stahl-250-Barren
+item.itemDustMaragingSteel250.name=Maraging-Stahl-250-Staub
+item.itemDustTinyMaragingSteel250.name=Winziges Häufchen Maraging-Stahl-250-Staub
+item.itemDustSmallMaragingSteel250.name=Kleines Häufchen Maraging-Stahl-250-Staub
+item.itemNuggetMaragingSteel250.name=Maraging-Stahl-250-Nugget
+item.itemPlateMaragingSteel250.name=Maraging-Stahl-250-Platte
+item.itemPlateDoubleMaragingSteel250.name=Doppelte Maraging-Stahl-250-Platte
+item.itemBoltMaragingSteel250.name=Maraging-Stahl-250-Bolzen
+item.itemRodMaragingSteel250.name=Maraging-Stahl-250-Stange
+item.itemRodLongMaragingSteel250.name=Lange Maraging-Stahl-250-Stange
+item.itemRingMaragingSteel250.name=Maraging-Stahl-250-Ring
+item.itemScrewMaragingSteel250.name=Maraging-Stahl-250-Schraube
+item.itemRotorMaragingSteel250.name=Maraging-Stahl-250-Rotor
+item.itemGearMaragingSteel250.name=Maraging-Stahl-250-Zahnrad
+item.itemIngotMaragingSteel300.name=Maraging-Stahl-300-Barren
+item.itemHotIngotMaragingSteel300.name=Hot Maraging-Stahl-300-Barren
+item.itemDustMaragingSteel300.name=Maraging-Stahl-300-Staub
+item.itemDustTinyMaragingSteel300.name=Winziges Häufchen Maraging-Stahl-300-Staub
+item.itemDustSmallMaragingSteel300.name=Kleines Häufchen Maraging-Stahl-300-Staub
+item.itemNuggetMaragingSteel300.name=Maraging-Stahl-300-Nugget
+item.itemPlateMaragingSteel300.name=Maraging-Stahl-300-Platte
+item.itemPlateDoubleMaragingSteel300.name=Doppelte Maraging-Stahl-300-Platte
+item.itemBoltMaragingSteel300.name=Maraging-Stahl-300-Bolzen
+item.itemRodMaragingSteel300.name=Maraging-Stahl-300-Stange
+item.itemRodLongMaragingSteel300.name=Lange Maraging-Stahl-300-Stange
+item.itemRingMaragingSteel300.name=Maraging-Stahl-300-Ring
+item.itemScrewMaragingSteel300.name=Maraging-Stahl-300-Schraube
+item.itemRotorMaragingSteel300.name=Maraging-Stahl-300-Rotor
+item.itemGearMaragingSteel300.name=Maraging-Stahl-300-Zahnrad
+item.itemIngotMaragingSteel350.name=Maraging-Stahl-350-Barren
+item.itemHotIngotMaragingSteel350.name=Hot Maraging-Stahl-350-Barren
+item.itemDustMaragingSteel350.name=Maraging-Stahl-350-Staub
+item.itemDustTinyMaragingSteel350.name=Winziges Häufchen Maraging-Stahl-350-Staub
+item.itemDustSmallMaragingSteel350.name=Kleines Häufchen Maraging-Stahl-350-Staub
+item.itemNuggetMaragingSteel350.name=Maraging-Stahl-350-Nugget
+item.itemPlateMaragingSteel350.name=Maraging-Stahl-350-Platte
+item.itemPlateDoubleMaragingSteel350.name=Doppelte Maraging-Stahl-350-Platte
+item.itemBoltMaragingSteel350.name=Maraging-Stahl-350-Bolzen
+item.itemRodMaragingSteel350.name=Maraging-Stahl-350-Stange
+item.itemRodLongMaragingSteel350.name=Lange Maraging-Stahl-350-Stange
+item.itemRingMaragingSteel350.name=Maraging-Stahl-350-Ring
+item.itemScrewMaragingSteel350.name=Maraging-Stahl-350-Schraube
+item.itemRotorMaragingSteel350.name=Maraging-Stahl-350-Rotor
+item.itemGearMaragingSteel350.name=Maraging-Stahl-350-Zahnrad
+item.itemIngotStellite.name=Stellite-Barren
+item.itemHotIngotStellite.name=Hot Stellite-Barren
+item.itemDustStellite.name=Stellite-Staub
+item.itemDustTinyStellite.name=Winziges Häufchen Stellite-Staub
+item.itemDustSmallStellite.name=Kleines Häufchen Stellite-Staub
+item.itemNuggetStellite.name=Stellite-Nugget
+item.itemPlateStellite.name=Stellite-Platte
+item.itemPlateDoubleStellite.name=Doppelte Stellite-Platte
+item.itemBoltStellite.name=Stellite-Bolzen
+item.itemRodStellite.name=Stellite-Stange
+item.itemRodLongStellite.name=Lange Stellite-Stange
+item.itemRingStellite.name=Stellite-Ring
+item.itemScrewStellite.name=Stellite-Schraube
+item.itemRotorStellite.name=Stellite-Rotor
+item.itemGearStellite.name=Stellite-Zahnrad
+item.itemIngotTalonite.name=Talonite-Barren
+item.itemDustTalonite.name=Talonite-Staub
+item.itemDustTinyTalonite.name=Winziges Häufchen Talonite-Staub
+item.itemDustSmallTalonite.name=Kleines Häufchen Talonite-Staub
+item.itemNuggetTalonite.name=Talonite-Nugget
+item.itemPlateTalonite.name=Talonite-Platte
+item.itemPlateDoubleTalonite.name=Doppelte Talonite-Platte
+item.itemBoltTalonite.name=Talonite-Bolzen
+item.itemRodTalonite.name=Talonite-Stange
+item.itemRodLongTalonite.name=Lange Talonite-Stange
+item.itemRingTalonite.name=Talonite-Ring
+item.itemScrewTalonite.name=Talonite-Schraube
+item.itemRotorTalonite.name=Talonite-Rotor
+item.itemGearTalonite.name=Talonite-Zahnrad
+item.itemIngotHastelloyW.name=Hastelloy-W-Barren
+item.itemDustHastelloyW.name=Hastelloy-W-Staub
+item.itemDustTinyHastelloyW.name=Winziges Häufchen Hastelloy-W-Staub
+item.itemDustSmallHastelloyW.name=Kleines Häufchen Hastelloy-W-Staub
+item.itemNuggetHastelloyW.name=Hastelloy-W-Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W-Platte
+item.itemPlateDoubleHastelloyW.name=Doppelte Hastelloy-W-Platte
+item.itemBoltHastelloyW.name=Hastelloy-W-Bolzen
+item.itemRodHastelloyW.name=Hastelloy-W-Stange
+item.itemRodLongHastelloyW.name=Lange Hastelloy-W-Stange
+item.itemRingHastelloyW.name=Hastelloy-W-Ring
+item.itemScrewHastelloyW.name=Hastelloy-W-Schraube
+item.itemRotorHastelloyW.name=Hastelloy-W-Rotor
+item.itemGearHastelloyW.name=Hastelloy-W-Zahnrad
+item.itemIngotHastelloyX.name=Hastelloy-X-Barren
+item.itemDustHastelloyX.name=Hastelloy-X-Staub
+item.itemDustTinyHastelloyX.name=Winziges Häufchen Hastelloy-X-Staub
+item.itemDustSmallHastelloyX.name=Kleines Häufchen Hastelloy-X-Staub
+item.itemNuggetHastelloyX.name=Hastelloy-X-Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X-Platte
+item.itemPlateDoubleHastelloyX.name=Doppelte Hastelloy-X-Platte
+item.itemBoltHastelloyX.name=Hastelloy-X-Bolzen
+item.itemRodHastelloyX.name=Hastelloy-X-Stange
+item.itemRodLongHastelloyX.name=Lange Hastelloy-X-Stange
+item.itemRingHastelloyX.name=Hastelloy-X-Ring
+item.itemScrewHastelloyX.name=Hastelloy-X-Schraube
+item.itemRotorHastelloyX.name=Hastelloy-X-Rotor
+item.itemGearHastelloyX.name=Hastelloy-X-Zahnrad
+item.itemIngotHastelloyC276.name=Hastelloy-C276-Barren
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276-Barren
+item.itemDustHastelloyC276.name=Hastelloy-C276-Staub
+item.itemDustTinyHastelloyC276.name=Winziges Häufchen Hastelloy-C276-Staub
+item.itemDustSmallHastelloyC276.name=Kleines Häufchen Hastelloy-C276-Staub
+item.itemNuggetHastelloyC276.name=Hastelloy-C276-Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276-Platte
+item.itemPlateDoubleHastelloyC276.name=Doppelte Hastelloy-C276-Platte
+item.itemBoltHastelloyC276.name=Hastelloy-C276-Bolzen
+item.itemRodHastelloyC276.name=Hastelloy-C276-Stange
+item.itemRodLongHastelloyC276.name=Lange Hastelloy-C276-Stange
+item.itemRingHastelloyC276.name=Hastelloy-C276-Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276-Schraube
+item.itemRotorHastelloyC276.name=Hastelloy-C276-Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276-Zahnrad
+item.itemIngotHastelloyN.name=Hastelloy-N-Barren
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N-Barren
+item.itemDustHastelloyN.name=Hastelloy-N-Staub
+item.itemDustTinyHastelloyN.name=Winziges Häufchen Hastelloy-N-Staub
+item.itemDustSmallHastelloyN.name=Kleines Häufchen Hastelloy-N-Staub
+item.itemNuggetHastelloyN.name=Hastelloy-N-Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N-Platte
+item.itemPlateDoubleHastelloyN.name=Doppelte Hastelloy-N-Platte
+item.itemBoltHastelloyN.name=Hastelloy-N-Bolzen
+item.itemRodHastelloyN.name=Hastelloy-N-Stange
+item.itemRodLongHastelloyN.name=Lange Hastelloy-N-Stange
+item.itemRingHastelloyN.name=Hastelloy-N-Ring
+item.itemScrewHastelloyN.name=Hastelloy-N-Schraube
+item.itemRotorHastelloyN.name=Hastelloy-N-Rotor
+item.itemGearHastelloyN.name=Hastelloy-N-Zahnrad
+item.itemIngotIncoloy020.name=Incoloy-020-Barren
+item.itemDustIncoloy020.name=Incoloy-020-Staub
+item.itemDustTinyIncoloy020.name=Winziges Häufchen Incoloy-020-Staub
+item.itemDustSmallIncoloy020.name=Kleines Häufchen Incoloy-020-Staub
+item.itemNuggetIncoloy020.name=Incoloy-020-Nugget
+item.itemPlateIncoloy020.name=Incoloy-020-Platte
+item.itemPlateDoubleIncoloy020.name=Doppelte Incoloy-020-Platte
+item.itemBoltIncoloy020.name=Incoloy-020-Bolzen
+item.itemRodIncoloy020.name=Incoloy-020-Stange
+item.itemRodLongIncoloy020.name=Lange Incoloy-020-Stange
+item.itemRingIncoloy020.name=Incoloy-020-Ring
+item.itemScrewIncoloy020.name=Incoloy-020-Schraube
+item.itemRotorIncoloy020.name=Incoloy-020-Rotor
+item.itemGearIncoloy020.name=Incoloy-020-Zahnrad
+item.itemIngotIncoloyDS.name=Incoloy-DS-Barren
+item.itemDustIncoloyDS.name=Incoloy-DS-Staub
+item.itemDustTinyIncoloyDS.name=Winziges Häufchen Incoloy-DS-Staub
+item.itemDustSmallIncoloyDS.name=Kleines Häufchen Incoloy-DS-Staub
+item.itemNuggetIncoloyDS.name=Incoloy-DS-Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS-Platte
+item.itemPlateDoubleIncoloyDS.name=Doppelte Incoloy-DS-Platte
+item.itemBoltIncoloyDS.name=Incoloy-DS-Bolzen
+item.itemRodIncoloyDS.name=Incoloy-DS-Stange
+item.itemRodLongIncoloyDS.name=Lange Incoloy-DS-Stange
+item.itemRingIncoloyDS.name=Incoloy-DS-Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS-Schraube
+item.itemRotorIncoloyDS.name=Incoloy-DS-Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS-Zahnrad
+item.itemIngotIncoloyMA956.name=Incoloy-MA956-Barren
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956-Barren
+item.itemDustIncoloyMA956.name=Incoloy-MA956-Staub
+item.itemDustTinyIncoloyMA956.name=Winziges Häufchen Incoloy-MA956-Staub
+item.itemDustSmallIncoloyMA956.name=Kleines Häufchen Incoloy-MA956-Staub
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956-Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956-Platte
+item.itemPlateDoubleIncoloyMA956.name=Doppelte Incoloy-MA956-Platte
+item.itemBoltIncoloyMA956.name=Incoloy-MA956-Bolzen
+item.itemRodIncoloyMA956.name=Incoloy-MA956-Stange
+item.itemRodLongIncoloyMA956.name=Lange Incoloy-MA956-Stange
+item.itemRingIncoloyMA956.name=Incoloy-MA956-Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956-Schraube
+item.itemRotorIncoloyMA956.name=Incoloy-MA956-Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956-Zahnrad
+item.itemIngotGrisium.name=Grisium-Barren
+item.itemHotIngotGrisium.name=Hot Grisium-Barren
+item.itemDustGrisium.name=Grisium-Staub
+item.itemDustTinyGrisium.name=Winziges Häufchen Grisium-Staub
+item.itemDustSmallGrisium.name=Kleines Häufchen Grisium-Staub
+item.itemNuggetGrisium.name=Grisium-Nugget
+item.itemPlateGrisium.name=Grisium-Platte
+item.itemPlateDoubleGrisium.name=Doppelte Grisium-Platte
+item.itemBoltGrisium.name=Grisium-Bolzen
+item.itemRodGrisium.name=Grisium-Stange
+item.itemRodLongGrisium.name=Lange Grisium-Stange
+item.itemRingGrisium.name=Grisium-Ring
+item.itemScrewGrisium.name=Grisium-Schraube
+item.itemRotorGrisium.name=Grisium-Rotor
+item.itemGearGrisium.name=Grisium-Zahnrad
+item.itemIngotHG1223.name=HG-1223-Barren
+item.itemDustHG1223.name=HG-1223-Staub
+item.itemDustTinyHG1223.name=Winziges Häufchen HG-1223-Staub
+item.itemDustSmallHG1223.name=Kleines Häufchen HG-1223-Staub
+item.itemNuggetHG1223.name=HG-1223-Nugget
+item.itemPlateHG1223.name=HG-1223-Platte
+item.itemPlateDoubleHG1223.name=Doppelte HG-1223-Platte
+item.itemIngotTrinium.name=Trinium-Barren
+item.itemDustTrinium.name=Trinium-Staub
+item.itemDustTinyTrinium.name=Winziges Häufchen Trinium-Staub
+item.itemDustSmallTrinium.name=Kleines Häufchen Trinium-Staub
+item.itemNuggetTrinium.name=Trinium-Nugget
+item.itemPlateTrinium.name=Trinium-Platte
+item.itemPlateDoubleTrinium.name=Doppelte Trinium-Platte
+item.itemIngotRefinedTrinium.name=Raffinierter Trinium-Barren
+item.itemDustRefinedTrinium.name=Raffinierter Trinium-Staub
+item.itemDustTinyRefinedTrinium.name=Winziges Häufchen raffinierter Trinium-Staub
+item.itemDustSmallRefinedTrinium.name=Kleines Häufchen raffinierter Trinium-Staub
+item.itemNuggetRefinedTrinium.name=Raffinierter Trinium-Nugget
+item.itemPlateRefinedTrinium.name=Raffinierte Trinium-Platte
+item.itemPlateDoubleRefinedTrinium.name=Doppelte raffinierte Trinium-Platte
+item.itemIngotTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Barren
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium-Titanium-Legierung-Barren
+item.itemDustTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Staub
+item.itemDustTinyTriniumTitaniumAlloy.name=Winziges Häufchen Trinium-Titanium-Legierung-Staub
+item.itemDustSmallTriniumTitaniumAlloy.name=Kleines Häufchen Trinium-Titanium-Legierung-Staub
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Platte
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Doppelte Trinium-Titanium-Legierung-Platte
+item.itemBoltTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Bolzen
+item.itemRodTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Stange
+item.itemRodLongTriniumTitaniumAlloy.name=Lange Trinium-Titanium-Legierung-Stange
+item.itemRingTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Schraube
+item.itemRotorTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Zahnrad
+item.itemIngotTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Barren
+item.itemDustTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Staub
+item.itemDustTinyTriniumNaquadahAlloy.name=Winziges Häufchen Trinium-Naquadah-Legierung-Staub
+item.itemDustSmallTriniumNaquadahAlloy.name=Kleines Häufchen Trinium-Naquadah-Legierung-Staub
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Platte
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Doppelte Trinium-Naquadah-Legierung-Platte
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Barren
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium-Naquadah-Carbonit-Barren
+item.itemDustTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Staub
+item.itemDustTinyTriniumNaquadahCarbonite.name=Winziges Häufchen Trinium-Naquadah-Carbonit-Staub
+item.itemDustSmallTriniumNaquadahCarbonite.name=Kleines Häufchen Trinium-Naquadah-Carbonit-Staub
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Platte
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Doppelte Trinium-Naquadah-Carbonit-Platte
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Bolzen
+item.itemRodTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Stange
+item.itemRodLongTriniumNaquadahCarbonite.name=Lange Trinium-Naquadah-Carbonit-Stange
+item.itemRingTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Schraube
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Zahnrad
+item.itemIngotQuantum.name=Quanten-Barren
+item.itemHotIngotQuantum.name=Hot Quanten-Barren
+item.itemDustQuantum.name=Quanten-Staub
+item.itemDustTinyQuantum.name=Winziges Häufchen Quanten-Staub
+item.itemDustSmallQuantum.name=Kleines Häufchen Quanten-Staub
+item.itemNuggetQuantum.name=Quanten-Nugget
+item.itemPlateQuantum.name=Quanten-Platte
+item.itemPlateDoubleQuantum.name=Doppelte Quanten-Platte
+item.itemBoltQuantum.name=Quanten-Bolzen
+item.itemRodQuantum.name=Quanten-Stange
+item.itemRodLongQuantum.name=Lange Quanten-Stange
+item.itemRingQuantum.name=Quanten-Ring
+item.itemScrewQuantum.name=Quanten-Schraube
+item.itemRotorQuantum.name=Quanten-Rotor
+item.itemGearQuantum.name=Quanten-Zahnrad
+item.itemDustFluorite.name=Fluorit-Staub
+item.itemDustTinyFluorite.name=Winziges Häufchen Fluorit-Staub
+item.itemDustSmallFluorite.name=Kleines Häufchen Fluorit-Staub
+item.crushedFluorite.name=Zerkleinertes Fluorit-Erz
+item.crushedCentrifugedFluorite.name=Zentrifugiertes zerkleinertes Fluorit-Erz
+item.crushedPurifiedFluorite.name=Gereinigtes zerkleinertes Fluorit-Erz
+item.dustImpureFluorite.name=Ungereinigtes Fluorit-Staub
+item.dustPureFluorite.name=Gereinigtes Fluorit-Staub
+item.itemDustCrocoite.name=Crocoit-Staub
+item.itemDustTinyCrocoite.name=Winziges Häufchen Crocoit-Staub
+item.itemDustSmallCrocoite.name=Kleines Häufchen Crocoit-Staub
+item.crushedCrocoite.name=Zerkleinertes Crocoit-Erz
+item.crushedCentrifugedCrocoite.name=Zentrifugiertes zerkleinertes Crocoit-Erz
+item.crushedPurifiedCrocoite.name=Gereinigtes zerkleinertes Crocoit-Erz
+item.dustImpureCrocoite.name=Ungereinigtes Crocoit-Staub
+item.dustPureCrocoite.name=Gereinigtes Crocoit-Staub
+item.itemDustGeikielite.name=Geikielite-Staub
+item.itemDustTinyGeikielite.name=Winziges Häufchen Geikielite-Staub
+item.itemDustSmallGeikielite.name=Kleines Häufchen Geikielite-Staub
+item.crushedGeikielite.name=Zerkleinertes Geikielite-Erz
+item.crushedCentrifugedGeikielite.name=Zentrifugiertes zerkleinertes Geikielite-Erz
+item.crushedPurifiedGeikielite.name=Gereinigtes zerkleinertes Geikielite-Erz
+item.dustImpureGeikielite.name=Ungereinigtes Geikielite-Staub
+item.dustPureGeikielite.name=Gereinigtes Geikielite-Staub
+item.itemDustNichromite.name=Nichromit-Staub
+item.itemDustTinyNichromite.name=Winziges Häufchen Nichromit-Staub
+item.itemDustSmallNichromite.name=Kleines Häufchen Nichromit-Staub
+item.crushedNichromite.name=Zerkleinertes Nichromit-Erz
+item.crushedCentrifugedNichromite.name=Zentrifugiertes zerkleinertes Nichromit-Erz
+item.crushedPurifiedNichromite.name=Gereinigtes zerkleinertes Nichromit-Erz
+item.dustImpureNichromite.name=Ungereinigtes Nichromit-Staub
+item.dustPureNichromite.name=Gereinigtes Nichromit-Staub
+item.itemDustTitanite.name=Titanit-Staub
+item.itemDustTinyTitanite.name=Winziges Häufchen Titanit-Staub
+item.itemDustSmallTitanite.name=Kleines Häufchen Titanit-Staub
+item.crushedTitanite.name=Zerkleinertes Titanit-Erz
+item.crushedCentrifugedTitanite.name=Zentrifugiertes zerkleinertes Titanit-Erz
+item.crushedPurifiedTitanite.name=Gereinigtes zerkleinertes Titanit-Erz
+item.dustImpureTitanite.name=Ungereinigtes Titanit-Staub
+item.dustPureTitanite.name=Gereinigtes Titanit-Staub
+item.itemDustZimbabweite.name=Zimbabweit-Staub
+item.itemDustTinyZimbabweite.name=Winziges Häufchen Zimbabweit-Staub
+item.itemDustSmallZimbabweite.name=Kleines Häufchen Zimbabweit-Staub
+item.crushedZimbabweite.name=Zerkleinertes Zimbabweit-Erz
+item.crushedCentrifugedZimbabweite.name=Zentrifugiertes zerkleinertes Zimbabweit-Erz
+item.crushedPurifiedZimbabweite.name=Gereinigtes zerkleinertes Zimbabweit-Erz
+item.dustImpureZimbabweite.name=Ungereinigtes Zimbabweit-Staub
+item.dustPureZimbabweite.name=Gereinigtes Zimbabweit-Staub
+item.itemDustZirconolite.name=Zirkonolit-Staub
+item.itemDustTinyZirconolite.name=Winziges Häufchen Zirkonolit-Staub
+item.itemDustSmallZirconolite.name=Kleines Häufchen Zirkonolit-Staub
+item.crushedZirconolite.name=Zerkleinertes Zirkonolit-Erz
+item.crushedCentrifugedZirconolite.name=Zentrifugiertes zerkleinertes Zirkonolit-Erz
+item.crushedPurifiedZirconolite.name=Gereinigtes zerkleinertes Zirkonolit-Erz
+item.dustImpureZirconolite.name=Ungereinigter Zirkonolit-Staub
+item.dustPureZirconolite.name=Gereinigter Zirkonolit-Staub
+item.itemDustGadoliniteCe.name=Gadolinit(Ce)-Staub
+item.itemDustTinyGadoliniteCe.name=Winziges Häufchen Gadolinit(Ce)-Staub
+item.itemDustSmallGadoliniteCe.name=Kleines Häufchen Gadolinit(Ce)-Staub
+item.crushedGadoliniteCe.name=Zerkleinertes Gadolinit(Ce)-Erz
+item.crushedCentrifugedGadoliniteCe.name=Zentrifugiertes zerkleinertes Gadolinit(Ce)-Erz
+item.crushedPurifiedGadoliniteCe.name=Gereinigtes zerkleinertes Gadolinit(Ce)-Erz
+item.dustImpureGadoliniteCe.name=Ungereinigter Gadolinit(Ce)-Staub
+item.dustPureGadoliniteCe.name=Gereinigter Gadolinit(Ce)-Staub
+item.itemDustGadoliniteY.name=Gadolinit(Y)-Staub
+item.itemDustTinyGadoliniteY.name=Winziges Häufchen Gadolinit(Y)-Staub
+item.itemDustSmallGadoliniteY.name=Kleines Häufchen Gadolinit(Y)-Staub
+item.crushedGadoliniteY.name=Zerkleinertes Gadolinit(Y)-Erz
+item.crushedCentrifugedGadoliniteY.name=Zentrifugiertes zerkleinertes Gadolinit(Y)-Erz
+item.crushedPurifiedGadoliniteY.name=Gereinigtes zerkleinertes Gadolinit(Y)-Erz
+item.dustImpureGadoliniteY.name=Ungereinigter Gadolinit(Y)-Staub
+item.dustPureGadoliniteY.name=Gereinigter Gadolinit(Y)-Staub
+item.itemDustLepersonnite.name=Lepersonnit-Staub
+item.itemDustTinyLepersonnite.name=Winziges Häufchen Lepersonnite-Staub
+item.itemDustSmallLepersonnite.name=Kleines Häufchen Lepersonnite-Staub
+item.crushedLepersonnite.name=Zerkleinertes Lepersonnite-Erz
+item.crushedCentrifugedLepersonnite.name=Zentrifugiertes zerkleinertes Lepersonnite-Erz
+item.crushedPurifiedLepersonnite.name=Gereinigtes zerkleinertes Lepersonnite-Erz
+item.dustImpureLepersonnite.name=Ungereinigter Lepersonnite-Staub
+item.dustPureLepersonnite.name=Gereinigter Lepersonnite-Staub
+item.itemDustSamarskiteY.name=Samarsikt(Y)-Staub
+item.itemDustTinySamarskiteY.name=Winziges Häufchen Samarsikt(Y)-Staub
+item.itemDustSmallSamarskiteY.name=Kleines Häufchen Samarsikt(Y)-Staub
+item.crushedSamarskiteY.name=Zerkleinertes Samarsikt(Y)-Erz
+item.crushedCentrifugedSamarskiteY.name=Zentrifugiertes zerkleinertes Samarsikt(Y)-Erz
+item.crushedPurifiedSamarskiteY.name=Gereinigtes zerkleinertes Samarsikt(Y)-Erz
+item.dustImpureSamarskiteY.name=Ungereinigter Samarsikt(Y)-Staub
+item.dustPureSamarskiteY.name=Gereinigter Samarsikt(Y)-Staub
+item.itemDustSamarskiteYb.name=Samarsikt(Yb)-Staub
+item.itemDustTinySamarskiteYb.name=Winziges Häufchen Samarsikt(Yb)-Staub
+item.itemDustSmallSamarskiteYb.name=Kleines Häufchen Samarsikt(Yb)-Staub
+item.crushedSamarskiteYb.name=Zerkleinertes Samarsikt(Yb)-Erz
+item.crushedCentrifugedSamarskiteYb.name=Zentrifugiertes zerkleinertes Samarsikt(Yb)-Erz
+item.crushedPurifiedSamarskiteYb.name=Gereinigtes zerkleinertes Samarsikt(Yb)-Erz
+item.dustImpureSamarskiteYb.name=Ungereinigter Samarsikt(Yb)-Staub
+item.dustPureSamarskiteYb.name=Gereinigter Samarsikt(Yb)-Staub
+item.itemDustXenotime.name=Xenotime-Staub
+item.itemDustTinyXenotime.name=Winziges Häufchen Xenotime-Staub
+item.itemDustSmallXenotime.name=Kleines Häufchen Xenotime-Staub
+item.crushedXenotime.name=Zerkleinertes Xenotime-Erz
+item.crushedCentrifugedXenotime.name=Zentrifugiertes zerkleinertes Xenotime-Erz
+item.crushedPurifiedXenotime.name=Gereinigtes zerkleinertes Xenotime-Erz
+item.dustImpureXenotime.name=Ungereinigter Xenotime-Staub
+item.dustPureXenotime.name=Gereinigter Xenotime-Staub
+item.itemDustYttriaite.name=Yttriait-Staub
+item.itemDustTinyYttriaite.name=Winziges Häufchen Yttriait-Staub
+item.itemDustSmallYttriaite.name=Kleines Häufchen Yttriait-Staub
+item.crushedYttriaite.name=Zerkleinertes Yttriait-Erz
+item.crushedCentrifugedYttriaite.name=Zentrifugiertes zerkleinertes Yttriait-Erz
+item.crushedPurifiedYttriaite.name=Gereinigtes zerkleinertes Yttriait-Erz
+item.dustImpureYttriaite.name=Ungereinigter Yttriait-Staub
+item.dustPureYttriaite.name=Gereinigter Yttriait-Staub
+item.itemDustYttrialite.name=Yttrialit-Staub
+item.itemDustTinyYttrialite.name=Winziges Häufchen Yttrialit-Staub
+item.itemDustSmallYttrialite.name=Kleines Häufchen Yttrialit-Staub
+item.crushedYttrialite.name=Zerkleinertes Yttrialit-Erz
+item.crushedCentrifugedYttrialite.name=Zentrifugiertes zerkleinertes Yttrialit-Erz
+item.crushedPurifiedYttrialite.name=Gereinigtes zerkleinertes Yttrialit-Erz
+item.dustImpureYttrialite.name=Ungereinigter Yttrialit-Staub
+item.dustPureYttrialite.name=Gereinigter Yttrialit-Staub
+item.itemDustYttrocerite.name=Yttrocerite-Staub
+item.itemDustTinyYttrocerite.name=Winziges Häufchen Yttrocerite-Staub
+item.itemDustSmallYttrocerite.name=Kleines Häufchen Yttrocerite-Staub
+item.crushedYttrocerite.name=Zerkleinertes Yttrocerite-Erz
+item.crushedCentrifugedYttrocerite.name=Zentrifugiertes zerkleinertes Yttrocerite-Erz
+item.crushedPurifiedYttrocerite.name=Gereinigtes zerkleinertes Yttrocerite-Erz
+item.dustImpureYttrocerite.name=Ungereinigter Yttrocerite-Staub
+item.dustPureYttrocerite.name=Gereinigter Yttrocerite-Staub
+item.itemDustZircon.name=Zirkon-Staub
+item.itemDustTinyZircon.name=Winziges Häufchen Zirkon-Staub
+item.itemDustSmallZircon.name=Kleines Häufchen Zirkon-Staub
+item.crushedZircon.name=Zerkleinertes Zirkon-Erz
+item.crushedCentrifugedZircon.name=Zentrifugiertes zerkleinertes Zirkon-Erz
+item.crushedPurifiedZircon.name=Gereinigtes zerkleinertes Zirkon-Erz
+item.dustImpureZircon.name=Ungereinigter Zirkon-Staub
+item.dustPureZircon.name=Gereinigter Zirkon-Staub
+item.itemDustPolycrase.name=Polycrase-Staub
+item.itemDustTinyPolycrase.name=Winziges Häufchen Polycrase-Staub
+item.itemDustSmallPolycrase.name=Kleines Häufchen Polycrase-Staub
+item.crushedPolycrase.name=Zerkleinertes Polycrase-Erz
+item.crushedCentrifugedPolycrase.name=Zentrifugiertes zerkleinertes Polycrase-Erz
+item.crushedPurifiedPolycrase.name=Gereinigtes zerkleinertes Polycrase-Erz
+item.dustImpurePolycrase.name=Ungereinigter Polycrase-Staub
+item.dustPurePolycrase.name=Gereinigter Polycrase-Staub
+item.itemDustZircophyllite.name=Zirkophyllit-Staub
+item.itemDustTinyZircophyllite.name=Winziges Häufchen Zirkophyllit-Staub
+item.itemDustSmallZircophyllite.name=Kleines Häufchen Zirkophyllit-Staub
+item.crushedZircophyllite.name=Zerkleinertes Zirkophyllit-Erz
+item.crushedCentrifugedZircophyllite.name=Zentrifugiertes zerkleinertes Zirkophyllit-Erz
+item.crushedPurifiedZircophyllite.name=Gereinigtes zerkleinertes Zirkophyllit-Erz
+item.dustImpureZircophyllite.name=Ungereinigter Zirkophyllit-Staub
+item.dustPureZircophyllite.name=Gereinigter Zirkophyllit-Staub
+item.itemDustZirkelite.name=Zirkelit-Staub
+item.itemDustTinyZirkelite.name=Winziges Häufchen Zirkelit-Staub
+item.itemDustSmallZirkelite.name=Kleines Häufchen Zirkelit-Staub
+item.crushedZirkelite.name=Zerkleinertes Zirkelit-Erz
+item.crushedCentrifugedZirkelite.name=Zentrifugiertes zerkleinertes Zirkelit-Erz
+item.crushedPurifiedZirkelite.name=Gereinigtes zerkleinertes Zirkelit-Erz
+item.dustImpureZirkelite.name=Ungereinigter Zirkelit-Staub
+item.dustPureZirkelite.name=Gereinigter Zirkelit-Staub
+item.itemDustLanthaniteLa.name=Lanthanit(La)-Staub
+item.itemDustTinyLanthaniteLa.name=Winziges Häufchen Lanthanit(La)-Staub
+item.itemDustSmallLanthaniteLa.name=Kleines Häufchen Lanthanit(La)-Staub
+item.crushedLanthaniteLa.name=Zerkleinertes Lanthanit(La)-Erz
+item.crushedCentrifugedLanthaniteLa.name=Zentrifugiertes zerkleinertes Lanthanit(La)-Erz
+item.crushedPurifiedLanthaniteLa.name=Gereinigtes zerkleinertes Lanthanit(La)-Erz
+item.dustImpureLanthaniteLa.name=Ungereinigter Lanthanit(La)-Staub
+item.dustPureLanthaniteLa.name=Gereinigter Lanthanit(La)-Staub
+item.itemDustLanthaniteCe.name=Lanthanit(Ce)-Staub
+item.itemDustTinyLanthaniteCe.name=Winziges Häufchen Lanthanit(Ce)-Staub
+item.itemDustSmallLanthaniteCe.name=Kleines Häufchen Lanthanit(Ce)-Staub
+item.crushedLanthaniteCe.name=Zerkleinertes Lanthanit(Ce)-Erz
+item.crushedCentrifugedLanthaniteCe.name=Zentrifugiertes zerkleinertes Lanthanit(Ce)-Erz
+item.crushedPurifiedLanthaniteCe.name=Gereinigtes zerkleinertes Lanthanit(Ce)-Erz
+item.dustImpureLanthaniteCe.name=Ungereinigter Lanthanit(Ce)-Staub
+item.dustPureLanthaniteCe.name=Gereinigter Lanthanit(Ce)-Staub
+item.itemDustLanthaniteNd.name=Lanthanit(Nd)-Staub
+item.itemDustTinyLanthaniteNd.name=Winziges Häufchen Lanthanit(Nd)-Staub
+item.itemDustSmallLanthaniteNd.name=Kleines Häufchen Lanthanit(Nd)-Staub
+item.crushedLanthaniteNd.name=Zerkleinertes Lanthanit(Nd)-Erz
+item.crushedCentrifugedLanthaniteNd.name=Zentrifugiertes zerkleinertes Lanthanit(Nd)-Erz
+item.crushedPurifiedLanthaniteNd.name=Gereinigtes zerkleinertes Lanthanit(Nd)-Erz
+item.dustImpureLanthaniteNd.name=Ungereinigter Lanthanit(Nd)-Staub
+item.dustPureLanthaniteNd.name=Gereinigter Lanthanit(Nd)-Staub
+item.itemDustAgarditeY.name=Agardit(Y)-Staub
+item.itemDustTinyAgarditeY.name=Winziges Häufchen Agardit(Y)-Staub
+item.itemDustSmallAgarditeY.name=Kleines Häufchen Agardit(Y)-Staub
+item.crushedAgarditeY.name=Zerkleinertes Agardit(Y)-Erz
+item.crushedCentrifugedAgarditeY.name=Zentrifugiertes zerkleinertes Agardit(Y)-Erz
+item.crushedPurifiedAgarditeY.name=Gereinigtes zerkleinertes Agardit(Y)-Erz
+item.dustImpureAgarditeY.name=Ungereinigter Agardit(Y)-Staub
+item.dustPureAgarditeY.name=Gereinigter Agardit(Y)-Staub
+item.itemDustAgarditeCd.name=Agardit(Cd)-Staub
+item.itemDustTinyAgarditeCd.name=Winziges Häufchen Agardit(Cd)-Staub
+item.itemDustSmallAgarditeCd.name=Kleines Häufchen Agardit(Cd)-Staub
+item.crushedAgarditeCd.name=Zerkleinertes Agardit(Cd)-Erz
+item.crushedCentrifugedAgarditeCd.name=Zentrifugiertes zerkleinertes Agardit(Cd)-Erz
+item.crushedPurifiedAgarditeCd.name=Gereinigtes zerkleinertes Agardit(Cd)-Erz
+item.dustImpureAgarditeCd.name=Ungereinigter Agardit(Cd)-Staub
+item.dustPureAgarditeCd.name=Gereinigter Agardit(Cd)-Staub
+item.itemDustAgarditeLa.name=Agardit(La)-Staub
+item.itemDustTinyAgarditeLa.name=Winziges Häufchen Agardit(La)-Staub
+item.itemDustSmallAgarditeLa.name=Kleines Häufchen Agardit(La)-Staub
+item.crushedAgarditeLa.name=Zerkleinertes Agardit(La)-Erz
+item.crushedCentrifugedAgarditeLa.name=Zentrifugiertes zerkleinertes Agardit(La)-Erz
+item.crushedPurifiedAgarditeLa.name=Gereinigtes zerkleinertes Agardit(La)-Erz
+item.dustImpureAgarditeLa.name=Ungereinigter Agardit(La)-Staub
+item.dustPureAgarditeLa.name=Gereinigter Agardit(La)-Staub
+item.itemDustAgarditeNd.name=Agardit(Nd)-Staub
+item.itemDustTinyAgarditeNd.name=Winziges Häufchen Agardit(Nd)-Staub
+item.itemDustSmallAgarditeNd.name=Kleines Häufchen Agardit(Nd)-Staub
+item.crushedAgarditeNd.name=Zerkleinertes Agardit(Nd)-Erz
+item.crushedCentrifugedAgarditeNd.name=Zentrifugiertes zerkleinertes Agardit(Nd)-Erz
+item.crushedPurifiedAgarditeNd.name=Gereinigtes zerkleinertes Agardit(Nd)-Erz
+item.dustImpureAgarditeNd.name=Ungereinigter Agardit(Nd)-Staub
+item.dustPureAgarditeNd.name=Gereinigter Agardit(Nd)-Staub
+item.itemDustHibonite.name=Hibonit-Staub
+item.itemDustTinyHibonite.name=Winziges Häufchen Hibonit-Staub
+item.itemDustSmallHibonite.name=Kleines Häufchen Hibonit-Staub
+item.crushedHibonite.name=Zerkleinertes Hibonit-Erz
+item.crushedCentrifugedHibonite.name=Zentrifugiertes zerkleinertes Hibonit-Erz
+item.crushedPurifiedHibonite.name=Gereinigtes zerkleinertes Hibonit-Erz
+item.dustImpureHibonite.name=Ungereinigter Hibonit-Staub
+item.dustPureHibonite.name=Gereinigter Hibonit-Staub
+item.itemDustCerite.name=Cerit-Staub
+item.itemDustTinyCerite.name=Winziges Häufchen Cerit-Staub
+item.itemDustSmallCerite.name=Kleines Häufchen Cerit-Staub
+item.crushedCerite.name=Zerkleinertes Cerit-Erz
+item.crushedCentrifugedCerite.name=Zentrifugiertes zerkleinertes Cerit-Erz
+item.crushedPurifiedCerite.name=Gereinigtes zerkleinertes Cerit-Erz
+item.dustImpureCerite.name=Ungereinigter Cerit-Staub
+item.dustPureCerite.name=Gereinigter Cerit-Staub
+item.itemDustFluorcaphite.name=Fluorcaphit-Staub
+item.itemDustTinyFluorcaphite.name=Winziges Häufchen Fluorcaphit-Staub
+item.itemDustSmallFluorcaphite.name=Kleines Häufchen Fluorcaphit-Staub
+item.crushedFluorcaphite.name=Zerkleinertes Fluorcaphit-Erz
+item.crushedCentrifugedFluorcaphite.name=Zentrifugiertes zerkleinertes Fluorcaphit-Erz
+item.crushedPurifiedFluorcaphite.name=Gereinigtes zerkleinertes Fluorcaphit-Erz
+item.dustImpureFluorcaphite.name=Ungereinigter Fluorcaphit-Staub
+item.dustPureFluorcaphite.name=Gereinigter Fluorcaphit-Staub
+item.itemDustFlorencite.name=Florencit-Staub
+item.itemDustTinyFlorencite.name=Winziges Häufchen Florencit-Staub
+item.itemDustSmallFlorencite.name=Kleines Häufchen Florencit-Staub
+item.crushedFlorencite.name=Zerkleinertes Florencit-Erz
+item.crushedCentrifugedFlorencite.name=Zentrifugiertes zerkleinertes Florencit-Erz
+item.crushedPurifiedFlorencite.name=Gereinigtes zerkleinertes Florencit-Erz
+item.dustImpureFlorencite.name=Ungereinigter Florencit-Staub
+item.dustPureFlorencite.name=Gereinigter Florencit-Staub
+item.itemDustCryolite.name=Cryolit-Staub
+item.itemDustTinyCryolite.name=Winziges Häufchen Cryolit-Staub
+item.itemDustSmallCryolite.name=Kleines Häufchen Cryolit-Staub
+item.crushedCryolite.name=Zerkleinertes Cryolit-Erz
+item.crushedCentrifugedCryolite.name=Zentrifugiertes zerkleinertes Cryolit-Erz
+item.crushedPurifiedCryolite.name=Gereinigtes zerkleinertes Cryolit-Erz
+item.dustImpureCryolite.name=Ungereinigter Cryolit-Staub
+item.dustPureCryolite.name=Gereinigter Cryolit-Staub
+
+//Shards
+item.itemDrained.name=Erschöpfte Scherbe
+item.itemDustInfusedAir.name=Infundierter Luftstaub
+item.itemDustInfusedFire.name=Infundierter Feuerstaub
+item.itemDustInfusedEarth.name=Infundierter Erdstaub
+item.itemDustInfusedWater.name=Infundierter Wasserstaub
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium-Karbonat-Staub
+item.itemDustSmallLithiumCarbonate.name=Kleines Häufchen Lithium-Karbonat-Staub
+item.itemDustTinyLithiumCarbonate.name=Winziges Häufchen Lithium-Karbonat-Staub
+item.itemDustLithiumPeroxide.name=Lithium-Peroxid-Staub
+item.itemDustSmallLithiumPeroxide.name=Kleines Häufchen Lithium-Peroxid-Staub
+item.itemDustTinyLithiumPeroxide.name=Winziges Häufchen Lithium-Peroxid-Staub
+item.itemDustLithiumHydroxide.name=Lithium-Hydroxid-Staub
+item.itemDustSmallLithiumHydroxide.name=Kleines Häufchen Lithium-Hydroxid-Staub
+item.itemDustTinyLithiumHydroxide.name=Winziges Häufchen Lithium-Hydroxid-Staub
+item.itemDustCalciumHydroxide.name=Kalkhydrat-Staub
+item.itemDustSmallCalciumHydroxide.name=Kleines Häufchen Kalkhydrat-Staub
+item.itemDustTinyCalciumHydroxide.name=Winziges Häufchen Kalkhydrat-Staub
+item.itemDustCalciumCarbonate.name=Calcium-Karbonat-Staub
+item.itemDustSmallCalciumCarbonate.name=Kleines Häufchen Calcium-Karbonat-Staub
+item.itemDustTinyCalciumCarbonate.name=Winziges Häufchen Calcium-Karbonat-Staub
+item.itemDustGypsum.name=Calcium-Sulfat(Gypsum)-Staub
+item.itemDustSmallGypsum.name=Kleines Häufchen Calcium-Sulfat(Gypsum)-Staub
+item.itemDustTinyGypsum.name=Winziges Häufchen Calcium-Sulfat(Gypsum)-Staub
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustSmallLi2CO3CaOH2.name=Kleines Häufchen Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustTinyLi2CO3CaOH2.name=Winziges Häufchen Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustLi2BeF4.name=Li2BeF4 Treibstoff-Komposit-Staub
+item.itemDustSmallLi2BeF4.name=Kleines Häufchen Li2BeF4 Treibstoff-Komposit-Staub
+item.itemDustTinyLi2BeF4.name=Winziges Häufchen Li2BeF4 Treibstoff-Komposit-Staub
+item.Li2BeF4.name=Li2BeF4-Zelle
+item.itemCircuitLFTR.name=§aThorium Reaktorkontrollschaltung
+item.itemZirconiumPellet.name=Zirkonium-Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4-Staub
+item.itemDustSmallZrCl4.name=Kleines Häufchen ZrCl4-Staub
+item.itemDustTinyZrCl4.name=Winziges Häufchen ZrCl4-Staub
+item.itemDustCookedZrCl4.name=gebrannter ZrCl4-Staub
+item.itemDustSmallCookedZrCl4.name=Kleines Häufchen gebrannter ZrCl4-Staub
+item.itemDustTinyCookedZrCl4.name=Winziges Häufchen gebrannter ZrCl4-Staub
+item.itemDustUN18Fertiliser.name=UN-18 Dünger-Staub
+item.itemDustSmallUN18Fertiliser.name=Kleines Häufchen UN-18 Dünger-Staub
+item.itemDustTinyUN18Fertiliser.name=Winziges Häufchen UN-18 Dünger-Staub
+item.itemDustUN32Fertiliser.name=UN-32 Dünger-Staub
+item.itemDustSmallUN32Fertiliser.name=Kleines Häufchen UN-32 Dünger-Staub
+item.itemDustTinyUN32Fertiliser.name=Winziges Häufchen UN-32 Dünger-Staub
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium-Multi-Spitzhacke
+item.AluminiumMultispade.name=Aluminium-Multi-Schaufel
+item.BerylliumMultispade.name=Beryllium-Multi-Schaufel
+item.BismuthMultispade.name=Bismuth-Multi-Schaufel
+item.CarbonMultispade.name=Karbon-Multi-Schaufel
+item.ChromeMultipick.name=Chrom-Multi-Spitzhacke
+item.ChromeMultispade.name=Chrom-Multi-Schaufel
+item.CobaltMultipick.name=Kobalt-Multi-Spitzhacke
+item.CobaltMultispade.name=Kobalt-Multi-Schaufel
+item.GoldMultispade.name=Gold-Multi-Schaufel
+item.IridiumMultipick.name=Iridium-Multi-Spitzhacke
+item.IridiumMultispade.name=Iridium-Multi-Schaufel
+item.IronMultipick.name=Eisen-Multi-Spitzhacke
+item.IronMultispade.name=Eisen-Multi-Schaufel
+item.LeadMultispade.name=Blei-Multi-Schaufel
+item.ManganeseMultipick.name=Mangan-Multi-Spitzhacke
+item.ManganeseMultispade.name=Mangan-Multi-Schaufel
+item.MolybdenumMultipick.name=Molybdän-Multi-Spitzhacke
+item.MolybdenumMultispade.name=Molybdän-Multi-Schaufel
+item.NeodymiumMultipick.name=Neodym-Multi-Spitzhacke
+item.NeodymiumMultispade.name=Neodym-Multi-Schaufel
+item.NeutroniumMultipick.name=Neutronium-Multi-Spitzhacke
+item.NeutroniumMultispade.name=Neutronium-Multi-Schaufel
+item.NickelMultispade.name=Nickel-Multi-Schaufel
+item.OsmiumMultipick.name=Osmium-Multi-Spitzhacke
+item.OsmiumMultispade.name=Osmium-Multi-Schaufel
+item.PalladiumMultipick.name=Palladium-Multi-Spitzhacke
+item.PalladiumMultispade.name=Palladium-Multi-Schaufel
+item.PlatinumMultispade.name=Platin-Multi-Schaufel
+item.Plutonium241Multipick.name=Plutonium-241-Multi-Spitzhacke
+item.Plutonium241Multispade.name=Plutonium-241-Multi-Schaufel
+item.SilverMultispade.name=Silber-Multi-Schaufel
+item.ThoriumMultipick.name=Thorium-Multi-Spitzhacke
+item.ThoriumMultispade.name=Thorium-Multi-Schaufel
+item.TitaniumMultipick.name=Titan-Multi-Spitzhacke
+item.TitaniumMultispade.name=Titan-Multi-Schaufel
+item.TungstenMultipick.name=Wolfram-Multi-Spitzhacke
+item.TungstenMultispade.name=Wolfram-Multi-Schaufel
+item.Uranium235Multipick.name=Uran-235-Multi-Spitzhacke
+item.Uranium235Multispade.name=Uran-235-Multi-Schaufel
+item.DarkSteelMultipick.name=Dunkelstahl-Multi-Spitzhacke
+item.DarkSteelMultispade.name=Dunkelstahl-Multi-Schaufel
+item.DuraniumMultipick.name=Duranium-Multi-Spitzhacke
+item.DuraniumMultispade.name=Duranium-Multi-Schaufel
+item.InfusedGoldMultispade.name=Infundiertes-Gold-Multi-Schaufel
+item.NaquadahMultipick.name=Naquadah-Multi-Spitzhacke
+item.NaquadahMultispade.name=Naquadah-Multi-Schaufel
+item.NaquadahAlloyMultipick.name=Naquadah-Legierung-Multi-Spitzhacke
+item.NaquadahAlloyMultispade.name=Naquadah-Legierung-Multi-Schaufel
+item.NaquadriaMultipick.name=Naquadria-Multi-Spitzhacke
+item.NaquadriaMultispade.name=Naquadria-Multi-Schaufel
+item.TritaniumMultipick.name=Tritanium-Multi-Spitzhacke
+item.TritaniumMultispade.name=Tritanium-Multi-Schaufel
+item.OsmiridiumMultipick.name=Osmiridium-Multi-Spitzhacke
+item.OsmiridiumMultispade.name=Osmiridium-Multi-Schaufel
+item.BrassMultispade.name=Messing-Multi-Schaufel
+item.BronzeMultipick.name=Bronze-Multi-Spitzhacke
+item.BronzeMultispade.name=Bronze-Multi-Schaufel
+item.CupronickelMultispade.name=Cupronickel-Multi-Schaufel
+item.ElectrumMultispade.name=Electrum-Multi-Schaufel
+item.InvarMultipick.name=Invar-Multi-Spitzhacke
+item.InvarMultispade.name=Invar-Multi-Schaufel
+item.KanthalMultispade.name=Kanthal-Multi-Schaufel
+item.MagnaliumMultipick.name=Magnalium-Multi-Spitzhacke
+item.MagnaliumMultispade.name=Magnalium-Multi-Schaufel
+item.NichromeMultispade.name=Nichrom-Multi-Schaufel
+item.PigIronMultipick.name=Schweineisen-Multi-Spitzhacke
+item.PigIronMultispade.name=Schweineisen-Multi-Schaufel
+item.PolycaprolactamMultispade.name=Polycaprolactam-Multi-Schaufel
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene-Multi-Schaufel
+item.NickelZincFerriteMultispade.name=Nickel-Zink-Ferrit-Multi-Schaufel
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene-Sulfit-Multi-Schaufel
+item.StainlessSteelMultipick.name=Edelstahl-Multi-Spitzhacke
+item.StainlessSteelMultispade.name=Edelstahl-Multi-Schaufel
+item.SteelMultipick.name=Stahl-Multi-Spitzhacke
+item.SteelMultispade.name=Stahl-Multi-Schaufel
+item.TinAlloyMultispade.name=Zinnlegierung-Multi-Schaufel
+item.UltimetMultipick.name=Ultimet-Multi-Spitzhacke
+item.UltimetMultispade.name=Ultimet-Multi-Schaufel
+item.WroughtIronMultipick.name=Schmiedeisen-Multi-Spitzhacke
+item.WroughtIronMultispade.name=Schmiedeisen-Multi-Schaufel
+item.SterlingSilverMultipick.name=Sterlingsilber-Multi-Spitzhacke
+item.SterlingSilverMultispade.name=Sterlingsilber-Multi-Schaufel
+item.RoseGoldMultipick.name=Rosegold-Multi-Spitzhacke
+item.RoseGoldMultispade.name=Rosegold-Multi-Schaufel
+item.BlackBronzeMultipick.name=Schwarzbronze-Multi-Spitzhacke
+item.BlackBronzeMultispade.name=Schwarzbronze-Multi-Schaufel
+item.BismuthBronzeMultipick.name=Bismuth-Bronze-Multi-Spitzhacke
+item.BismuthBronzeMultispade.name=Bismuth-Bronze-Multi-Schaufel
+item.BlackSteelMultipick.name=Schwarzstahl-Multi-Spitzhacke
+item.BlackSteelMultispade.name=Schwarzstahl-Multi-Schaufel
+item.RedSteelMultipick.name=Rotstahl-Multi-Spitzhacke
+item.RedSteelMultispade.name=Rotstahl-Multi-Schaufel
+item.BlueSteelMultipick.name=Blaustahl-Multi-Spitzhacke
+item.BlueSteelMultispade.name=Blaustahl-Multi-Schaufel
+item.DamascusSteelMultipick.name=Damaskusstahl-Multi-Spitzhacke
+item.DamascusSteelMultispade.name=Damaskusstahl-Multi-Schaufel
+item.MithrilMultispade.name=Mithril-Multi-Schaufel
+item.CobaltBrassMultipick.name=Kobaltmessing-Multi-Spitzhacke
+item.CobaltBrassMultispade.name=Kobaltmessing-Multi-Schaufel
+item.ThaumiumMultipick.name=Thaumium-Multi-Spitzhacke
+item.ThaumiumMultispade.name=Thaumium-Multi-Schaufel
+item.HSSGMultipick.name=HSS-G-Multi-Spitzhacke
+item.HSSGMultispade.name=HSS-G-Multi-Schaufel
+item.HSSEMultipick.name=HSS-E-Multi-Spitzhacke
+item.HSSEMultispade.name=HSS-E-Multi-Schaufel
+item.HSSSMultipick.name=HSS-S-Multi-Spitzhacke
+item.HSSSMultispade.name=HSS-S-Multi-Schaufel
+item.HastelloyC276Multipick.name=Hastelloy-C276-Multi-Spitzhacke
+item.HastelloyC276Multispade.name=Hastelloy-C276-Multi-Schaufel
+item.HastelloyNMultipick.name=Hastelloy-N-Multi-Spitzhacke
+item.HastelloyNMultispade.name=Hastelloy-N-Multi-Schaufel
+item.HastelloyWMultipick.name=Hastelloy-W-Multi-Spitzhacke
+item.HastelloyWMultispade.name=Hastelloy-W-Multi-Schaufel
+item.HastelloyXMultipick.name=Hastelloy-X-Multi-Spitzhacke
+item.HastelloyXMultispade.name=Hastelloy-X-Multi-Schaufel
+item.Incoloy020Multipick.name=Incoloy-020-Multi-Spitzhacke
+item.Incoloy020Multispade.name=Incoloy-020-Multi-Schaufel
+item.IncoloyDSMultipick.name=Incoloy-DS-Multi-Spitzhacke
+item.IncoloyDSMultispade.name=Incoloy-DS-Multi-Schaufel
+item.IncoloyMA956Multipick.name=Incoloy-MA956-Multi-Spitzhacke
+item.IncoloyMA956Multispade.name=Incoloy-MA956-Multi-Schaufel
+item.Inconel625Multipick.name=Inconel-625-Multi-Spitzhacke
+item.Inconel625Multispade.name=Inconel-625-Multi-Schaufel
+item.Inconel690Multipick.name=Inconel-690-Multi-Spitzhacke
+item.Inconel690Multispade.name=Inconel-690-Multi-Schaufel
+item.Inconel792Multipick.name=Inconel-792-Multi-Spitzhacke
+item.Inconel792Multispade.name=Inconel-792-Multi-Schaufel
+item.GrisiumMultipick.name=Grisium-Multi-Spitzhacke
+item.GrisiumMultispade.name=Grisium-Multi-Schaufel
+item.Tantalloy60Multipick.name=Tantalloy-60-Multi-Spitzhacke
+item.Tantalloy60Multispade.name=Tantalloy-60-Multi-Schaufel
+item.Tantalloy61Multipick.name=Tantalloy-61-Multi-Spitzhacke
+item.Tantalloy61Multispade.name=Tantalloy-61-Multi-Schaufel
+item.StaballoyMultipick.name=Staballoy-Multi-Spitzhacke
+item.StaballoyMultispade.name=Staballoy-Multi-Schaufel
+item.QuantumMultipick.name=Quanten-Multi-Spitzhacke
+item.QuantumMultispade.name=Quanten-Multi-Schaufel
+item.PotinMultipick.name=Potin-Multi-Spitzhacke
+item.PotinMultispade.name=Potin-Multi-Schaufel
+item.TumbagaMultipick.name=Tumbaga-Multi-Spitzhacke
+item.TumbagaMultispade.name=Tumbaga-Multi-Schaufel
+item.TaloniteMultipick.name=Talonite-Multi-Spitzhacke
+item.TaloniteMultispade.name=Talonite-Multi-Schaufel
+item.StelliteMultipick.name=Stellite-Multi-Spitzhacke
+item.StelliteMultispade.name=Stellite-Multi-Schaufel
+item.TungstenCarbideMultipick.name=Wolframcarbid-Multi-Spitzhacke
+item.TungstenCarbideMultispade.name=Wolframcarbid-Multi-Schaufel
+item.TantalumCarbideMultipick.name=Tantalcarbid-Multi-Spitzhacke
+item.TantalumCarbideMultispade.name=Tantalcarbid-Multi-Schaufel
+
+item.mobessence.name=Mobessenz-Zell
+item.itemPlateClay.name=Lehm-Platte
+item.itemPlateDoubleClay.name=Doppelte Lehm-Platte
+item.itemSmallGearWroughtIron.name=Kleines Schmiedeisen-Zahnrad
+item.itemPlateLithium.name=Lithium-Platte
+item.itemPlateDoubleEuropium.name=Doppelte Europium-Platte
+item.itemBoilerChassis_0.name=Fortgeschrittenes Boiler-Chassis [Stufe 1]
+item.itemDehydratorCoilWire_0.name=Spulendraht [EV]
+item.itemDehydratorCoil_0.name=Dehydratorspule [EV]
+item.itemAirFilter_0.name=Luftfilter [Stufe 1]
+item.itemLavaFilter.name=Lavafilter
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=Drachenfangbehälter
+item.CoalGas.name=Kohlegas-Zelle
+item.Ethylbenzene.name=Ethylbenzin-Zelle
+item.Anthracene.name=Anthracen-Zelle
+item.Toluene.name=Toluol-Zelle
+item.CoalTar.name=Kohl-Teer-Zelle
+item.CoalTarOil.name=Kohl-Teeröl-Zelle
+item.SulfuricCoalTarOil.name=Schweflige Kohl-Teeröl-Zelle
+item.Naphthalene.name=Naphthalin-Zelle
+item.itemDustPhthalicAnhydride.name=Phthalsäureanhydrid-Staub
+item.itemDustSmallPhthalicAnhydride.name=Kleines Häufchen Phthalsäureanhydrid-Staub
+item.itemDustTinyPhthalicAnhydride.name=Winziges Häufchen Phthalsäureanhydrid-Staub
+item.2Ethylanthraquinone.name=2-Ethylanthrachinon-Zelle
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrachinon-Zelle
+item.HydrogenPeroxide.name=Wasserstoffperoxid-Zelle
+item.itemDustLithiumHydroperoxide.name=Lithium-Wasserstoffperoxid-Staub
+item.itemDustSmallLithiumHydroperoxide.name=Kleines Häufchen Lithium-Wasserstoffperoxid-Staub
+item.itemDustTinyLithiumHydroperoxide.name=Winziges Häufchen Lithium-Wasserstoffperoxid-Staub
+item.LithiumPeroxide.name=Lithium-Peroxid-Zelle
+item.itemPotionChilly.name=Frostiger Trank
+item.itemKeyBig4000DC's.name=4000DC's großer Schlüssel
+item.itemGemDull.name=Stumpfer Edelstein
+item.itemMushroomForest.name=Waldpilz
+item.itemPlateVanadium.name=Vanadium-Platte
+item.thekeytothecity.name=Der Schlüssel zur Stadt
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium-Staub
+item.itemDustSmallSoularium.name=Kleines Häufchen Soularium-Staub
+item.itemDustTinySoularium.name=Winziges Häufchen Soularium-Staub
+item.itemDustRedstoneAlloy.name=Redstone-Legierung-Staub
+item.itemDustSmallRedstoneAlloy.name=Kleines Häufchen Redstone-Legierung-Staub
+item.itemDustTinyRedstoneAlloy.name=Winziges Häufchen Redstone-Legierung-Staub
+item.itemDustElectricalSteel.name=Elektrisches-Stahl-Staub
+item.itemDustSmallElectricalSteel.name=Kleines Häufchen Elektrisches-Stahl-Staub
+item.itemDustTinyElectricalSteel.name=Winziges Häufchen Elektrisches-Stahl-Staub
+item.itemDustPulsatingIron.name=Pulsierendes-Eisen-Staub
+item.itemDustSmallPulsatingIron.name=Kleines Häufchen Pulsierendes-Eisen-Staub
+item.itemDustTinyPulsatingIron.name=Winziges Häufchen Pulsierendes-Eisen-Staub
+item.itemDustEnergeticAlloy.name=Energetische-Legierung-Staub
+item.itemDustSmallEnergeticAlloy.name=Kleines Häufchen Energetische-Legierung-Staub
+item.itemDustTinyEnergeticAlloy.name=Winziges Häufchen Energetische-Legierung-Staub
+item.itemDustVibrantAlloy.name=Dynamische-Legierung-Staub
+item.itemDustSmallVibrantAlloy.name=Kleines Häufchen Dynamische-Legierung-Staub
+item.itemDustTinyVibrantAlloy.name=Winziges Häufchen Dynamische-Legierung-Staub
+item.itemDustConductiveIron.name=Leitendes-Iron-Staub
+item.itemDustSmallConductiveIron.name=Kleines Häufchen Leitendes-Iron-Staub
+item.itemDustTinyConductiveIron.name=Winziges Häufchen Leitendes-Iron-Staub
+item.itemPlateSoularium.name=Soularium-Plate
+item.itemPlateRedstoneAlloy.name=Redstone-Legierung-Platte
+item.itemPlateElectricalSteel.name=Elektrisches-Stahl-Platte
+item.itemPlatePhasedIron.name=Pulsierende-Eisen-Platte
+item.itemPlateEnergeticAlloy.name=Energetische-Legierung-Platte
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium-Platte
+item.itemPlateCyanite.name=Cyanit-Platte
+item.itemPlateLudicrite.name=Ludikrit-Platte
+item.itemPlateVoid.name="Nichts"-Platte
+item.itemPlateDimensionShard.name=Dimensionsscherben-Platte
+item.rfEUBattery.name=Universelle Ladbare Batterie
+item.personalCloakingDevice.name=§9Persönliches Drapiergerät§7
+item.personalHealingDevice.name=§9Persönliche Helungsnanobooster§r
+item.SlowBuildingRing.name=§eLangsamer Bau-Ring§7
+item.itemStaballoyPickaxe.name=Tunnelgräber
+item.itemStaballoyAxe.name=Baumfäller
+item.itemSandstoneHammer.name=Bruchsteinbrecher
+item.itemBufferCore.name=Pufferkern [ULV].
+item.itemBufferCore.name=Pufferkern [LV].
+item.itemBufferCore.name=Pufferkern [MV].
+item.itemBufferCore.name=Pufferkern [HV].
+item.itemBufferCore.name=Pufferkern [EV].
+item.itemBufferCore.name=Pufferkern [IV].
+item.itemBufferCore.name=Pufferkern [LuV].
+item.itemBufferCore.name=Pufferkern [ZPM].
+item.itemBufferCore.name=Pufferkern [UV].
+item.itemBufferCore.name=Pufferkern [MAX].
+item.itemPLACEHOLDER_Circuit.name=Quarks Manipulator (UV)
+item.itembookgt.name=§oThermal-Boiler-Anleitung
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Schallplatte [§cAktiviert§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Regenwaldeiche
+tile.blockRainforestOakLeaves.name=Eichenblatt
+tile.blockRainforestOakSapling.name=Regenwaldeichensetzling
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Kaputt
+tile.blockFastArcaneAlembic.1.name=Kaputt
+
+//Frame Boxes
+tile.Block of Selenium.name=Block aus Selen
+tile.Selenium Frame Box.name=Selen-Rahmen-Box
+tile.Block of Bromine.name=Block aus Bromine
+tile.Block of Strontium.name=Block aus Strontium
+tile.Strontium Frame Box.name=Strontium-Rahmen-Box
+tile.Block of Zirconium.name=Block aus Zirconium
+tile.Zirconium Frame Box.name=Zirkonium-Rahmen-Box
+tile.Block of Ruthenium.name=Block aus Ruthenium
+tile.Ruthenium Frame Box.name=Ruthenium-Rahmen-Box
+tile.Block of Iodine.name=Block aus Iod
+tile.Iodine Frame Box.name=Iod-Rahmen-Box
+tile.Block of Hafnium.name=Block aus Hafnium
+tile.Hafnium Frame Box.name=Hafnium-Rahmen-Box
+tile.Block of Dysprosium.name=Block aus Dysprosium
+tile.Dysprosium Frame Box.name=Dysprosium-Rahmen-Box
+tile.Block of Tellurium.name=Block aus Tellur
+tile.Tellurium Frame Box.name=Tellur-Rahmen-Box
+tile.Block of Rhodium.name=Block aus Rhodium
+tile.Rhodium Frame Box.name=Rhodium-Rahmen-Box
+tile.Block of Rhenium.name=Block aus Rhenium
+tile.Rhenium Frame Box.name=Rhenium-Rahmen-Box
+tile.Block of Thallium.name=Block aus Thallium
+tile.Thallium Frame Box.name=Thallium-Rahmen-Box
+tile.Block of Technetium.name=Block aus Technetium
+tile.Block of Polonium.name=Block aus Polonium
+tile.Block of Astatine.name=Block aus Astata
+tile.Block of Francium.name=Block aus Francium
+tile.Block of Radium.name=Block aus Radium
+tile.Block of Actinium.name=Block aus Actinium
+tile.Block of Protactinium.name=Block aus Protactinium
+tile.Block of Neptunium.name=Block aus Neptunium
+tile.Block of Curium.name=Block aus Curium
+tile.Block of Berkelium.name=Block aus Berkelium
+tile.Block of Californium.name=Block aus Californium
+tile.Block of Einsteinium.name=Block aus Einsteinium
+tile.Block of Fermium.name=Block aus Fermium
+tile.Block of Thorium 232.name=Block aus Thorium-232
+tile.Block of Uranium 232.name=Block aus Uran-232
+tile.Block of Uranium 233.name=Block aus Uran-233
+tile.Block of Plutonium-238.name=Block aus Plutonium-238
+tile.Block of Strontium-90.name=Block aus Strontium-90
+tile.Block of Polonium-210.name=Block aus Polonium-210
+tile.Block of Americium-241.name=Block aus Americium-241
+tile.Block of Silicon Carbide.name=Block aus Siliconcarbid
+tile.Silicon Carbide Frame Box.name=Siliconcarbid-Rahmen-Box
+tile.Block of Zirconium Carbide.name=Block aus Zirkoniumcarbid
+tile.Zirconium Carbide Frame Box.name=Zirkoniumcarbide-Rahmen-Box
+tile.Block of Tantalum Carbide.name=Block aus Tantalcarbid
+tile.Tantalum Carbide Frame Box.name=Tantalcarbide-Rahmen-Box
+tile.Block of Niobium Carbide.name=Block aus Niobcarbid
+tile.Niobium Carbide Frame Box.name=Niobium Carbide-Rahmen-Box
+tile.Block of Beryllium Fluoride.name=Block aus Beryllium-Fluorid
+tile.Block of Lithium Fluoride.name=Block aus Lithium-Fluorid
+tile.Block of Thorium Tetrafluoride.name=Block aus Thorium-Tetrafluorid
+tile.Block of Thorium Hexafluoride.name=Block aus Thorium-Hexafluorid
+tile.Block of Uranium Tetrafluoride.name=Block aus Uran-Tetrafluorid
+tile.Block of Uranium Hexafluoride.name=Block aus Uran-Hexafluorid
+tile.Block of Zirconium Tetrafluoride.name=Block aus Zirkonium-Tetrafluorid
+tile.Block of Neptunium Hexafluoride.name=Block aus Neptunium-Hexafluorid
+tile.Block of Technetium Hexafluoride.name=Block aus Technetium-Hexafluorid
+tile.Block of Selenium Hexafluoride.name=Block aus Selen-Hexafluorid
+tile.Block of LiFBeF2ZrF4U235.name=Block aus LiFBeF2ZrF4U235
+tile.Block of LiFBeF2ZrF4UF4.name=Block aus LiFBeF2ZrF4UF4
+tile.Block of LiFBeF2ThF4UF4.name=Block aus LiFBeF2ThF4UF4
+tile.Block of Energy Crystal.name=Block aus Energiekristall
+tile.Energy Crystal Frame Box.name=Energiekristall-Rahmen-Box
+tile.Block of Blood Steel.name=Block aus Blutstahl
+tile.Blutstahl Frame Box.name=Blutstahl-Rahmen-Box
+tile.Block of Zeron-100.name=Block aus Zeron-100
+tile.Zeron-100 Frame Box.name=Zeron-100-Rahmen-Box
+tile.Block of Tumbaga.name=Block aus Tumbaga
+tile.Tumbaga Frame Box.name=Tumbaga-Rahmen-Box
+tile.Block of Potin.name=Block aus Potin
+tile.Potin Frame Box.name=Potin-Rahmen-Box
+tile.Block of Staballoy.name=Block aus Staballoy
+tile.Staballoy Frame Box.name=Staballoy-Rahmen-Box
+tile.Block of Tantalloy-60.name=Block aus Tantalloy-60
+tile.Tantalloy-60 Frame Box.name=Tantalloy-60-Rahmen-Box
+tile.Block of Tantalloy-61.name=Block aus Tantalloy-61
+tile.Tantalloy-61 Frame Box.name=Tantalloy-61-Rahmen-Box
+tile.Block of Inconel-625.name=Block aus Inconel-625
+tile.Inconel-625 Frame Box.name=Inconel-625-Rahmen-Box
+tile.Block of Inconel-690.name=Block aus Inconel-690
+tile.Inconel-690 Frame Box.name=Inconel-690-Rahmen-Box
+tile.Block of Inconel-792.name=Block aus Inconel-792
+tile.Inconel-792 Frame Box.name=Inconel-792-Rahmen-Box
+tile.Block of Eglin Steel.name=Block aus Eglin Steel
+tile.Eglin Steel Frame Box.name=Eglin Steel-Rahmen-Box
+tile.Block of Maraging Steel 250.name=Block aus Maraging-Stahl 250
+tile.Maraging Steel 250 Frame Box.name=Maraging-Stahl 250-Rahmen-Box
+tile.Block of Maraging Steel 300.name=Block aus Maraging-Stahl 300
+tile.Maraging Steel 300 Frame Box.name=Maraging-Stahl 300-Rahmen-Box
+tile.Block of Maraging Steel 350.name=Block aus Maraging-Stahl 350
+tile.Maraging Steel 350 Frame Box.name=Maraging-Stahl 350-Rahmen-Box
+tile.Block of Stellite.name=Block aus Stellite
+tile.Stellite Frame Box.name=Stellite-Rahmen-Box
+tile.Block of Talonite.name=Block aus Talonite
+tile.Talonite Frame Box.name=Talonite-Rahmen-Box
+tile.Block of Hastelloy-W.name=Block aus Hastelloy-W
+tile.Hastelloy-W Frame Box.name=Hastelloy-W-Rahmen-Box
+tile.Block of Hastelloy-X.name=Block aus Hastelloy-X
+tile.Hastelloy-X Frame Box.name=Hastelloy-X-Rahmen-Box
+tile.Block of Hastelloy-C276.name=Block aus Hastelloy-C276
+tile.Hastelloy-C276 Frame Box.name=Hastelloy-C276-Rahmen-Box
+tile.Block of Hastelloy-N.name=Block aus Hastelloy-N
+tile.Hastelloy-N Frame Box.name=Hastelloy-N-Rahmen-Box
+tile.Block of Incoloy-020.name=Block aus Incoloy-020
+tile.Incoloy-020 Frame Box.name=Incoloy-020-Rahmen-Box
+tile.Block of Incoloy-DS.name=Block aus Incoloy-DS
+tile.Incoloy-DS Frame Box.name=Incoloy-DS-Rahmen-Box
+tile.Block of Incoloy-MA956.name=Block aus Incoloy-MA956
+tile.Incoloy-MA956 Frame Box.name=Incoloy-MA956-Rahmen-Box
+tile.Block of Grisium.name=Block aus Grisium
+tile.Grisium Frame Box.name=Grisium-Rahmen-Box
+tile.Block of Trinium.name=Block aus Trinium
+tile.Block of Refined Trinium.name=Block aus raffiniertem Trinium
+tile.Block of Trinium Titanium Alloy.name=Block aus Trinium-Titanium-Legierung
+tile.Trinium Titanium Alloy Frame Box.name=Trinium-Titanium-Legierung-Rahmen-Box
+tile.Block of Trinium Naquadah Alloy.name=Block aus Trinium-Naquadah-Legierung
+tile.Block of Trinium Naquadah Carbonite.name=Block aus Trinium-Naquadah-Carbonit
+tile.Trinium Naquadah Carbonite Frame Box.name=Trinium-Naquadah-Carbonit-Rahmen-Box
+tile.Block of Quantum.name=Block aus Quanten
+tile.Quantum Frame Box.name=Quanten-Rahmenbox
+
+//Ores
+tile.OreFluorite.name=Fluoriterz
+tile.OreCrocoite.name=Crocoiterz
+tile.OreGeikielite.name=Geikielieerz
+tile.OreNichromite.name=Nichromiterz
+tile.OreTitanite.name=Titaniterz
+tile.OreZimbabweite.name=Zimbabweiterz
+tile.OreZirconolite.name=Zirconoliterz
+tile.OreGadoliniteCe.name=Gadoliniterz(Ce)
+tile.OreGadoliniteY.name=Gadoliniterz(Y)
+tile.OreLepersonnite.name=Lepersonniterz
+tile.OreSamarskiteY.name=Samarskiterz(Y)
+tile.OreSamarskiteYb.name=Samarskiterz(Yb)
+tile.OreXenotime.name=Xenotimerz
+tile.OreYttriaite.name=Yttriaiterz
+tile.OreYttrialite.name=Yttrialiterz
+tile.OreYttrocerite.name=Yttroceriterz
+tile.OreZircon.name=Zirconerz
+tile.OrePolycrase.name=Polycraserz
+tile.OreZircophyllite.name=Zircophylliterz
+tile.OreZirkelite.name=Zirkeliterz
+tile.OreLanthaniteLa.name=Lanthaniterz(La)
+tile.OreLanthaniteCe.name=Lanthaniterz(Ce)
+tile.OreLanthaniteNd.name=Lanthaniterz(Nd)
+tile.OreAgarditeY.name=Agarditerz(Y)
+tile.OreAgarditeCd.name=Agarditerz(Cd)
+tile.OreAgarditeLa.name=Agarditerz(La)
+tile.OreAgarditeNd.name=Agarditerz(Nd)
+tile.OreHibonite.name=Hiboniterz
+tile.OreCerite.name=Ceriterz
+tile.OreFluorcaphite.name=Fluorcaphiterz
+tile.OreFlerzncite.name=Flerznciterz
+tile.OreCryolite.name=Cryoliterz
+
+//Misc
+tile.blockMFEffect.name=Spezial
+tile.fluidBlockSludge.name=Brühe
+tile.blockWorkbenchGT.name=Werkbank
+tile.blockWorkbenchGTAdvanced.name=Fortgeschrittene Werkbank
+tile.blockHeliumGenerator.name=Helium Generator
+tile.blockFirePit.name=Feuerstelle
+tile.blockFishTrap.name=Fischfalle
+tile.blockInfiniteFluidTank.name=Unendlicher Tank
+tile.blockMiningExplosives.name=Minensprengstoff
+tile.blockHellFire.name=Höllenfeuer
+tile.blockProjectBench.name=Projektplanungstisch
+tile.blockTradeBench.name=Handelstisch
+tile.blockModularity.name=Modulare Werkbank
+tile.blockBlackGate.name=Witherkäfig
+tile.blockTankXpConverter.name=Erfahrungswandler(XP)
+
+//Everglades Blocks
+tile.fluidSludge.0.name=Stehendes Abwasser
+tile.blockDarkWorldPortal.name=Portalstein für die Dunkle Welt
+tile.blockDarkWorldGround.name=Grundstein der Dunklen Welt
+tile.blockDarkWorldGround2.name=Grundstein der Dunklen Welt
+tile.blockDarkWorldPortalFrame.name=Portalrahmen für die Dunkle Welt
diff --git a/src/main/resources/assets/miscutils/lang/en_US.lang b/src/main/resources/assets/miscutils/lang/en_US.lang
new file mode 100644
index 0000000000..6fe80a2360
--- /dev/null
+++ b/src/main/resources/assets/miscutils/lang/en_US.lang
@@ -0,0 +1,3572 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Blocks
+itemGroup.MiscUtilMiscTab=[GT++] Items
+itemGroup.MiscUtilCombatTab=[GT++] Combat
+itemGroup.MiscUtilToolsTab=[GT++] Tools
+itemGroup.MiscUtilMachineTab=[GT++] Machines
+itemGroup.MiscUtilOtherTab=[GT++] Items II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Additions
+
+//Debug
+item.AAA_Broken.name=[Non-existent Item] Report This Recipe On Github, Please.
+item.itemBedLocator_Base.name=Bed Locator [NBT Test]
+item.itemBaseItemWithCharge.name=Base Chargeable Item
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Shapes
+
+//Fluids
+tile.fluidSludge.name=Stagnant Waste Water
+tile.fluidSludge.0.name=Stagnant Waste Water
+
+//Death Messages
+death.attack.plasmabolt=%s died by burning hot plasma.
+death.attack.plasmabolt.player=%1$s was killed by %2$s using plasma.
+death.attack.gtpp.grinder=%s was ground into nothingness by an IsaMill.
+
+//Batch mode chat message
+misc.BatchModeTextOn=Batch recipes (ME output bus recommended, will void excess outputs!)
+misc.BatchModeTextOff=Don't batch recipes
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Plate of Battery Alloy
+item.itemIngotBatteryAlloy.name=Ingot of Battery Alloy
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Empty Fuel Rod
+item.itemFuelRod_Thorium.name=Thorium Fuel Rod
+item.itemFuelRod_Uranium.name=Uranium Fuel Rod
+item.itemFuelRod_Plutonium.name=Plutonium Fuel Rod
+
+//Entities
+entity.constructStaballoy.name=Staballoy Construct
+entity.sickBlaze.name=Infected Zealot
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Tool Constructor
+tile.blockEggBox.name=Egg Box
+tile.blockCircuitProgrammer.name=Circuit Programmer
+tile.blockDecayablesChest.name=Lead Lined Box
+tile.blockVolumetricFlaskSetter.name=Volumetric Flask Configurator
+tile.blockSuperLight.name=Shining Star
+tile.blockPestKiller.name=Pest Killer
+tile.blockSuperJukebox.name=Sir Mixalot [Jukebox]
+
+//Tools
+item.itemBufferCore.name=Energy Core
+item.itemStaballoyPickaxe.name=Tunnel Digger
+item.itemStaballoyAxe.name=Tree Feller
+item.itemSandstoneHammer.name=Cobblestone Breaker
+
+# Tooltips
+GTPP.machines.chisel_slot.tooltip=Target Slot
+GTPP.machines.chisel_slot.tooltip.1=§7Put chiseled item to specify output
+GTPP.core.GT_Tooltip=Added by: §2Alkalus §7- §c[GT++]
+GTPP.core.GT_Tooltip_Builder=§2Alkalus §7- §c[GT++]
+GTPP.core.GT_Tooltip_Radioactive=§7Warning: §aRadioactive! §6 Avoid direct handling without hazmat protection.
+
+# RecipeMaps
+gtpp.recipe.cokeoven=Coke Oven
+gtpp.recipe.matterfab2=Matter Fabricator
+gtpp.recipe.rocketenginefuel=Rocket Engine Fuel
+gtpp.recipe.quantumforcesmelter=Quantum Force Transformer
+gtpp.recipe.chemicaldehydrator=Dehydrator
+gtpp.recipe.vacfurnace=Vacuum Furnace
+gtpp.recipe.alloyblastsmelter=Alloy Blast Smelter
+gtpp.recipe.lftr=Liquid Fluoride Thorium Reactor
+gtpp.recipe.nuclearsaltprocessingplant=Nuclear Salt Processing Plant
+gtpp.recipe.oremill=Milling
+gtpp.recipe.fissionfuel=Nuclear Fuel Processing
+gtpp.recipe.coldtrap=Cold Trap
+gtpp.recipe.reactorprocessingunit=Reactor Processing Unit
+gtpp.recipe.simplewasher=Simple Dust Washer
+gtpp.recipe.moleculartransformer=Molecular Transformer
+gtpp.recipe.fluidchemicaleactor=Chemical Plant
+gtpp.recipe.RTGgenerators=RTG
+gtpp.recipe.thermalgeneratorfuel=Thermal Boiler
+gtpp.recipe.solartower=Solar Tower
+gtpp.recipe.cyclotron=COMET - Compact Cyclotron
+gtpp.recipe.fishpond=Zhuhai - Fishing Port
+gtpp.recipe.cryogenicfreezer=Cryogenic Freezer
+gtpp.recipe.multicentrifuge=Multiblock Centrifuge
+gtpp.recipe.multielectro=Multiblock Electrolyzer
+gtpp.recipe.multimixer=Multiblock Mixer
+gtpp.recipe.multidehydrator=Multiblock Dehydrator
+gtpp.recipe.semifluidgeneratorfuels=Semifluid Generator Fuels
+gtpp.recipe.flotationcell=Flotation Cell
+gtpp.recipe.treefarm=Tree Growth Simulator
+
+# Recipe categories
+gtpp.recipe.category.abs_non_alloy_recipes=ABS Non-Alloy Recipes
+
+# NEI
+gtpp.nei.lftr.power=Power: %s EU/t per Dynamo
+gtpp.nei.lftr.dynamo=Dynamo: %s EU
+gtpp.nei.lftr.total=Total: %s EU
+gtpp.nei.milling.not_consumed=Does not always get consumed in the process
+gtpp.nei.chemplant.tier.1=Bronze
+gtpp.nei.chemplant.tier.2=Steel
+gtpp.nei.chemplant.tier.3=Aluminium
+gtpp.nei.chemplant.tier.4=Stainless Steel
+gtpp.nei.chemplant.tier.5=Titanium
+gtpp.nei.chemplant.tier.6=Tungsten Steel
+gtpp.nei.chemplant.tier.7=Laurenium
+gtpp.nei.chemplant.tier.8=Botmium
+gtpp.nei.rtg.days=Fuel Value: %s Minecraft Days
+gtpp.nei.solar_tower.1=Solar Heater rings boost tier
+gtpp.nei.solar_tower.2=R1:T1, R2:T2, R3:T4, R4:T8, R5:T16
+gtpp.nei.solar_tower.3=Input Amount = 1000 x T
+gtpp.nei.tgs.1=The sapling is not consumed.
+gtpp.nei.tgs.2=If %s is provided,
+gtpp.nei.tgs.3=Saplings are made instead.
+gtpp.nei.tgs.sapling=Outputted if %s is provided
+
+gtpp.nei.tgs.tooltip.sapling=Place in machine controller slot
+gtpp.nei.tgs.tooltip.saw=Place in an input bus to harvest logs
+gtpp.nei.tgs.tooltip.needsSaw=Requires a Saw to harvest
+gtpp.nei.tgs.tooltip.cutter=Place in an input bus to harvest saplings
+gtpp.nei.tgs.tooltip.needsCutter=Requires a Branch Cutter to harvest
+gtpp.nei.tgs.tooltip.shears=Place in an input bus to harvest leaves
+gtpp.nei.tgs.tooltip.needsShears=Requires Shears to harvest
+gtpp.nei.tgs.tooltip.knife=Place in an input bus to harvest fruit
+gtpp.nei.tgs.tooltip.needsKnife=Requires a Knife to harvest
+gtpp.nei.tgs.tooltip.multiplier=Output multiplier:
+gtpp.nei.tgs.info-1=Output is further boosted
+gtpp.nei.tgs.info-2=by machine energy tier
+gtpp.nei.tgs.info-3=and tool type
+
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Blazing Pyrotheum Bucket
+item.MiscUtils.bucket.bucketCryotheum.name=Gelid Cryotheum Bucket
+item.MiscUtils.bucket.bucketEnder.name=Resonant Ender Bucket
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheum Dust
+item.MiscUtils.material.dustCryotheum.name=Cryotheum Dust
+item.MiscUtils.material.rodBlizz.name=Blizz Rod
+item.MiscUtils.material.dustBlizz.name=Blizz Powder
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=Blazing Pyrotheum
+tile.miscutils.fluid.cryotheum.name=Gelid Cryotheum
+tile.miscutils.fluid.ender.name=Resonant Ender
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=Accelerated Frame
+item.frameVoid.name=Void Frame
+item.frameMutagenic.name=Mutagenic Frame
+item.frameBusy.name=Working Frame
+item.frameChocolate.name=Chocolate Frame
+item.frameRestraint.name=Restraining Frame
+item.frameSoul.name=Soul Frame
+item.frameHealing.name=Healing Frame
+item.frameNova.name=Nova Frame
+item.frameArborists.name=Arborist Frame
+item.frameDecaying.name=Decaying Frame
+item.frameSlowing.name=Slowing Frame
+item.frameStabilizing.name=Stabilizing Frame
+item.frameUseless.name=Useless Frame
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Energetic Alloy Rotor Blade
+item.itemTungstenSteelRotorBlade.name=TungstenSteel Rotor Blade
+item.itemVibrantRotorBlade.name=Vibrant Alloy Rotor Blade
+item.itemIridiumRotorBlade.name=Iridium Rotor Blade
+item.itemEnergeticShaft.name=Energetic Alloy Shaft
+item.itemTungstenSteelShaft.name=TungstenSteel Shaft
+item.itemVibrantShaft.name=Vibrant Alloy Shaft
+item.itemIridiumShaft.name=Iridium Shaft
+item.itemMagnaliumRotorBlade.name=Magnalium Rotor Blade
+item.itemUltimetRotorBlade.name=Ultimet Blade
+item.itemMagnaliumShaft.name=Magnalium Shaft
+item.itemUltimetShaft.name=Ultimet Shaft
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Enriched Soularium Plate
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+item.itemAlkalusDisk.name=Alkalus Disk
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Compressed Obsidian (9)
+tile.blockCompressedObsidian.1.name=Double Compressed Obsidian (81)
+tile.blockCompressedObsidian.2.name=Triple Compressed Obsidian (729)
+tile.blockCompressedObsidian.3.name=Quadruple Compressed Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Quintuple Compressed Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Inverted Obsidian
+tile.blockCompressedObsidian.6.name=Compressed Glowstone (9)
+tile.blockCompressedObsidian.7.name=Double Compressed Glowstone (81)
+tile.blockCompressedObsidian.8.name=Triple Compressed Glowstone (729)
+tile.blockCompressedObsidian.9.name=Quadruple Compressed Glowstone (6561)
+tile.blockCompressedObsidian.10.name=Quintuple Compressed Glowstone (59049)
+tile.blockNet.name=Net
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=High Quality Sulfur Dioxide Cell
+item.mobessence.name=Mob Essence Cell
+item.Fertiliser.name=Fertiliser Cell
+item.UN32Fertiliser.name=UN-32 Fertiliser Cell
+item.UN18Fertiliser.name=UN-18 Fertiliser Cell
+item.RaisinJuice.name=Raisin Juice Cell
+item.BerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.AmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.Hydroxide.name=Hydroxide Cell
+item.Ammonium.name=Ammonium Cell
+item.AmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+
+//Resources
+item.itemCoalCoke.name=Coking Coal
+item.itemHydrogenBlob.name=Mysterious Hydrogen Blob
+
+//Normal Items
+item.itemSimpleFiremaker.name=Basic Firemaker
+item.itemFiber.name=Plant Fiber
+item.itemRope.name=Rope
+item.backpackRed.name=Red Backpack
+item.backpackGreen.name=Green Backpack
+item.backpackBlue.name=Blue Backpack
+item.backpackYellow.name=Yellow Backpack
+item.backpackPurple.name=Purple Backpack
+item.backpackCyan.name=Cyan Backpack
+item.backpackMaroon.name=Maroon Backpack
+item.backpackOlive.name=Olive Backpack
+item.backpackDarkGreen.name=Dark Green Backpack
+item.backpackDarkPurple.name=Dark Purple Backpack
+item.backpackTeal.name=Teal Backpack
+item.backpackNavy.name=Navy Backpack
+item.backpackSilver.name=Silver Backpack
+item.backpackGray.name=Gray Backpack
+item.backpackBlack.name=Black Backpack
+item.backpackWhite.name=White Backpack
+item.itemBlueprint.name=Blueprint [I am useless]
+item.itemBlueprint.tooltip.0=Technical Document No. %d
+item.itemBlueprint.tooltip.1=Currently holding a blueprint for %s
+item.itemBlueprint.tooltip.2=Currently not holding a blueprint for anything.
+item.itemGemShards.0.name=Diamond Shards
+item.itemGemShards.1.name=Emerald Shards
+item.itemGemShards.2.name=Ruby Shards
+item.itemGemShards.3.name=Sapphire Shards
+item.itemGemShards.tooltip=Diamond Shards
+item.itemHalfCompleteCasings.name=Half Complete Casing
+item.itemSulfuricPotion.name=Throwable Vial of Sulfuric Acid
+item.itemHydrofluoricPotion.name=Throwable Vial of Hydrofluoric Acid
+item.itemBaseItemHotFood.tooltip.0=§7Warning: §cVery hot!§7 Avoid direct handling..
+item.itemBaseItemHotFood.tooltip.1=This food has %d seconds left, until it is cool.
+item.itemBoilerChassis.name=Advanced Boiler Chassis [Tier %d]
+item.itemDehydratorCoilWire.name=Coil Wire [%s]
+item.itemDehydratorCoil.name=Dehydrator Coil [%s]
+item.itemLavaFilter.name=Lava Filter
+item.itemLavaFilter.tooltip=Filters Lava within a Thermal Boiler.
+item.itemGrindleTablet.name=Grindle
+item.itemGrindleTablet.tooltip=Used to read data from DataSticks & DataOrbs.
+item.itemDragonJar.0.name=Dragon Capture Jar
+item.itemDragonJar.0.tooltip=Does not contain anything.
+item.itemDragonJar.1.name=Captured Dragon Jar
+item.itemDragonJar.1.tooltip=Contains a %s.
+item.itemControlCore.name=Control Core [%s]
+item.itemControlCore.tooltip.0=Allows a Multiblock to function upto %s
+item.itemControlCore.tooltip.1=Required Tier is determined by the sum of the eu/t of all Energy Inputs
+item.itemControlCore.tooltip.2=Lower tiers may be used to underclock, which is useful in some situations
+item.thekeytothecity.tooltip.0=You feel like you're on top of the world.
+item.thekeytothecity.tooltip.1=Wear it around your neck like an amulet.
+
+//Conversion Dusts
+item.dustNeptunium238.name=Neptunium 238 Dust
+item.dustRadium226.name=Radium 226 Dust
+item.itemDustDecayedRadium226.name=Decayed Radium 226 Dust
+item.itemDustSmallDecayedRadium226.name=Small Decayed Radium 226 Dust
+item.itemDustTinyDecayedRadium226.name=Tiny Decayed Radium 226 Dust
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium Dust
+item.itemDustSmallGadolinium.name=Small Pile of Gadolinium Dust
+item.itemDustTinyGadolinium.name=Tiny Pile of Gadolinium Dust
+item.itemDustYtterbium.name=Ytterbium Dust
+item.itemDustSmallYtterbium.name=Small Pile of Ytterbium Dust
+item.itemDustTinyYtterbium.name=Tiny Pile of Ytterbium Dust
+item.itemDustSamarium.name=Samarium Dust
+item.itemDustSmallSamarium.name=Small Pile of Samarium Dust
+item.itemDustTinySamarium.name=Tiny Pile of Samarium Dust
+item.itemDustLanthanum.name=Lanthanum Dust
+item.itemDustSmallLanthanum.name=Small Pile of Lanthanum Dust
+item.itemDustTinyLanthanum.name=Tiny Pile of Lanthanum Dust
+item.itemCellNeon.name=Neon Cell
+item.itemCellGermanium.name=Germanium Cell
+item.itemCellSelenium.name=Selenium Cell
+item.itemCellBromine.name=Bromine Cell
+item.itemCellKrypton.name=Krypton Cell
+item.itemCellZirconium.name=Zirconium Cell
+item.itemCellTechnetium.name=Technetium Cell
+item.itemCellRuthenium.name=Ruthenium Cell
+item.itemCellRhodium.name=Rhodium Cell
+item.itemCellIodine.name=Iodine Cell
+item.itemCellXenon.name=Xenon Cell
+item.itemCellHafnium.name=Hafnium Cell
+item.itemCellRhenium.name=Rhenium Cell
+item.itemCellThallium.name=Thallium Cell
+item.itemCellPolonium.name=Polonium Cell
+item.itemCellAstatine.name=Astatine Cell
+item.itemCellFrancium.name=Francium Cell
+item.itemCellRadium.name=Radium Cell
+item.itemCellActinium.name=Actinium Cell
+item.itemCellProtactinium.name=Protactinium Cell
+item.itemCellNeptunium.name=Neptunium Cell
+item.itemCellCurium.name=Curium Cell
+item.itemCellBerkelium.name=Berkelium Cell
+item.itemCellCalifornium.name=Californium Cell
+item.itemCellEinsteinium.name=Einsteinium Cell
+item.itemCellFermium.name=Fermium Cell
+item.itemCellRefinedTrinium.name=Refined Trinium Cell
+item.itemIngotSelenium.name=Selenium Ingot
+item.itemDustSelenium.name=Selenium Dust
+item.itemDustTinySelenium.name=Tiny Pile of Selenium Dust
+item.itemDustSmallSelenium.name=Small Pile of Selenium Dust
+item.itemNuggetSelenium.name=Selenium Nugget
+item.itemPlateSelenium.name=Selenium Plate
+item.itemPlateDoubleSelenium.name=Double Selenium Plate
+item.itemBoltSelenium.name=Selenium Bolt
+item.itemRodSelenium.name=Selenium Rod
+item.itemRodLongSelenium.name=Long Selenium Rod
+item.itemRingSelenium.name=Selenium Ring
+item.itemScrewSelenium.name=Selenium Screw
+item.itemRotorSelenium.name=Selenium Rotor
+item.itemGearSelenium.name=Selenium Gear
+item.itemCellUranium232.name=Uranium 232 Cell
+item.itemCellUranium233.name=Uranium 233 Cell
+item.itemCellThoriumTetrafluoride.name=Thorium Tetrafluoride Cell
+item.itemCellThoriumHexafluoride.name=Thorium Hexafluoride Cell
+item.itemCellUraniumTetrafluoride.name=Uranium Tetrafluoride Cell
+item.itemCellUraniumHexafluoride.name=Uranium Hexafluoride Cell
+item.itemCellZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.itemCellBerylliumFluoride.name=Beryllium Fluoride Cell
+item.itemCellLithiumFluoride.name=Lithium Fluoride Cell
+item.itemCellHydroxide.name=Hydroxide Cell
+item.itemCellAmmonium.name=Ammonium Cell
+item.itemCellAmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.itemCellBerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+item.itemCellNeptuniumHexafluoride.name=Neptunium Hexafluoride Cell
+item.itemCellTechnetiumHexafluoride.name=Technetium Hexafluoride Cell
+item.itemCellSeleniumHexafluoride.name=Selenium Hexafluoride Cell
+item.itemCellEnergyCrystal.name=Energy Crystal Cell
+item.itemCellBloodSteel.name=Blood Steel Cell
+item.itemCellStaballoy.name=Staballoy Cell
+item.itemCellTantalloy60.name=Tantalloy-60 Cell
+item.itemCellTantalloy61.name=Tantalloy-61 Cell
+item.itemCellTumbaga.name=Tumbaga Cell
+item.itemCellPotin.name=Potin Cell
+item.itemCellInconel625.name=Inconel-625 Cell
+item.itemCellInconel690.name=Inconel-690 Cell
+item.itemCellInconel792.name=Inconel-792 Cell
+item.itemCellZeron100.name=Zeron-100 Cell
+item.itemCellMaragingSteel250.name=Maraging Steel 250 Cell
+item.itemCellMaragingSteel300.name=Maraging Steel 300 Cell
+item.itemCellMaragingSteel350.name=Maraging Steel 350 Cell
+item.itemCellStellite.name=Stellite Cell
+item.itemCellTalonite.name=Talonite Cell
+item.itemCellHastelloyW.name=Hastelloy-W Cell
+item.itemCellHastelloyX.name=Hastelloy-X Cell
+item.itemCellHastelloyN.name=Hastelloy-N Cell
+item.itemCellHastelloyC276.name=Hastelloy-C276 Cell
+item.itemCellIncoloy020.name=Incoloy-020 Cell
+item.itemCellIncoloyDS.name=Incoloy-DS Cell
+item.itemCellIncoloyMA956.name=Incoloy-MA956 Cell
+item.itemCellTungstenCarbide.name=Tungsten Carbide Cell
+item.itemCellSiliconCarbide.name=Silicon Carbide Cell
+item.itemCellTantalumCarbide.name=Tantalum Carbide Cell
+item.itemCellZirconiumCarbide.name=Zirconium Carbide Cell
+item.itemCellNiobiumCarbide.name=Niobium Carbide Cell
+item.itemCellGrisium.name=Grisium Cell
+item.itemCellEglinSteelBaseCompound.name=Eglin Steel Base Compound Cell
+item.itemCellEglinSteel.name=Eglin Steel Cell
+item.itemCellHG1223.name=HG-1223 Cell
+item.itemCellTriniumTitaniumAlloy.name=Trinium Titanium Alloy Cell
+item.itemCellTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Cell
+item.itemCellTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Cell
+item.itemCellQuantum.name=Quantum Cell
+item.itemIngotBromine.name=Bromine Ingot
+item.itemDustBromine.name=Bromine Dust
+item.itemDustTinyBromine.name=Tiny Pile of Bromine Dust
+item.itemDustSmallBromine.name=Small Pile of Bromine Dust
+item.itemNuggetBromine.name=Bromine Nugget
+item.itemPlateBromine.name=Bromine Plate
+item.itemPlateDoubleBromine.name=Double Bromine Plate
+item.itemIngotStrontium.name=Strontium Ingot
+item.itemDustStrontium.name=Strontium Dust
+item.itemDustTinyStrontium.name=Tiny Pile of Strontium Dust
+item.itemDustSmallStrontium.name=Small Pile of Strontium Dust
+item.itemNuggetStrontium.name=Strontium Nugget
+item.itemPlateStrontium.name=Strontium Plate
+item.itemPlateDoubleStrontium.name=Double Strontium Plate
+item.itemBoltStrontium.name=Strontium Bolt
+item.itemRodStrontium.name=Strontium Rod
+item.itemRodLongStrontium.name=Long Strontium Rod
+item.itemRingStrontium.name=Strontium Ring
+item.itemScrewStrontium.name=Strontium Screw
+item.itemRotorStrontium.name=Strontium Rotor
+item.itemGearStrontium.name=Strontium Gear
+item.itemIngotZirconium.name=Zirconium Ingot
+item.itemDustZirconium.name=Zirconium Dust
+item.itemDustTinyZirconium.name=Tiny Pile of Zirconium Dust
+item.itemDustSmallZirconium.name=Small Pile of Zirconium Dust
+item.itemNuggetZirconium.name=Zirconium Nugget
+item.itemPlateZirconium.name=Zirconium Plate
+item.itemPlateDoubleZirconium.name=Double Zirconium Plate
+item.itemBoltZirconium.name=Zirconium Bolt
+item.itemRodZirconium.name=Zirconium Rod
+item.itemRodLongZirconium.name=Long Zirconium Rod
+item.itemRingZirconium.name=Zirconium Ring
+item.itemScrewZirconium.name=Zirconium Screw
+item.itemRotorZirconium.name=Zirconium Rotor
+item.itemGearZirconium.name=Zirconium Gear
+item.itemIngotRuthenium.name=Ruthenium Ingot
+item.itemDustRuthenium.name=Ruthenium Dust
+item.itemDustTinyRuthenium.name=Tiny Pile of Ruthenium Dust
+item.itemDustSmallRuthenium.name=Small Pile of Ruthenium Dust
+item.itemNuggetRuthenium.name=Ruthenium Nugget
+item.itemPlateRuthenium.name=Ruthenium Plate
+item.itemPlateDoubleRuthenium.name=Double Ruthenium Plate
+item.itemBoltRuthenium.name=Ruthenium Bolt
+item.itemRodRuthenium.name=Ruthenium Rod
+item.itemRodLongRuthenium.name=Long Ruthenium Rod
+item.itemRingRuthenium.name=Ruthenium Ring
+item.itemScrewRuthenium.name=Ruthenium Screw
+item.itemRotorRuthenium.name=Ruthenium Rotor
+item.itemGearRuthenium.name=Ruthenium Gear
+item.itemIngotIodine.name=Iodine Ingot
+item.itemDustIodine.name=Iodine Dust
+item.itemDustTinyIodine.name=Tiny Pile of Iodine Dust
+item.itemDustSmallIodine.name=Small Pile of Iodine Dust
+item.itemNuggetIodine.name=Iodine Nugget
+item.itemPlateIodine.name=Iodine Plate
+item.itemPlateDoubleIodine.name=Double Iodine Plate
+item.itemBoltIodine.name=Iodine Bolt
+item.itemRodIodine.name=Iodine Rod
+item.itemRodLongIodine.name=Long Iodine Rod
+item.itemRingIodine.name=Iodine Ring
+item.itemScrewIodine.name=Iodine Screw
+item.itemRotorIodine.name=Iodine Rotor
+item.itemGearIodine.name=Iodine Gear
+item.itemIngotHafnium.name=Hafnium Ingot
+item.itemDustHafnium.name=Hafnium Dust
+item.itemDustTinyHafnium.name=Tiny Pile of Hafnium Dust
+item.itemDustSmallHafnium.name=Small Pile of Hafnium Dust
+item.itemNuggetHafnium.name=Hafnium Nugget
+item.itemPlateHafnium.name=Hafnium Plate
+item.itemPlateDoubleHafnium.name=Double Hafnium Plate
+item.itemBoltHafnium.name=Hafnium Bolt
+item.itemRodHafnium.name=Hafnium Rod
+item.itemRodLongHafnium.name=Long Hafnium Rod
+item.itemRingHafnium.name=Hafnium Ring
+item.itemScrewHafnium.name=Hafnium Screw
+item.itemRotorHafnium.name=Hafnium Rotor
+item.itemGearHafnium.name=Hafnium Gear
+item.itemIngotDysprosium.name=Dysprosium Ingot
+item.itemDustDysprosium.name=Dysprosium Dust
+item.itemDustTinyDysprosium.name=Tiny Pile of Dysprosium Dust
+item.itemDustSmallDysprosium.name=Small Pile of Dysprosium Dust
+item.itemNuggetDysprosium.name=Dysprosium Nugget
+item.itemPlateDysprosium.name=Dysprosium Plate
+item.itemPlateDoubleDysprosium.name=Double Dysprosium Plate
+item.itemBoltDysprosium.name=Dysprosium Bolt
+item.itemRodDysprosium.name=Dysprosium Rod
+item.itemRodLongDysprosium.name=Long Dysprosium Rod
+item.itemRingDysprosium.name=Dysprosium Ring
+item.itemScrewDysprosium.name=Dysprosium Screw
+item.itemRotorDysprosium.name=Dysprosium Rotor
+item.itemGearDysprosium.name=Dysprosium Gear
+item.itemIngotTellurium.name=Tellurium Ingot
+item.itemDustTellurium.name=Tellurium Dust
+item.itemDustTinyTellurium.name=Tiny Pile of Tellurium Dust
+item.itemDustSmallTellurium.name=Small Pile of Tellurium Dust
+item.itemNuggetTellurium.name=Tellurium Nugget
+item.itemPlateTellurium.name=Tellurium Plate
+item.itemPlateDoubleTellurium.name=Double Tellurium Plate
+item.itemBoltTellurium.name=Tellurium Bolt
+item.itemRodTellurium.name=Tellurium Rod
+item.itemRodLongTellurium.name=Long Tellurium Rod
+item.itemRingTellurium.name=Tellurium Ring
+item.itemScrewTellurium.name=Tellurium Screw
+item.itemRotorTellurium.name=Tellurium Rotor
+item.itemGearTellurium.name=Tellurium Gear
+item.itemIngotRhodium.name=Rhodium Ingot
+item.itemDustRhodium.name=Rhodium Dust
+item.itemDustTinyRhodium.name=Tiny Pile of Rhodium Dust
+item.itemDustSmallRhodium.name=Small Pile of Rhodium Dust
+item.itemNuggetRhodium.name=Rhodium Nugget
+item.itemPlateRhodium.name=Rhodium Plate
+item.itemPlateDoubleRhodium.name=Double Rhodium Plate
+item.itemBoltRhodium.name=Rhodium Bolt
+item.itemRodRhodium.name=Rhodium Rod
+item.itemRodLongRhodium.name=Long Rhodium Rod
+item.itemRingRhodium.name=Rhodium Ring
+item.itemScrewRhodium.name=Rhodium Screw
+item.itemRotorRhodium.name=Rhodium Rotor
+item.itemGearRhodium.name=Rhodium Gear
+item.itemIngotRhenium.name=Rhenium Ingot
+item.itemDustRhenium.name=Rhenium Dust
+item.itemDustTinyRhenium.name=Tiny Pile of Rhenium Dust
+item.itemDustSmallRhenium.name=Small Pile of Rhenium Dust
+item.itemNuggetRhenium.name=Rhenium Nugget
+item.itemPlateRhenium.name=Rhenium Plate
+item.itemPlateDoubleRhenium.name=Double Rhenium Plate
+item.itemBoltRhenium.name=Rhenium Bolt
+item.itemRodRhenium.name=Rhenium Rod
+item.itemRodLongRhenium.name=Long Rhenium Rod
+item.itemRingRhenium.name=Rhenium Ring
+item.itemScrewRhenium.name=Rhenium Screw
+item.itemRotorRhenium.name=Rhenium Rotor
+item.itemGearRhenium.name=Rhenium Gear
+item.itemIngotThallium.name=Thallium Ingot
+item.itemDustThallium.name=Thallium Dust
+item.itemDustTinyThallium.name=Tiny Pile of Thallium Dust
+item.itemDustSmallThallium.name=Small Pile of Thallium Dust
+item.itemNuggetThallium.name=Thallium Nugget
+item.itemPlateThallium.name=Thallium Plate
+item.itemPlateDoubleThallium.name=Double Thallium Plate
+item.itemBoltThallium.name=Thallium Bolt
+item.itemRodThallium.name=Thallium Rod
+item.itemRodLongThallium.name=Long Thallium Rod
+item.itemRingThallium.name=Thallium Ring
+item.itemScrewThallium.name=Thallium Screw
+item.itemRotorThallium.name=Thallium Rotor
+item.itemGearThallium.name=Thallium Gear
+item.itemIngotTechnetium.name=Technetium Ingot
+item.itemDustTechnetium.name=Technetium Dust
+item.itemDustTinyTechnetium.name=Tiny Pile of Technetium Dust
+item.itemDustSmallTechnetium.name=Small Pile of Technetium Dust
+item.itemNuggetTechnetium.name=Technetium Nugget
+item.itemPlateTechnetium.name=Technetium Plate
+item.itemPlateDoubleTechnetium.name=Double Technetium Plate
+item.itemIngotPolonium.name=Polonium Ingot
+item.itemDustPolonium.name=Polonium Dust
+item.itemDustTinyPolonium.name=Tiny Pile of Polonium Dust
+item.itemDustSmallPolonium.name=Small Pile of Polonium Dust
+item.itemNuggetPolonium.name=Polonium Nugget
+item.itemPlatePolonium.name=Polonium Plate
+item.itemPlateDoublePolonium.name=Double Polonium Plate
+item.itemIngotAstatine.name=Astatine Ingot
+item.itemDustAstatine.name=Astatine Dust
+item.itemDustTinyAstatine.name=Tiny Pile of Astatine Dust
+item.itemDustSmallAstatine.name=Small Pile of Astatine Dust
+item.itemNuggetAstatine.name=Astatine Nugget
+item.itemPlateAstatine.name=Astatine Plate
+item.itemPlateDoubleAstatine.name=Double Astatine Plate
+item.itemIngotFrancium.name=Francium Ingot
+item.itemDustFrancium.name=Francium Dust
+item.itemDustTinyFrancium.name=Tiny Pile of Francium Dust
+item.itemDustSmallFrancium.name=Small Pile of Francium Dust
+item.itemNuggetFrancium.name=Francium Nugget
+item.itemPlateFrancium.name=Francium Plate
+item.itemPlateDoubleFrancium.name=Double Francium Plate
+item.itemIngotRadium.name=Radium Ingot
+item.itemDustRadium.name=Radium Dust
+item.itemDustTinyRadium.name=Tiny Pile of Radium Dust
+item.itemDustSmallRadium.name=Small Pile of Radium Dust
+item.itemNuggetRadium.name=Radium Nugget
+item.itemPlateRadium.name=Radium Plate
+item.itemPlateDoubleRadium.name=Double Radium Plate
+item.itemIngotActinium.name=Actinium Ingot
+item.itemDustActinium.name=Actinium Dust
+item.itemDustTinyActinium.name=Tiny Pile of Actinium Dust
+item.itemDustSmallActinium.name=Small Pile of Actinium Dust
+item.itemNuggetActinium.name=Actinium Nugget
+item.itemPlateActinium.name=Actinium Plate
+item.itemPlateDoubleActinium.name=Double Actinium Plate
+item.itemIngotProtactinium.name=Protactinium Ingot
+item.itemDustProtactinium.name=Protactinium Dust
+item.itemDustTinyProtactinium.name=Tiny Pile of Protactinium Dust
+item.itemDustSmallProtactinium.name=Small Pile of Protactinium Dust
+item.itemNuggetProtactinium.name=Protactinium Nugget
+item.itemPlateProtactinium.name=Protactinium Plate
+item.itemPlateDoubleProtactinium.name=Double Protactinium Plate
+item.itemIngotNeptunium.name=Neptunium Ingot
+item.itemDustNeptunium.name=Neptunium Dust
+item.itemDustTinyNeptunium.name=Tiny Pile of Neptunium Dust
+item.itemDustSmallNeptunium.name=Small Pile of Neptunium Dust
+item.itemNuggetNeptunium.name=Neptunium Nugget
+item.itemPlateNeptunium.name=Neptunium Plate
+item.itemPlateDoubleNeptunium.name=Double Neptunium Plate
+item.itemIngotCurium.name=Curium Ingot
+item.itemDustCurium.name=Curium Dust
+item.itemDustTinyCurium.name=Tiny Pile of Curium Dust
+item.itemDustSmallCurium.name=Small Pile of Curium Dust
+item.itemNuggetCurium.name=Curium Nugget
+item.itemPlateCurium.name=Curium Plate
+item.itemPlateDoubleCurium.name=Double Curium Plate
+item.itemIngotBerkelium.name=Berkelium Ingot
+item.itemDustBerkelium.name=Berkelium Dust
+item.itemDustTinyBerkelium.name=Tiny Pile of Berkelium Dust
+item.itemDustSmallBerkelium.name=Small Pile of Berkelium Dust
+item.itemNuggetBerkelium.name=Berkelium Nugget
+item.itemPlateBerkelium.name=Berkelium Plate
+item.itemPlateDoubleBerkelium.name=Double Berkelium Plate
+item.itemIngotCalifornium.name=Californium Ingot
+item.itemDustCalifornium.name=Californium Dust
+item.itemDustTinyCalifornium.name=Tiny Pile of Californium Dust
+item.itemDustSmallCalifornium.name=Small Pile of Californium Dust
+item.itemNuggetCalifornium.name=Californium Nugget
+item.itemPlateCalifornium.name=Californium Plate
+item.itemPlateDoubleCalifornium.name=Double Californium Plate
+item.itemDustEinsteinium.name=Einsteinium Dust
+item.itemDustTinyEinsteinium.name=Tiny Pile of Einsteinium Dust
+item.itemDustSmallEinsteinium.name=Small Pile of Einsteinium Dust
+item.itemNuggetEinsteinium.name=Einsteinium Nugget
+item.itemPlateEinsteinium.name=Einsteinium Plate
+item.itemPlateDoubleEinsteinium.name=Double Einsteinium Plate
+item.itemIngotFermium.name=Fermium Ingot
+item.itemDustFermium.name=Fermium Dust
+item.itemDustTinyFermium.name=Tiny Pile of Fermium Dust
+item.itemDustSmallFermium.name=Small Pile of Fermium Dust
+item.itemNuggetFermium.name=Fermium Nugget
+item.itemPlateFermium.name=Fermium Plate
+item.itemPlateDoubleFermium.name=Double Fermium Plate
+item.itemIngotLithium7.name=Lithium 7 Ingot
+item.itemDustLithium7.name=Lithium 7 Dust
+item.itemDustTinyLithium7.name=Tiny Pile of Lithium 7 Dust
+item.itemDustSmallLithium7.name=Small Pile of Lithium 7 Dust
+item.itemNuggetLithium7.name=Lithium 7 Nugget
+item.itemPlateLithium7.name=Lithium 7 Plate
+item.itemPlateDoubleLithium7.name=Double Lithium 7 Plate
+item.itemIngotThorium232.name=Thorium 232 Ingot
+item.itemDustThorium232.name=Thorium 232 Dust
+item.itemDustTinyThorium232.name=Tiny Pile of Thorium 232 Dust
+item.itemDustSmallThorium232.name=Small Pile of Thorium 232 Dust
+item.itemNuggetThorium232.name=Thorium 232 Nugget
+item.itemPlateThorium232.name=Thorium 232 Plate
+item.itemPlateDoubleThorium232.name=Double Thorium 232 Plate
+item.itemIngotUranium232.name=Uranium 232 Ingot
+item.itemDustUranium232.name=Uranium 232 Dust
+item.itemDustTinyUranium232.name=Tiny Pile of Uranium 232 Dust
+item.itemDustSmallUranium232.name=Small Pile of Uranium 232 Dust
+item.itemNuggetUranium232.name=Uranium 232 Nugget
+item.itemPlateUranium232.name=Uranium 232 Plate
+item.itemRodUranium232.name=Uranium 232 Rod
+item.itemRodLongUranium232.name=Long Uranium 232 Rod
+item.itemIngotUranium233.name=Uranium 233 Ingot
+item.itemDustUranium233.name=Uranium 233 Dust
+item.itemDustTinyUranium233.name=Tiny Pile of Uranium 233 Dust
+item.itemDustSmallUranium233.name=Small Pile of Uranium 233 Dust
+item.itemNuggetUranium233.name=Uranium 233 Nugget
+item.itemPlateUranium233.name=Uranium 233 Plate
+item.itemRodUranium233.name=Uranium 233 Rod
+item.itemRodLongUranium233.name=Long Uranium 233 Rod
+item.itemIngotPlutonium238.name=Plutonium 238 Ingot
+item.itemDustPlutonium238.name=Plutonium 238 Dust
+item.itemDustTinyPlutonium238.name=Tiny Pile of Plutonium 238 Dust
+item.itemDustSmallPlutonium238.name=Small Pile of Plutonium 238 Dust
+item.itemNuggetPlutonium238.name=Plutonium 238 Nugget
+item.itemPlatePlutonium238.name=Plutonium 238 Plate
+item.itemPlateDoublePlutonium238.name=Double Plutonium 238 Plate
+item.itemIngotStrontium90.name=Strontium 90 Ingot
+item.itemDustStrontium90.name=Strontium 90 Dust
+item.itemDustTinyStrontium90.name=Tiny Pile of Strontium 90 Dust
+item.itemDustSmallStrontium90.name=Small Pile of Strontium 90 Dust
+item.itemNuggetStrontium90.name=Strontium 90 Nugget
+item.itemPlateStrontium90.name=Strontium 90 Plate
+item.itemPlateDoubleStrontium90.name=Double Strontium 90 Plate
+item.itemIngotPolonium210.name=Polonium 210 Ingot
+item.itemDustPolonium210.name=Polonium 210 Dust
+item.itemDustTinyPolonium210.name=Tiny Pile of Polonium 210 Dust
+item.itemDustSmallPolonium210.name=Small Pile of Polonium 210 Dust
+item.itemNuggetPolonium210.name=Polonium 210 Nugget
+item.itemPlatePolonium210.name=Polonium 210 Plate
+item.itemPlateDoublePolonium210.name=Double Polonium 210 Plate
+item.itemIngotAmericium241.name=Americium 241 Ingot
+item.itemDustAmericium241.name=Americium 241 Dust
+item.itemDustTinyAmericium241.name=Tiny Pile of Americium 241 Dust
+item.itemDustSmallAmericium241.name=Small Pile of Americium 241 Dust
+item.itemNuggetAmericium241.name=Americium 241 Nugget
+item.itemPlateAmericium241.name=Americium 241 Plate
+item.itemPlateDoubleAmericium241.name=Double Americium 241 Plate
+item.itemIngotSiliconCarbide.name=Silicon Carbide Ingot
+item.itemDustSiliconCarbide.name=Silicon Carbide Dust
+item.itemDustTinySiliconCarbide.name=Tiny Pile of Silicon Carbide Dust
+item.itemDustSmallSiliconCarbide.name=Small Pile of Silicon Carbide Dust
+item.itemNuggetSiliconCarbide.name=Silicon Carbide Nugget
+item.itemPlateSiliconCarbide.name=Silicon Carbide Plate
+item.itemPlateDoubleSiliconCarbide.name=Double Silicon Carbide Plate
+item.itemBoltSiliconCarbide.name=Silicon Carbide Bolt
+item.itemRodSiliconCarbide.name=Silicon Carbide Rod
+item.itemRodLongSiliconCarbide.name=Long Silicon Carbide Rod
+item.itemRingSiliconCarbide.name=Silicon Carbide Ring
+item.itemScrewSiliconCarbide.name=Silicon Carbide Screw
+item.itemRotorSiliconCarbide.name=Silicon Carbide Rotor
+item.itemGearSiliconCarbide.name=Silicon Carbide Gear
+item.itemIngotZirconiumCarbide.name=Zirconium Carbide Ingot
+item.itemHotIngotZirconiumCarbide.name=Hot Zirconium Carbide Ingot
+item.itemDustZirconiumCarbide.name=Zirconium Carbide Dust
+item.itemDustTinyZirconiumCarbide.name=Tiny Pile of Zirconium Carbide Dust
+item.itemDustSmallZirconiumCarbide.name=Small Pile of Zirconium Carbide Dust
+item.itemNuggetZirconiumCarbide.name=Zirconium Carbide Nugget
+item.itemPlateZirconiumCarbide.name=Zirconium Carbide Plate
+item.itemPlateDoubleZirconiumCarbide.name=Double Zirconium Carbide Plate
+item.itemBoltZirconiumCarbide.name=Zirconium Carbide Bolt
+item.itemRodZirconiumCarbide.name=Zirconium Carbide Rod
+item.itemRodLongZirconiumCarbide.name=Long Zirconium Carbide Rod
+item.itemRingZirconiumCarbide.name=Zirconium Carbide Ring
+item.itemScrewZirconiumCarbide.name=Zirconium Carbide Screw
+item.itemRotorZirconiumCarbide.name=Zirconium Carbide Rotor
+item.itemGearZirconiumCarbide.name=Zirconium Carbide Gear
+item.itemIngotTantalumCarbide.name=Tantalum Carbide Ingot
+item.itemHotIngotTantalumCarbide.name=Hot Tantalum Carbide Ingot
+item.itemDustTantalumCarbide.name=Tantalum Carbide Dust
+item.itemDustTinyTantalumCarbide.name=Tiny Pile of Tantalum Carbide Dust
+item.itemDustSmallTantalumCarbide.name=Small Pile of Tantalum Carbide Dust
+item.itemNuggetTantalumCarbide.name=Tantalum Carbide Nugget
+item.itemPlateTantalumCarbide.name=Tantalum Carbide Plate
+item.itemPlateDoubleTantalumCarbide.name=Double Tantalum Carbide Plate
+item.itemBoltTantalumCarbide.name=Tantalum Carbide Bolt
+item.itemRodTantalumCarbide.name=Tantalum Carbide Rod
+item.itemRodLongTantalumCarbide.name=Long Tantalum Carbide Rod
+item.itemRingTantalumCarbide.name=Tantalum Carbide Ring
+item.itemScrewTantalumCarbide.name=Tantalum Carbide Screw
+item.itemRotorTantalumCarbide.name=Tantalum Carbide Rotor
+item.itemGearTantalumCarbide.name=Tantalum Carbide Gear
+item.itemIngotNiobiumCarbide.name=Niobium Carbide Ingot
+item.itemHotIngotNiobiumCarbide.name=Hot Niobium Carbide Ingot
+item.itemDustNiobiumCarbide.name=Niobium Carbide Dust
+item.itemDustTinyNiobiumCarbide.name=Tiny Pile of Niobium Carbide Dust
+item.itemDustSmallNiobiumCarbide.name=Small Pile of Niobium Carbide Dust
+item.itemNuggetNiobiumCarbide.name=Niobium Carbide Nugget
+item.itemPlateNiobiumCarbide.name=Niobium Carbide Plate
+item.itemPlateDoubleNiobiumCarbide.name=Double Niobium Carbide Plate
+item.itemBoltNiobiumCarbide.name=Niobium Carbide Bolt
+item.itemRodNiobiumCarbide.name=Niobium Carbide Rod
+item.itemRodLongNiobiumCarbide.name=Long Niobium Carbide Rod
+item.itemRingNiobiumCarbide.name=Niobium Carbide Ring
+item.itemScrewNiobiumCarbide.name=Niobium Carbide Screw
+item.itemRotorNiobiumCarbide.name=Niobium Carbide Rotor
+item.itemGearNiobiumCarbide.name=Niobium Carbide Gear
+item.itemIngotBerylliumFluoride.name=Beryllium Fluoride Ingot
+item.itemDustBerylliumFluoride.name=Beryllium Fluoride Dust
+item.itemDustTinyBerylliumFluoride.name=Tiny Pile of Beryllium Fluoride Dust
+item.itemDustSmallBerylliumFluoride.name=Small Pile of Beryllium Fluoride Dust
+item.itemNuggetBerylliumFluoride.name=Beryllium Fluoride Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium Fluoride Plate
+item.itemPlateDoubleBerylliumFluoride.name=Double Beryllium Fluoride Plate
+item.itemIngotLithiumFluoride.name=Lithium Fluoride Ingot
+item.itemDustLithiumFluoride.name=Lithium Fluoride Dust
+item.itemDustTinyLithiumFluoride.name=Tiny Pile of Lithium Fluoride Dust
+item.itemDustSmallLithiumFluoride.name=Small Pile of Lithium Fluoride Dust
+item.itemNuggetLithiumFluoride.name=Lithium Fluoride Nugget
+item.itemPlateLithiumFluoride.name=Lithium Fluoride Plate
+item.itemPlateDoubleLithiumFluoride.name=Double Lithium Fluoride Plate
+item.itemIngotThoriumTetrafluoride.name=Thorium Tetrafluoride Ingot
+item.itemDustThoriumTetrafluoride.name=Thorium Tetrafluoride Dust
+item.itemDustTinyThoriumTetrafluoride.name=Tiny Pile of Thorium Tetrafluoride Dust
+item.itemDustSmallThoriumTetrafluoride.name=Small Pile of Thorium Tetrafluoride Dust
+item.itemNuggetThoriumTetrafluoride.name=Thorium Tetrafluoride Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium Tetrafluoride Plate
+item.itemPlateDoubleThoriumTetrafluoride.name=Double Thorium Tetrafluoride Plate
+item.itemIngotThoriumHexafluoride.name=Thorium Hexafluoride Ingot
+item.itemDustThoriumHexafluoride.name=Thorium Hexafluoride Dust
+item.itemDustTinyThoriumHexafluoride.name=Tiny Pile of Thorium Hexafluoride Dust
+item.itemDustSmallThoriumHexafluoride.name=Small Pile of Thorium Hexafluoride Dust
+item.itemNuggetThoriumHexafluoride.name=Thorium Hexafluoride Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium Hexafluoride Plate
+item.itemPlateDoubleThoriumHexafluoride.name=Double Thorium Hexafluoride Plate
+item.itemIngotUraniumTetrafluoride.name=Uranium Tetrafluoride Ingot
+item.itemDustUraniumTetrafluoride.name=Uranium Tetrafluoride Dust
+item.itemDustTinyUraniumTetrafluoride.name=Tiny Pile of Uranium Tetrafluoride Dust
+item.itemDustSmallUraniumTetrafluoride.name=Small Pile of Uranium Tetrafluoride Dust
+item.itemNuggetUraniumTetrafluoride.name=Uranium Tetrafluoride Nugget
+item.itemPlateUraniumTetrafluoride.name=Uranium Tetrafluoride Plate
+item.itemPlateDoubleUraniumTetrafluoride.name=Double Uranium Tetrafluoride Plate
+item.itemIngotUraniumHexafluoride.name=Uranium Hexafluoride Ingot
+item.itemDustUraniumHexafluoride.name=Uranium Hexafluoride Dust
+item.itemDustTinyUraniumHexafluoride.name=Tiny Pile of Uranium Hexafluoride Dust
+item.itemDustSmallUraniumHexafluoride.name=Small Pile of Uranium Hexafluoride Dust
+item.itemNuggetUraniumHexafluoride.name=Uranium Hexafluoride Nugget
+item.itemPlateUraniumHexafluoride.name=Uranium Hexafluoride Plate
+item.itemPlateDoubleUraniumHexafluoride.name=Double Uranium Hexafluoride Plate
+item.itemIngotZirconiumTetrafluoride.name=Zirconium Tetrafluoride Ingot
+item.itemDustZirconiumTetrafluoride.name=Zirconium Tetrafluoride Dust
+item.itemDustTinyZirconiumTetrafluoride.name=Tiny Pile of Zirconium Tetrafluoride Dust
+item.itemDustSmallZirconiumTetrafluoride.name=Small Pile of Zirconium Tetrafluoride Dust
+item.itemNuggetZirconiumTetrafluoride.name=Zirconium Tetrafluoride Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirconium Tetrafluoride Plate
+item.itemPlateDoubleZirconiumTetrafluoride.name=Double Zirconium Tetrafluoride Plate
+item.itemIngotNeptuniumHexafluoride.name=Neptunium Hexafluoride Ingot
+item.itemDustNeptuniumHexafluoride.name=Neptunium Hexafluoride Dust
+item.itemDustTinyNeptuniumHexafluoride.name=Tiny Pile of Neptunium Hexafluoride Dust
+item.itemDustSmallNeptuniumHexafluoride.name=Small Pile of Neptunium Hexafluoride Dust
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium Hexafluoride Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium Hexafluoride Plate
+item.itemPlateDoubleNeptuniumHexafluoride.name=Double Neptunium Hexafluoride Plate
+item.itemIngotTechnetiumHexafluoride.name=Technetium Hexafluoride Ingot
+item.itemDustTechnetiumHexafluoride.name=Technetium Hexafluoride Dust
+item.itemDustTinyTechnetiumHexafluoride.name=Tiny Pile of Technetium Hexafluoride Dust
+item.itemDustSmallTechnetiumHexafluoride.name=Small Pile of Technetium Hexafluoride Dust
+item.itemNuggetTechnetiumHexafluoride.name=Technetium Hexafluoride Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium Hexafluoride Plate
+item.itemPlateDoubleTechnetiumHexafluoride.name=Double Technetium Hexafluoride Plate
+item.itemIngotSeleniumHexafluoride.name=Selenium Hexafluoride Ingot
+item.itemDustSeleniumHexafluoride.name=Selenium Hexafluoride Dust
+item.itemDustTinySeleniumHexafluoride.name=Tiny Pile of Selenium Hexafluoride Dust
+item.itemDustSmallSeleniumHexafluoride.name=Small Pile of Selenium Hexafluoride Dust
+item.itemNuggetSeleniumHexafluoride.name=Selenium Hexafluoride Nugget
+item.itemPlateSeleniumHexafluoride.name=Selenium Hexafluoride Plate
+item.itemPlateDoubleSeleniumHexafluoride.name=Double Selenium Hexafluoride Plate
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Ingot
+item.itemDustLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Dust
+item.itemDustTinyLiFBeF2ZrF4U235.name=Tiny Pile of LiFBeF2ZrF4U235 Dust
+item.itemDustSmallLiFBeF2ZrF4U235.name=Small Pile of LiFBeF2ZrF4U235 Dust
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Plate
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Double LiFBeF2ZrF4U235 Plate
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Ingot
+item.itemDustLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Dust
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Tiny Pile of LiFBeF2ZrF4UF4 Dust
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Small Pile of LiFBeF2ZrF4UF4 Dust
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Double LiFBeF2ZrF4UF4 Plate
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Ingot
+item.itemDustLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Dust
+item.itemDustTinyLiFBeF2ThF4UF4.name=Tiny Pile of LiFBeF2ThF4UF4 Dust
+item.itemDustSmallLiFBeF2ThF4UF4.name=Small Pile of LiFBeF2ThF4UF4 Dust
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Double LiFBeF2ThF4UF4 Plate
+item.itemIngotEnergyCrystal.name=Energy Crystal Ingot
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal Ingot
+item.itemDustEnergyCrystal.name=Energy Crystal Dust
+item.itemDustTinyEnergyCrystal.name=Tiny Pile of Energy Crystal Dust
+item.itemDustSmallEnergyCrystal.name=Small Pile of Energy Crystal Dust
+item.itemNuggetEnergyCrystal.name=Energy Crystal Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal Plate
+item.itemPlateDoubleEnergyCrystal.name=Double Energy Crystal Plate
+item.itemBoltEnergyCrystal.name=Energy Crystal Bolt
+item.itemRodEnergyCrystal.name=Energy Crystal Rod
+item.itemRodLongEnergyCrystal.name=Long Energy Crystal Rod
+item.itemRingEnergyCrystal.name=Energy Crystal Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal Screw
+item.itemRotorEnergyCrystal.name=Energy Crystal Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal Gear
+item.itemIngotBloodSteel.name=Blood Steel Ingot
+item.itemDustBloodSteel.name=Blood Steel Dust
+item.itemDustTinyBloodSteel.name=Tiny Pile of Blood Steel Dust
+item.itemDustSmallBloodSteel.name=Small Pile of Blood Steel Dust
+item.itemNuggetBloodSteel.name=Blood Steel Nugget
+item.itemPlateBloodSteel.name=Blood Steel Plate
+item.itemPlateDoubleBloodSteel.name=Double Blood Steel Plate
+item.itemBoltBloodSteel.name=Blood Steel Bolt
+item.itemRodBloodSteel.name=Blood Steel Rod
+item.itemRodLongBloodSteel.name=Long Blood Steel Rod
+item.itemRingBloodSteel.name=Blood Steel Ring
+item.itemScrewBloodSteel.name=Blood Steel Screw
+item.itemRotorBloodSteel.name=Blood Steel Rotor
+item.itemGearBloodSteel.name=Blood Steel Gear
+item.itemIngotZeron100.name=Zeron-100 Ingot
+item.itemHotIngotZeron100.name=Hot Zeron-100 Ingot
+item.itemDustZeron100.name=Zeron-100 Dust
+item.itemDustTinyZeron100.name=Tiny Pile of Zeron-100 Dust
+item.itemDustSmallZeron100.name=Small Pile of Zeron-100 Dust
+item.itemNuggetZeron100.name=Zeron-100 Nugget
+item.itemPlateZeron100.name=Zeron-100 Plate
+item.itemPlateDoubleZeron100.name=Double Zeron-100 Plate
+item.itemBoltZeron100.name=Zeron-100 Bolt
+item.itemRodZeron100.name=Zeron-100 Rod
+item.itemRodLongZeron100.name=Long Zeron-100 Rod
+item.itemRingZeron100.name=Zeron-100 Ring
+item.itemScrewZeron100.name=Zeron-100 Screw
+item.itemRotorZeron100.name=Zeron-100 Rotor
+item.itemGearZeron100.name=Zeron-100 Gear
+item.itemIngotTumbaga.name=Tumbaga Ingot
+item.itemDustTumbaga.name=Tumbaga Dust
+item.itemDustTinyTumbaga.name=Tiny Pile of Tumbaga Dust
+item.itemDustSmallTumbaga.name=Small Pile of Tumbaga Dust
+item.itemNuggetTumbaga.name=Tumbaga Nugget
+item.itemPlateTumbaga.name=Tumbaga Plate
+item.itemPlateDoubleTumbaga.name=Double Tumbaga Plate
+item.itemBoltTumbaga.name=Tumbaga Bolt
+item.itemRodTumbaga.name=Tumbaga Rod
+item.itemRodLongTumbaga.name=Long Tumbaga Rod
+item.itemRingTumbaga.name=Tumbaga Ring
+item.itemScrewTumbaga.name=Tumbaga Screw
+item.itemRotorTumbaga.name=Tumbaga Rotor
+item.itemGearTumbaga.name=Tumbaga Gear
+item.itemIngotPotin.name=Potin Ingot
+item.itemDustPotin.name=Potin Dust
+item.itemDustTinyPotin.name=Tiny Pile of Potin Dust
+item.itemDustSmallPotin.name=Small Pile of Potin Dust
+item.itemNuggetPotin.name=Potin Nugget
+item.itemPlatePotin.name=Potin Plate
+item.itemPlateDoublePotin.name=Double Potin Plate
+item.itemBoltPotin.name=Potin Bolt
+item.itemRodPotin.name=Potin Rod
+item.itemRodLongPotin.name=Long Potin Rod
+item.itemRingPotin.name=Potin Ring
+item.itemScrewPotin.name=Potin Screw
+item.itemRotorPotin.name=Potin Rotor
+item.itemGearPotin.name=Potin Gear
+item.itemIngotStaballoy.name=Staballoy Ingot
+item.itemHotIngotStaballoy.name=Hot Staballoy Ingot
+item.itemDustStaballoy.name=Staballoy Dust
+item.itemDustTinyStaballoy.name=Tiny Pile of Staballoy Dust
+item.itemDustSmallStaballoy.name=Small Pile of Staballoy Dust
+item.itemNuggetStaballoy.name=Staballoy Nugget
+item.itemPlateStaballoy.name=Staballoy Plate
+item.itemPlateDoubleStaballoy.name=Double Staballoy Plate
+item.itemBoltStaballoy.name=Staballoy Bolt
+item.itemRodStaballoy.name=Staballoy Rod
+item.itemRodLongStaballoy.name=Long Staballoy Rod
+item.itemRingStaballoy.name=Staballoy Ring
+item.itemScrewStaballoy.name=Staballoy Screw
+item.itemRotorStaballoy.name=Staballoy Rotor
+item.itemGearStaballoy.name=Staballoy Gear
+item.itemIngotTantalloy60.name=Tantalloy-60 Ingot
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60 Ingot
+item.itemDustTantalloy60.name=Tantalloy-60 Dust
+item.itemDustTinyTantalloy60.name=Tiny Pile of Tantalloy-60 Dust
+item.itemDustSmallTantalloy60.name=Small Pile of Tantalloy-60 Dust
+item.itemNuggetTantalloy60.name=Tantalloy-60 Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60 Plate
+item.itemPlateDoubleTantalloy60.name=Double Tantalloy-60 Plate
+item.itemBoltTantalloy60.name=Tantalloy-60 Bolt
+item.itemRodTantalloy60.name=Tantalloy-60 Rod
+item.itemRodLongTantalloy60.name=Long Tantalloy-60 Rod
+item.itemRingTantalloy60.name=Tantalloy-60 Ring
+item.itemScrewTantalloy60.name=Tantalloy-60 Screw
+item.itemRotorTantalloy60.name=Tantalloy-60 Rotor
+item.itemGearTantalloy60.name=Tantalloy-60 Gear
+item.itemIngotTantalloy61.name=Tantalloy-61 Ingot
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61 Ingot
+item.itemDustTantalloy61.name=Tantalloy-61 Dust
+item.itemDustTinyTantalloy61.name=Tiny Pile of Tantalloy-61 Dust
+item.itemDustSmallTantalloy61.name=Small Pile of Tantalloy-61 Dust
+item.itemNuggetTantalloy61.name=Tantalloy-61 Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61 Plate
+item.itemPlateDoubleTantalloy61.name=Double Tantalloy-61 Plate
+item.itemBoltTantalloy61.name=Tantalloy-61 Bolt
+item.itemRodTantalloy61.name=Tantalloy-61 Rod
+item.itemRodLongTantalloy61.name=Long Tantalloy-61 Rod
+item.itemRingTantalloy61.name=Tantalloy-61 Ring
+item.itemScrewTantalloy61.name=Tantalloy-61 Screw
+item.itemRotorTantalloy61.name=Tantalloy-61 Rotor
+item.itemGearTantalloy61.name=Tantalloy-61 Gear
+item.itemIngotInconel625.name=Inconel-625 Ingot
+item.itemHotIngotInconel625.name=Hot Inconel-625 Ingot
+item.itemDustInconel625.name=Inconel-625 Dust
+item.itemDustTinyInconel625.name=Tiny Pile of Inconel-625 Dust
+item.itemDustSmallInconel625.name=Small Pile of Inconel-625 Dust
+item.itemNuggetInconel625.name=Inconel-625 Nugget
+item.itemPlateInconel625.name=Inconel-625 Plate
+item.itemPlateDoubleInconel625.name=Double Inconel-625 Plate
+item.itemBoltInconel625.name=Inconel-625 Bolt
+item.itemRodInconel625.name=Inconel-625 Rod
+item.itemRodLongInconel625.name=Long Inconel-625 Rod
+item.itemRingInconel625.name=Inconel-625 Ring
+item.itemScrewInconel625.name=Inconel-625 Screw
+item.itemRotorInconel625.name=Inconel-625 Rotor
+item.itemGearInconel625.name=Inconel-625 Gear
+item.itemIngotInconel690.name=Inconel-690 Ingot
+item.itemHotIngotInconel690.name=Hot Inconel-690 Ingot
+item.itemDustInconel690.name=Inconel-690 Dust
+item.itemDustTinyInconel690.name=Tiny Pile of Inconel-690 Dust
+item.itemDustSmallInconel690.name=Small Pile of Inconel-690 Dust
+item.itemNuggetInconel690.name=Inconel-690 Nugget
+item.itemPlateInconel690.name=Inconel-690 Plate
+item.itemPlateDoubleInconel690.name=Double Inconel-690 Plate
+item.itemBoltInconel690.name=Inconel-690 Bolt
+item.itemRodInconel690.name=Inconel-690 Rod
+item.itemRodLongInconel690.name=Long Inconel-690 Rod
+item.itemRingInconel690.name=Inconel-690 Ring
+item.itemScrewInconel690.name=Inconel-690 Screw
+item.itemRotorInconel690.name=Inconel-690 Rotor
+item.itemGearInconel690.name=Inconel-690 Gear
+item.itemIngotInconel792.name=Inconel-792 Ingot
+item.itemHotIngotInconel792.name=Hot Inconel-792 Ingot
+item.itemDustInconel792.name=Inconel-792 Dust
+item.itemDustTinyInconel792.name=Tiny Pile of Inconel-792 Dust
+item.itemDustSmallInconel792.name=Small Pile of Inconel-792 Dust
+item.itemNuggetInconel792.name=Inconel-792 Nugget
+item.itemPlateInconel792.name=Inconel-792 Plate
+item.itemPlateDoubleInconel792.name=Double Inconel-792 Plate
+item.itemBoltInconel792.name=Inconel-792 Bolt
+item.itemRodInconel792.name=Inconel-792 Rod
+item.itemRodLongInconel792.name=Long Inconel-792 Rod
+item.itemRingInconel792.name=Inconel-792 Ring
+item.itemScrewInconel792.name=Inconel-792 Screw
+item.itemRotorInconel792.name=Inconel-792 Rotor
+item.itemGearInconel792.name=Inconel-792 Gear
+item.itemDustEglinSteelBaseCompound.name=Eglin Steel Base Compound Dust
+item.itemDustTinyEglinSteelBaseCompound.name=Tiny Pile of Eglin Steel Base Compound Dust
+item.itemDustSmallEglinSteelBaseCompound.name=Small Pile of Eglin Steel Base Compound Dust
+item.itemIngotEglinSteel.name=Eglin Steel Ingot
+item.itemDustEglinSteel.name=Eglin Steel Dust
+item.itemDustTinyEglinSteel.name=Tiny Pile of Eglin Steel Dust
+item.itemDustSmallEglinSteel.name=Small Pile of Eglin Steel Dust
+item.itemNuggetEglinSteel.name=Eglin Steel Nugget
+item.itemPlateEglinSteel.name=Eglin Steel Plate
+item.itemPlateDoubleEglinSteel.name=Double Eglin Steel Plate
+item.itemBoltEglinSteel.name=Eglin Steel Bolt
+item.itemRodEglinSteel.name=Eglin Steel Rod
+item.itemRodLongEglinSteel.name=Long Eglin Steel Rod
+item.itemRingEglinSteel.name=Eglin Steel Ring
+item.itemScrewEglinSteel.name=Eglin Steel Screw
+item.itemRotorEglinSteel.name=Eglin Steel Rotor
+item.itemGearEglinSteel.name=Eglin Steel Gear
+item.itemIngotMaragingSteel250.name=Maraging Steel 250 Ingot
+item.itemHotIngotMaragingSteel250.name=Hot Maraging Steel 250 Ingot
+item.itemDustMaragingSteel250.name=Maraging Steel 250 Dust
+item.itemDustTinyMaragingSteel250.name=Tiny Pile of Maraging Steel 250 Dust
+item.itemDustSmallMaragingSteel250.name=Small Pile of Maraging Steel 250 Dust
+item.itemNuggetMaragingSteel250.name=Maraging Steel 250 Nugget
+item.itemPlateMaragingSteel250.name=Maraging Steel 250 Plate
+item.itemPlateDoubleMaragingSteel250.name=Double Maraging Steel 250 Plate
+item.itemBoltMaragingSteel250.name=Maraging Steel 250 Bolt
+item.itemRodMaragingSteel250.name=Maraging Steel 250 Rod
+item.itemRodLongMaragingSteel250.name=Long Maraging Steel 250 Rod
+item.itemRingMaragingSteel250.name=Maraging Steel 250 Ring
+item.itemScrewMaragingSteel250.name=Maraging Steel 250 Screw
+item.itemRotorMaragingSteel250.name=Maraging Steel 250 Rotor
+item.itemGearMaragingSteel250.name=Maraging Steel 250 Gear
+item.itemIngotMaragingSteel300.name=Maraging Steel 300 Ingot
+item.itemHotIngotMaragingSteel300.name=Hot Maraging Steel 300 Ingot
+item.itemDustMaragingSteel300.name=Maraging Steel 300 Dust
+item.itemDustTinyMaragingSteel300.name=Tiny Pile of Maraging Steel 300 Dust
+item.itemDustSmallMaragingSteel300.name=Small Pile of Maraging Steel 300 Dust
+item.itemNuggetMaragingSteel300.name=Maraging Steel 300 Nugget
+item.itemPlateMaragingSteel300.name=Maraging Steel 300 Plate
+item.itemPlateDoubleMaragingSteel300.name=Double Maraging Steel 300 Plate
+item.itemBoltMaragingSteel300.name=Maraging Steel 300 Bolt
+item.itemRodMaragingSteel300.name=Maraging Steel 300 Rod
+item.itemRodLongMaragingSteel300.name=Long Maraging Steel 300 Rod
+item.itemRingMaragingSteel300.name=Maraging Steel 300 Ring
+item.itemScrewMaragingSteel300.name=Maraging Steel 300 Screw
+item.itemRotorMaragingSteel300.name=Maraging Steel 300 Rotor
+item.itemGearMaragingSteel300.name=Maraging Steel 300 Gear
+item.itemIngotMaragingSteel350.name=Maraging Steel 350 Ingot
+item.itemHotIngotMaragingSteel350.name=Hot Maraging Steel 350 Ingot
+item.itemDustMaragingSteel350.name=Maraging Steel 350 Dust
+item.itemDustTinyMaragingSteel350.name=Tiny Pile of Maraging Steel 350 Dust
+item.itemDustSmallMaragingSteel350.name=Small Pile of Maraging Steel 350 Dust
+item.itemNuggetMaragingSteel350.name=Maraging Steel 350 Nugget
+item.itemPlateMaragingSteel350.name=Maraging Steel 350 Plate
+item.itemPlateDoubleMaragingSteel350.name=Double Maraging Steel 350 Plate
+item.itemBoltMaragingSteel350.name=Maraging Steel 350 Bolt
+item.itemRodMaragingSteel350.name=Maraging Steel 350 Rod
+item.itemRodLongMaragingSteel350.name=Long Maraging Steel 350 Rod
+item.itemRingMaragingSteel350.name=Maraging Steel 350 Ring
+item.itemScrewMaragingSteel350.name=Maraging Steel 350 Screw
+item.itemRotorMaragingSteel350.name=Maraging Steel 350 Rotor
+item.itemGearMaragingSteel350.name=Maraging Steel 350 Gear
+item.itemIngotStellite.name=Stellite Ingot
+item.itemHotIngotStellite.name=Hot Stellite Ingot
+item.itemDustStellite.name=Stellite Dust
+item.itemDustTinyStellite.name=Tiny Pile of Stellite Dust
+item.itemDustSmallStellite.name=Small Pile of Stellite Dust
+item.itemNuggetStellite.name=Stellite Nugget
+item.itemPlateStellite.name=Stellite Plate
+item.itemPlateDoubleStellite.name=Double Stellite Plate
+item.itemBoltStellite.name=Stellite Bolt
+item.itemRodStellite.name=Stellite Rod
+item.itemRodLongStellite.name=Long Stellite Rod
+item.itemRingStellite.name=Stellite Ring
+item.itemScrewStellite.name=Stellite Screw
+item.itemRotorStellite.name=Stellite Rotor
+item.itemGearStellite.name=Stellite Gear
+item.itemIngotTalonite.name=Talonite Ingot
+item.itemDustTalonite.name=Talonite Dust
+item.itemDustTinyTalonite.name=Tiny Pile of Talonite Dust
+item.itemDustSmallTalonite.name=Small Pile of Talonite Dust
+item.itemNuggetTalonite.name=Talonite Nugget
+item.itemPlateTalonite.name=Talonite Plate
+item.itemPlateDoubleTalonite.name=Double Talonite Plate
+item.itemBoltTalonite.name=Talonite Bolt
+item.itemRodTalonite.name=Talonite Rod
+item.itemRodLongTalonite.name=Long Talonite Rod
+item.itemRingTalonite.name=Talonite Ring
+item.itemScrewTalonite.name=Talonite Screw
+item.itemRotorTalonite.name=Talonite Rotor
+item.itemGearTalonite.name=Talonite Gear
+item.itemIngotHastelloyW.name=Hastelloy-W Ingot
+item.itemDustHastelloyW.name=Hastelloy-W Dust
+item.itemDustTinyHastelloyW.name=Tiny Pile of Hastelloy-W Dust
+item.itemDustSmallHastelloyW.name=Small Pile of Hastelloy-W Dust
+item.itemNuggetHastelloyW.name=Hastelloy-W Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W Plate
+item.itemPlateDoubleHastelloyW.name=Double Hastelloy-W Plate
+item.itemBoltHastelloyW.name=Hastelloy-W Bolt
+item.itemRodHastelloyW.name=Hastelloy-W Rod
+item.itemRodLongHastelloyW.name=Long Hastelloy-W Rod
+item.itemRingHastelloyW.name=Hastelloy-W Ring
+item.itemScrewHastelloyW.name=Hastelloy-W Screw
+item.itemRotorHastelloyW.name=Hastelloy-W Rotor
+item.itemGearHastelloyW.name=Hastelloy-W Gear
+item.itemIngotHastelloyX.name=Hastelloy-X Ingot
+item.itemDustHastelloyX.name=Hastelloy-X Dust
+item.itemDustTinyHastelloyX.name=Tiny Pile of Hastelloy-X Dust
+item.itemDustSmallHastelloyX.name=Small Pile of Hastelloy-X Dust
+item.itemNuggetHastelloyX.name=Hastelloy-X Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X Plate
+item.itemPlateDoubleHastelloyX.name=Double Hastelloy-X Plate
+item.itemBoltHastelloyX.name=Hastelloy-X Bolt
+item.itemRodHastelloyX.name=Hastelloy-X Rod
+item.itemRodLongHastelloyX.name=Long Hastelloy-X Rod
+item.itemRingHastelloyX.name=Hastelloy-X Ring
+item.itemScrewHastelloyX.name=Hastelloy-X Screw
+item.itemRotorHastelloyX.name=Hastelloy-X Rotor
+item.itemGearHastelloyX.name=Hastelloy-X Gear
+item.itemIngotHastelloyC276.name=Hastelloy-C276 Ingot
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276 Ingot
+item.itemDustHastelloyC276.name=Hastelloy-C276 Dust
+item.itemDustTinyHastelloyC276.name=Tiny Pile of Hastelloy-C276 Dust
+item.itemDustSmallHastelloyC276.name=Small Pile of Hastelloy-C276 Dust
+item.itemNuggetHastelloyC276.name=Hastelloy-C276 Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276 Plate
+item.itemPlateDoubleHastelloyC276.name=Double Hastelloy-C276 Plate
+item.itemBoltHastelloyC276.name=Hastelloy-C276 Bolt
+item.itemRodHastelloyC276.name=Hastelloy-C276 Rod
+item.itemRodLongHastelloyC276.name=Long Hastelloy-C276 Rod
+item.itemRingHastelloyC276.name=Hastelloy-C276 Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276 Screw
+item.itemRotorHastelloyC276.name=Hastelloy-C276 Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276 Gear
+item.itemIngotHastelloyN.name=Hastelloy-N Ingot
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N Ingot
+item.itemDustHastelloyN.name=Hastelloy-N Dust
+item.itemDustTinyHastelloyN.name=Tiny Pile of Hastelloy-N Dust
+item.itemDustSmallHastelloyN.name=Small Pile of Hastelloy-N Dust
+item.itemNuggetHastelloyN.name=Hastelloy-N Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N Plate
+item.itemPlateDoubleHastelloyN.name=Double Hastelloy-N Plate
+item.itemBoltHastelloyN.name=Hastelloy-N Bolt
+item.itemRodHastelloyN.name=Hastelloy-N Rod
+item.itemRodLongHastelloyN.name=Long Hastelloy-N Rod
+item.itemRingHastelloyN.name=Hastelloy-N Ring
+item.itemScrewHastelloyN.name=Hastelloy-N Screw
+item.itemRotorHastelloyN.name=Hastelloy-N Rotor
+item.itemGearHastelloyN.name=Hastelloy-N Gear
+item.itemIngotIncoloy020.name=Incoloy-020 Ingot
+item.itemDustIncoloy020.name=Incoloy-020 Dust
+item.itemDustTinyIncoloy020.name=Tiny Pile of Incoloy-020 Dust
+item.itemDustSmallIncoloy020.name=Small Pile of Incoloy-020 Dust
+item.itemNuggetIncoloy020.name=Incoloy-020 Nugget
+item.itemPlateIncoloy020.name=Incoloy-020 Plate
+item.itemPlateDoubleIncoloy020.name=Double Incoloy-020 Plate
+item.itemBoltIncoloy020.name=Incoloy-020 Bolt
+item.itemRodIncoloy020.name=Incoloy-020 Rod
+item.itemRodLongIncoloy020.name=Long Incoloy-020 Rod
+item.itemRingIncoloy020.name=Incoloy-020 Ring
+item.itemScrewIncoloy020.name=Incoloy-020 Screw
+item.itemRotorIncoloy020.name=Incoloy-020 Rotor
+item.itemGearIncoloy020.name=Incoloy-020 Gear
+item.itemIngotIncoloyDS.name=Incoloy-DS Ingot
+item.itemDustIncoloyDS.name=Incoloy-DS Dust
+item.itemDustTinyIncoloyDS.name=Tiny Pile of Incoloy-DS Dust
+item.itemDustSmallIncoloyDS.name=Small Pile of Incoloy-DS Dust
+item.itemNuggetIncoloyDS.name=Incoloy-DS Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS Plate
+item.itemPlateDoubleIncoloyDS.name=Double Incoloy-DS Plate
+item.itemBoltIncoloyDS.name=Incoloy-DS Bolt
+item.itemRodIncoloyDS.name=Incoloy-DS Rod
+item.itemRodLongIncoloyDS.name=Long Incoloy-DS Rod
+item.itemRingIncoloyDS.name=Incoloy-DS Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS Screw
+item.itemRotorIncoloyDS.name=Incoloy-DS Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS Gear
+item.itemIngotIncoloyMA956.name=Incoloy-MA956 Ingot
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956 Ingot
+item.itemDustIncoloyMA956.name=Incoloy-MA956 Dust
+item.itemDustTinyIncoloyMA956.name=Tiny Pile of Incoloy-MA956 Dust
+item.itemDustSmallIncoloyMA956.name=Small Pile of Incoloy-MA956 Dust
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956 Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956 Plate
+item.itemPlateDoubleIncoloyMA956.name=Double Incoloy-MA956 Plate
+item.itemBoltIncoloyMA956.name=Incoloy-MA956 Bolt
+item.itemRodIncoloyMA956.name=Incoloy-MA956 Rod
+item.itemRodLongIncoloyMA956.name=Long Incoloy-MA956 Rod
+item.itemRingIncoloyMA956.name=Incoloy-MA956 Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956 Screw
+item.itemRotorIncoloyMA956.name=Incoloy-MA956 Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956 Gear
+item.itemIngotGrisium.name=Grisium Ingot
+item.itemHotIngotGrisium.name=Hot Grisium Ingot
+item.itemDustGrisium.name=Grisium Dust
+item.itemDustTinyGrisium.name=Tiny Pile of Grisium Dust
+item.itemDustSmallGrisium.name=Small Pile of Grisium Dust
+item.itemNuggetGrisium.name=Grisium Nugget
+item.itemPlateGrisium.name=Grisium Plate
+item.itemPlateDoubleGrisium.name=Double Grisium Plate
+item.itemBoltGrisium.name=Grisium Bolt
+item.itemRodGrisium.name=Grisium Rod
+item.itemRodLongGrisium.name=Long Grisium Rod
+item.itemRingGrisium.name=Grisium Ring
+item.itemScrewGrisium.name=Grisium Screw
+item.itemRotorGrisium.name=Grisium Rotor
+item.itemGearGrisium.name=Grisium Gear
+item.itemIngotHG1223.name=HG-1223 Ingot
+item.itemDustHG1223.name=HG-1223 Dust
+item.itemDustTinyHG1223.name=Tiny Pile of HG-1223 Dust
+item.itemDustSmallHG1223.name=Small Pile of HG-1223 Dust
+item.itemNuggetHG1223.name=HG-1223 Nugget
+item.itemPlateHG1223.name=HG-1223 Plate
+item.itemPlateDoubleHG1223.name=Double HG-1223 Plate
+item.itemIngotTrinium.name=Trinium Ingot
+item.itemDustTrinium.name=Trinium Dust
+item.itemDustTinyTrinium.name=Tiny Pile of Trinium Dust
+item.itemDustSmallTrinium.name=Small Pile of Trinium Dust
+item.itemNuggetTrinium.name=Trinium Nugget
+item.itemPlateTrinium.name=Trinium Plate
+item.itemPlateDoubleTrinium.name=Double Trinium Plate
+item.itemIngotRefinedTrinium.name=Refined Trinium Ingot
+item.itemDustRefinedTrinium.name=Refined Trinium Dust
+item.itemDustTinyRefinedTrinium.name=Tiny Pile of Refined Trinium Dust
+item.itemDustSmallRefinedTrinium.name=Small Pile of Refined Trinium Dust
+item.itemNuggetRefinedTrinium.name=Refined Trinium Nugget
+item.itemPlateRefinedTrinium.name=Refined Trinium Plate
+item.itemPlateDoubleRefinedTrinium.name=Double Refined Trinium Plate
+item.itemIngotTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ingot
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium Titanium Alloy Ingot
+item.itemDustTriniumTitaniumAlloy.name=Trinium Titanium Alloy Dust
+item.itemDustTinyTriniumTitaniumAlloy.name=Tiny Pile of Trinium Titanium Alloy Dust
+item.itemDustSmallTriniumTitaniumAlloy.name=Small Pile of Trinium Titanium Alloy Dust
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium Titanium Alloy Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium Titanium Alloy Plate
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Double Trinium Titanium Alloy Plate
+item.itemBoltTriniumTitaniumAlloy.name=Trinium Titanium Alloy Bolt
+item.itemRodTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rod
+item.itemRodLongTriniumTitaniumAlloy.name=Long Trinium Titanium Alloy Rod
+item.itemRingTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium Titanium Alloy Screw
+item.itemRotorTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium Titanium Alloy Gear
+item.itemIngotTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Ingot
+item.itemDustTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Dust
+item.itemDustTinyTriniumNaquadahAlloy.name=Tiny Pile of Trinium Naquadah Alloy Dust
+item.itemDustSmallTriniumNaquadahAlloy.name=Small Pile of Trinium Naquadah Alloy Dust
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Plate
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Double Trinium Naquadah Alloy Plate
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ingot
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium Naquadah Carbonite Ingot
+item.itemDustTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Dust
+item.itemDustTinyTriniumNaquadahCarbonite.name=Tiny Pile of Trinium Naquadah Carbonite Dust
+item.itemDustSmallTriniumNaquadahCarbonite.name=Small Pile of Trinium Naquadah Carbonite Dust
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Plate
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Double Trinium Naquadah Carbonite Plate
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Bolt
+item.itemRodTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rod
+item.itemRodLongTriniumNaquadahCarbonite.name=Long Trinium Naquadah Carbonite Rod
+item.itemRingTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Screw
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Gear
+item.itemIngotQuantum.name=Quantum Ingot
+item.itemHotIngotQuantum.name=Hot Quantum Ingot
+item.itemDustQuantum.name=Quantum Dust
+item.itemDustTinyQuantum.name=Tiny Pile of Quantum Dust
+item.itemDustSmallQuantum.name=Small Pile of Quantum Dust
+item.itemNuggetQuantum.name=Quantum Nugget
+item.itemPlateQuantum.name=Quantum Plate
+item.itemPlateDoubleQuantum.name=Double Quantum Plate
+item.itemBoltQuantum.name=Quantum Bolt
+item.itemRodQuantum.name=Quantum Rod
+item.itemRodLongQuantum.name=Long Quantum Rod
+item.itemRingQuantum.name=Quantum Ring
+item.itemScrewQuantum.name=Quantum Screw
+item.itemRotorQuantum.name=Quantum Rotor
+item.itemGearQuantum.name=Quantum Gear
+item.itemDustFluoriteF.name=Fluorite (F) Dust
+item.itemDustTinyFluoriteF.name=Tiny Pile of Fluorite (F) Dust
+item.itemDustSmallFluoriteF.name=Small Pile of Fluorite (F) Dust
+item.crushedFluoriteF.name=Crushed Fluorite (F) Ore
+item.oreRawFluoriteF.name=Raw Fluorite (F) Ore
+item.crushedCentrifugedFluoriteF.name=Centrifuged Crushed Fluorite (F) Ore
+item.crushedPurifiedFluoriteF.name=Purified Crushed Fluorite (F) Ore
+item.dustImpureFluoriteF.name=Impure Fluorite (F) Dust
+item.dustPureFluoriteF.name=Purified Fluorite (F) Dust
+item.itemDustCrocoite.name=Crocoite Dust
+item.itemDustTinyCrocoite.name=Tiny Pile of Crocoite Dust
+item.itemDustSmallCrocoite.name=Small Pile of Crocoite Dust
+item.crushedCrocoite.name=Crushed Crocoite Ore
+item.oreRawCrocoite.name=Raw Crocoite Ore
+item.crushedCentrifugedCrocoite.name=Centrifuged Crushed Crocoite Ore
+item.crushedPurifiedCrocoite.name=Purified Crushed Crocoite Ore
+item.dustImpureCrocoite.name=Impure Crocoite Dust
+item.dustPureCrocoite.name=Purified Crocoite Dust
+item.itemDustGeikielite.name=Geikielite Dust
+item.itemDustTinyGeikielite.name=Tiny Pile of Geikielite Dust
+item.itemDustSmallGeikielite.name=Small Pile of Geikielite Dust
+item.crushedGeikielite.name=Crushed Geikielite Ore
+item.oreRawGeikielite.name=Raw Geikielite Ore
+item.crushedCentrifugedGeikielite.name=Centrifuged Crushed Geikielite Ore
+item.crushedPurifiedGeikielite.name=Purified Crushed Geikielite Ore
+item.dustImpureGeikielite.name=Impure Geikielite Dust
+item.dustPureGeikielite.name=Purified Geikielite Dust
+item.itemDustNichromite.name=Nichromite Dust
+item.itemDustTinyNichromite.name=Tiny Pile of Nichromite Dust
+item.itemDustSmallNichromite.name=Small Pile of Nichromite Dust
+item.crushedNichromite.name=Crushed Nichromite Ore
+item.oreRawNichromite.name=Raw Nichromite Ore
+item.crushedCentrifugedNichromite.name=Centrifuged Crushed Nichromite Ore
+item.crushedPurifiedNichromite.name=Purified Crushed Nichromite Ore
+item.dustImpureNichromite.name=Impure Nichromite Dust
+item.dustPureNichromite.name=Purified Nichromite Dust
+item.itemDustTitanite.name=Titanite Dust
+item.itemDustTinyTitanite.name=Tiny Pile of Titanite Dust
+item.itemDustSmallTitanite.name=Small Pile of Titanite Dust
+item.crushedTitanite.name=Crushed Titanite Ore
+item.oreRawTitanite.name=Raw Titanite Ore
+item.crushedCentrifugedTitanite.name=Centrifuged Crushed Titanite Ore
+item.crushedPurifiedTitanite.name=Purified Crushed Titanite Ore
+item.dustImpureTitanite.name=Impure Titanite Dust
+item.dustPureTitanite.name=Purified Titanite Dust
+item.itemDustZimbabweite.name=Zimbabweite Dust
+item.itemDustTinyZimbabweite.name=Tiny Pile of Zimbabweite Dust
+item.itemDustSmallZimbabweite.name=Small Pile of Zimbabweite Dust
+item.crushedZimbabweite.name=Crushed Zimbabweite Ore
+item.oreRawZimbabweite.name=Raw Zimbabweite Ore
+item.crushedCentrifugedZimbabweite.name=Centrifuged Crushed Zimbabweite Ore
+item.crushedPurifiedZimbabweite.name=Purified Crushed Zimbabweite Ore
+item.dustImpureZimbabweite.name=Impure Zimbabweite Dust
+item.dustPureZimbabweite.name=Purified Zimbabweite Dust
+item.itemDustZirconolite.name=Zirconolite Dust
+item.itemDustTinyZirconolite.name=Tiny Pile of Zirconolite Dust
+item.itemDustSmallZirconolite.name=Small Pile of Zirconolite Dust
+item.crushedZirconolite.name=Crushed Zirconolite Ore
+item.oreRawZirconolite.name=Raw Zirconolite Ore
+item.crushedCentrifugedZirconolite.name=Centrifuged Crushed Zirconolite Ore
+item.crushedPurifiedZirconolite.name=Purified Crushed Zirconolite Ore
+item.dustImpureZirconolite.name=Impure Zirconolite Dust
+item.dustPureZirconolite.name=Purified Zirconolite Dust
+item.itemDustGadoliniteCe.name=Gadolinite (Ce) Dust
+item.itemDustTinyGadoliniteCe.name=Tiny Pile of Gadolinite (Ce) Dust
+item.itemDustSmallGadoliniteCe.name=Small Pile of Gadolinite (Ce) Dust
+item.crushedGadoliniteCe.name=Crushed Gadolinite (Ce) Ore
+item.oreRawGadoliniteCe.name=Raw Gadolinite (Ce) Ore
+item.crushedCentrifugedGadoliniteCe.name=Centrifuged Crushed Gadolinite (Ce) Ore
+item.crushedPurifiedGadoliniteCe.name=Purified Crushed Gadolinite (Ce) Ore
+item.dustImpureGadoliniteCe.name=Impure Gadolinite (Ce) Dust
+item.dustPureGadoliniteCe.name=Purified Gadolinite (Ce) Dust
+item.itemDustGadoliniteY.name=Gadolinite (Y) Dust
+item.itemDustTinyGadoliniteY.name=Tiny Pile of Gadolinite (Y) Dust
+item.itemDustSmallGadoliniteY.name=Small Pile of Gadolinite (Y) Dust
+item.crushedGadoliniteY.name=Crushed Gadolinite (Y) Ore
+item.oreRawGadoliniteY.name=Raw Gadolinite (Y) Ore
+item.crushedCentrifugedGadoliniteY.name=Centrifuged Crushed Gadolinite (Y) Ore
+item.crushedPurifiedGadoliniteY.name=Purified Crushed Gadolinite (Y) Ore
+item.dustImpureGadoliniteY.name=Impure Gadolinite (Y) Dust
+item.dustPureGadoliniteY.name=Purified Gadolinite (Y) Dust
+item.itemDustLepersonnite.name=Lepersonnite Dust
+item.itemDustTinyLepersonnite.name=Tiny Pile of Lepersonnite Dust
+item.itemDustSmallLepersonnite.name=Small Pile of Lepersonnite Dust
+item.crushedLepersonnite.name=Crushed Lepersonnite Ore
+item.oreRawLepersonnite.name=Raw Lepersonnite Ore
+item.crushedCentrifugedLepersonnite.name=Centrifuged Crushed Lepersonnite Ore
+item.crushedPurifiedLepersonnite.name=Purified Crushed Lepersonnite Ore
+item.dustImpureLepersonnite.name=Impure Lepersonnite Dust
+item.dustPureLepersonnite.name=Purified Lepersonnite Dust
+item.itemDustSamarskiteY.name=Samarskite (Y) Dust
+item.itemDustTinySamarskiteY.name=Tiny Pile of Samarskite (Y) Dust
+item.itemDustSmallSamarskiteY.name=Small Pile of Samarskite (Y) Dust
+item.crushedSamarskiteY.name=Crushed Samarskite (Y) Ore
+item.oreRawSamarskiteY.name=Raw Samarskite (Y) Ore
+item.crushedCentrifugedSamarskiteY.name=Centrifuged Crushed Samarskite (Y) Ore
+item.crushedPurifiedSamarskiteY.name=Purified Crushed Samarskite (Y) Ore
+item.dustImpureSamarskiteY.name=Impure Samarskite (Y) Dust
+item.dustPureSamarskiteY.name=Purified Samarskite (Y) Dust
+item.itemDustSamarskiteYb.name=Samarskite (Yb) Dust
+item.itemDustTinySamarskiteYb.name=Tiny Pile of Samarskite (Yb) Dust
+item.itemDustSmallSamarskiteYb.name=Small Pile of Samarskite (Yb) Dust
+item.crushedSamarskiteYb.name=Crushed Samarskite (Yb) Ore
+item.oreRawSamarskiteYb.name=Raw Samarskite (Yb) Ore
+item.crushedCentrifugedSamarskiteYb.name=Centrifuged Crushed Samarskite (Yb) Ore
+item.crushedPurifiedSamarskiteYb.name=Purified Crushed Samarskite (Yb) Ore
+item.dustImpureSamarskiteYb.name=Impure Samarskite (Yb) Dust
+item.dustPureSamarskiteYb.name=Purified Samarskite (Yb) Dust
+item.itemDustXenotime.name=Xenotime Dust
+item.itemDustTinyXenotime.name=Tiny Pile of Xenotime Dust
+item.itemDustSmallXenotime.name=Small Pile of Xenotime Dust
+item.crushedXenotime.name=Crushed Xenotime Ore
+item.oreRawXenotime.name=Raw Xenotime Ore
+item.crushedCentrifugedXenotime.name=Centrifuged Crushed Xenotime Ore
+item.crushedPurifiedXenotime.name=Purified Crushed Xenotime Ore
+item.dustImpureXenotime.name=Impure Xenotime Dust
+item.dustPureXenotime.name=Purified Xenotime Dust
+item.itemDustYttriaite.name=Yttriaite Dust
+item.itemDustTinyYttriaite.name=Tiny Pile of Yttriaite Dust
+item.itemDustSmallYttriaite.name=Small Pile of Yttriaite Dust
+item.crushedYttriaite.name=Crushed Yttriaite Ore
+item.oreRawYttriaite.name=Raw Yttriaite Ore
+item.crushedCentrifugedYttriaite.name=Centrifuged Crushed Yttriaite Ore
+item.crushedPurifiedYttriaite.name=Purified Crushed Yttriaite Ore
+item.dustImpureYttriaite.name=Impure Yttriaite Dust
+item.dustPureYttriaite.name=Purified Yttriaite Dust
+item.itemDustYttrialite.name=Yttrialite Dust
+item.itemDustTinyYttrialite.name=Tiny Pile of Yttrialite Dust
+item.itemDustSmallYttrialite.name=Small Pile of Yttrialite Dust
+item.crushedYttrialite.name=Crushed Yttrialite Ore
+item.oreRawYttrialite.name=Raw Yttrialite Ore
+item.crushedCentrifugedYttrialite.name=Centrifuged Crushed Yttrialite Ore
+item.crushedPurifiedYttrialite.name=Purified Crushed Yttrialite Ore
+item.dustImpureYttrialite.name=Impure Yttrialite Dust
+item.dustPureYttrialite.name=Purified Yttrialite Dust
+item.itemDustYttrocerite.name=Yttrocerite Dust
+item.itemDustTinyYttrocerite.name=Tiny Pile of Yttrocerite Dust
+item.itemDustSmallYttrocerite.name=Small Pile of Yttrocerite Dust
+item.crushedYttrocerite.name=Crushed Yttrocerite Ore
+item.oreRawYttrocerite.name=Raw Yttrocerite Ore
+item.crushedCentrifugedYttrocerite.name=Centrifuged Crushed Yttrocerite Ore
+item.crushedPurifiedYttrocerite.name=Purified Crushed Yttrocerite Ore
+item.dustImpureYttrocerite.name=Impure Yttrocerite Dust
+item.dustPureYttrocerite.name=Purified Yttrocerite Dust
+item.itemDustZircon.name=Zircon Dust
+item.itemDustTinyZircon.name=Tiny Pile of Zircon Dust
+item.itemDustSmallZircon.name=Small Pile of Zircon Dust
+item.crushedZircon.name=Crushed Zircon Ore
+item.oreRawZircon.name=Raw Zircon Ore
+item.crushedCentrifugedZircon.name=Centrifuged Crushed Zircon Ore
+item.crushedPurifiedZircon.name=Purified Crushed Zircon Ore
+item.dustImpureZircon.name=Impure Zircon Dust
+item.dustPureZircon.name=Purified Zircon Dust
+item.itemDustPolycrase.name=Polycrase Dust
+item.itemDustTinyPolycrase.name=Tiny Pile of Polycrase Dust
+item.itemDustSmallPolycrase.name=Small Pile of Polycrase Dust
+item.crushedPolycrase.name=Crushed Polycrase Ore
+item.oreRawPolycrase.name=Raw Polycrase Ore
+item.crushedCentrifugedPolycrase.name=Centrifuged Crushed Polycrase Ore
+item.crushedPurifiedPolycrase.name=Purified Crushed Polycrase Ore
+item.dustImpurePolycrase.name=Impure Polycrase Dust
+item.dustPurePolycrase.name=Purified Polycrase Dust
+item.itemDustZircophyllite.name=Zircophyllite Dust
+item.itemDustTinyZircophyllite.name=Tiny Pile of Zircophyllite Dust
+item.itemDustSmallZircophyllite.name=Small Pile of Zircophyllite Dust
+item.crushedZircophyllite.name=Crushed Zircophyllite Ore
+item.oreRawZircophyllite.name=Raw Zircophyllite Ore
+item.crushedCentrifugedZircophyllite.name=Centrifuged Crushed Zircophyllite Ore
+item.crushedPurifiedZircophyllite.name=Purified Crushed Zircophyllite Ore
+item.dustImpureZircophyllite.name=Impure Zircophyllite Dust
+item.dustPureZircophyllite.name=Purified Zircophyllite Dust
+item.itemDustZirkelite.name=Zirkelite Dust
+item.itemDustTinyZirkelite.name=Tiny Pile of Zirkelite Dust
+item.itemDustSmallZirkelite.name=Small Pile of Zirkelite Dust
+item.crushedZirkelite.name=Crushed Zirkelite Ore
+item.oreRawZirkelite.name=Raw Zirkelite Ore
+item.crushedCentrifugedZirkelite.name=Centrifuged Crushed Zirkelite Ore
+item.crushedPurifiedZirkelite.name=Purified Crushed Zirkelite Ore
+item.dustImpureZirkelite.name=Impure Zirkelite Dust
+item.dustPureZirkelite.name=Purified Zirkelite Dust
+item.itemDustLanthaniteLa.name=Lanthanite (La) Dust
+item.itemDustTinyLanthaniteLa.name=Tiny Pile of Lanthanite (La) Dust
+item.itemDustSmallLanthaniteLa.name=Small Pile of Lanthanite (La) Dust
+item.crushedLanthaniteLa.name=Crushed Lanthanite (La) Ore
+item.oreRawLanthaniteLa.name=Raw Lanthanite (La) Ore
+item.crushedCentrifugedLanthaniteLa.name=Centrifuged Crushed Lanthanite (La) Ore
+item.crushedPurifiedLanthaniteLa.name=Purified Crushed Lanthanite (La) Ore
+item.dustImpureLanthaniteLa.name=Impure Lanthanite (La) Dust
+item.dustPureLanthaniteLa.name=Purified Lanthanite (La) Dust
+item.itemDustLanthaniteCe.name=Lanthanite (Ce) Dust
+item.itemDustTinyLanthaniteCe.name=Tiny Pile of Lanthanite (Ce) Dust
+item.itemDustSmallLanthaniteCe.name=Small Pile of Lanthanite (Ce) Dust
+item.crushedLanthaniteCe.name=Crushed Lanthanite (Ce) Ore
+item.oreRawLanthaniteCe.name=Raw Lanthanite (Ce) Ore
+item.crushedCentrifugedLanthaniteCe.name=Centrifuged Crushed Lanthanite (Ce) Ore
+item.crushedPurifiedLanthaniteCe.name=Purified Crushed Lanthanite (Ce) Ore
+item.dustImpureLanthaniteCe.name=Impure Lanthanite (Ce) Dust
+item.dustPureLanthaniteCe.name=Purified Lanthanite (Ce) Dust
+item.itemDustLanthaniteNd.name=Lanthanite (Nd) Dust
+item.itemDustTinyLanthaniteNd.name=Tiny Pile of Lanthanite (Nd) Dust
+item.itemDustSmallLanthaniteNd.name=Small Pile of Lanthanite (Nd) Dust
+item.crushedLanthaniteNd.name=Crushed Lanthanite (Nd) Ore
+item.oreRawLanthaniteNd.name=Raw Lanthanite (Nd) Ore
+item.crushedCentrifugedLanthaniteNd.name=Centrifuged Crushed Lanthanite (Nd) Ore
+item.crushedPurifiedLanthaniteNd.name=Purified Crushed Lanthanite (Nd) Ore
+item.dustImpureLanthaniteNd.name=Impure Lanthanite (Nd) Dust
+item.dustPureLanthaniteNd.name=Purified Lanthanite (Nd) Dust
+item.itemDustAgarditeY.name=Agardite (Y) Dust
+item.itemDustTinyAgarditeY.name=Tiny Pile of Agardite (Y) Dust
+item.itemDustSmallAgarditeY.name=Small Pile of Agardite (Y) Dust
+item.crushedAgarditeY.name=Crushed Agardite (Y) Ore
+item.oreRawAgarditeY.name=Raw Agardite (Y) Ore
+item.crushedCentrifugedAgarditeY.name=Centrifuged Crushed Agardite (Y) Ore
+item.crushedPurifiedAgarditeY.name=Purified Crushed Agardite (Y) Ore
+item.dustImpureAgarditeY.name=Impure Agardite (Y) Dust
+item.dustPureAgarditeY.name=Purified Agardite (Y) Dust
+item.itemDustAgarditeCd.name=Agardite (Cd) Dust
+item.itemDustTinyAgarditeCd.name=Tiny Pile of Agardite (Cd) Dust
+item.itemDustSmallAgarditeCd.name=Small Pile of Agardite (Cd) Dust
+item.crushedAgarditeCd.name=Crushed Agardite (Cd) Ore
+item.oreRawAgarditeCd.name=Raw Agardite (Cd) Ore
+item.crushedCentrifugedAgarditeCd.name=Centrifuged Crushed Agardite (Cd) Ore
+item.crushedPurifiedAgarditeCd.name=Purified Crushed Agardite (Cd) Ore
+item.dustImpureAgarditeCd.name=Impure Agardite (Cd) Dust
+item.dustPureAgarditeCd.name=Purified Agardite (Cd) Dust
+item.itemDustAgarditeLa.name=Agardite (La) Dust
+item.itemDustTinyAgarditeLa.name=Tiny Pile of Agardite (La) Dust
+item.itemDustSmallAgarditeLa.name=Small Pile of Agardite (La) Dust
+item.crushedAgarditeLa.name=Crushed Agardite (La) Ore
+item.oreRawAgarditeLa.name=Raw Agardite (La) Ore
+item.crushedCentrifugedAgarditeLa.name=Centrifuged Crushed Agardite (La) Ore
+item.crushedPurifiedAgarditeLa.name=Purified Crushed Agardite (La) Ore
+item.dustImpureAgarditeLa.name=Impure Agardite (La) Dust
+item.dustPureAgarditeLa.name=Purified Agardite (La) Dust
+item.itemDustAgarditeNd.name=Agardite (Nd) Dust
+item.itemDustTinyAgarditeNd.name=Tiny Pile of Agardite (Nd) Dust
+item.itemDustSmallAgarditeNd.name=Small Pile of Agardite (Nd) Dust
+item.crushedAgarditeNd.name=Crushed Agardite (Nd) Ore
+item.oreRawAgarditeNd.name=Raw Agardite (Nd) Ore
+item.crushedCentrifugedAgarditeNd.name=Centrifuged Crushed Agardite (Nd) Ore
+item.crushedPurifiedAgarditeNd.name=Purified Crushed Agardite (Nd) Ore
+item.dustImpureAgarditeNd.name=Impure Agardite (Nd) Dust
+item.dustPureAgarditeNd.name=Purified Agardite (Nd) Dust
+item.itemDustHibonite.name=Hibonite Dust
+item.itemDustTinyHibonite.name=Tiny Pile of Hibonite Dust
+item.itemDustSmallHibonite.name=Small Pile of Hibonite Dust
+item.crushedHibonite.name=Crushed Hibonite Ore
+item.oreRawHibonite.name=Raw Hibonite Ore
+item.crushedCentrifugedHibonite.name=Centrifuged Crushed Hibonite Ore
+item.crushedPurifiedHibonite.name=Purified Crushed Hibonite Ore
+item.dustImpureHibonite.name=Impure Hibonite Dust
+item.dustPureHibonite.name=Purified Hibonite Dust
+item.itemDustCerite.name=Cerite Dust
+item.itemDustTinyCerite.name=Tiny Pile of Cerite Dust
+item.itemDustSmallCerite.name=Small Pile of Cerite Dust
+item.crushedCerite.name=Crushed Cerite Ore
+item.oreRawCerite.name=Raw Cerite Ore
+item.crushedCentrifugedCerite.name=Centrifuged Crushed Cerite Ore
+item.crushedPurifiedCerite.name=Purified Crushed Cerite Ore
+item.dustImpureCerite.name=Impure Cerite Dust
+item.dustPureCerite.name=Purified Cerite Dust
+item.itemDustFluorcaphite.name=Fluorcaphite Dust
+item.itemDustTinyFluorcaphite.name=Tiny Pile of Fluorcaphite Dust
+item.itemDustSmallFluorcaphite.name=Small Pile of Fluorcaphite Dust
+item.crushedFluorcaphite.name=Crushed Fluorcaphite Ore
+item.oreRawFluorcaphite.name=Raw Fluorcaphite Ore
+item.crushedCentrifugedFluorcaphite.name=Centrifuged Crushed Fluorcaphite Ore
+item.crushedPurifiedFluorcaphite.name=Purified Crushed Fluorcaphite Ore
+item.dustImpureFluorcaphite.name=Impure Fluorcaphite Dust
+item.dustPureFluorcaphite.name=Purified Fluorcaphite Dust
+item.itemDustFlorencite.name=Florencite Dust
+item.itemDustTinyFlorencite.name=Tiny Pile of Florencite Dust
+item.itemDustSmallFlorencite.name=Small Pile of Florencite Dust
+item.crushedFlorencite.name=Crushed Florencite Ore
+item.oreRawFlorencite.name=Raw Florencite Ore
+item.crushedCentrifugedFlorencite.name=Centrifuged Crushed Florencite Ore
+item.crushedPurifiedFlorencite.name=Purified Crushed Florencite Ore
+item.dustImpureFlorencite.name=Impure Florencite Dust
+item.dustPureFlorencite.name=Purified Florencite Dust
+item.itemDustCryoliteF.name=Cryolite (F) Dust
+item.itemDustTinyCryoliteF.name=Tiny Pile of Cryolite (F) Dust
+item.itemDustSmallCryoliteF.name=Small Pile of Cryolite (F) Dust
+item.crushedCryoliteF.name=Crushed Cryolite (F) Ore
+item.oreRawCryoliteF.name=Raw Cryolite (F) Ore
+item.crushedCentrifugedCryoliteF.name=Centrifuged Crushed Cryolite (F) Ore
+item.crushedPurifiedCryoliteF.name=Purified Crushed Cryolite (F) Ore
+item.dustImpureCryoliteF.name=Impure Cryolite (F) Dust
+item.dustPureCryoliteF.name=Purified Cryolite (F) Dust
+item.itemDustTinyYellorium.name=Tiny Pile of Yellorium Dust
+item.itemDustSmallYellorium.name=Small Pile of Yellorium Dust
+item.crushedYellorium.name=Crushed Yellorium Ore
+item.oreRawYellorium.name=Raw Yellorium Ore
+item.crushedCentrifugedYellorium.name=Centrifuged Crushed Yellorium Ore
+item.crushedPurifiedYellorium.name=Purified Crushed Yellorium Ore
+item.dustImpureYellorium.name=Impure Yellorium Dust
+item.dustPureYellorium.name=Purified Yellorium Dust
+
+//Shards
+item.itemDrained.name=Drained Shard
+item.itemAer.name=Aer Shard
+item.itemIgnis.name=Ignis Shard
+item.itemTerra.name=Terra Shard
+item.itemAqua.name=Aqua Shard
+item.itemDustInfusedAir.name=Infused Air Dust
+item.itemDustInfusedFire.name=Infused Fire Dust
+item.itemDustInfusedEarth.name=Infused Earth Dust
+item.itemDustInfusedWater.name=Infused Water Dust
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium Carbonate Dust
+item.itemDustSmallLithiumCarbonate.name=Small Pile of Lithium Carbonate Dust
+item.itemDustTinyLithiumCarbonate.name=Tiny Pile of Lithium Carbonate Dust
+item.itemDustLithiumPeroxide.name=Lithium Peroxide Dust
+item.itemDustSmallLithiumPeroxide.name=Small Pile of Lithium Peroxide Dust
+item.itemDustTinyLithiumPeroxide.name=Tiny Pile of Lithium Peroxide Dust
+item.itemDustLithiumHydroxide.name=Lithium Hydroxide Dust
+item.itemDustSmallLithiumHydroxide.name=Small Pile of Lithium Hydroxide Dust
+item.itemDustTinyLithiumHydroxide.name=Tiny Pile of Lithium Hydroxide Dust
+item.itemDustCalciumHydroxide.name=Hydrated Lime Dust
+item.itemDustSmallCalciumHydroxide.name=Small Pile of Hydrated Lime Dust
+item.itemDustTinyCalciumHydroxide.name=Tiny Pile of Hydrated Lime Dust
+item.itemDustCalciumCarbonate.name=Calcium Carbonate Dust
+item.itemDustSmallCalciumCarbonate.name=Small Pile of Calcium Carbonate Dust
+item.itemDustTinyCalciumCarbonate.name=Tiny Pile of Calcium Carbonate Dust
+item.itemDustGypsum.name=Calcium Sulfate (Gypsum) Dust
+item.itemDustSmallGypsum.name=Small Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustTinyGypsum.name=Tiny Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustSmallLi2CO3CaOH2.name=Small Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustTinyLi2CO3CaOH2.name=Tiny Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustLi2BeF4.name=Li2BeF4 Fuel Compound Dust
+item.itemDustSmallLi2BeF4.name=Small Pile of Li2BeF4 Fuel Compound Dust
+item.itemDustTinyLi2BeF4.name=Tiny Pile of Li2BeF4 Fuel Compound Dust
+item.Li2BeF4.name=Li2BeF4 Cell
+item.itemCircuitLFTR.name=§aControl Circuit
+item.itemZirconiumPellet.name=Zirconium Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4 Dust
+item.itemDustSmallZrCl4.name=Small Pile of ZrCl4 Dust
+item.itemDustTinyZrCl4.name=Tiny Pile of ZrCl4 Dust
+item.itemDustCookedZrCl4.name=Cooked ZrCl4 Dust
+item.itemDustSmallCookedZrCl4.name=Small Pile of Cooked ZrCl4 Dust
+item.itemDustTinyCookedZrCl4.name=Tiny Pile of Cooked ZrCl4 Dust
+item.itemDustUN18Fertiliser.name=UN-18 Fertiliser Dust
+item.itemDustSmallUN18Fertiliser.name=Small Pile of UN-18 Fertiliser Dust
+item.itemDustTinyUN18Fertiliser.name=Tiny Pile of UN-18 Fertiliser Dust
+item.itemDustUN32Fertiliser.name=UN-32 Fertiliser Dust
+item.itemDustSmallUN32Fertiliser.name=Small Pile of UN-32 Fertiliser Dust
+item.itemDustTinyUN32Fertiliser.name=Tiny Pile of UN-32 Fertiliser Dust
+item.itemCustomMetaCover.miscutils.GtMachineCasings=%s Machine Plate Cover
+item.itemGregtechPump.tooltip.0=Cannot drain any other standard fluid container block
+item.itemGregtechPump.tooltip.1=Cannot be emptied via RMB, use inside a tank with GUI
+item.itemGregtechPump.tooltip.2=This is technically just a fancy fluid cell
+item.itemGregtechPump.tooltip.3=No Fluids Contained
+item.itemBaseEuItem.tooltip.0=§eElectric
+item.itemBaseEuItem.tooltip.1=Contains %d EU Tier: %d
+item.itemBaseEuItem.tooltip.2=Empty. You should recycle it properly.
+item.itemBaseEuItem.tooltip.3=%d / %d EU - Voltage: %d
+item.itemDebugClearing.name=Debug Square [%d]
+item.itemDebugClearing.0.tooltip=Mode: Clear
+item.itemDebugClearing.1.tooltip=Mode: Fill
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium Multipick
+item.AluminiumMultispade.name=Aluminium Multispade
+item.BerylliumMultispade.name=Beryllium Multispade
+item.BismuthMultispade.name=Bismuth Multispade
+item.CarbonMultispade.name=Carbon Multispade
+item.ChromeMultipick.name=Chrome Multipick
+item.ChromeMultispade.name=Chrome Multispade
+item.CobaltMultipick.name=Cobalt Multipick
+item.CobaltMultispade.name=Cobalt Multispade
+item.GoldMultispade.name=Gold Multispade
+item.IridiumMultipick.name=Iridium Multipick
+item.IridiumMultispade.name=Iridium Multispade
+item.IronMultipick.name=Iron Multipick
+item.IronMultispade.name=Iron Multispade
+item.LeadMultispade.name=Lead Multispade
+item.ManganeseMultipick.name=Manganese Multipick
+item.ManganeseMultispade.name=Manganese Multispade
+item.MolybdenumMultipick.name=Molybdenum Multipick
+item.MolybdenumMultispade.name=Molybdenum Multispade
+item.NeodymiumMultipick.name=Neodymium Multipick
+item.NeodymiumMultispade.name=Neodymium Multispade
+item.NeutroniumMultipick.name=Neutronium Multipick
+item.NeutroniumMultispade.name=Neutronium Multispade
+item.NickelMultispade.name=Nickel Multispade
+item.OsmiumMultipick.name=Osmium Multipick
+item.OsmiumMultispade.name=Osmium Multispade
+item.PalladiumMultipick.name=Palladium Multipick
+item.PalladiumMultispade.name=Palladium Multispade
+item.PlatinumMultispade.name=Platinum Multispade
+item.Plutonium241Multipick.name=Plutonium 241 Multipick
+item.Plutonium241Multispade.name=Plutonium 241 Multispade
+item.SilverMultispade.name=Silver Multispade
+item.ThoriumMultipick.name=Thorium Multipick
+item.ThoriumMultispade.name=Thorium Multispade
+item.TitaniumMultipick.name=Titanium Multipick
+item.TitaniumMultispade.name=Titanium Multispade
+item.TungstenMultipick.name=Tungsten Multipick
+item.TungstenMultispade.name=Tungsten Multispade
+item.Uranium235Multipick.name=Uranium 235 Multipick
+item.Uranium235Multispade.name=Uranium 235 Multispade
+item.DarkSteelMultipick.name=Dark Steel Multipick
+item.DarkSteelMultispade.name=Dark Steel Multispade
+item.DuraniumMultipick.name=Duranium Multipick
+item.DuraniumMultispade.name=Duranium Multispade
+item.InfusedGoldMultispade.name=Infused Gold Multispade
+item.NaquadahMultipick.name=Naquadah Multipick
+item.NaquadahMultispade.name=Naquadah Multispade
+item.NaquadahAlloyMultipick.name=Naquadah Alloy Multipick
+item.NaquadahAlloyMultispade.name=Naquadah Alloy Multispade
+item.NaquadriaMultipick.name=Naquadria Multipick
+item.NaquadriaMultispade.name=Naquadria Multispade
+item.TritaniumMultipick.name=Tritanium Multipick
+item.TritaniumMultispade.name=Tritanium Multispade
+item.OsmiridiumMultipick.name=Osmiridium Multipick
+item.OsmiridiumMultispade.name=Osmiridium Multispade
+item.BrassMultispade.name=Brass Multispade
+item.BronzeMultipick.name=Bronze Multipick
+item.BronzeMultispade.name=Bronze Multispade
+item.CupronickelMultispade.name=Cupronickel Multispade
+item.ElectrumMultispade.name=Electrum Multispade
+item.InvarMultipick.name=Invar Multipick
+item.InvarMultispade.name=Invar Multispade
+item.KanthalMultispade.name=Kanthal Multispade
+item.MagnaliumMultipick.name=Magnalium Multipick
+item.MagnaliumMultispade.name=Magnalium Multispade
+item.NichromeMultispade.name=Nichrome Multispade
+item.PigIronMultipick.name=Pig Iron Multipick
+item.PigIronMultispade.name=Pig Iron Multispade
+item.PolycaprolactamMultispade.name=Polycaprolactam Multispade
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene Multispade
+item.NickelZincFerriteMultispade.name=Nickel-Zinc Ferrite Multispade
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene Sulfide Multispade
+item.StainlessSteelMultipick.name=Stainless Steel Multipick
+item.StainlessSteelMultispade.name=Stainless Steel Multispade
+item.SteelMultipick.name=Steel Multipick
+item.SteelMultispade.name=Steel Multispade
+item.TinAlloyMultispade.name=Tin Alloy Multispade
+item.UltimetMultipick.name=Ultimet Multipick
+item.UltimetMultispade.name=Ultimet Multispade
+item.WroughtIronMultipick.name=Wrought Iron Multipick
+item.WroughtIronMultispade.name=Wrought Iron Multispade
+item.SterlingSilverMultipick.name=Sterling Silver Multipick
+item.SterlingSilverMultispade.name=Sterling Silver Multispade
+item.RoseGoldMultipick.name=Rose Gold Multipick
+item.RoseGoldMultispade.name=Rose Gold Multispade
+item.BlackBronzeMultipick.name=Black Bronze Multipick
+item.BlackBronzeMultispade.name=Black Bronze Multispade
+item.BismuthBronzeMultipick.name=Bismuth Bronze Multipick
+item.BismuthBronzeMultispade.name=Bismuth Bronze Multispade
+item.BlackSteelMultipick.name=Black Steel Multipick
+item.BlackSteelMultispade.name=Black Steel Multispade
+item.RedSteelMultipick.name=Red Steel Multipick
+item.RedSteelMultispade.name=Red Steel Multispade
+item.BlueSteelMultipick.name=Blue Steel Multipick
+item.BlueSteelMultispade.name=Blue Steel Multispade
+item.DamascusSteelMultipick.name=Damascus Steel Multipick
+item.DamascusSteelMultispade.name=Damascus Steel Multispade
+item.MithrilMultispade.name=Mithril Multispade
+item.CobaltBrassMultipick.name=Cobalt Brass Multipick
+item.CobaltBrassMultispade.name=Cobalt Brass Multispade
+item.ThaumiumMultipick.name=Thaumium Multipick
+item.ThaumiumMultispade.name=Thaumium Multispade
+item.HSSGMultipick.name=HSS-G Multipick
+item.HSSGMultispade.name=HSS-G Multispade
+item.HSSEMultipick.name=HSS-E Multipick
+item.HSSEMultispade.name=HSS-E Multispade
+item.HSSSMultipick.name=HSS-S Multipick
+item.HSSSMultispade.name=HSS-S Multispade
+item.HastelloyC276Multipick.name=Hastelloy-C276 Multipick
+item.HastelloyC276Multispade.name=Hastelloy-C276 Multispade
+item.HastelloyNMultipick.name=Hastelloy-N Multipick
+item.HastelloyNMultispade.name=Hastelloy-N Multispade
+item.HastelloyWMultipick.name=Hastelloy-W Multipick
+item.HastelloyWMultispade.name=Hastelloy-W Multispade
+item.HastelloyXMultipick.name=Hastelloy-X Multipick
+item.HastelloyXMultispade.name=Hastelloy-X Multispade
+item.Incoloy020Multipick.name=Incoloy-020 Multipick
+item.Incoloy020Multispade.name=Incoloy-020 Multispade
+item.IncoloyDSMultipick.name=Incoloy-DS Multipick
+item.IncoloyDSMultispade.name=Incoloy-DS Multispade
+item.IncoloyMA956Multipick.name=Incoloy-MA956 Multipick
+item.IncoloyMA956Multispade.name=Incoloy-MA956 Multispade
+item.Inconel625Multipick.name=Inconel-625 Multipick
+item.Inconel625Multispade.name=Inconel-625 Multispade
+item.Inconel690Multipick.name=Inconel-690 Multipick
+item.Inconel690Multispade.name=Inconel-690 Multispade
+item.Inconel792Multipick.name=Inconel-792 Multipick
+item.Inconel792Multispade.name=Inconel-792 Multispade
+item.GrisiumMultipick.name=Grisium Multipick
+item.GrisiumMultispade.name=Grisium Multispade
+item.Tantalloy60Multipick.name=Tantalloy-60 Multipick
+item.Tantalloy60Multispade.name=Tantalloy-60 Multispade
+item.Tantalloy61Multipick.name=Tantalloy-61 Multipick
+item.Tantalloy61Multispade.name=Tantalloy-61 Multispade
+item.StaballoyMultipick.name=Staballoy Multipick
+item.StaballoyMultispade.name=Staballoy Multispade
+item.QuantumMultipick.name=Quantum Multipick
+item.QuantumMultispade.name=Quantum Multispade
+item.PotinMultipick.name=Potin Multipick
+item.PotinMultispade.name=Potin Multispade
+item.TumbagaMultipick.name=Tumbaga Multipick
+item.TumbagaMultispade.name=Tumbaga Multispade
+item.TaloniteMultipick.name=Talonite Multipick
+item.TaloniteMultispade.name=Talonite Multispade
+item.StelliteMultipick.name=Stellite Multipick
+item.StelliteMultispade.name=Stellite Multispade
+item.TungstenCarbideMultipick.name=Tungsten Carbide Multipick
+item.TungstenCarbideMultispade.name=Tungsten Carbide Multispade
+item.TantalumCarbideMultipick.name=Tantalum Carbide Multipick
+item.TantalumCarbideMultispade.name=Tantalum Carbide Multispade
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=Clay Plate
+item.itemPlateDoubleClay.name=Double Clay Plate
+item.itemPlateLithium.name=Lithium Plate
+item.itemPlateDoubleEuropium.name=Double Europium Plate
+
+//Gears
+item.itemSmallGearWroughtIron.name=Small Wrought Iron Gear
+
+//Misc
+item.itemFoilUranium235.name=Uranium 235 Foil
+
+item.itemBoilerChassis_0.name=Advanced Boiler Chassis [Tier 1]
+item.itemDehydratorCoilWire_0.name=Coil Wire [EV]
+item.itemDehydratorCoil_0.name=Dehydrator Coil [EV]
+item.itemAirFilter_0.name=Air Filter
+item.itemAirFilter_1.name=Air Filter
+item.itemDragonJar.name=Dragon Capture Jar
+item.CoalGas.name=Coal Gas Cell
+item.Ethylbenzene.name=Ethylbenzene Cell
+item.Anthracene.name=Anthracene Cell
+item.Toluene.name=Toluene Cell
+item.CoalTar.name=Coal Tar Cell
+item.CoalTarOil.name=Coal Tar Oil Cell
+item.SulfuricCoalTarOil.name=Sulfuric Coal Tar Oil Cell
+item.Naphthalene.name=Naphthalene Cell
+item.itemDustPhthalicAnhydride.name=Phthalic Anhydride Dust
+item.itemDustSmallPhthalicAnhydride.name=Small Pile of Phthalic Anhydride Dust
+item.itemDustTinyPhthalicAnhydride.name=Tiny Pile of Phthalic Anhydride Dust
+item.2Ethylanthraquinone.name=2-Ethylanthraquinone Cell
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrahydroquinone Cell
+item.HydrogenPeroxide.name=Hydrogen Peroxide Cell
+item.itemDustLithiumHydroperoxide.name=Lithium Hydroperoxide Dust
+item.itemDustSmallLithiumHydroperoxide.name=Small Pile of Lithium Hydroperoxide Dust
+item.itemDustTinyLithiumHydroperoxide.name=Tiny Pile of Lithium Hydroperoxide Dust
+item.LithiumPeroxide.name=Lithium Peroxide Cell
+item.itemPotionChilly.name=Chilly Potion
+item.itemKeyBig4000DC's.name=4000DC's Big Key
+item.itemGemDull.name=Dull Gemstone
+item.itemMushroomForest.name=Forest Mushroom
+item.itemPlateVanadium.name=Vanadium Plate
+item.thekeytothecity.name=The Key to the City
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium Dust
+item.itemDustSmallSoularium.name=Small Pile of Soularium Dust
+item.itemDustTinySoularium.name=Tiny Pile of Soularium Dust
+item.itemDustRedstoneAlloy.name=Redstone Alloy Dust
+item.itemDustSmallRedstoneAlloy.name=Small Pile of Redstone Alloy Dust
+item.itemDustTinyRedstoneAlloy.name=Tiny Pile of Redstone Alloy Dust
+item.itemDustElectricalSteel.name=Electrical Steel Dust
+item.itemDustSmallElectricalSteel.name=Small Pile of Electrical Steel Dust
+item.itemDustTinyElectricalSteel.name=Tiny Pile of Electrical Steel Dust
+item.itemDustPulsatingIron.name=Pulsating Iron Dust
+item.itemDustSmallPulsatingIron.name=Small Pile of Pulsating Iron Dust
+item.itemDustTinyPulsatingIron.name=Tiny Pile of Pulsating Iron Dust
+item.itemDustEnergeticAlloy.name=Energetic Alloy Dust
+item.itemDustSmallEnergeticAlloy.name=Small Pile of Energetic Alloy Dust
+item.itemDustTinyEnergeticAlloy.name=Tiny Pile of Energetic Alloy Dust
+item.itemDustVibrantAlloy.name=Vibrant Alloy Dust
+item.itemDustSmallVibrantAlloy.name=Small Pile of Vibrant Alloy Dust
+item.itemDustTinyVibrantAlloy.name=Tiny Pile of Vibrant Alloy Dust
+item.itemDustConductiveIron.name=Conductive Iron Dust
+item.itemDustSmallConductiveIron.name=Small Pile of Conductive Iron Dust
+item.itemDustTinyConductiveIron.name=Tiny Pile of Conductive Iron Dust
+item.itemPlateSoularium.name=Soularium plate
+item.itemPlateRedstoneAlloy.name=Redstone Alloy plate
+item.itemPlateElectricalSteel.name=Electrical Steel plate
+item.itemPlatePhasedIron.name=Phased Iron plate
+item.itemPlateEnergeticAlloy.name=Energetic Alloy plate
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium plate
+item.itemPlateCyanite.name=Cyanite plate
+item.itemPlateLudicrite.name=Ludicrite plate
+item.itemPlateVoid.name=Void plate
+item.itemPlateDimensionShard.name=Dimensional Shard plate
+item.rfEUBattery.name=Universally Chargeable Battery
+item.rfEUBattery.tooltip.0=§eIC2/EU Information§7);
+item.rfEUBattery.tooltip.1=§7Tier: [§e%d§7] Current Power: [§e%d§7/EU]
+item.rfEUBattery.tooltip.2=§7Transfer Limit: [§e%d§7Eu/t] Burn Time: [§e%d§7s]
+item.rfEUBattery.tooltip.3=§cRF Information§7
+item.rfEUBattery.tooltip.4=§7Extraction Rate: [§%d§7Rf/t] Insert Rate: [§c%d§7Rf/t]
+item.rfEUBattery.tooltip.5=§7Current Charge: [§c%d§7Rf / %dRf] §c%.2f%%§7
+item.personalCloakingDevice.name=§9Personal Cloaking Device§7
+item.personalCloakingDevice.tooltip.0=§aWorn as a Belt within Baubles.§7
+item.personalCloakingDevice.tooltip.1=§aDrains 10,000EU/t to provide invisibility.§7
+item.personalCloakingDevice.tooltip.2=§6IC2/EU Information§7
+item.personalCloakingDevice.tooltip.3=§7Tier: [§e%d§7] Input Limit: [§e%d§7EU/t]
+item.personalCloakingDevice.tooltip.4=§7Current Power: [§e%d§7EU] [§e%.2f%%§7]
+item.personalCloakingDevice.tooltip.5=§7Time Remaining: [§e%d§7 seconds]
+item.personalHealingDevice.name=§9Personal Healing NanoBooster§r
+item.SlowBuildingRing.name=§eSlow Building Ring§7
+item.SlowBuildingRing.tooltip.0=§aWorn as a Ring within Baubles. Prevents you from sprinting.§7
+item.SlowBuildingRing.tooltip.1=§aMovement speed reduced to crouch speed.§7
+item.SlowBuildingRing.tooltip.2=§aPress shift while worn to toggle crouch on/off.§7
+item.itemBufferCore1.name=Energy Core [ULV].
+item.itemBufferCore2.name=Energy Core [LV].
+item.itemBufferCore3.name=Energy Core [MV].
+item.itemBufferCore4.name=Energy Core [HV].
+item.itemBufferCore5.name=Energy Core [EV].
+item.itemBufferCore6.name=Energy Core [IV].
+item.itemBufferCore7.name=Energy Core [LuV].
+item.itemBufferCore8.name=Energy Core [ZPM].
+item.itemBufferCore9.name=Energy Core [UV].
+item.itemBufferCore10.name=Energy Core [MAX].
+item.itembookgt.name=§oThermal Boiler Manual
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Disk [§cActivated§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Rainforest Oak
+tile.blockRainforestOakLeaves.name=Oak Leaves
+tile.blockRainforestOakSapling.name=Rainforest Oak Sapling
+tile.blockPineLogLog.name=Pine Log
+tile.blockPineLeaves.name=Pine Leaves
+tile.blockPineSapling.name=Pine Sapling
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Broken
+tile.blockFastArcaneAlembic.1.name=Broken
+
+//Frame Boxes
+tile.Block of Selenium.name=Block of Selenium
+tile.Selenium Frame Box.name=Selenium Frame Box
+tile.Block of Bromine.name=Block of Bromine
+tile.Block of Strontium.name=Block of Strontium
+tile.Strontium Frame Box.name=Strontium Frame Box
+tile.Block of Zirconium.name=Block of Zirconium
+tile.Zirconium Frame Box.name=Zirconium Frame Box
+tile.Block of Ruthenium.name=Block of Ruthenium
+tile.Ruthenium Frame Box.name=Ruthenium Frame Box
+tile.Block of Iodine.name=Block of Iodine
+tile.Iodine Frame Box.name=Iodine Frame Box
+tile.Block of Hafnium.name=Block of Hafnium
+tile.Hafnium Frame Box.name=Hafnium Frame Box
+tile.Block of Dysprosium.name=Block of Dysprosium
+tile.Dysprosium Frame Box.name=Dysprosium Frame Box
+tile.Block of Tellurium.name=Block of Tellurium
+tile.Tellurium Frame Box.name=Tellurium Frame Box
+tile.Block of Rhodium.name=Block of Rhodium
+tile.Rhodium Frame Box.name=Rhodium Frame Box
+tile.Block of Rhenium.name=Block of Rhenium
+tile.Rhenium Frame Box.name=Rhenium Frame Box
+tile.Block of Thallium.name=Block of Thallium
+tile.Thallium Frame Box.name=Thallium Frame Box
+tile.Block of Technetium.name=Block of Technetium
+tile.Block of Polonium.name=Block of Polonium
+tile.Block of Astatine.name=Block of Astatine
+tile.Block of Francium.name=Block of Francium
+tile.Block of Radium.name=Block of Radium
+tile.Block of Actinium.name=Block of Actinium
+tile.Block of Protactinium.name=Block of Protactinium
+tile.Block of Neptunium.name=Block of Neptunium
+tile.Block of Curium.name=Block of Curium
+tile.Block of Berkelium.name=Block of Berkelium
+tile.Block of Californium.name=Block of Californium
+tile.Block of Einsteinium.name=Block of Einsteinium
+tile.Block of Fermium.name=Block of Fermium
+tile.Block of Thorium 232.name=Block of Thorium 232
+tile.Block of Uranium 232.name=Block of Uranium 232
+tile.Block of Uranium 233.name=Block of Uranium 233
+tile.Block of Plutonium-238.name=Block of Plutonium 238
+tile.Block of Strontium-90.name=Block of Strontium 90
+tile.Block of Polonium-210.name=Block of Polonium 210
+tile.Block of Americium-241.name=Block of Americium 241
+tile.Block of Silicon Carbide.name=Block of Silicon Carbide
+tile.Silicon Carbide Frame Box.name=Silicon Carbide Frame Box
+tile.Block of Zirconium Carbide.name=Block of Zirconium Carbide
+tile.Zirconium Carbide Frame Box.name=Zirconium Carbide Frame Box
+tile.Block of Tantalum Carbide.name=Block of Tantalum Carbide
+tile.Tantalum Carbide Frame Box.name=Tantalum Carbide Frame Box
+tile.Block of Niobium Carbide.name=Block of Niobium Carbide
+tile.Niobium Carbide Frame Box.name=Niobium Carbide Frame Box
+tile.Block of Beryllium Fluoride.name=Block of Beryllium Fluoride
+tile.Block of Lithium Fluoride.name=Block of Lithium Fluoride
+tile.Block of Thorium Tetrafluoride.name=Block of Thorium Tetrafluoride
+tile.Block of Thorium Hexafluoride.name=Block of Thorium Hexafluoride
+tile.Block of Uranium Tetrafluoride.name=Block of Uranium Tetrafluoride
+tile.Block of Uranium Hexafluoride.name=Block of Uranium Hexafluoride
+tile.Block of Zirconium Tetrafluoride.name=Block of Zirconium Tetrafluoride
+tile.Block of Neptunium Hexafluoride.name=Block of Neptunium Hexafluoride
+tile.Block of Technetium Hexafluoride.name=Block of Technetium Hexafluoride
+tile.Block of Selenium Hexafluoride.name=Block of Selenium Hexafluoride
+tile.Block of LiFBeF2ZrF4U235.name=Block of LiFBeF2ZrF4U235
+tile.Block of LiFBeF2ZrF4UF4.name=Block of LiFBeF2ZrF4UF4
+tile.Block of LiFBeF2ThF4UF4.name=Block of LiFBeF2ThF4UF4
+tile.Block of Energy Crystal.name=Block of Energy Crystal
+tile.Energy Crystal Frame Box.name=Energy Crystal Frame Box
+tile.Block of Blood Steel.name=Block of Blood Steel
+tile.Blood Steel Frame Box.name=Blood Steel Frame Box
+tile.Block of Zeron-100.name=Block of Zeron-100
+tile.Zeron-100 Frame Box.name=Zeron-100 Frame Box
+tile.Block of Tumbaga.name=Block of Tumbaga
+tile.Tumbaga Frame Box.name=Tumbaga Frame Box
+tile.Block of Potin.name=Block of Potin
+tile.Potin Frame Box.name=Potin Frame Box
+tile.Block of Staballoy.name=Block of Staballoy
+tile.Staballoy Frame Box.name=Staballoy Frame Box
+tile.Block of Tantalloy-60.name=Block of Tantalloy-60
+tile.Tantalloy-60 Frame Box.name=Tantalloy-60 Frame Box
+tile.Block of Tantalloy-61.name=Block of Tantalloy-61
+tile.Tantalloy-61 Frame Box.name=Tantalloy-61 Frame Box
+tile.Block of Inconel-625.name=Block of Inconel-625
+tile.Inconel-625 Frame Box.name=Inconel-625 Frame Box
+tile.Block of Inconel-690.name=Block of Inconel-690
+tile.Inconel-690 Frame Box.name=Inconel-690 Frame Box
+tile.Block of Inconel-792.name=Block of Inconel-792
+tile.Inconel-792 Frame Box.name=Inconel-792 Frame Box
+tile.Block of Eglin Steel.name=Block of Eglin Steel
+tile.Eglin Steel Frame Box.name=Eglin Steel Frame Box
+tile.Block of Maraging Steel 250.name=Block of Maraging Steel 250
+tile.Maraging Steel 250 Frame Box.name=Maraging Steel 250 Frame Box
+tile.Block of Maraging Steel 300.name=Block of Maraging Steel 300
+tile.Maraging Steel 300 Frame Box.name=Maraging Steel 300 Frame Box
+tile.Block of Maraging Steel 350.name=Block of Maraging Steel 350
+tile.Maraging Steel 350 Frame Box.name=Maraging Steel 350 Frame Box
+tile.Block of Stellite.name=Block of Stellite
+tile.Stellite Frame Box.name=Stellite Frame Box
+tile.Block of Talonite.name=Block of Talonite
+tile.Talonite Frame Box.name=Talonite Frame Box
+tile.Block of Hastelloy-W.name=Block of Hastelloy-W
+tile.Hastelloy-W Frame Box.name=Hastelloy-W Frame Box
+tile.Block of Hastelloy-X.name=Block of Hastelloy-X
+tile.Hastelloy-X Frame Box.name=Hastelloy-X Frame Box
+tile.Block of Hastelloy-C276.name=Block of Hastelloy-C276
+tile.Hastelloy-C276 Frame Box.name=Hastelloy-C276 Frame Box
+tile.Block of Hastelloy-N.name=Block of Hastelloy-N
+tile.Hastelloy-N Frame Box.name=Hastelloy-N Frame Box
+tile.Block of Incoloy-020.name=Block of Incoloy-020
+tile.Incoloy-020 Frame Box.name=Incoloy-020 Frame Box
+tile.Block of Incoloy-DS.name=Block of Incoloy-DS
+tile.Incoloy-DS Frame Box.name=Incoloy-DS Frame Box
+tile.Block of Incoloy-MA956.name=Block of Incoloy-MA956
+tile.Incoloy-MA956 Frame Box.name=Incoloy-MA956 Frame Box
+tile.Block of Grisium.name=Block of Grisium
+tile.Grisium Frame Box.name=Grisium Frame Box
+tile.Block of Trinium.name=Block of Trinium
+tile.Block of Refined Trinium.name=Block of Refined Trinium
+tile.Block of Trinium Titanium Alloy.name=Block of Trinium Titanium Alloy
+tile.Trinium Titanium Alloy Frame Box.name=Trinium Titanium Alloy Frame Box
+tile.Block of Trinium Naquadah Alloy.name=Block of Trinium Naquadah Alloy
+tile.Block of Trinium Naquadah Carbonite.name=Block of Trinium Naquadah Carbonite
+tile.Trinium Naquadah Carbonite Frame Box.name=Trinium Naquadah Carbonite Frame Box
+tile.Block of Quantum.name=Block of Quantum
+tile.Quantum Frame Box.name=Quantum Frame Box
+
+//Ores
+tile.OreFluoriteF.name=Fluorite (F) Ore
+tile.OreCrocoite.name=Crocoite Ore
+tile.OreGeikielite.name=Geikielite Ore
+tile.OreNichromite.name=Nichromite Ore
+tile.OreTitanite.name=Titanite Ore
+tile.OreZimbabweite.name=Zimbabweite Ore
+tile.OreZirconolite.name=Zirconolite Ore
+tile.OreGadoliniteCe.name=Gadolinite (Ce) Ore
+tile.OreGadoliniteY.name=Gadolinite (Y) Ore
+tile.OreLepersonnite.name=Lepersonnite Ore
+tile.OreSamarskiteY.name=Samarskite (Y) Ore
+tile.OreSamarskiteYb.name=Samarskite (Yb) Ore
+tile.OreXenotime.name=Xenotime Ore
+tile.OreYttriaite.name=Yttriaite Ore
+tile.OreYttrialite.name=Yttrialite Ore
+tile.OreYttrocerite.name=Yttrocerite Ore
+tile.OreZircon.name=Zircon Ore
+tile.OrePolycrase.name=Polycrase Ore
+tile.OreZircophyllite.name=Zircophyllite Ore
+tile.OreZirkelite.name=Zirkelite Ore
+tile.OreLanthaniteLa.name=Lanthanite (La) Ore
+tile.OreLanthaniteCe.name=Lanthanite (Ce) Ore
+tile.OreLanthaniteNd.name=Lanthanite (Nd) Ore
+tile.OreAgarditeY.name=Agardite (Y) Ore
+tile.OreAgarditeCd.name=Agardite (Cd) Ore
+tile.OreAgarditeLa.name=Agardite (La) Ore
+tile.OreAgarditeNd.name=Agardite (Nd) Ore
+tile.OreHibonite.name=Hibonite Ore
+tile.OreCerite.name=Cerite Ore
+tile.OreFluorcaphite.name=Fluorcaphite Ore
+tile.OreFlorencite.name=Florencite Ore
+tile.OreCryoliteF.name=Cryolite (F) Ore
+
+//Misc
+tile.blockMFEffect.name=Special
+tile.fluidBlockSludge.name=Sludge
+tile.blockWorkbenchGT.name=Workbench
+tile.blockWorkbenchGTAdvanced.name=Advanced Workbench
+tile.blockHeliumGenerator.name=Helium Generator
+tile.blockFirePit.name=Fire Pit
+tile.blockFishTrap.name=Fish Catcher
+tile.blockInfiniteFluidTank.name=Infinite Fluid Tank
+tile.blockMiningExplosives.name=Mining Explosives
+tile.blockHellFire.name=Hellish Fire
+tile.blockProjectBench.name=Project Table
+tile.blockTradeBench.name=Trade Bench
+tile.blockModularity.name=Modularity Bench
+tile.blockBlackGate.name=Wither Cage
+tile.blockTankXpConverter.name=Experience Converter
+
+//Everglades Blocks
+tile.blockDarkWorldPortal.name=A Glimpse of the Future
+tile.blockDarkWorldGround.name=Unstable Earth
+tile.blockDarkWorldGround2.name=Polluted Soil
+tile.blockDarkWorldGround2.2.name=Highly Polluted Soil
+tile.blockDarkWorldPortalFrame.name=Containment Frame
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=Strengthened Mining Pipe
+tile.blockMiningHeadFake.name=Bedrock Drill
+item.itemPlateMeatRaw.name=Fleshy Panel
+tile.Block of MeatRaw.name=Block of Raw Meat
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ThF4UF4]
+item.BurntLiFBeF2ZrF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4UF4]
+item.BurntLiFBeF2ZrF4U235.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4U235]
+item.itemBigEgg.name= ounce Chicken Egg
+item.itemPlateSodium.name=Sodium Plate
+
+item.itemNuggetPromethium.name=Promethium Nugget
+item.itemIngotPromethium.name=Promethium Ingot
+item.itemDustSmallPromethium.name=Small Pile of Promethium
+item.itemDustTinyPromethium.name=Tiny Pile of Promethium
+item.itemDustPromethium.name=Promethium Dust
+tile.Block of Promethium.name=Block of Promethium
+
+item.itemCellAmericium241.name=Americium 241 Cell
+item.itemCellPolonium210.name=Polonium 210 Cell
+item.itemCellStrontium90.name=Strontium 90 Cell
+item.itemCellPlutonium238.name=Plutonium 238 Cell
+
+entity.MiningCharge.name=Mining Charge
+entity.throwablePotionSulfuric.name=Flask of Sulfuric Acid
+entity.throwablePotionHydrofluoric.name=Flask of Hydrofluoric Acid
+entity.toxinBall.name=Toxin globule
+entity.plasmaBolt.name=Plasma
+entity.bigChickenFriendly.name=Giant Chicken
+
+//Added 26/6/18
+tile.OreTrinium.name=Trinium Ore
+item.crushedTrinium.name=Crushed Trinium Ore
+item.crushedCentrifugedTrinium.name=Centrifuged Crushed Trinium Ore
+item.crushedPurifiedTrinium.name=Purified Crushed Trinium Ore
+item.dustImpureTrinium.name=Impure Trinium Dust
+item.dustPureTrinium.name=Purified Trinium Dust
+
+//Added 1/7/18
+entity.WiseVillager.name=Wise Villager
+tile.blockMobSpawnerEx.0.name=Monster Spawner
+tile.blockMobSpawnerEx.1.name=Monster Spawner
+tile.blockMobSpawnerEx.2.name=Monster Spawner
+tile.blockMobSpawnerEx.3.name=Monster Spawner
+tile.blockMobSpawnerEx.4.name=Monster Spawner
+tile.blockMobSpawnerEx.5.name=Monster Spawner
+tile.blockMobSpawnerEx.6.name=Monster Spawner
+tile.blockMobSpawnerEx.7.name=Monster Spawner
+tile.blockMobSpawnerEx.8.name=Monster Spawner
+tile.blockMobSpawnerEx.9.name=Monster Spawner
+tile.blockMobSpawnerEx.10.name=Monster Spawner
+tile.blockMobSpawnerEx.11.name=Monster Spawner
+tile.blockMobSpawnerEx.12.name=Monster Spawner
+tile.blockMobSpawnerEx.13.name=Monster Spawner
+tile.blockMobSpawnerEx.14.name=Monster Spawner
+tile.blockMobSpawnerEx.15.name=Monster Spawner
+description.villager.profession.miscutils.banker=Banker
+description.villager.profession.miscutils.technician=GT Technician
+description.villager.profession.miscutils.trader=Ore Trader
+description.villager.profession.miscutils.aboriginal=Native Australian
+
+//Added 23/8/18
+item.itemHatTinFoil.name=Tin Foil Hat
+
+//Added 13/9/18
+entity.Aboriginal.name=Native
+entity.miscutils.constructStaballoy.name=Staballoy Construct
+entity.miscutils.sickBlaze.name=Infected Zealot
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.Formaldehyde.name=Formaldehyde Cell
+item.RocketFuelMixA.name=H8N4C2O4 Rocket Fuel Cell
+item.RocketFuelMixB.name=RP-1 Rocket Fuel Cell
+item.RocketFuelMixC.name=CN3H7O3 Rocket Fuel Cell
+item.RocketFuelMixD.name=Dense Hydrazine Rocket Fuel Cell
+item.RP1Fuel.name=RP-1 Fuel Cell
+item.Monomethylhydrazine.name=Monomethylhydrazine Cell
+item.Hydrazine.name=Hydrazine Cell
+item.NitrogenTetroxide.name=Nitrogen Tetroxide Cell
+item.NitrousOxide.name=Nitrous Oxide Cell
+item.AmmoniumNitrateSlurry.name=Ammonium Nitrate Slurry Cell
+item.Kerosene.name=Kerosene Cell
+item.LiquidOxygen.name=Liquid Oxygen Cell [LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=Irarsite Ore
+item.crushedIrarsite.name=Crushed Irarsite Ore
+item.oreRawIrarsite.name=Raw Irarsite Ore
+item.crushedCentrifugedIrarsite.name=Centrifuged Crushed Irarsite Ore
+item.crushedPurifiedIrarsite.name=Purified Crushed Irarsite Ore
+item.dustImpureIrarsite.name=Impure Irarsite Dust
+item.dustPureIrarsite.name=Purified Irarsite Dust
+item.itemDustIrarsite.name=Irarsite Dust
+item.itemDustTinyIrarsite.name=Tiny Pile of Irarsite Dust
+item.itemDustSmallIrarsite.name=Small Pile of Irarsite Dust
+
+tile.OreMiessiite.name=Miessiite Ore
+item.crushedMiessiite.name=Crushed Miessiite Ore
+item.oreRawMiessiite.name=Raw Miessiite Ore
+item.crushedCentrifugedMiessiite.name=Centrifuged Crushed Miessiite Ore
+item.crushedPurifiedMiessiite.name=Purified Crushed Miessiite Ore
+item.dustImpureMiessiite.name=Impure Miessiite Dust
+item.dustPureMiessiite.name=Purified Miessiite Dust
+item.itemDustMiessiite.name=Miessiite Dust
+item.itemDustTinyMiessiite.name=Tiny Pile of Miessiite Dust
+item.itemDustSmallMiessiite.name=Small Pile of Miessiite Dust
+
+tile.OreComancheite.name=Comancheite Ore
+item.crushedComancheite.name=Crushed Comancheite Ore
+item.oreRawComancheite.name=Raw Comancheite Ore
+item.crushedCentrifugedComancheite.name=Centrifuged Crushed Comancheite Ore
+item.crushedPurifiedComancheite.name=Purified Crushed Comancheite Ore
+item.dustImpureComancheite.name=Impure Comancheite Dust
+item.dustPureComancheite.name=Purified Comancheite Dust
+item.itemDustComancheite.name=Comancheite Dust
+item.itemDustTinyComancheite.name=Tiny Pile of Comancheite Dust
+item.itemDustSmallComancheite.name=Small Pile of Comancheite Dust
+
+tile.OreKoboldite.name=Koboldite Ore
+item.crushedKoboldite.name=Crushed Koboldite Ore
+item.oreRawKoboldite.name=Raw Koboldite Ore
+item.crushedCentrifugedKoboldite.name=Centrifuged Crushed Koboldite Ore
+item.crushedPurifiedKoboldite.name=Purified Crushed Koboldite Ore
+item.dustImpureKoboldite.name=Impure Koboldite Dust
+item.dustPureKoboldite.name=Purified Koboldite Dust
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+
+tile.OrePerroudite.name=Perroudite Ore
+item.crushedPerroudite.name=Crushed Perroudite Ore
+item.oreRawPerroudite.name=Raw Perroudite Ore
+item.crushedCentrifugedPerroudite.name=Centrifuged Crushed Perroudite Ore
+item.crushedPurifiedPerroudite.name=Purified Crushed Perroudite Ore
+item.dustImpurePerroudite.name=Impure Perroudite Dust
+item.dustPurePerroudite.name=Purified Perroudite Dust
+item.itemDustPerroudite.name=Perroudite Dust
+item.itemDustTinyPerroudite.name=Tiny Pile of Perroudite Dust
+item.itemDustSmallPerroudite.name=Small Pile of Perroudite Dust
+
+tile.OreDemicheleite.name=Demicheleite Ore
+item.crushedDemicheleite.name=Crushed Demicheleite Ore
+item.oreRawDemicheleite.name=Raw Demicheleite Ore
+item.crushedCentrifugedDemicheleite.name=Centrifuged Crushed Demicheleite Ore
+item.crushedPurifiedDemicheleite.name=Purified Crushed Demicheleite Ore
+item.dustImpureDemicheleite.name=Impure Demicheleite Dust
+item.dustPureDemicheleite.name=Purified Demicheleite Dust
+item.itemDustDemicheleite.name=Demicheleite Dust
+item.itemDustTinyDemicheleite.name=Tiny Pile of Demicheleite Dust
+item.itemDustSmallDemicheleite.name=Small Pile of Demicheleite Dust
+
+tile.OreAlburnite.name=Alburnite Ore
+item.crushedAlburnite.name=Crushed Alburnite Ore
+item.oreRawAlburnite.name=Raw Alburnite Ore
+item.crushedCentrifugedAlburnite.name=Centrifuged Crushed Alburnite Ore
+item.crushedPurifiedAlburnite.name=Purified Crushed Alburnite Ore
+item.dustImpureAlburnite.name=Impure Alburnite Dust
+item.dustPureAlburnite.name=Purified Alburnite Dust
+item.itemDustAlburnite.name=Alburnite Dust
+item.itemDustTinyAlburnite.name=Tiny Pile of Alburnite Dust
+item.itemDustSmallAlburnite.name=Small Pile of Alburnite Dust
+
+tile.OreLautarite.name=Lautarite Ore
+item.crushedLautarite.name=Crushed Lautarite Ore
+item.oreRawLautarite.name=Raw Lautarite Ore
+item.crushedCentrifugedLautarite.name=Centrifuged Crushed Lautarite Ore
+item.crushedPurifiedLautarite.name=Purified Crushed Lautarite Ore
+item.dustImpureLautarite.name=Impure Lautarite Dust
+item.dustPureLautarite.name=Purified Lautarite Dust
+item.itemDustLautarite.name=Lautarite Dust
+item.itemDustTinyLautarite.name=Tiny Pile of Lautarite Dust
+item.itemDustSmallLautarite.name=Small Pile of Lautarite Dust
+
+tile.OreBariteRd.name=Barite (Rd) Ore
+item.crushedBariteRd.name=Crushed Barite (Rd) Ore
+item.oreRawBariteRd.name=Raw Barite (Rd) Ore
+item.crushedCentrifugedBariteRd.name=Centrifuged Crushed Barite (Rd) Ore
+item.crushedPurifiedBariteRd.name=Purified Crushed Barite (Rd) Ore
+item.dustImpureBariteRd.name=Impure Barite (Rd) Dust
+item.dustPureBariteRd.name=Purified Barite (Rd) Dust
+item.itemDustBariteRd.name=Barite (Rd) Dust
+item.itemDustTinyBariteRd.name=Tiny Pile of Barite (Rd) Dust
+item.itemDustSmallBariteRd.name=Small Pile of Barite (Rd) Dust
+
+tile.OreHoneaite.name=Honeaite Ore
+item.crushedHoneaite.name=Crushed Honeaite Ore
+item.oreRawHoneaite.name=Raw Honeaite Ore
+item.crushedCentrifugedHoneaite.name=Centrifuged Crushed Honeaite Ore
+item.crushedPurifiedHoneaite.name=Purified Crushed Honeaite Ore
+item.dustImpureHoneaite.name=Impure Honeaite Dust
+item.dustPureHoneaite.name=Purified Honeaite Dust
+item.itemDustHoneaite.name=Honeaite Dust
+item.itemDustTinyHoneaite.name=Tiny Pile of Honeaite Dust
+item.itemDustSmallHoneaite.name=Small Pile of Honeaite Dust
+
+tile.OreLafossaite.name=Lafossaite Ore
+item.crushedLafossaite.name=Crushed Lafossaite Ore
+item.oreRawLafossaite.name=Raw Lafossaite Ore
+item.crushedCentrifugedLafossaite.name=Centrifuged Crushed Lafossaite Ore
+item.crushedPurifiedLafossaite.name=Purified Crushed Lafossaite Ore
+item.dustImpureLafossaite.name=Impure Lafossaite Dust
+item.dustPureLafossaite.name=Purified Lafossaite Dust
+item.itemDustLafossaite.name=Lafossaite Dust
+item.itemDustTinyLafossaite.name=Tiny Pile of Lafossaite Dust
+item.itemDustSmallLafossaite.name=Small Pile of Lafossaite Dust
+
+tile.OreKashinite.name=Kashinite Ore
+item.crushedKashinite.name=Crushed Kashinite Ore
+item.oreRawKashinite.name=Raw Kashinite Ore
+item.crushedCentrifugedKashinite.name=Centrifuged Crushed Kashinite Ore
+item.crushedPurifiedKashinite.name=Purified Crushed Kashinite Ore
+item.dustImpureKashinite.name=Impure Kashinite Dust
+item.dustPureKashinite.name=Purified Kashinite Dust
+item.itemDustKashinite.name=Kashinite Dust
+item.itemDustTinyKashinite.name=Tiny Pile of Kashinite Dust
+item.itemDustSmallKashinite.name=Small Pile of Kashinite Dust
+
+tile.OreRadioactiveMineralMix.name=Strange Ore
+item.crushedRadioactiveMineralMix.name=Crushed Strange Ore
+item.oreRawRadioactiveMineralMix.name=Raw Strange Ore
+item.crushedCentrifugedRadioactiveMineralMix.name=Centrifuged Crushed Strange Ore
+item.crushedPurifiedRadioactiveMineralMix.name=Purified Crushed Strange Ore
+item.dustImpureRadioactiveMineralMix.name=Impure Strange Dust
+item.dustPureRadioactiveMineralMix.name=Purified Strange Dust
+item.itemDustRadioactiveMineralMix.name=Strange Dust
+item.itemDustTinyRadioactiveMineralMix.name=Tiny Pile of Strange Dust
+item.itemDustSmallRadioactiveMineralMix.name=Small Pile of Strange Dust
+
+tile.OreDemicheleiteBr.name=Demicheleite (Br) Ore
+item.crushedDemicheleiteBr.name=Crushed Demicheleite (Br) Ore
+item.oreRawDemicheleiteBr.name=Raw Demicheleite (Br) Ore
+item.crushedCentrifugedDemicheleiteBr.name=Centrifuged Crushed Demicheleite (Br) Ore
+item.crushedPurifiedDemicheleiteBr.name=Purified Crushed Demicheleite (Br) Ore
+item.dustImpureDemicheleiteBr.name=Impure Demicheleite (Br) Dust
+item.dustPureDemicheleiteBr.name=Purified Demicheleite (Br) Dust
+item.itemDustDemicheleiteBr.name=Demicheleite (Br) Dust
+
+
+//Materials
+
+item.itemIngotTitansteel.name=Titansteel Ingot
+item.itemHotIngotTitansteel.name=Hot Titansteel Ingot
+item.itemDustTitansteel.name=Titansteel Dust
+item.itemDustTinyTitansteel.name=Tiny Pile of Titansteel Dust
+item.itemDustSmallTitansteel.name=Small Pile of Titansteel Dust
+item.itemNuggetTitansteel.name=Titansteel Nugget
+item.itemPlateTitansteel.name=Titansteel Plate
+item.itemPlateDoubleTitansteel.name=Double Titansteel Plate
+item.itemBoltTitansteel.name=Titansteel Bolt
+item.itemRodTitansteel.name=Titansteel Rod
+item.itemRodLongTitansteel.name=Long Titansteel Rod
+item.itemRingTitansteel.name=Titansteel Ring
+item.itemScrewTitansteel.name=Titansteel Screw
+item.itemRotorTitansteel.name=Titansteel Rotor
+item.itemGearTitansteel.name=Titansteel Gear
+item.itemCellTitansteel.name=Titansteel Cell
+tile.Block of Titansteel.name=Block of Titansteel
+tile.Titansteel Frame Box.name=Titansteel Frame Box
+
+item.itemIngotOctiron.name=Octiron Ingot
+item.itemHotIngotOctiron.name=Hot Octiron Ingot
+item.itemDustOctiron.name=Octiron Dust
+item.itemDustTinyOctiron.name=Tiny Pile of Octiron Dust
+item.itemDustSmallOctiron.name=Small Pile of Octiron Dust
+item.itemNuggetOctiron.name=Octiron Nugget
+item.itemPlateOctiron.name=Octiron Plate
+item.itemPlateDoubleOctiron.name=Double Octiron Plate
+item.itemBoltOctiron.name=Octiron Bolt
+item.itemRodOctiron.name=Octiron Rod
+item.itemRodLongOctiron.name=Long Octiron Rod
+item.itemRingOctiron.name=Octiron Ring
+item.itemScrewOctiron.name=Octiron Screw
+item.itemRotorOctiron.name=Octiron Rotor
+item.itemGearOctiron.name=Octiron Gear
+item.itemCellOctiron.name=Octiron Cell
+tile.Block of Octiron.name=Block of Octiron
+tile.Octiron Frame Box.name=Octiron Frame Box
+
+item.itemIngotWatertightSteel.name=Watertight Steel Ingot
+item.itemHotIngotWatertightSteel.name=Hot Watertight Steel Ingot
+item.itemDustWatertightSteel.name=Watertight Steel Dust
+item.itemDustTinyWatertightSteel.name=Tiny Pile of Watertight Steel Dust
+item.itemDustSmallWatertightSteel.name=Small Pile of Watertight Steel Dust
+item.itemNuggetWatertightSteel.name=Watertight Steel Nugget
+item.itemPlateWatertightSteel.name=Watertight Steel Plate
+item.itemPlateDoubleWatertightSteel.name=Double Watertight Steel Plate
+item.itemBoltWatertightSteel.name=Watertight Steel Bolt
+item.itemRodWatertightSteel.name=Watertight Steel Rod
+item.itemRodLongWatertightSteel.name=Long Watertight Steel Rod
+item.itemRingWatertightSteel.name=Watertight Steel Ring
+item.itemScrewWatertightSteel.name=Watertight Steel Screw
+item.itemRotorWatertightSteel.name=Watertight Steel Rotor
+item.itemGearWatertightSteel.name=Watertight Steel Gear
+item.itemCellWatertightSteel.name=Watertight Steel Cell
+tile.Block of Watertight Steel.name=Block of Watertight Steel
+tile.Watertight Steel Frame Box.name=Watertight Steel Frame Box
+
+item.itemIngotCelestialTungsten.name=Celestial Tungsten Ingot
+item.itemHotIngotCelestialTungsten.name=Hot Celestial Tungsten Ingot
+item.itemDustCelestialTungsten.name=Celestial Tungsten Dust
+item.itemDustTinyCelestialTungsten.name=Tiny Pile of Celestial Tungsten Dust
+item.itemDustSmallCelestialTungsten.name=Small Pile of Celestial Tungsten Dust
+item.itemNuggetCelestialTungsten.name=Celestial Tungsten Nugget
+item.itemPlateCelestialTungsten.name=Celestial Tungsten Plate
+item.itemPlateDoubleCelestialTungsten.name=Double Celestial Tungsten Plate
+item.itemBoltCelestialTungsten.name=Celestial Tungsten Bolt
+item.itemRodCelestialTungsten.name=Celestial Tungsten Rod
+item.itemRodLongCelestialTungsten.name=Long Celestial Tungsten Rod
+item.itemRingCelestialTungsten.name=Celestial Tungsten Ring
+item.itemScrewCelestialTungsten.name=Celestial Tungsten Screw
+item.itemRotorCelestialTungsten.name=Celestial Tungsten Rotor
+item.itemGearCelestialTungsten.name=Celestial Tungsten Gear
+item.itemCellCelestialTungsten.name=Celestial Tungsten Cell
+tile.Block of Celestial Tungsten.name=Block of Celestial Tungsten
+tile.Celestial Tungsten Frame Box.name=Celestial Tungsten Frame Box
+
+item.itemIngotHypogen.name=Hypogen Ingot
+item.itemHotIngotHypogen.name=Hot Hypogen Ingot
+item.itemDustHypogen.name=Hypogen Dust
+item.itemDustTinyHypogen.name=Tiny Pile of Hypogen Dust
+item.itemDustSmallHypogen.name=Small Pile of Hypogen Dust
+item.itemNuggetHypogen.name=Hypogen Nugget
+item.itemPlateHypogen.name=Hypogen Plate
+item.itemPlateDoubleHypogen.name=Double Hypogen Plate
+item.itemBoltHypogen.name=Hypogen Bolt
+item.itemRodHypogen.name=Hypogen Rod
+item.itemRodLongHypogen.name=Long Hypogen Rod
+item.itemRingHypogen.name=Hypogen Ring
+item.itemScrewHypogen.name=Hypogen Screw
+item.itemRotorHypogen.name=Hypogen Rotor
+item.itemGearHypogen.name=Hypogen Gear
+item.itemCellHypogen.name=Hypogen Cell
+tile.Block of Hypogen.name=Block of Hypogen
+tile.Hypogen Frame Box.name=Hypogen Frame Box
+
+item.itemIngotArceusAlloy2B.name=Arceus Alloy 2B Ingot
+item.itemHotIngotArceusAlloy2B.name=Hot Arceus Alloy 2B Ingot
+item.itemDustArceusAlloy2B.name=Arceus Alloy 2B Dust
+item.itemDustTinyArceusAlloy2B.name=Tiny Pile of Arceus Alloy 2B Dust
+item.itemDustSmallArceusAlloy2B.name=Small Pile of Arceus Alloy 2B Dust
+item.itemNuggetArceusAlloy2B.name=Arceus Alloy 2B Nugget
+item.itemPlateArceusAlloy2B.name=Arceus Alloy 2B Plate
+item.itemPlateDoubleArceusAlloy2B.name=Double Arceus Alloy 2B Plate
+item.itemBoltArceusAlloy2B.name=Arceus Alloy 2B Bolt
+item.itemRodArceusAlloy2B.name=Arceus Alloy 2B Rod
+item.itemRodLongArceusAlloy2B.name=Long Arceus Alloy 2B Rod
+item.itemRingArceusAlloy2B.name=Arceus Alloy 2B Ring
+item.itemScrewArceusAlloy2B.name=Arceus Alloy 2B Screw
+item.itemRotorArceusAlloy2B.name=Arceus Alloy 2B Rotor
+item.itemGearArceusAlloy2B.name=Arceus Alloy 2B Gear
+item.itemCellArceusAlloy2B.name=Arceus Alloy 2B Cell
+tile.Block of Arceus Alloy 2B.name=Block of Arceus Alloy 2B
+tile.Arceus Alloy 2B Frame Box.name=Arceus Alloy 2B Frame Box
+
+item.itemIngotChromaticGlass.name=Chromatic Glass Ingot
+item.itemHotIngotChromaticGlass.name=Hot Chromatic Glass Ingot
+item.itemDustChromaticGlass.name=Chromatic Glass Dust
+item.itemDustTinyChromaticGlass.name=Tiny Pile of Chromatic Glass Dust
+item.itemDustSmallChromaticGlass.name=Small Pile of Chromatic Glass Dust
+item.itemNuggetChromaticGlass.name=Chromatic Glass Nugget
+item.itemPlateChromaticGlass.name=Chromatic Glass Plate
+item.itemPlateDoubleChromaticGlass.name=Double Chromatic Glass Plate
+item.itemBoltChromaticGlass.name=Chromatic Glass Bolt
+item.itemRodChromaticGlass.name=Chromatic Glass Rod
+item.itemRodLongChromaticGlass.name=Long Chromatic Glass Rod
+item.itemRingChromaticGlass.name=Chromatic Glass Ring
+item.itemScrewChromaticGlass.name=Chromatic Glass Screw
+item.itemRotorChromaticGlass.name=Chromatic Glass Rotor
+item.itemGearChromaticGlass.name=Chromatic Glass Gear
+item.itemCellChromaticGlass.name=Chromatic Glass Cell
+tile.Block of Chromatic Glass.name=Block of Chromatic Glass
+tile.Chromatic Glass Frame Box.name=Chromatic Glass Frame Box
+
+item.itemIngotAstralTitanium.name=Astral Titanium Ingot
+item.itemHotIngotAstralTitanium.name=Hot Astral Titanium Ingot
+item.itemDustAstralTitanium.name=Astral Titanium Dust
+item.itemDustTinyAstralTitanium.name=Tiny Pile of Astral Titanium Dust
+item.itemDustSmallAstralTitanium.name=Small Pile of Astral Titanium Dust
+item.itemNuggetAstralTitanium.name=Astral Titanium Nugget
+item.itemPlateAstralTitanium.name=Astral Titanium Plate
+item.itemPlateDoubleAstralTitanium.name=Double Astral Titanium Plate
+item.itemBoltAstralTitanium.name=Astral Titanium Bolt
+item.itemRodAstralTitanium.name=Astral Titanium Rod
+item.itemRodLongAstralTitanium.name=Long Astral Titanium Rod
+item.itemRingAstralTitanium.name=Astral Titanium Ring
+item.itemScrewAstralTitanium.name=Astral Titanium Screw
+item.itemRotorAstralTitanium.name=Astral Titanium Rotor
+item.itemGearAstralTitanium.name=Astral Titanium Gear
+item.itemCellAstralTitanium.name=Astral Titanium Cell
+tile.Block of Astral Titanium.name=Block of Astral Titanium
+tile.Astral Titanium Frame Box.name=Astral Titanium Frame Box
+
+item.itemIngotTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ingot
+item.itemHotIngotTungstenTitaniumCarbide.name=Hot Tungsten Titanium Carbide Ingot
+item.itemDustTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Dust
+item.itemDustTinyTungstenTitaniumCarbide.name=Tiny Pile of Tungsten Titanium Carbide Dust
+item.itemDustSmallTungstenTitaniumCarbide.name=Small Pile of Tungsten Titanium Carbide Dust
+item.itemNuggetTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Nugget
+item.itemPlateTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Plate
+item.itemPlateDoubleTungstenTitaniumCarbide.name=Double Tungsten Titanium Carbide Plate
+item.itemBoltTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Bolt
+item.itemRodTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rod
+item.itemRodLongTungstenTitaniumCarbide.name=Long Tungsten Titanium Carbide Rod
+item.itemRingTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ring
+item.itemScrewTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Screw
+item.itemRotorTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rotor
+item.itemGearTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Gear
+item.itemCellTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Cell
+tile.Block of Tungsten Titanium Carbide.name=Block of Tungsten Titanium Carbide
+tile.Tungsten Titanium Carbide Frame Box.name=Tungsten Titanium Carbide Frame Box
+
+item.itemIngotNitinol60.name=Nitinol 60 Ingot
+item.itemHotIngotNitinol60.name=Hot Nitinol 60 Ingot
+item.itemDustNitinol60.name=Nitinol 60 Dust
+item.itemDustTinyNitinol60.name=Tiny Pile of Nitinol 60 Dust
+item.itemDustSmallNitinol60.name=Small Pile of Nitinol 60 Dust
+item.itemNuggetNitinol60.name=Nitinol 60 Nugget
+item.itemPlateNitinol60.name=Nitinol 60 Plate
+item.itemPlateDoubleNitinol60.name=Double Nitinol 60 Plate
+item.itemBoltNitinol60.name=Nitinol 60 Bolt
+item.itemRodNitinol60.name=Nitinol 60 Rod
+item.itemRodLongNitinol60.name=Long Nitinol 60 Rod
+item.itemRingNitinol60.name=Nitinol 60 Ring
+item.itemScrewNitinol60.name=Nitinol 60 Screw
+item.itemRotorNitinol60.name=Nitinol 60 Rotor
+item.itemGearNitinol60.name=Nitinol 60 Gear
+item.itemCellNitinol60.name=Nitinol 60 Cell
+tile.Block of Nitinol 60.name=Block of Nitinol 60
+tile.Nitinol 60 Frame Box.name=Nitinol 60 Frame Box
+
+item.itemIngotAdvancedNitinol.name=Advanced Nitinol Ingot
+item.itemHotIngotAdvancedNitinol.name=Hot Advanced Nitinol Ingot
+item.itemDustAdvancedNitinol.name=Advanced Nitinol Dust
+item.itemDustTinyAdvancedNitinol.name=Tiny Pile of Advanced Nitinol Dust
+item.itemDustSmallAdvancedNitinol.name=Small Pile of Advanced Nitinol Dust
+item.itemNuggetAdvancedNitinol.name=Advanced Nitinol Nugget
+item.itemPlateAdvancedNitinol.name=Advanced Nitinol Plate
+item.itemPlateDoubleAdvancedNitinol.name=Double Advanced Nitinol Plate
+item.itemBoltAdvancedNitinol.name=Advanced Nitinol Bolt
+item.itemRodAdvancedNitinol.name=Advanced Nitinol Rod
+item.itemRodLongAdvancedNitinol.name=Long Advanced Nitinol Rod
+item.itemRingAdvancedNitinol.name=Advanced Nitinol Ring
+item.itemScrewAdvancedNitinol.name=Advanced Nitinol Screw
+item.itemRotorAdvancedNitinol.name=Advanced Nitinol Rotor
+item.itemGearAdvancedNitinol.name=Advanced Nitinol Gear
+item.itemCellAdvancedNitinol.name=Advanced Nitinol Cell
+tile.Block of Advanced Nitinol.name=Block of Advanced Nitinol
+tile.Advanced Nitinol Frame Box.name=Advanced Nitinol Frame Box
+
+item.itemIngotArcanite.name=Arcanite Ingot
+item.itemHotIngotArcanite.name=Hot Arcanite Ingot
+item.itemDustArcanite.name=Arcanite Dust
+item.itemDustTinyArcanite.name=Tiny Pile of Arcanite Dust
+item.itemDustSmallArcanite.name=Small Pile of Arcanite Dust
+item.itemNuggetArcanite.name=Arcanite Nugget
+item.itemPlateArcanite.name=Arcanite Plate
+item.itemPlateDoubleArcanite.name=Double Arcanite Plate
+item.itemBoltArcanite.name=Arcanite Bolt
+item.itemRodArcanite.name=Arcanite Rod
+item.itemRodLongArcanite.name=Long Arcanite Rod
+item.itemRingArcanite.name=Arcanite Ring
+item.itemScrewArcanite.name=Arcanite Screw
+item.itemRotorArcanite.name=Arcanite Rotor
+item.itemGearArcanite.name=Arcanite Gear
+item.itemCellArcanite.name=Arcanite Cell
+tile.Block of Arcanite.name=Block of Arcanite
+tile.Arcanite Frame Box.name=Arcanite Frame Box
+
+item.itemIngotPikyonium64B.name=Pikyonium 64B Ingot
+item.itemHotIngotPikyonium64B.name=Hot Pikyonium 64B Ingot
+item.itemDustPikyonium64B.name=Pikyonium 64B Dust
+item.itemDustTinyPikyonium64B.name=Tiny Pile of Pikyonium 64B Dust
+item.itemDustSmallPikyonium64B.name=Small Pile of Pikyonium 64B Dust
+item.itemNuggetPikyonium64B.name=Pikyonium 64B Nugget
+item.itemPlatePikyonium64B.name=Pikyonium 64B Plate
+item.itemPlateDoublePikyonium64B.name=Double Pikyonium 64B Plate
+item.itemBoltPikyonium64B.name=Pikyonium 64B Bolt
+item.itemRodPikyonium64B.name=Pikyonium 64B Rod
+item.itemRodLongPikyonium64B.name=Long Pikyonium 64B Rod
+item.itemRingPikyonium64B.name=Pikyonium 64B Ring
+item.itemScrewPikyonium64B.name=Pikyonium 64B Screw
+item.itemRotorPikyonium64B.name=Pikyonium 64B Rotor
+item.itemGearPikyonium64B.name=Pikyonium 64B Gear
+item.itemCellPikyonium64B.name=Pikyonium 64B Cell
+tile.Block of Pikyonium 64B.name=Block of Pikyonium 64B
+tile.Pikyonium 64B Frame Box.name=Pikyonium 64B Frame Box
+
+item.itemIngotCinobiteA243.name=Cinobite A243 Ingot
+item.itemHotIngotCinobiteA243.name=Hot Cinobite A243 Ingot
+item.itemDustCinobiteA243.name=Cinobite A243 Dust
+item.itemDustTinyCinobiteA243.name=Tiny Pile of Cinobite A243 Dust
+item.itemDustSmallCinobiteA243.name=Small Pile of Cinobite A243 Dust
+item.itemNuggetCinobiteA243.name=Cinobite A243 Nugget
+item.itemPlateCinobiteA243.name=Cinobite A243 Plate
+item.itemPlateDoubleCinobiteA243.name=Double Cinobite A243 Plate
+item.itemBoltCinobiteA243.name=Cinobite A243 Bolt
+item.itemRodCinobiteA243.name=Cinobite A243 Rod
+item.itemRodLongCinobiteA243.name=Long Cinobite A243 Rod
+item.itemRingCinobiteA243.name=Cinobite A243 Ring
+item.itemScrewCinobiteA243.name=Cinobite A243 Screw
+item.itemRotorCinobiteA243.name=Cinobite A243 Rotor
+item.itemGearCinobiteA243.name=Cinobite A243 Gear
+item.itemCellCinobiteA243.name=Cinobite A243 Cell
+tile.Block of Cinobite A243.name=Block of Cinobite A243
+tile.Cinobite A243 Frame Box.name=Cinobite A243 Frame Box
+
+item.itemIngotLafiumCompound.name=Lafium Compound Ingot
+item.itemHotIngotLafiumCompound.name=Hot Lafium Compound Ingot
+item.itemDustLafiumCompound.name=Lafium Compound Dust
+item.itemDustTinyLafiumCompound.name=Tiny Pile of Lafium Compound Dust
+item.itemDustSmallLafiumCompound.name=Small Pile of Lafium Compound Dust
+item.itemNuggetLafiumCompound.name=Lafium Compound Nugget
+item.itemPlateLafiumCompound.name=Lafium Compound Plate
+item.itemPlateDoubleLafiumCompound.name=Double Lafium Compound Plate
+item.itemBoltLafiumCompound.name=Lafium Compound Bolt
+item.itemRodLafiumCompound.name=Lafium Compound Rod
+item.itemRodLongLafiumCompound.name=Long Lafium Compound Rod
+item.itemRingLafiumCompound.name=Lafium Compound Ring
+item.itemScrewLafiumCompound.name=Lafium Compound Screw
+item.itemRotorLafiumCompound.name=Lafium Compound Rotor
+item.itemGearLafiumCompound.name=Lafium Compound Gear
+item.itemCellLafiumCompound.name=Lafium Compound Cell
+tile.Block of Lafium Compound.name=Block of Lafium Compound
+tile.Lafium Compound Frame Box.name=Lafium Compound Frame Box
+
+item.itemIngotKoboldite.name=Koboldite Ingot
+item.itemHotIngotKoboldite.name=Hot Koboldite Ingot
+item.itemNuggetKoboldite.name=Koboldite Nugget
+item.itemPlateKoboldite.name=Koboldite Plate
+item.itemPlateDoubleKoboldite.name=Double Koboldite Plate
+item.itemBoltKoboldite.name=Koboldite Bolt
+item.itemRodKoboldite.name=Koboldite Rod
+item.itemRodLongKoboldite.name=Long Koboldite Rod
+item.itemRingKoboldite.name=Koboldite Ring
+item.itemScrewKoboldite.name=Koboldite Screw
+item.itemRotorKoboldite.name=Koboldite Rotor
+item.itemGearKoboldite.name=Koboldite Gear
+item.itemCellKoboldite.name=Koboldite Cell
+tile.Block of Koboldite.name=Block of Koboldite
+tile.Koboldite Frame Box.name=Koboldite Frame Box
+
+item.itemIngotAbyssalAlloy.name=Abyssal Alloy Ingot
+item.itemHotIngotAbyssalAlloy.name=Hot Abyssal Alloy Ingot
+item.itemDustAbyssalAlloy.name=Abyssal Alloy Dust
+item.itemDustTinyAbyssalAlloy.name=Tiny Pile of Abyssal Alloy Dust
+item.itemDustSmallAbyssalAlloy.name=Small Pile of Abyssal Alloy Dust
+item.itemNuggetAbyssalAlloy.name=Abyssal Alloy Nugget
+item.itemPlateAbyssalAlloy.name=Abyssal Alloy Plate
+item.itemPlateDoubleAbyssalAlloy.name=Double Abyssal Alloy Plate
+item.itemBoltAbyssalAlloy.name=Abyssal Alloy Bolt
+item.itemRodAbyssalAlloy.name=Abyssal Alloy Rod
+item.itemRodLongAbyssalAlloy.name=Long Abyssal Alloy Rod
+item.itemRingAbyssalAlloy.name=Abyssal Alloy Ring
+item.itemScrewAbyssalAlloy.name=Abyssal Alloy Screw
+item.itemRotorAbyssalAlloy.name=Abyssal Alloy Rotor
+item.itemGearAbyssalAlloy.name=Abyssal Alloy Gear
+item.itemCellAbyssalAlloy.name=Abyssal Alloy Cell
+tile.Block of Abyssal Alloy.name=Block of Abyssal Alloy
+tile.Abyssal Alloy Frame Box.name=Abyssal Alloy Frame Box
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=Technetium 99M Dust
+item.dustTechnetium99.name=Technetium 99 Dust
+item.dustMolybdenum99.name=Molybdenum 99 Dust
+
+//Bags
+item.item.MysticBag.name=Mystic Pouch
+item.item.Eatotron9000.name=Eatotronic 9000
+item.item.ToolBox.name=Workers Toolbox
+
+//Cells
+item.Bromine.name=Bromine Cell
+item.Krypton.name=Krypton Cell
+item.cryotheum.name=Cryotheum Cell
+item.pyrotheum.name=Pyrotheum Cell
+item.GeneticMutagen.name=Mutagen Cell
+
+//Ingots
+item.itemHotIngotIncoloy020.name=Hot Incoloy-020 Ingot
+item.itemHotIngotIncoloyDS.name=Hot Incoloy-DS Ingot
+item.itemHotIngotTalonite.name=Hot Talonite Ingot
+item.itemHotIngotHastelloyX.name=Hot Hastelloy-X Ingot
+item.itemHotIngotHastelloyW.name=Hot Hastelloy-W Carbide Ingot
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=Lead Plate
+
+//Ions
+item.particle.ion.Hydrogen.name=Hydrogen Ion
+item.particle.ion.Helium.name=Helium Ion
+item.particle.ion.Lithium.name=Lithium Ion
+item.particle.ion.Beryllium.name=Beryllium Ion
+item.particle.ion.Boron.name=Boron Ion
+item.particle.ion.Carbon.name=Carbon Ion
+item.particle.ion.Nitrogen.name=Nitrogen Ion
+item.particle.ion.Oxygen.name=Oxygen Ion
+item.particle.ion.Fluorine.name=Fluorine Ion
+item.particle.ion.Neon.name=Neon Ion
+item.particle.ion.Sodium.name=Sodium Ion
+item.particle.ion.Magnesium.name=Magnesium Ion
+item.particle.ion.Aluminum.name=Aluminum Ion
+item.particle.ion.Silicon.name=Silicon Ion
+item.particle.ion.Phosphorus.name=Phosphorus Ion
+item.particle.ion.Sulfur.name=Sulfur Ion
+item.particle.ion.Chlorine.name=Chlorine Ion
+item.particle.ion.Argon.name=Argon Ion
+item.particle.ion.Potassium.name=Potassium Ion
+item.particle.ion.Calcium.name=Calcium Ion
+item.particle.ion.Scandium.name=Scandium Ion
+item.particle.ion.Titanium.name=Titanium Ion
+item.particle.ion.Vanadium.name=Vanadium Ion
+item.particle.ion.Chromium.name=Chromium Ion
+item.particle.ion.Manganese.name=Manganese Ion
+item.particle.ion.Iron.name=Iron Ion
+item.particle.ion.Cobalt.name=Cobalt Ion
+item.particle.ion.Nickel.name=Nickel Ion
+item.particle.ion.Copper.name=Copper Ion
+item.particle.ion.Zinc.name=Zinc Ion
+item.particle.ion.Gallium.name=Gallium Ion
+item.particle.ion.Germanium.name=Germanium Ion
+item.particle.ion.Arsenic.name=Arsenic Ion
+item.particle.ion.Selenium.name=Selenium Ion
+item.particle.ion.Bromine.name=Bromine Ion
+item.particle.ion.Krypton.name=Krypton Ion
+item.particle.ion.Rubidium.name=Rubidium Ion
+item.particle.ion.Strontium.name=Strontium Ion
+item.particle.ion.Yttrium.name=Yttrium Ion
+item.particle.ion.Zirconium.name=Zirconium Ion
+item.particle.ion.Niobium.name=Niobium Ion
+item.particle.ion.Molybdenum.name=Molybdenum Ion
+item.particle.ion.Technetium.name=Technetium Ion
+item.particle.ion.Ruthenium.name=Ruthenium Ion
+item.particle.ion.Rhodium.name=Rhodium Ion
+item.particle.ion.Palladium.name=Palladium Ion
+item.particle.ion.Silver.name=Silver Ion
+item.particle.ion.Cadmium.name=Cadmium Ion
+item.particle.ion.Indium.name=Indium Ion
+item.particle.ion.Tin.name=Tin Ion
+item.particle.ion.Antimony.name=Antimony Ion
+item.particle.ion.Tellurium.name=Tellurium Ion
+item.particle.ion.Iodine.name=Iodine Ion
+item.particle.ion.Xenon.name=Xenon Ion
+item.particle.ion.Cesium.name=Caesium Ion
+item.particle.ion.Barium.name=Barium Ion
+item.particle.ion.Lanthanum.name=Lanthanum Ion
+item.particle.ion.Cerium.name=Cerium Ion
+item.particle.ion.Praseodymium.name=Praseodymium Ion
+item.particle.ion.Neodymium.name=Neodymium Ion
+item.particle.ion.Promethium.name=Promethium Ion
+item.particle.ion.Samarium.name=Samarium Ion
+item.particle.ion.Europium.name=Europium Ion
+item.particle.ion.Gadolinium.name=Gadolinium Ion
+item.particle.ion.Terbium.name=Terbium Ion
+item.particle.ion.Dysprosium.name=Dysprosium Ion
+item.particle.ion.Holmium.name=Holmium Ion
+item.particle.ion.Erbium.name=Erbium Ion
+item.particle.ion.Thulium.name=Thulium Ion
+item.particle.ion.Ytterbium.name=Ytterbium Ion
+item.particle.ion.Lutetium.name=Lutetium Ion
+item.particle.ion.Hafnium.name=Hafnium Ion
+item.particle.ion.Tantalum.name=Tantalum Ion
+item.particle.ion.Tungsten.name=Tungsten Ion
+item.particle.ion.Rhenium.name=Rhenium Ion
+item.particle.ion.Osmium.name=Osmium Ion
+item.particle.ion.Iridium.name=Iridium Ion
+item.particle.ion.Platinum.name=Platinum Ion
+item.particle.ion.Gold.name=Gold Ion
+item.particle.ion.Mercury.name=Mercury Ion
+item.particle.ion.Thallium.name=Thallium Ion
+item.particle.ion.Lead.name=Lead Ion
+item.particle.ion.Bismuth.name=Bismuth Ion
+item.particle.ion.Polonium.name=Polonium Ion
+item.particle.ion.Astatine.name=Astatine Ion
+item.particle.ion.Radon.name=Radon Ion
+item.particle.ion.Francium.name=Francium Ion
+item.particle.ion.Radium.name=Radium Ion
+item.particle.ion.Actinium.name=Actinium Ion
+item.particle.ion.Thorium.name=Thorium Ion
+item.particle.ion.Protactinium.name=Protactinium Ion
+item.particle.ion.Uranium.name=Uranium Ion
+item.particle.ion.Neptunium.name=Neptunium Ion
+item.particle.ion.Plutonium.name=Plutonium Ion
+item.particle.ion.Americium.name=Americium Ion
+item.particle.ion.Curium.name=Curium Ion
+item.particle.ion.Berkelium.name=Berkelium Ion
+item.particle.ion.Californium.name=Californium Ion
+item.particle.ion.Einsteinium.name=Einsteinium Ion
+item.particle.ion.Fermium.name=Fermium Ion
+item.particle.ion.Mendelevium.name=Mendelevium Ion
+item.particle.ion.Nobelium.name=Nobelium Ion
+item.particle.ion.Lawrencium.name=Lawrencium Ion
+item.particle.ion.Rutherfordium.name=Rutherfordium Ion
+item.particle.ion.Dubnium.name=Dubnium Ion
+item.particle.ion.Seaborgium.name=Seaborgium Ion
+item.particle.ion.Bohrium.name=Bohrium Ion
+item.particle.ion.Hassium.name=Hassium Ion
+item.particle.ion.Meitnerium.name=Meitnerium Ion
+item.particle.ion.Darmstadtium.name=Darmstadtium Ion
+item.particle.ion.Roentgenium.name=Roentgenium Ion
+item.particle.ion.Copernicium.name=Copernicium Ion
+item.particle.ion.Nihonium.name=Nihonium Ion
+item.particle.ion.Flerovium.name=Flerovium Ion
+item.particle.ion.Moscovium.name=Moscovium Ion
+item.particle.ion.Livermorium.name=Livermorium Ion
+item.particle.ion.Tennessine.name=Tennessine Ion
+item.particle.ion.Oganesson.name=Oganesson Ion
+
+
+item.particle.base.Graviton.name=Graviton
+item.particle.base.Up.name=Up Quark
+item.particle.base.Down.name=Down Quark
+item.particle.base.Charm.name=Charm Quark
+item.particle.base.Strange.name=Strange Quark
+item.particle.base.Top.name=Top Quark
+item.particle.base.Bottom.name=Bottom Quark
+item.particle.base.Electron.name=Electron
+item.particle.base.Electron Neutrino.name=Electron Neutrino
+item.particle.base.Muon.name=Muon
+item.particle.base.Muon Neutrino.name=Muon Neutrino
+item.particle.base.Tau.name=Tau
+item.particle.base.Tau Neutrino.name=Tau Neutrino
+item.particle.base.Gluon.name=Gluon
+item.particle.base.Photon.name=Photon
+item.particle.base.Z Boson.name=Z Boson
+item.particle.base.W Boson.name=W Boson
+item.particle.base.Higgs Boson.name=Higgs Boson
+item.particle.base.Proton.name=Proton
+item.particle.base.Neutron.name=Neutron
+item.particle.base.Lambda.name=Lambda
+item.particle.base.Omega.name=Omega
+item.particle.base.Pion.name=Pion
+item.particle.base.ETA Meson.name=ETA Meson
+item.particle.base.Unknown.name=Unknown Particle
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=Glass Auto-Door
+tile.playerDoorCactus.name=Cactus Auto-Door
+tile.playerDoorIce.name=Ice Auto-Door
+tile.playerDoorIron.name=Iron Auto-Door
+tile.playerDoorWood.name=Wooden Auto-Door
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=Charge Pack [LuV]
+item.GTPP.BattPack.07.name=Charge Pack [ZPM]
+item.GTPP.BattPack.08.name=Charge Pack [UV]
+item.GTPP.BattPack.09.name=Charge Pack [MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++ Debug Scanner
+item.RawWaste.name=Cell of Animal Waste
+item.ManureSlurry.name=Cell of Manure Slurry
+item.FertileManureSlurry.name=Cell of Fertile Slurry
+item.itemDustTinyDemicheleiteBr.name=Tiny Pile of Demicheleite (Br)
+item.itemDustSmallDemicheleiteBr.name=Small Pile of Demicheleite (Br)
+tile.blockPooCollector.name=Agricultural Sewer
+tile.Block of Lithium 7.name=Block of Lithium 7
+
+//Added 14/3/19
+item.blood.name=Cell of Blood
+item.aniline.name=Aniline Cell
+item.cadaverine.name=Cadaverine Cell
+item.polyurethane.name=Polyurethane Cell
+item.putrescine.name=Putrescine Cell
+item.cyclohexane.name=Cyclohexane Cell
+item.cyclohexanone.name=Cyclohexanone Cell
+item.nitrobenzene.name=Nitrobenzene Cell
+item.ender.name=Cell of Liquid Ender
+item.xpjuice.name=Cell of Liquid Xp
+item.itemBombUnf.name=Throwable Bomb (unf)
+item.itemBombCasing.name=Bomb Casing
+item.gtpp.throwable.bomb.name=Throwable Bomb
+item.itemDetCable.name=Bomb Fuse
+tile.blockPooCollector.0.name=Agricultural Sewer
+tile.blockPooCollector.8.name=Biocomposite Collector
+item.itemIngotBakelite.name=Bakelite Ingot
+item.itemDustBakelite.name=Bakelite Dust
+item.itemDustTinyBakelite.name=Tiny Pile of Bakelite Dust
+item.itemDustSmallBakelite.name=Small Pile of Bakelite Dust
+item.itemNuggetBakelite.name=Bakelite Nugget
+item.itemPlateBakelite.name=Bakelite Plate
+item.itemPlateDoubleBakelite.name=Double Bakelite Plate
+item.itemCellBakelite.name=Bakelite Cell
+tile.Block of Bakelite.name=Block of Bakelite
+item.itemIngotNylon.name=Nylon Ingot
+item.itemDustNylon.name=Nylon Dust
+item.itemDustTinyNylon.name=Tiny Pile of Nylon Dust
+item.itemDustSmallNylon.name=Small Pile of Nylon Dust
+item.itemNuggetNylon.name=Nylon Nugget
+item.itemPlateNylon.name=Nylon Plate
+item.itemPlateDoubleNylon.name=Double Nylon Plate
+item.itemCellNylon.name=Nylon Cell
+tile.Block of Nylon.name=Block of Nylon
+item.itemIngotTeflon.name=Teflon Ingot
+item.itemDustTeflon.name=Teflon Dust
+item.itemDustTinyTeflon.name=Tiny Pile of Teflon Dust
+item.itemDustSmallTeflon.name=Small Pile of Teflon Dust
+item.itemNuggetTeflon.name=Teflon Nugget
+item.itemPlateTeflon.name=Teflon Plate
+item.itemPlateDoubleTeflon.name=Double Teflon Plate
+item.itemCellTeflon.name=Teflon Cell
+tile.Block of Teflon.name=Block of Teflon
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=Aluminium Ion
+item.particle.ion.Caesium.name=Caesium Ion
+
+item.GTPP.MonsterKiller.Enderman.name=Enderman Killer
+item.GTPP.MonsterKiller.Spider.name=Spider Killer
+item.GTPP.MonsterKiller.Skeleton.name=Skeleton Killer
+item.GTPP.MonsterKiller.Creeper.name=Creeper Killer
+item.GTPP.MonsterKiller.Zombie.name=Zombie Killer
+item.GTPP.MonsterKiller.Hellish.name=Nether Mob Killer
+
+item.itemIngotRunite.name=Runite Ingot
+item.itemDustRunite.name=Runite Dust
+item.itemDustTinyRunite.name=Tiny Pile of Runite Dust
+item.itemDustSmallRunite.name=Small Pile of Runite Dust
+item.itemNuggetRunite.name=Runite Nugget
+item.itemPlateRunite.name=Runite Plate
+item.itemPlateDoubleRunite.name=Double Runite Plate
+item.itemCellRunite.name=Runite Cell
+tile.Block of Runite.name=Block of Runite
+
+item.itemIngotDragonblood.name=Dragon Metal Ingot
+item.itemDustDragonblood.name=Dragon Metal Dust
+item.itemDustTinyDragonblood.name=Tiny Pile of Dragon Metal Dust
+item.itemDustSmallDragonblood.name=Small Pile of Dragon Metal Dust
+item.itemNuggetDragonblood.name=Shard of Dragonblood
+item.itemPlateDragonblood.name=Dragon Metal Plate
+item.itemPlateDoubleDragonblood.name=Double Dragon Metal Plate
+item.itemCellDragonblood.name=Dragonblood Cell
+tile.Block of Dragonblood.name=Block of Dragon Metal
+
+item.itemIngotBlackTitanium.name=Black Titanium Ingot
+item.itemDustBlackTitanium.name=Black Titanium Dust
+item.itemDustTinyBlackTitanium.name=Tiny Pile of Black Titanium Dust
+item.itemDustSmallBlackTitanium.name=Small Pile of Black Titanium Dust
+item.itemNuggetBlackTitanium.name=Black Titanium Nugget
+item.itemPlateBlackTitanium.name=Black Titanium Plate
+item.itemPlateDoubleBlackTitanium.name=Double Black Titanium Plate
+item.itemCellBlackTitanium.name=Black Titanium Cell
+tile.Block of Black Titanium.name=Block of Black Titanium
+
+item.itemIngotAncientGranite.name=Ancient Granite Ingot
+item.itemHotIngotAncientGranite.name=Hot Ancient Granite Ingot
+item.itemDustAncientGranite.name=Ancient Granite Dust
+item.itemDustTinyAncientGranite.name=Tiny Pile of Ancient Granite Dust
+item.itemDustSmallAncientGranite.name=Small Pile of Ancient Granite Dust
+item.itemNuggetAncientGranite.name=Ancient Granite Nugget
+item.itemPlateAncientGranite.name=Ancient Granite Plate
+item.itemPlateDoubleAncientGranite.name=Double Ancient Granite Plate
+tile.Block of Ancient Granite.name=Block of Ancient Granite
+
+item.itemIngotBabbitAlloy.name=Babbit Alloy Ingot
+item.itemHotIngotBabbitAlloy.name=Hot Babbit Alloy Ingot
+item.itemDustBabbitAlloy.name=Babbit Alloy Dust
+item.itemDustTinyBabbitAlloy.name=Tiny Pile of Babbit Alloy Dust
+item.itemDustSmallBabbitAlloy.name=Small Pile of Babbit Alloy Dust
+item.itemNuggetBabbitAlloy.name=Babbit Alloy Nugget
+item.itemPlateBabbitAlloy.name=Babbit Alloy Plate
+item.itemPlateDoubleBabbitAlloy.name=Double Babbit Alloy Plate
+item.itemCellBabbitAlloy.name=Babbit Alloy Cell
+tile.Block of Babbit Alloy.name=Block of Babbit Alloy
+
+item.itemIngotBlackMetal.name=Black Metal Ingot
+item.itemHotIngotBlackMetal.name=Hot Black Metal Ingot
+item.itemDustBlackMetal.name=Black Metal Dust
+item.itemDustTinyBlackMetal.name=Tiny Pile of Black Metal Dust
+item.itemDustSmallBlackMetal.name=Small Pile of Black Metal Dust
+item.itemNuggetBlackMetal.name=Black Metal Nugget
+item.itemPlateBlackMetal.name=Black Metal Plate
+item.itemPlateDoubleBlackMetal.name=Double Black Metal Plate
+item.itemBoltBlackMetal.name=Black Metal Bolt
+item.itemRodBlackMetal.name=Black Metal Rod
+item.itemRodLongBlackMetal.name=Long Black Metal Rod
+item.itemRingBlackMetal.name=Black Metal Ring
+item.itemScrewBlackMetal.name=Black Metal Screw
+item.itemRotorBlackMetal.name=Black Metal Rotor
+item.itemGearBlackMetal.name=Black Metal Gear
+item.itemCellBlackMetal.name=Black Metal Cell
+tile.Block of Black Metal.name=Block of Black Metal
+tile.Black Metal Frame Box.name=Black Metal Frame Box
+
+item.itemIngotWhiteMetal.name=White Metal Ingot
+item.itemHotIngotWhiteMetal.name=Hot White Metal Ingot
+item.itemDustWhiteMetal.name=White Metal Dust
+item.itemDustTinyWhiteMetal.name=Tiny Pile of White Metal Dust
+item.itemDustSmallWhiteMetal.name=Small Pile of White Metal Dust
+item.itemNuggetWhiteMetal.name=White Metal Nugget
+item.itemPlateWhiteMetal.name=White Metal Plate
+item.itemPlateDoubleWhiteMetal.name=Double White Metal Plate
+item.itemBoltWhiteMetal.name=White Metal Bolt
+item.itemRodWhiteMetal.name=White Metal Rod
+item.itemRodLongWhiteMetal.name=Long White Metal Rod
+item.itemRingWhiteMetal.name=White Metal Ring
+item.itemScrewWhiteMetal.name=White Metal Screw
+item.itemRotorWhiteMetal.name=White Metal Rotor
+item.itemGearWhiteMetal.name=White Metal Gear
+item.itemCellWhiteMetal.name=White Metal Cell
+tile.Block of White Metal.name=Block of White Metal
+tile.White Metal Frame Box.name=White Metal Frame Box
+
+//Added 29/04/2019
+tile.OreRunite.name=Runite Ore
+item.crushedRunite.name=Crushed Runite Ore
+item.oreRawRunite.name=Raw Runite Ore
+item.crushedCentrifugedRunite.name=Centrifuged Crushed Runite Ore
+item.crushedPurifiedRunite.name=Purified Crushed Runite Ore
+item.dustImpureRunite.name=Impure Runite Dust
+item.dustPureRunite.name=Purified Runite Dust
+
+tile.OreAncientGranite.name=Ancient Granite Ore
+item.crushedAncientGranite.name=Crushed Ancient Granite Ore
+item.oreRawAncientGranite.name=Raw Ancient Granite Ore
+item.crushedCentrifugedAncientGranite.name=Centrifuged Crushed Ancient Granite Ore
+item.crushedPurifiedAncientGranite.name=Purified Crushed Ancient Granite Ore
+item.dustImpureAncientGranite.name=Impure Ancient Granite Dust
+item.dustPureAncientGranite.name=Purified Ancient Granite Dust
+
+item.itemIngotRhugnor.name=Rhugnor Ingot
+item.itemDustRhugnor.name=Rhugnor Dust
+item.itemDustTinyRhugnor.name=Tiny Pile of Rhugnor Dust
+item.itemDustSmallRhugnor.name=Small Pile of Rhugnor Dust
+item.itemNuggetRhugnor.name=Rhugnor Nugget
+item.itemPlateRhugnor.name=Rhugnor Plate
+item.itemPlateDoubleRhugnor.name=Double Rhugnor Plate
+item.itemCellRhugnor.name=Rhugnor Cell
+tile.Block of Rhugnor.name=Block of Rhugnor
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=Charge Pack [LV]
+item.GTPP.BattPack.02.name=Charge Pack [MV]
+item.GTPP.BattPack.03.name=Charge Pack [HV]
+item.GTPP.BattPack.04.name=Charge Pack [EV]
+item.GTPP.BattPack.05.name=Charge Pack [IV]
+item.IndustrialDiamondExquisite.name=Exquisite Industrial Diamond
+
+item.itemSpringCelestialTungsten.name=Celestial Tungsten Spring
+item.itemSpringWhiteMetal.name=White Metal Spring
+item.itemSpringNitinol60.name=Nitinol 60 Spring
+item.itemSpringWatertightSteel.name=Watertight Steel Spring
+item.itemSpringEglinSteel.name=Eglin Steel Spring
+
+item.itemSmallSpringMaragingSteel250.name=Small Maraging Steel 250 Spring
+item.itemSmallSpringNichrome.name=Small Nichrome Spring
+item.itemSmallSpringStaballoy.name=Small Staballoy Spring
+item.itemSmallSpringBlackSteel.name=Small Black Steel Spring
+item.itemSmallSpringBlackTitanium.name=Small Black Titanium Spring
+
+item.itemFineWireWhiteMetal.name=Fine White Metal Wire
+item.itemFineWirePalladium.name=Fine Palladium Wire
+item.itemFineWireZirconium.name=Fine Zirconium Wire
+item.itemFineWireGrisium.name=Fine Grisium Wire
+item.itemFineWireBabbitAlloy.name=Fine Babbit Alloy Wire
+item.itemFineWireKoboldite.name=Fine Koboldite Wire
+item.itemFineWireHG1223.name=Fine HG-1223 Wire
+item.itemFineWireQuantum.name=Fine Quantum Wire
+
+item.itemHeavyPlatePotin.name=Heavy Potin Plate
+item.itemHeavyPlateWatertightSteel.name=Heavy Watertight Steel Plate
+item.itemHeavyPlateBronze.name=Heavy Bronze Plate
+item.itemHeavyPlateOsmiridium.name=Heavy Osmiridium Plate
+item.itemHeavyPlateQuantum.name=Heavy Quantum Plate
+item.itemHeavyPlateBlackSteel.name=Heavy Black Steel Plate
+item.itemHeavyPlateStainlessSteel.name=Heavy Stainless Steel Plate
+item.itemHeavyPlateEglinSteel.name=Heavy Eglin Steel Plate
+item.itemHeavyPlateMaragingSteel300.name=Heavy Maraging Steel 300 Plate
+item.itemHeavyPlateTalonite.name=Heavy Talonite Plate
+item.itemHeavyPlateHypogen.name=Heavy Hypogen Plate
+item.itemHeavyPlateRhugnor.name=Heavy Rhugnor Plate
+item.itemHeavyPlateAdvancedNitinol.name=Heavy Advanced Nitinol Plate
+item.itemHeavyPlateAstralTitanium.name=Heavy Astral Titanium Plate
+item.itemHeavyPlateCelestialTungsten.name=Heavy Celestial Tungsten Plate
+item.itemHeavyPlateWhiteMetal.name=Heavy White Metal Plate
+item.itemHeavyPlateBlackMetal.name=Heavy Black Metal Plate
+item.itemHeavyPlateAncientGranite.name=Heavy Ancient Granite Plate
+
+item.GTPP.bauble.fireprotection.0.name=Supreme Pizza Gloves
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=Selenium Dioxide Cell
+item.itemCellSeleniousAcid.name=Selenious Acid Cell
+
+//Added 25/7/19
+container.pestkiller=Pest Killer
+
+//Added 15/8/19
+gtpp.nei.decayables=Decayables Chest
+entity.batKing.name=Bat King
+item.itemCellCarbyne.name=Carbyne Cell
+item.itemCellHydrogenCyanide.name=Cell of Hydrogen Cyanide
+item.itemCactusCharcoal.name=Cactus Charcoal
+item.itemCactusCoke.name=Cactus Coke
+item.itemSugarCharcoal.name=Sugar Charcoal
+item.itemSugarCoke.name=Sugar Coke
+item.LiquidHydrogen.name=Liquid Hydrogen Cell [LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=Reinforced Door
+tile.blockInhibitorObelisk.name=Inhibitor Obelisk
+tile.Battlesign.name=Battlesign
+tile.blockMagicBox.name=Magic Box
+tile.blockManaPod.name=Mana Pod Stem
+tile.buildToolBlock.name=Tool Block
+tile.blockRedPlasma.name=Red Plasma Block
+tile.pipeBlock.name=Pipe
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=Greenockite Ore
+item.crushedGreenockite.name=Crushed Greenockite Ore
+item.oreRawGreenockite.name=Raw Greenockite Ore
+item.crushedCentrifugedGreenockite.name=Centrifuged Crushed Greenockite Ore
+item.crushedPurifiedGreenockite.name=Purified Crushed Greenockite Ore
+item.dustImpureGreenockite.name=Impure Greenockite Dust
+item.dustPureGreenockite.name=Purified Greenockite Dust
+item.itemDustGreenockite.name=Greenockite Dust
+item.itemDustTinyGreenockite.name=Tiny Pile of Greenockite Dust
+item.itemDustSmallGreenockite.name=Small Pile of Greenockite Dust
+
+tile.OreRareEarthI.name=Rare Earth (I) Ore
+item.crushedRareEarthI.name=Crushed Rare Earth (I) Ore
+item.oreRawRareEarthI.name=Raw Rare Earth (I) Ore
+item.crushedCentrifugedRareEarthI.name=Centrifuged Crushed Rare Earth (I) Ore
+item.crushedPurifiedRareEarthI.name=Purified Crushed Rare Earth (I) Ore
+item.dustImpureRareEarthI.name=Impure Rare Earth (I) Dust
+item.dustPureRareEarthI.name=Purified Rare Earth (I) Dust
+item.itemDustRareEarthI.name=Rare Earth (I) Dust
+item.itemDustTinyRareEarthI.name=Tiny Pile of Rare Earth (I) Dust
+item.itemDustSmallRareEarthI.name=Small Pile of Rare Earth (I) Dust
+
+tile.OreRareEarthII.name=Rare Earth (II) Ore
+item.crushedRareEarthII.name=Crushed Rare Earth (II) Ore
+item.oreRawRareEarthII.name=Raw Rare Earth (II) Ore
+item.crushedCentrifugedRareEarthII.name=Centrifuged Crushed Rare Earth (II) Ore
+item.crushedPurifiedRareEarthII.name=Purified Crushed Rare Earth (II) Ore
+item.dustImpureRareEarthII.name=Impure Rare Earth (II) Dust
+item.dustPureRareEarthII.name=Purified Rare Earth (II) Dust
+item.itemDustRareEarthII.name=Rare Earth (II) Dust
+item.itemDustTinyRareEarthII.name=Tiny Pile of Rare Earth (II) Dust
+item.itemDustSmallRareEarthII.name=Small Pile of Rare Earth (II) Dust
+
+tile.OreRareEarthIII.name=Rare Earth (III) Ore
+item.crushedRareEarthIII.name=Crushed Rare Earth (III) Ore
+item.oreRawRareEarthIII.name=Raw Rare Earth (III) Ore
+item.crushedCentrifugedRareEarthIII.name=Centrifuged Crushed Rare Earth (III) Ore
+item.crushedPurifiedRareEarthIII.name=Purified Crushed Rare Earth (III) Ore
+item.dustImpureRareEarthIII.name=Impure Rare Earth (III) Dust
+item.dustPureRareEarthIII.name=Purified Rare Earth (III) Dust
+item.itemDustRareEarthIII.name=Rare Earth (III) Dust
+item.itemDustTinyRareEarthIII.name=Tiny Pile of Rare Earth (III) Dust
+item.itemDustSmallRareEarthIII.name=Small Pile of Rare Earth (III) Dust
+
+//Added 16/10/19
+item.BioRecipeSelector.name=Programmed Bio Circuit
+item.FermentationBase.name=Cell of Fermentation Base
+item.ureamix.name=Cell of Urea Mix
+item.liquidresin.name=Cell of Liquid Resin
+item.propionicacid.name=Propionic Acid Cell
+item.aceticacid.name=Acetic Acid Cell
+item.BasicAgrichemItem.0.name=Algae Biomass
+item.BasicAgrichemItem.1.name=Green Algae Biomass
+item.BasicAgrichemItem.2.name=Brown Algae Biomass
+item.BasicAgrichemItem.3.name=Golden-Brown Algae Biomass
+item.BasicAgrichemItem.4.name=Red Algae Biomass
+item.BasicAgrichemItem.5.name=Cellulose Fiber
+item.BasicAgrichemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicAgrichemItem.7.name=Red Cellulose Fiber
+item.BasicAgrichemItem.8.name=Compost
+item.BasicAgrichemItem.9.name=Wood Pellet
+item.BasicAgrichemItem.10.name=Wood Brick
+item.BasicAgrichemItem.11.name=Cellulose Pulp
+item.BasicAgrichemItem.12.name=Raw Bio Resin
+item.BasicAgrichemItem.13.name=Catalyst Carrier
+item.BasicAgrichemItem.14.name=Green Metal Catalyst
+item.BasicAgrichemItem.15.name=Alginic Acid
+item.BasicAgrichemItem.16.name=Alumina
+item.BasicAgrichemItem.17.name=Aluminium Pellet
+item.BasicAgrichemItem.18.name=Sodium Aluminate
+item.BasicAgrichemItem.19.name=Sodium Hydroxide
+item.BasicAgrichemItem.20.name=Sodium Carbonate
+item.BasicAgrichemItem.21.name=Lithium Chloride
+
+//Added 24/10/19
+item.butanol.name=Butanol Cell
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=Heated Water
+fluidHotWater.name=Heated Water
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=Hot Titanium Ingot
+item.OilHeavy.name=Heavy Oil Cell
+item.UnsymmetricalDimethylhydrazine.name=Unsymmetrical Dimethylhydrazine Cell
+item.benzene.name=Benzene Cell
+item.Benzene.name=Benzene Cell
+item.phenol.name=Phenol Cell
+item.CarbonDioxide.name=Carbon Dioxide Cell
+item.itemCellCarbonDioxide.name=Carbon Dioxide Cell
+item.CarbonMonoxide.name=Carbon Monoxide Cell
+item.itemCellCarbonMonoxide.name=Carbon Monoxide Cell
+item.acetone.name=Acetone Cell
+item.saltwater.name=Salt Water Cell
+item.BasicAgrichemItem.22.name=Mold (Pellet)
+item.BasicAgrichemItem.23.name=Clean Aluminium Mix
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=Red Metal Catalyst
+item.BasicGenericChemItem.1.name=Yellow Metal Catalyst
+item.BasicGenericChemItem.2.name=Blue Metal Catalyst
+item.BasicGenericChemItem.3.name=Orange Metal Catalyst
+item.BasicGenericChemItem.4.name=Purple Metal Catalyst
+item.BasicGenericChemItem.5.name=Brown Metal Catalyst
+item.MudRedSlurry.name=Cell of Red Mud Slurry
+item.liquid_toluene.name=Toluene Cell
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=Pink Metal Catalyst
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=Raw Human Meat
+item.BasicMetaFood.1.name=Cooked Human Meat
+item.BasicMetaFood.2.name=Raw Horse Meat
+item.BasicMetaFood.3.name=Cooked Horse Meat
+item.BasicMetaFood.4.name=Raw Wolf Meat
+item.BasicMetaFood.5.name=Cooked Wolf Meat
+item.BasicMetaFood.6.name=Raw Ocelot Meat
+item.BasicMetaFood.7.name=Cooked Ocelot Meat
+item.BasicMetaFood.8.name=Blaze Flesh
+
+item.itemCellNaquadahFuel.name=Naquadah Fuel Cell
+item.itemCellEnrichedNaquadahFuel.name=Enriched Naquadah Fuel Cell
+item.itemCellNaquadriaFuel.name=Naquadria Fuel Cell
+item.boricacid.name=Boric Acid Cell
+item.hydrochloricacid.name=Hydrochloric Acid Cell
+
+item.BasicAlgaeItem.name=Breedable Algae
+item.BasicAlgaeItem.0.name=Breedable Algae
+item.BasicAlgaeItem.1.name=Breedable Algae
+item.BasicAlgaeItem.2.name=Breedable Algae
+item.BasicAlgaeItem.3.name=Breedable Algae
+item.BasicAlgaeItem.4.name=Breedable Algae
+item.BasicAlgaeItem.5.name=Breedable Algae
+item.BasicAlgaeItem.6.name=Breedable Algae
+
+//Added 30/03/20
+item.milledChalcopyrite.name=Milled Chalcopyrite
+item.milledSphalerite.name=Milled Sphalerite
+item.milledNickel.name=Milled Nickel
+item.milledPlatinum.name=Milled Platinum
+item.milledPentlandite.name=Milled Pentlandite
+item.FrothZincflotation.name=Sphalerite Flotation Froth Cell
+item.FrothCopperflotation.name=Chalcopyrite Flotation Froth Cell
+item.FrothNickelflotation.name=Nickel Flotation Froth Cell
+item.FrothPlatinumflotation.name=Platinum Flotation Froth Cell
+item.FrothPentlanditeflotation.name=Pentlandite Flotation Froth Cell
+item.BasicGenericChemItem.7.name=Alumina Milling Ball
+item.BasicGenericChemItem.8.name=Soapstone Milling Ball
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=Sodium Ethoxide Dust
+item.BasicGenericChemItem.10.name=Sodium Ethyl Xanthate Dust
+item.BasicGenericChemItem.11.name=Potassium Ethyl Xanthate Dust
+item.BasicGenericChemItem.12.name=Potassium Hydroxide Dust
+item.CarbonDisulfide.name=Carbon Disulfide Cell
+item.HydrogenSulfide.name=Hydrogen Sulfide Cell
+item.BasicAgrichemItem.24.name=Pinecone
+item.BasicAgrichemItem.25.name=Crushed Pine Materials
+item.pineoil.name=Pine Oil Cell
+
+//Added 11/4/20
+item.milledRedstone.name=Milled Redstone
+item.milledSpessartine.name=Milled Spessartine
+item.milledGrossular.name=Milled Grossular
+item.milledAlmandine.name=Milled Almandine
+item.milledPyrope.name=Milled Pyrope
+item.FrothRedstoneflotation.name=Redstone Flotation Froth Cell
+item.FrothSpessartineflotation.name=Spessartine Flotation Froth Cell
+item.FrothGrossularflotation.name=Grossular Flotation Froth Cell
+item.FrothAlmandineflotation.name=Almandine Flotation Froth Cell
+item.FrothPyropeflotation.name=Pyrope Flotation Froth Cell
+
+//Added 13/04/20
+item.T3RecipeSelector.name=Programmed Breakthrough Circuit
+
+//Added 03/05/20
+entity.miscutils.batKing.name=Spectral Bat
+entity.miscutils.bigChickenFriendly.name=Giant Chicken
+entity.miscutils.AusDingo.name=Dingo
+entity.miscutils.AusBoar.name=Wild Boar
+entity.miscutils.AusSpider.name=Forest Spider
+entity.miscutils.AusOctopus.name=Octopus
+container.EggBox=Egg Hatching Box
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=Volumetric Flask Configurator
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=Laurenium Ingot
+item.itemHotIngotLaurenium.name=Hot Laurenium Ingot
+item.itemDustLaurenium.name=Laurenium Dust
+item.itemDustTinyLaurenium.name=Tiny Pile of Laurenium Dust
+item.itemDustSmallLaurenium.name=Small Pile of Laurenium Dust
+item.itemNuggetLaurenium.name=Laurenium Nugget
+item.itemPlateLaurenium.name=Laurenium Plate
+item.itemPlateDoubleLaurenium.name=Double Laurenium Plate
+item.itemBoltLaurenium.name=Laurenium Bolt
+item.itemRodLaurenium.name=Laurenium Rod
+item.itemRodLongLaurenium.name=Long Laurenium Rod
+item.itemRingLaurenium.name=Laurenium Ring
+item.itemScrewLaurenium.name=Laurenium Screw
+item.itemRotorLaurenium.name=Laurenium Rotor
+item.itemGearLaurenium.name=Laurenium Gear
+item.itemCellLaurenium.name=Laurenium Cell
+tile.Block of Laurenium.name=Block of Laurenium
+tile.Laurenium Frame Box.name=Laurenium Frame Box
+item.itemIngotBotmium.name=Botmium Ingot
+item.itemHotIngotBotmium.name=Hot Botmium Ingot
+item.itemDustBotmium.name=Botmium Dust
+item.itemDustTinyBotmium.name=Tiny Pile of Botmium Dust
+item.itemDustSmallBotmium.name=Small Pile of Botmium Dust
+item.itemNuggetBotmium.name=Botmium Nugget
+item.itemPlateBotmium.name=Botmium Plate
+item.itemPlateDoubleBotmium.name=Double Botmium Plate
+item.itemBoltBotmium.name=Botmium Bolt
+item.itemRodBotmium.name=Botmium Rod
+item.itemRodLongBotmium.name=Long Botmium Rod
+item.itemRingBotmium.name=Botmium Ring
+item.itemScrewBotmium.name=Botmium Screw
+item.itemRotorBotmium.name=Botmium Rotor
+item.itemGearBotmium.name=Botmium Gear
+item.itemCellBotmium.name=Botmium Cell
+tile.Block of Botmium.name=Block of Botmium
+tile.Botmium Frame Box.name=Botmium Frame Box
+
+//Added 29/05/20
+item.itemBasicTurbine.name=Basic Turbine
+item.itemBasicTurbine_0.name=Basic Iron Turbine
+item.itemBasicTurbine_1.name=Basic Bronze Turbine
+item.itemBasicTurbine_2.name=Basic Steel Turbine
+
+interaction.voidexcess.enabled=Void Excess Enabled
+interaction.voidexcess.disabled=Void Excess Disabled
+
+interaction.separateBusses.enabled=Input busses are separated
+interaction.separateBusses.disabled=Input busses are not separated
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=Uranium Residue Mix
+item.BasicNuclearChemItem.1.name=Plutonium Residue Mix
+item.BasicNuclearChemItem.2.name=Fluoride Residue Mix
+item.BasicNuclearChemItem.3.name=Noble Residue Mix
+item.BasicNuclearChemItem.4.name=Red Algae Biomass
+item.BasicNuclearChemItem.5.name=Cellulose Fiber
+item.BasicNuclearChemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicNuclearChemItem.7.name=Red Cellulose Fiber
+
+item.itemCellLiFBeF2ZrF4U235.name=LFTR Fuel I Cell
+item.itemCellLiFBeF2ZrF4UF4.name=LFTR Fuel II Cell
+item.itemCellLiFBeF2ThF4UF4.name=LFTR Fuel III Cell
+item.Li2BeF2UF4.name=Burnt Li2BeF2UF4 Cell
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP Cell
+item.itemCellUF6F2.name=UF6F2 Cell
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4 Cell
+item.itemCellUF6F2FP.name=UF6F2FP Cell
+item.dustProtactinium233.name=Protactinium-233 Dust
+item.itemCellLiFThF4.name=LiFThF4 Cell
+item.NuclearWaste.name=Nuclear Waste Cell
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4 Cell
+item.itemCellSodiumFluoride.name=Sodium Fluoride Cell
+item.itemCellLiFBeF2.name=LiFBeF2 Cell
+
+//Added 7/12/21
+item.itemCellDysprosium.name=Dysprosium Cell
+item.itemCellThorium.name=Thorium Cell
+item.itemCellTellurium.name=Tellurium Cell
+item.itemCellThorium232.name=Thorium-232 Cell
+item.itemCellLithiumTetrafluoroberyllate.name=Lithium Tetrafluoroberyllate Cell
+item.itemCellBurntReactorFuelI.name=Spent LFTR Fuel I Cell
+item.itemCellBurntReactorFuelII.name=Spent LFTR Fuel II Cell
+item.itemDustTinyIndium.name=Tiny Indium Dust
+item.itemDustSmallIndium.name=Small Indium Dust
+item.itemDustIndium.name=Indium Dust
+item.itemDustTinyBerylliumHydroxide.name=Tiny Beryllium Hydroxide Dust
+item.itemDustSmallBerylliumHydroxide.name=Small Beryllium Hydroxide Dust
+item.itemDustBerylliumHydroxide.name=Beryllium Hydroxide Dust
+item.itemDustTinyAmmoniumBifluoride.name=Tiny Ammonium Bifluoride Dust
+item.itemDustSmallAmmoniumBifluoride.name=Small Ammonium Bifluoride Dust
+item.itemDustAmmoniumBifluoride.name=Ammonium Bifluoride Dust
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=Tiny Ammonium Tetrafluoroberyllate Dust
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=Small Ammonium Tetrafluoroberyllate Dust
+item.itemDustAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Dust
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=Impure LiFBeF2 Cell
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=Helium Sparged LiFBeF2UF4FP Cell
+item.itemCellFluorineSpargedLiFThF4.name=Fluorine Sparged LiFThF4 Cell
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=Fluorine Sparged LiFBeF2ThF4 Cell
+item.itemIngotHS188A.name=HS-188A Ingot
+item.itemHotIngotHS188A.name=Hot HS-188A Ingot
+item.itemDustHS188A.name=HS-188A Dust
+item.itemDustTinyHS188A.name=Tiny Pile of HS-188A Dust
+item.itemDustSmallHS188A.name=Small Pile of HS-188A Dust
+item.itemNuggetHS188A.name=HS-188A Nugget
+item.itemPlateHS188A.name=HS-188A Plate
+item.itemPlateDoubleHS188A.name=Double HS-188A Plate
+item.itemBoltHS188A.name=HS-188A Bolt
+item.itemRodHS188A.name=HS-188A Rod
+item.itemRodLongHS188A.name=Long HS-188A Rod
+item.itemRingHS188A.name=HS-188A Ring
+item.itemScrewHS188A.name=HS-188A Screw
+item.itemRotorHS188A.name=HS-188A Rotor
+item.itemGearHS188A.name=HS-188A Gear
+item.itemCellHS188A.name=HS-188A Cell
+
+//Added 12/12/21
+item.itemIngotErbium.name=Erbium Ingot
+item.itemHotIngotErbium.name=Hot Erbium Ingot
+item.itemDustErbium.name=Erbium Dust
+item.itemDustTinyErbium.name=Tiny Pile of Erbium Dust
+item.itemDustSmallErbium.name=Small Pile of Erbium Dust
+item.itemNuggetErbium.name=Erbium Nugget
+item.itemPlateErbium.name=Erbium Plate
+item.itemPlateDoubleErbium.name=Double Erbium Plate
+item.itemBoltErbium.name=Erbium Bolt
+item.itemRodErbium.name=Erbium Rod
+item.itemRodLongErbium.name=Long Erbium Rod
+item.itemRingErbium.name=Erbium Ring
+item.itemScrewErbium.name=Erbium Screw
+item.itemRotorErbium.name=Erbium Rotor
+item.itemGearErbium.name=Erbium Gear
+item.itemCellErbium.name=Erbium Cell
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr Ingot
+item.itemHotIngotHeLiCoPtEr.name=Hot HeLiCoPtEr Ingot
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr Dust
+item.itemDustTinyHeLiCoPtEr.name=Tiny Pile of HeLiCoPtEr Dust
+item.itemDustSmallHeLiCoPtEr.name=Small Pile of HeLiCoPtEr Dust
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr Nugget
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr Plate
+item.itemPlateDoubleHeLiCoPtEr.name=Double HeLiCoPtEr Plate
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr Bolt
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr Rod
+item.itemRodLongHeLiCoPtEr.name=Long HeLiCoPtEr Rod
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr Ring
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr Screw
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr Rotor
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr Gear
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr Cell
+item.itemIngotPraseodymium.name=Praseodymium Ingot
+item.itemHotIngotPraseodymium.name=Hot Praseodymium Ingot
+item.itemDustPraseodymium.name=Praseodymium Dust
+item.itemDustTinyPraseodymium.name=Tiny Pile of Praseodymium Dust
+item.itemDustSmallPraseodymium.name=Small Pile of Praseodymium Dust
+item.itemNuggetPraseodymium.name=Praseodymium Nugget
+item.itemPlatePraseodymium.name=Praseodymium Plate
+item.itemPlateDoublePraseodymium.name=Double Praseodymium Plate
+item.itemBoltPraseodymium.name=Praseodymium Bolt
+item.itemRodPraseodymium.name=Praseodymium Rod
+item.itemRodLongPraseodymium.name=Long Praseodymium Rod
+item.itemRingPraseodymium.name=Praseodymium Ring
+item.itemScrewPraseodymium.name=Praseodymium Screw
+item.itemRotorPraseodymium.name=Praseodymium Rotor
+item.itemGearPraseodymium.name=Praseodymium Gear
+item.itemCellPraseodymium.name=Praseodymium Cell
+item.milledMonazite.name=Milled Monazite
+item.FrothMonaziteflotation.name=Monazite Flotation Froth Cell
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=Formaldehyde Catalyst
+item.hydrogenchloridemix.name=Hydrogen Chlorine Mix
+
+//Added 19/01/22
+item.SunnariumBit.name=Sunnarium Bit
+
+//Added 29/01/22
+sleep.event.okay=You slept well and now feel a little better.
+sleep.event.good=You slept well and now feel much better.
+sleep.event.wellrested=You feel really well rested.
+sleep.event.downsides=The downsides of life no longer effect you.
+item.miscutils:magicfeather.name=Magical Feather
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=Solid-Acid Catalyst
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=Infinite Mutation Catalyst
+
+//Added 23/10/22
+miscutils.machines.QFTFluidMode=Quantum Force Transformer Fluid Output Mode
+
+//Added 16/11/22
+item.BasicGenericChemItem.16.name=Platinum Group Catalyst
+item.BasicGenericChemItem.17.name=Plastic Polymer Catalyst
+item.BasicGenericChemItem.18.name=Rubber Polymer Catalyst
+item.BasicGenericChemItem.19.name=Adhesion Promoter Catalyst
+item.BasicGenericChemItem.20.name=Tita-Tungsten Indium Catalyst
+item.BasicGenericChemItem.21.name=Radioactivity Catalyst
+item.BasicGenericChemItem.22.name=Rare-Earth Group Catalyst
+item.BasicGenericChemItem.23.name=Simple Naquadah Catalyst
+item.BasicGenericChemItem.24.name=Advanced Naquadah Catalyst
+item.BasicGenericChemItem.25.name=Raw Intelligence Catalyst
+item.BasicGenericChemItem.26.name=Ultimate Plasticizer Catalyst
+item.BasicGenericChemItem.27.name=Biological Intelligence Catalyst
+item.BasicGenericChemItem.28.name=Temporal Harmonizer Catalyst
+
+item.ItemCustomSpawnEgg.name=Spawn %s
+item.itemSimpleFiremaker.message.0=You light the fire pit.
+item.itemSimpleFiremaker.message.1=You somehow managed to set yourself on fire...
+item.itemSimpleFiremaker.message.2=You created a fire!
+item.itemSimpleFiremaker.message.3=Your attemp does nothing.
+
+//Added 17/07/23
+item.BasicGenericChemItem.29.name=Limpid Water Catalyst
+item.BasicGenericChemItem.30.name=Flawless Water Catalyst
+
+//Added 18/07/23
+item.BasicGenericChemItem.31.name=Particle Acceleration Catalyst
+item.BasicGenericChemItem.32.name=Synchrotron-Capable Catalyst
+
+//Added 19/09/23
+item.BasicGenericChemItem.33.name=Algagenic Growth Promoter Catalyst
diff --git a/src/main/resources/assets/miscutils/lang/ru_RU.lang b/src/main/resources/assets/miscutils/lang/ru_RU.lang
new file mode 100644
index 0000000000..807de0ef72
--- /dev/null
+++ b/src/main/resources/assets/miscutils/lang/ru_RU.lang
@@ -0,0 +1,3351 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Блоки
+itemGroup.MiscUtilMiscTab=[GT++] Предметы
+itemGroup.MiscUtilCombatTab=[GT++] Бой
+itemGroup.MiscUtilToolsTab=[GT++] Инструменты
+itemGroup.MiscUtilMachineTab=[GT++] Машины
+itemGroup.MiscUtilOtherTab=[GT++] Предметы II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Additions
+
+//Debug
+item.AAA_Broken.name=[Несуществующий элемент] Сообщите об этом рецепте на Github, пожалуйста.
+item.itemBedLocator_Base.name=Локатор кровати [NBT Test]
+item.itemBaseItemWithCharge.name=Base Chargeable Item
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Shapes
+
+//Fluids
+tile.fluidSludge.name=Застоявшиеся сточные воды
+tile.fluidSludge.0.name=Застоявшиеся сточные воды
+
+//Death Messages
+death.attack.plasmabolt=%s died by burning hot plasma.
+death.attack.plasmabolt.player=%1$s was killed by %2$s using plasma.
+death.attack.gtpp.grinder=%s was ground into nothingness by an IsaMill.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Plate of Battery Alloy
+item.itemIngotBatteryAlloy.name=Ingot of Battery Alloy
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Empty Fuel Rod
+item.itemFuelRod_Thorium.name=Thorium Fuel Rod
+item.itemFuelRod_Uranium.name=Uranium Fuel Rod
+item.itemFuelRod_Plutonium.name=Plutonium Fuel Rod
+
+//Entities
+entity.constructStaballoy.name=Staballoy Construct
+entity.sickBlaze.name=Infected Zealot
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Tool Constructor
+
+//Tools
+item.itemBufferCore.name=Энергетическое ядро
+item.itemStaballoyPickaxe.name=Туннелекопатель
+item.itemStaballoyAxe.name=Лесоруб
+item.itemSandstoneHammer.name=Дробилка булыжников
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Blazing Pyrotheum Bucket
+item.MiscUtils.bucket.bucketCryotheum.name=Gelid Cryotheum Bucket
+item.MiscUtils.bucket.bucketEnder.name=Resonant Ender Bucket
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheum Dust
+item.MiscUtils.material.dustCryotheum.name=Cryotheum Dust
+item.MiscUtils.material.rodBlizz.name=Blizz Rod
+item.MiscUtils.material.dustBlizz.name=Blizz Powder
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=Жидкий Пиротеум
+tile.miscutils.fluid.cryotheum.name=Жидкий Криотеум
+tile.miscutils.fluid.ender.name=Жидкий Эндер
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=Accelerated Frame
+item.frameVoid.name=Void Frame
+item.frameMutagenic.name=Mutagenic Frame
+item.frameBusy.name=Working Frame
+item.frameChocolate.name=Chocolate Frame
+item.frameRestraint.name=Restraining Frame
+item.frameSoul.name=Soul Frame
+item.frameHealing.name=Healing Frame
+item.frameNova.name=Nova Frame
+item.frameArborists.name=Arborist Frame
+item.frameDecaying.name=Decaying Frame
+item.frameSlowing.name=Slowing Frame
+item.frameStabilizing.name=Stabilizing Frame
+item.frameUseless.name=Useless Frame
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Energetic Alloy Rotor Blade
+item.itemTungstenSteelRotorBlade.name=TungstenSteel Rotor Blade
+item.itemVibrantRotorBlade.name=Vibrant Alloy Rotor Blade
+item.itemIridiumRotorBlade.name=Iridium Rotor Blade
+item.itemEnergeticShaft.name=Energetic Alloy Shaft
+item.itemTungstenSteelShaft.name=TungstenSteel Shaft
+item.itemVibrantShaft.name=Vibrant Alloy Shaft
+item.itemIridiumShaft.name=Iridium Shaft
+item.itemMagnaliumRotorBlade.name=Magnalium Rotor Blade
+item.itemUltimetRotorBlade.name=Ultimet Blade
+item.itemMagnaliumShaft.name=Magnalium Shaft
+item.itemUltimetShaft.name=Ultimet Shaft
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Enriched Soularium Plate
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+item.itemAlkalusDisk.name=Alkalus Disk
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Компрессированный Обсидиан (9)
+tile.blockCompressedObsidian.1.name=Double Compressed Obsidian (81)
+tile.blockCompressedObsidian.2.name=Triple Compressed Obsidian (729)
+tile.blockCompressedObsidian.3.name=Quadruple Compressed Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Quintuple Compressed Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Inverted Obsidian
+tile.blockCompressedObsidian.6.name=Compressed Glowstone (9)
+tile.blockCompressedObsidian.7.name=Double Compressed Glowstone (81)
+tile.blockCompressedObsidian.8.name=Triple Compressed Glowstone (729)
+tile.blockCompressedObsidian.9.name=Quadruple Compressed Glowstone (6561)
+tile.blockCompressedObsidian.10.name=Quintuple Compressed Glowstone (59049)
+tile.blockNet.name=сети
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=High Quality Sulfur Dioxide Cell
+item.mobessence.name=Mob Essence Cell
+item.Fertiliser.name=Fertiliser Cell
+item.UN32Fertiliser.name=UN-32 Fertiliser Cell
+item.UN18Fertiliser.name=UN-18 Fertiliser Cell
+item.RaisinJuice.name=Raisin Juice Cell
+item.BerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.AmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.Hydroxide.name=Hydroxide Cell
+item.Ammonium.name=Ammonium Cell
+item.AmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+
+//Resources
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+item.itemCoalCoke.name=Coking Coal
+item.itemHydrogenBlob.name=Mysterious Hydrogen Blob
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus Disk
+item.itemSimpleFiremaker.name=Basic Firemaker
+item.itemFiber.name=Plant Fiber
+item.itemRope.name=Rope
+item.backpackRed.name=Red Backpack
+item.backpackGreen.name=Green Backpack
+item.backpackBlue.name=Blue Backpack
+item.backpackYellow.name=Yellow Backpack
+item.backpackPurple.name=Purple Backpack
+item.backpackCyan.name=Cyan Backpack
+item.backpackMaroon.name=Maroon Backpack
+item.backpackOlive.name=Olive Backpack
+item.backpackDarkGreen.name=Dark Green Backpack
+item.backpackDarkPurple.name=Dark Purple Backpack
+item.backpackTeal.name=Teal Backpack
+item.backpackNavy.name=Navy Backpack
+item.backpackSilver.name=Silver Backpack
+item.backpackGray.name=Gray Backpack
+item.backpackBlack.name=Black Backpack
+item.backpackWhite.name=White Backpack
+item.itemBlueprint.name=Blueprint [I am useless]
+item.itemGemShards.name=Diamond Shards
+item.itemHalfCompleteCasings.name=Half Complete Casing
+item.itemSulfuricPotion.name=Throwable Vial of Sulfuric Acid
+item.itemHydrofluoricPotion.name=Throwable Vial of Hydrofluoric Acid
+
+
+//Conversion Dusts
+item.dustNeptunium238.name=Neptunium 238 Dust
+item.dustRadium226.name=Radium 226 Dust
+item.itemDustDecayedRadium226.name=Decayed Radium 226 Dust
+item.itemDustSmallDecayedRadium226.name=Small Decayed Radium 226 Dust
+item.itemDustTinyDecayedRadium226.name=Tiny Decayed Radium 226 Dust
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium Dust
+item.itemDustSmallGadolinium.name=Small Pile of Gadolinium Dust
+item.itemDustTinyGadolinium.name=Tiny Pile of Gadolinium Dust
+item.itemDustYtterbium.name=Ytterbium Dust
+item.itemDustSmallYtterbium.name=Small Pile of Ytterbium Dust
+item.itemDustTinyYtterbium.name=Tiny Pile of Ytterbium Dust
+item.itemDustSamarium.name=Samarium Dust
+item.itemDustSmallSamarium.name=Small Pile of Samarium Dust
+item.itemDustTinySamarium.name=Tiny Pile of Samarium Dust
+item.itemDustLanthanum.name=Lanthanum Dust
+item.itemDustSmallLanthanum.name=Small Pile of Lanthanum Dust
+item.itemDustTinyLanthanum.name=Tiny Pile of Lanthanum Dust
+item.itemCellNeon.name=Neon Cell
+item.itemCellGermanium.name=Germanium Cell
+item.itemCellSelenium.name=Selenium Cell
+item.itemCellBromine.name=Bromine Cell
+item.itemCellKrypton.name=Krypton Cell
+item.itemCellZirconium.name=Zirconium Cell
+item.itemCellTechnetium.name=Technetium Cell
+item.itemCellRuthenium.name=Ruthenium Cell
+item.itemCellRhodium.name=Rhodium Cell
+item.itemCellIodine.name=Iodine Cell
+item.itemCellXenon.name=Xenon Cell
+item.itemCellHafnium.name=Hafnium Cell
+item.itemCellRhenium.name=Rhenium Cell
+item.itemCellThallium.name=Thallium Cell
+item.itemCellPolonium.name=Polonium Cell
+item.itemCellAstatine.name=Astatine Cell
+item.itemCellFrancium.name=Francium Cell
+item.itemCellRadium.name=Radium Cell
+item.itemCellActinium.name=Actinium Cell
+item.itemCellProtactinium.name=Protactinium Cell
+item.itemCellNeptunium.name=Neptunium Cell
+item.itemCellCurium.name=Curium Cell
+item.itemCellBerkelium.name=Berkelium Cell
+item.itemCellCalifornium.name=Californium Cell
+item.itemCellEinsteinium.name=Einsteinium Cell
+item.itemCellFermium.name=Fermium Cell
+item.itemCellRefinedTrinium.name=Refined Trinium Cell
+item.itemIngotSelenium.name=Selenium Ingot
+item.itemDustSelenium.name=Пыль Селена
+item.itemDustTinySelenium.name=Tiny Pile of Selenium Dust
+item.itemDustSmallSelenium.name=Small Pile of Selenium Dust
+item.itemNuggetSelenium.name=Selenium Nugget
+item.itemPlateSelenium.name=Selenium Plate
+item.itemPlateDoubleSelenium.name=Double Selenium Plate
+item.itemBoltSelenium.name=Selenium Bolt
+item.itemRodSelenium.name=Selenium Rod
+item.itemRodLongSelenium.name=Long Selenium Rod
+item.itemRingSelenium.name=Selenium Ring
+item.itemScrewSelenium.name=Selenium Screw
+item.itemRotorSelenium.name=Selenium Rotor
+item.itemGearSelenium.name=Selenium Gear
+item.itemCellUranium232.name=Uranium 232 Cell
+item.itemCellUranium233.name=Uranium 233 Cell
+item.itemCellThoriumTetrafluoride.name=Thorium Tetrafluoride Cell
+item.itemCellThoriumHexafluoride.name=Thorium Hexafluoride Cell
+item.itemCellUraniumTetrafluoride.name=Uranium Tetrafluoride Cell
+item.itemCellUraniumHexafluoride.name=Uranium Hexafluoride Cell
+item.itemCellZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.itemCellBerylliumFluoride.name=Beryllium Fluoride Cell
+item.itemCellLithiumFluoride.name=Lithium Fluoride Cell
+item.itemCellHydroxide.name=Hydroxide Cell
+item.itemCellAmmonium.name=Ammonium Cell
+item.itemCellAmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.itemCellBerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+item.itemCellNeptuniumHexafluoride.name=Neptunium Hexafluoride Cell
+item.itemCellTechnetiumHexafluoride.name=Technetium Hexafluoride Cell
+item.itemCellSeleniumHexafluoride.name=Selenium Hexafluoride Cell
+item.itemCellEnergyCrystal.name=Energy Crystal Cell
+item.itemCellBloodSteel.name=Blood Steel Cell
+item.itemCellStaballoy.name=Staballoy Cell
+item.itemCellTantalloy60.name=Tantalloy-60 Cell
+item.itemCellTantalloy61.name=Tantalloy-61 Cell
+item.itemCellTumbaga.name=Tumbaga Cell
+item.itemCellPotin.name=Potin Cell
+item.itemCellInconel625.name=Inconel-625 Cell
+item.itemCellInconel690.name=Inconel-690 Cell
+item.itemCellInconel792.name=Inconel-792 Cell
+item.itemCellZeron100.name=Zeron-100 Cell
+item.itemCellMaragingSteel250.name=Maraging Steel 250 Cell
+item.itemCellMaragingSteel300.name=Maraging Steel 300 Cell
+item.itemCellMaragingSteel350.name=Maraging Steel 350 Cell
+item.itemCellStellite.name=Stellite Cell
+item.itemCellTalonite.name=Talonite Cell
+item.itemCellHastelloyW.name=Hastelloy-W Cell
+item.itemCellHastelloyX.name=Hastelloy-X Cell
+item.itemCellHastelloyN.name=Hastelloy-N Cell
+item.itemCellHastelloyC276.name=Hastelloy-C276 Cell
+item.itemCellIncoloy020.name=Incoloy-020 Cell
+item.itemCellIncoloyDS.name=Incoloy-DS Cell
+item.itemCellIncoloyMA956.name=Incoloy-MA956 Cell
+item.itemCellTungstenCarbide.name=Tungsten Carbide Cell
+item.itemCellSiliconCarbide.name=Silicon Carbide Cell
+item.itemCellTantalumCarbide.name=Tantalum Carbide Cell
+item.itemCellZirconiumCarbide.name=Zirconium Carbide Cell
+item.itemCellNiobiumCarbide.name=Niobium Carbide Cell
+item.itemCellGrisium.name=Grisium Cell
+item.itemCellEglinSteelBaseCompound.name=Eglin Steel Base Compound Cell
+item.itemCellEglinSteel.name=Eglin Steel Cell
+item.itemCellHG1223.name=HG-1223 Cell
+item.itemCellTriniumTitaniumAlloy.name=Trinium Titanium Alloy Cell
+item.itemCellTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Cell
+item.itemCellTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Cell
+item.itemCellQuantum.name=Quantum Cell
+item.itemIngotBromine.name=Bromine Ingot
+item.itemDustBromine.name=Пыль Брома
+item.itemDustTinyBromine.name=Tiny Pile of Bromine Dust
+item.itemDustSmallBromine.name=Small Pile of Bromine Dust
+item.itemNuggetBromine.name=Bromine Nugget
+item.itemPlateBromine.name=Bromine Plate
+item.itemPlateDoubleBromine.name=Double Bromine Plate
+item.itemIngotStrontium.name=Strontium Ingot
+item.itemDustStrontium.name=Пыль Стронция
+item.itemDustTinyStrontium.name=Tiny Pile of Strontium Dust
+item.itemDustSmallStrontium.name=Small Pile of Strontium Dust
+item.itemNuggetStrontium.name=Strontium Nugget
+item.itemPlateStrontium.name=Strontium Plate
+item.itemPlateDoubleStrontium.name=Double Strontium Plate
+item.itemBoltStrontium.name=Strontium Bolt
+item.itemRodStrontium.name=Strontium Rod
+item.itemRodLongStrontium.name=Long Strontium Rod
+item.itemRingStrontium.name=Strontium Ring
+item.itemScrewStrontium.name=Strontium Screw
+item.itemRotorStrontium.name=Strontium Rotor
+item.itemGearStrontium.name=Strontium Gear
+item.itemIngotZirconium.name=Zirconium Ingot
+item.itemDustZirconium.name=Пыль Циркония
+item.itemDustTinyZirconium.name=Tiny Pile of Zirconium Dust
+item.itemDustSmallZirconium.name=Small Pile of Zirconium Dust
+item.itemNuggetZirconium.name=Zirconium Nugget
+item.itemPlateZirconium.name=Zirconium Plate
+item.itemPlateDoubleZirconium.name=Double Zirconium Plate
+item.itemBoltZirconium.name=Zirconium Bolt
+item.itemRodZirconium.name=Zirconium Rod
+item.itemRodLongZirconium.name=Long Zirconium Rod
+item.itemRingZirconium.name=Zirconium Ring
+item.itemScrewZirconium.name=Zirconium Screw
+item.itemRotorZirconium.name=Zirconium Rotor
+item.itemGearZirconium.name=Zirconium Gear
+item.itemIngotRuthenium.name=Ruthenium Ingot
+item.itemDustRuthenium.name=Пыль Рутения
+item.itemDustTinyRuthenium.name=Tiny Pile of Ruthenium Dust
+item.itemDustSmallRuthenium.name=Small Pile of Ruthenium Dust
+item.itemNuggetRuthenium.name=Ruthenium Nugget
+item.itemPlateRuthenium.name=Ruthenium Plate
+item.itemPlateDoubleRuthenium.name=Double Ruthenium Plate
+item.itemBoltRuthenium.name=Ruthenium Bolt
+item.itemRodRuthenium.name=Ruthenium Rod
+item.itemRodLongRuthenium.name=Long Ruthenium Rod
+item.itemRingRuthenium.name=Ruthenium Ring
+item.itemScrewRuthenium.name=Ruthenium Screw
+item.itemRotorRuthenium.name=Ruthenium Rotor
+item.itemGearRuthenium.name=Ruthenium Gear
+item.itemIngotIodine.name=Iodine Ingot
+item.itemDustIodine.name=Пыль Йода
+item.itemDustTinyIodine.name=Tiny Pile of Iodine Dust
+item.itemDustSmallIodine.name=Small Pile of Iodine Dust
+item.itemNuggetIodine.name=Iodine Nugget
+item.itemPlateIodine.name=Iodine Plate
+item.itemPlateDoubleIodine.name=Double Iodine Plate
+item.itemBoltIodine.name=Iodine Bolt
+item.itemRodIodine.name=Iodine Rod
+item.itemRodLongIodine.name=Long Iodine Rod
+item.itemRingIodine.name=Iodine Ring
+item.itemScrewIodine.name=Iodine Screw
+item.itemRotorIodine.name=Iodine Rotor
+item.itemGearIodine.name=Iodine Gear
+item.itemIngotHafnium.name=Hafnium Ingot
+item.itemDustHafnium.name=Пыль Гафния
+item.itemDustTinyHafnium.name=Tiny Pile of Hafnium Dust
+item.itemDustSmallHafnium.name=Small Pile of Hafnium Dust
+item.itemNuggetHafnium.name=Hafnium Nugget
+item.itemPlateHafnium.name=Hafnium Plate
+item.itemPlateDoubleHafnium.name=Double Hafnium Plate
+item.itemBoltHafnium.name=Hafnium Bolt
+item.itemRodHafnium.name=Hafnium Rod
+item.itemRodLongHafnium.name=Long Hafnium Rod
+item.itemRingHafnium.name=Hafnium Ring
+item.itemScrewHafnium.name=Hafnium Screw
+item.itemRotorHafnium.name=Hafnium Rotor
+item.itemGearHafnium.name=Hafnium Gear
+item.itemIngotDysprosium.name=Dysprosium Ingot
+item.itemDustDysprosium.name=Dysprosium Dust
+item.itemDustTinyDysprosium.name=Tiny Pile of Dysprosium Dust
+item.itemDustSmallDysprosium.name=Small Pile of Dysprosium Dust
+item.itemNuggetDysprosium.name=Dysprosium Nugget
+item.itemPlateDysprosium.name=Dysprosium Plate
+item.itemPlateDoubleDysprosium.name=Double Dysprosium Plate
+item.itemBoltDysprosium.name=Dysprosium Bolt
+item.itemRodDysprosium.name=Dysprosium Rod
+item.itemRodLongDysprosium.name=Long Dysprosium Rod
+item.itemRingDysprosium.name=Dysprosium Ring
+item.itemScrewDysprosium.name=Dysprosium Screw
+item.itemRotorDysprosium.name=Dysprosium Rotor
+item.itemGearDysprosium.name=Dysprosium Gear
+item.itemIngotTellurium.name=Tellurium Ingot
+item.itemDustTellurium.name=Tellurium Dust
+item.itemDustTinyTellurium.name=Tiny Pile of Tellurium Dust
+item.itemDustSmallTellurium.name=Small Pile of Tellurium Dust
+item.itemNuggetTellurium.name=Tellurium Nugget
+item.itemPlateTellurium.name=Tellurium Plate
+item.itemPlateDoubleTellurium.name=Double Tellurium Plate
+item.itemBoltTellurium.name=Tellurium Bolt
+item.itemRodTellurium.name=Tellurium Rod
+item.itemRodLongTellurium.name=Long Tellurium Rod
+item.itemRingTellurium.name=Tellurium Ring
+item.itemScrewTellurium.name=Tellurium Screw
+item.itemRotorTellurium.name=Tellurium Rotor
+item.itemGearTellurium.name=Tellurium Gear
+item.itemIngotRhodium.name=Rhodium Ingot
+item.itemDustRhodium.name=Пыль Родия
+item.itemDustTinyRhodium.name=Tiny Pile of Rhodium Dust
+item.itemDustSmallRhodium.name=Small Pile of Rhodium Dust
+item.itemNuggetRhodium.name=Rhodium Nugget
+item.itemPlateRhodium.name=Rhodium Plate
+item.itemPlateDoubleRhodium.name=Double Rhodium Plate
+item.itemBoltRhodium.name=Rhodium Bolt
+item.itemRodRhodium.name=Rhodium Rod
+item.itemRodLongRhodium.name=Long Rhodium Rod
+item.itemRingRhodium.name=Rhodium Ring
+item.itemScrewRhodium.name=Rhodium Screw
+item.itemRotorRhodium.name=Rhodium Rotor
+item.itemGearRhodium.name=Rhodium Gear
+item.itemIngotRhenium.name=Rhenium Ingot
+item.itemDustRhenium.name=Пыль Рения
+item.itemDustTinyRhenium.name=Tiny Pile of Rhenium Dust
+item.itemDustSmallRhenium.name=Small Pile of Rhenium Dust
+item.itemNuggetRhenium.name=Rhenium Nugget
+item.itemPlateRhenium.name=Rhenium Plate
+item.itemPlateDoubleRhenium.name=Double Rhenium Plate
+item.itemBoltRhenium.name=Rhenium Bolt
+item.itemRodRhenium.name=Rhenium Rod
+item.itemRodLongRhenium.name=Long Rhenium Rod
+item.itemRingRhenium.name=Rhenium Ring
+item.itemScrewRhenium.name=Rhenium Screw
+item.itemRotorRhenium.name=Rhenium Rotor
+item.itemGearRhenium.name=Rhenium Gear
+item.itemIngotThallium.name=Thallium Ingot
+item.itemDustThallium.name=Пыль Таллия
+item.itemDustTinyThallium.name=Tiny Pile of Thallium Dust
+item.itemDustSmallThallium.name=Small Pile of Thallium Dust
+item.itemNuggetThallium.name=Thallium Nugget
+item.itemPlateThallium.name=Thallium Plate
+item.itemPlateDoubleThallium.name=Double Thallium Plate
+item.itemBoltThallium.name=Thallium Bolt
+item.itemRodThallium.name=Thallium Rod
+item.itemRodLongThallium.name=Long Thallium Rod
+item.itemRingThallium.name=Thallium Ring
+item.itemScrewThallium.name=Thallium Screw
+item.itemRotorThallium.name=Thallium Rotor
+item.itemGearThallium.name=Thallium Gear
+item.itemIngotTechnetium.name=Technetium Ingot
+item.itemDustTechnetium.name=Пыль Технеция
+item.itemDustTinyTechnetium.name=Tiny Pile of Technetium Dust
+item.itemDustSmallTechnetium.name=Small Pile of Technetium Dust
+item.itemNuggetTechnetium.name=Technetium Nugget
+item.itemPlateTechnetium.name=Technetium Plate
+item.itemPlateDoubleTechnetium.name=Double Technetium Plate
+item.itemIngotPolonium.name=Polonium Ingot
+item.itemDustPolonium.name=Пыль Полония
+item.itemDustTinyPolonium.name=Tiny Pile of Polonium Dust
+item.itemDustSmallPolonium.name=Small Pile of Polonium Dust
+item.itemNuggetPolonium.name=Polonium Nugget
+item.itemPlatePolonium.name=Polonium Plate
+item.itemPlateDoublePolonium.name=Double Polonium Plate
+item.itemIngotAstatine.name=Astatine Ingot
+item.itemDustAstatine.name=Пыль Астатина
+item.itemDustTinyAstatine.name=Tiny Pile of Astatine Dust
+item.itemDustSmallAstatine.name=Small Pile of Astatine Dust
+item.itemNuggetAstatine.name=Astatine Nugget
+item.itemPlateAstatine.name=Astatine Plate
+item.itemPlateDoubleAstatine.name=Double Astatine Plate
+item.itemIngotFrancium.name=Francium Ingot
+item.itemDustFrancium.name=Пыль Франция
+item.itemDustTinyFrancium.name=Tiny Pile of Francium Dust
+item.itemDustSmallFrancium.name=Small Pile of Francium Dust
+item.itemNuggetFrancium.name=Francium Nugget
+item.itemPlateFrancium.name=Francium Plate
+item.itemPlateDoubleFrancium.name=Double Francium Plate
+item.itemIngotRadium.name=Radium Ingot
+item.itemDustRadium.name=Пыль Радия
+item.itemDustTinyRadium.name=Tiny Pile of Radium Dust
+item.itemDustSmallRadium.name=Small Pile of Radium Dust
+item.itemNuggetRadium.name=Radium Nugget
+item.itemPlateRadium.name=Radium Plate
+item.itemPlateDoubleRadium.name=Double Radium Plate
+item.itemIngotActinium.name=Actinium Ingot
+item.itemDustActinium.name=Пыль Актиния
+item.itemDustTinyActinium.name=Tiny Pile of Actinium Dust
+item.itemDustSmallActinium.name=Small Pile of Actinium Dust
+item.itemNuggetActinium.name=Actinium Nugget
+item.itemPlateActinium.name=Actinium Plate
+item.itemPlateDoubleActinium.name=Double Actinium Plate
+item.itemIngotProtactinium.name=Protactinium Ingot
+item.itemDustProtactinium.name=Пыль Протактиния
+item.itemDustTinyProtactinium.name=Tiny Pile of Protactinium Dust
+item.itemDustSmallProtactinium.name=Small Pile of Protactinium Dust
+item.itemNuggetProtactinium.name=Protactinium Nugget
+item.itemPlateProtactinium.name=Protactinium Plate
+item.itemPlateDoubleProtactinium.name=Double Protactinium Plate
+item.itemIngotNeptunium.name=Neptunium Ingot
+item.itemDustNeptunium.name=Пыль Нептуния
+item.itemDustTinyNeptunium.name=Tiny Pile of Neptunium Dust
+item.itemDustSmallNeptunium.name=Small Pile of Neptunium Dust
+item.itemNuggetNeptunium.name=Neptunium Nugget
+item.itemPlateNeptunium.name=Neptunium Plate
+item.itemPlateDoubleNeptunium.name=Double Neptunium Plate
+item.itemIngotCurium.name=Curium Ingot
+item.itemDustCurium.name=Пыль Кюрия
+item.itemDustTinyCurium.name=Tiny Pile of Curium Dust
+item.itemDustSmallCurium.name=Small Pile of Curium Dust
+item.itemNuggetCurium.name=Curium Nugget
+item.itemPlateCurium.name=Curium Plate
+item.itemPlateDoubleCurium.name=Double Curium Plate
+item.itemIngotBerkelium.name=Berkelium Ingot
+item.itemDustBerkelium.name=Пыль Беркелия
+item.itemDustTinyBerkelium.name=Tiny Pile of Berkelium Dust
+item.itemDustSmallBerkelium.name=Small Pile of Berkelium Dust
+item.itemNuggetBerkelium.name=Berkelium Nugget
+item.itemPlateBerkelium.name=Berkelium Plate
+item.itemPlateDoubleBerkelium.name=Double Berkelium Plate
+item.itemIngotCalifornium.name=Californium Ingot
+item.itemDustCalifornium.name=Пыль Калифорния
+item.itemDustTinyCalifornium.name=Tiny Pile of Californium Dust
+item.itemDustSmallCalifornium.name=Small Pile of Californium Dust
+item.itemNuggetCalifornium.name=Californium Nugget
+item.itemPlateCalifornium.name=Californium Plate
+item.itemPlateDoubleCalifornium.name=Double Californium Plate
+item.itemDustEinsteinium.name=Пыль Эйнштейния
+item.itemDustTinyEinsteinium.name=Tiny Pile of Einsteinium Dust
+item.itemDustSmallEinsteinium.name=Small Pile of Einsteinium Dust
+item.itemNuggetEinsteinium.name=Einsteinium Nugget
+item.itemPlateEinsteinium.name=Einsteinium Plate
+item.itemPlateDoubleEinsteinium.name=Double Einsteinium Plate
+item.itemIngotFermium.name=Fermium Ingot
+item.itemDustFermium.name=Пыль Фермия
+item.itemDustTinyFermium.name=Tiny Pile of Fermium Dust
+item.itemDustSmallFermium.name=Small Pile of Fermium Dust
+item.itemNuggetFermium.name=Fermium Nugget
+item.itemPlateFermium.name=Fermium Plate
+item.itemPlateDoubleFermium.name=Double Fermium Plate
+item.itemIngotLithium7.name=Lithium 7 Ingot
+item.itemDustLithium7.name=Пыль Лития 7
+item.itemDustTinyLithium7.name=Tiny Pile of Lithium 7 Dust
+item.itemDustSmallLithium7.name=Small Pile of Lithium 7 Dust
+item.itemNuggetLithium7.name=Lithium 7 Nugget
+item.itemPlateLithium7.name=Lithium 7 Plate
+item.itemPlateDoubleLithium7.name=Double Lithium 7 Plate
+item.itemIngotThorium232.name=Thorium 232 Ingot
+item.itemDustThorium232.name=Пыль Тория 232
+item.itemDustTinyThorium232.name=Tiny Pile of Thorium 232 Dust
+item.itemDustSmallThorium232.name=Small Pile of Thorium 232 Dust
+item.itemNuggetThorium232.name=Thorium 232 Nugget
+item.itemPlateThorium232.name=Thorium 232 Plate
+item.itemPlateDoubleThorium232.name=Double Thorium 232 Plate
+item.itemIngotUranium232.name=Uranium 232 Ingot
+item.itemDustUranium232.name=Пыль Урана 232
+item.itemDustTinyUranium232.name=Tiny Pile of Uranium 232 Dust
+item.itemDustSmallUranium232.name=Small Pile of Uranium 232 Dust
+item.itemNuggetUranium232.name=Uranium 232 Nugget
+item.itemPlateUranium232.name=Uranium 232 Plate
+item.itemRodUranium232.name=Uranium 232 Rod
+item.itemRodLongUranium232.name=Long Uranium 232 Rod
+item.itemIngotUranium233.name=Uranium 233 Ingot
+item.itemDustUranium233.name=Пыль Урана 233
+item.itemDustTinyUranium233.name=Tiny Pile of Uranium 233 Dust
+item.itemDustSmallUranium233.name=Small Pile of Uranium 233 Dust
+item.itemNuggetUranium233.name=Uranium 233 Nugget
+item.itemPlateUranium233.name=Uranium 233 Plate
+item.itemRodUranium233.name=Uranium 233 Rod
+item.itemRodLongUranium233.name=Long Uranium 233 Rod
+item.itemIngotPlutonium238.name=Plutonium 238 Ingot
+item.itemDustPlutonium238.name=Пыль Плутония 238
+item.itemDustTinyPlutonium238.name=Tiny Pile of Plutonium 238 Dust
+item.itemDustSmallPlutonium238.name=Small Pile of Plutonium 238 Dust
+item.itemNuggetPlutonium238.name=Plutonium 238 Nugget
+item.itemPlatePlutonium238.name=Plutonium 238 Plate
+item.itemPlateDoublePlutonium238.name=Double Plutonium 238 Plate
+item.itemIngotStrontium90.name=Strontium 90 Ingot
+item.itemDustStrontium90.name=Пыль Стронция 90
+item.itemDustTinyStrontium90.name=Tiny Pile of Strontium 90 Dust
+item.itemDustSmallStrontium90.name=Small Pile of Strontium 90 Dust
+item.itemNuggetStrontium90.name=Strontium 90 Nugget
+item.itemPlateStrontium90.name=Strontium 90 Plate
+item.itemPlateDoubleStrontium90.name=Double Strontium 90 Plate
+item.itemIngotPolonium210.name=Polonium 210 Ingot
+item.itemDustPolonium210.name=Пыль Полония 210
+item.itemDustTinyPolonium210.name=Tiny Pile of Polonium 210 Dust
+item.itemDustSmallPolonium210.name=Small Pile of Polonium 210 Dust
+item.itemNuggetPolonium210.name=Polonium 210 Nugget
+item.itemPlatePolonium210.name=Polonium 210 Plate
+item.itemPlateDoublePolonium210.name=Double Polonium 210 Plate
+item.itemIngotAmericium241.name=Americium 241 Ingot
+item.itemDustAmericium241.name=Пыль Америция 241
+item.itemDustTinyAmericium241.name=Tiny Pile of Americium 241 Dust
+item.itemDustSmallAmericium241.name=Small Pile of Americium 241 Dust
+item.itemNuggetAmericium241.name=Americium 241 Nugget
+item.itemPlateAmericium241.name=Americium 241 Plate
+item.itemPlateDoubleAmericium241.name=Double Americium 241 Plate
+item.itemIngotSiliconCarbide.name=Silicon Carbide Ingot
+item.itemDustSiliconCarbide.name=Пыль Силиконового Карбида
+item.itemDustTinySiliconCarbide.name=Tiny Pile of Silicon Carbide Dust
+item.itemDustSmallSiliconCarbide.name=Small Pile of Silicon Carbide Dust
+item.itemNuggetSiliconCarbide.name=Silicon Carbide Nugget
+item.itemPlateSiliconCarbide.name=Silicon Carbide Plate
+item.itemPlateDoubleSiliconCarbide.name=Double Silicon Carbide Plate
+item.itemBoltSiliconCarbide.name=Silicon Carbide Bolt
+item.itemRodSiliconCarbide.name=Silicon Carbide Rod
+item.itemRodLongSiliconCarbide.name=Long Silicon Carbide Rod
+item.itemRingSiliconCarbide.name=Silicon Carbide Ring
+item.itemScrewSiliconCarbide.name=Silicon Carbide Screw
+item.itemRotorSiliconCarbide.name=Silicon Carbide Rotor
+item.itemGearSiliconCarbide.name=Silicon Carbide Gear
+item.itemIngotZirconiumCarbide.name=Zirconium Carbide Ingot
+item.itemHotIngotZirconiumCarbide.name=Hot Zirconium Carbide Ingot
+item.itemDustZirconiumCarbide.name=Пыль Циркониевого Карбида
+item.itemDustTinyZirconiumCarbide.name=Tiny Pile of Zirconium Carbide Dust
+item.itemDustSmallZirconiumCarbide.name=Small Pile of Zirconium Carbide Dust
+item.itemNuggetZirconiumCarbide.name=Zirconium Carbide Nugget
+item.itemPlateZirconiumCarbide.name=Zirconium Carbide Plate
+item.itemPlateDoubleZirconiumCarbide.name=Double Zirconium Carbide Plate
+item.itemBoltZirconiumCarbide.name=Zirconium Carbide Bolt
+item.itemRodZirconiumCarbide.name=Zirconium Carbide Rod
+item.itemRodLongZirconiumCarbide.name=Long Zirconium Carbide Rod
+item.itemRingZirconiumCarbide.name=Zirconium Carbide Ring
+item.itemScrewZirconiumCarbide.name=Zirconium Carbide Screw
+item.itemRotorZirconiumCarbide.name=Zirconium Carbide Rotor
+item.itemGearZirconiumCarbide.name=Zirconium Carbide Gear
+item.itemIngotTantalumCarbide.name=Tantalum Carbide Ingot
+item.itemHotIngotTantalumCarbide.name=Hot Tantalum Carbide Ingot
+item.itemDustTantalumCarbide.name=Пыль Танталового Карбида
+item.itemDustTinyTantalumCarbide.name=Tiny Pile of Tantalum Carbide Dust
+item.itemDustSmallTantalumCarbide.name=Small Pile of Tantalum Carbide Dust
+item.itemNuggetTantalumCarbide.name=Tantalum Carbide Nugget
+item.itemPlateTantalumCarbide.name=Tantalum Carbide Plate
+item.itemPlateDoubleTantalumCarbide.name=Double Tantalum Carbide Plate
+item.itemBoltTantalumCarbide.name=Tantalum Carbide Bolt
+item.itemRodTantalumCarbide.name=Tantalum Carbide Rod
+item.itemRodLongTantalumCarbide.name=Long Tantalum Carbide Rod
+item.itemRingTantalumCarbide.name=Tantalum Carbide Ring
+item.itemScrewTantalumCarbide.name=Tantalum Carbide Screw
+item.itemRotorTantalumCarbide.name=Tantalum Carbide Rotor
+item.itemGearTantalumCarbide.name=Tantalum Carbide Gear
+item.itemIngotNiobiumCarbide.name=Niobium Carbide Ingot
+item.itemHotIngotNiobiumCarbide.name=Hot Niobium Carbide Ingot
+item.itemDustNiobiumCarbide.name=Пыль Ниобиевого Карбида
+item.itemDustTinyNiobiumCarbide.name=Tiny Pile of Niobium Carbide Dust
+item.itemDustSmallNiobiumCarbide.name=Small Pile of Niobium Carbide Dust
+item.itemNuggetNiobiumCarbide.name=Niobium Carbide Nugget
+item.itemPlateNiobiumCarbide.name=Niobium Carbide Plate
+item.itemPlateDoubleNiobiumCarbide.name=Double Niobium Carbide Plate
+item.itemBoltNiobiumCarbide.name=Niobium Carbide Bolt
+item.itemRodNiobiumCarbide.name=Niobium Carbide Rod
+item.itemRodLongNiobiumCarbide.name=Long Niobium Carbide Rod
+item.itemRingNiobiumCarbide.name=Niobium Carbide Ring
+item.itemScrewNiobiumCarbide.name=Niobium Carbide Screw
+item.itemRotorNiobiumCarbide.name=Niobium Carbide Rotor
+item.itemGearNiobiumCarbide.name=Niobium Carbide Gear
+item.itemIngotBerylliumFluoride.name=Beryllium Fluoride Ingot
+item.itemDustBerylliumFluoride.name=Пыль Бериллиевого Фторида
+item.itemDustTinyBerylliumFluoride.name=Tiny Pile of Beryllium Fluoride Dust
+item.itemDustSmallBerylliumFluoride.name=Small Pile of Beryllium Fluoride Dust
+item.itemNuggetBerylliumFluoride.name=Beryllium Fluoride Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium Fluoride Plate
+item.itemPlateDoubleBerylliumFluoride.name=Double Beryllium Fluoride Plate
+item.itemIngotLithiumFluoride.name=Lithium Fluoride Ingot
+item.itemDustLithiumFluoride.name=Пыль Литиевого Фторида
+item.itemDustTinyLithiumFluoride.name=Tiny Pile of Lithium Fluoride Dust
+item.itemDustSmallLithiumFluoride.name=Small Pile of Lithium Fluoride Dust
+item.itemNuggetLithiumFluoride.name=Lithium Fluoride Nugget
+item.itemPlateLithiumFluoride.name=Lithium Fluoride Plate
+item.itemPlateDoubleLithiumFluoride.name=Double Lithium Fluoride Plate
+item.itemIngotThoriumTetrafluoride.name=Thorium Tetrafluoride Ingot
+item.itemDustThoriumTetrafluoride.name=Пыль Ториевого Тетрафторида
+item.itemDustTinyThoriumTetrafluoride.name=Tiny Pile of Thorium Tetrafluoride Dust
+item.itemDustSmallThoriumTetrafluoride.name=Small Pile of Thorium Tetrafluoride Dust
+item.itemNuggetThoriumTetrafluoride.name=Thorium Tetrafluoride Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium Tetrafluoride Plate
+item.itemPlateDoubleThoriumTetrafluoride.name=Double Thorium Tetrafluoride Plate
+item.itemIngotThoriumHexafluoride.name=Thorium Hexafluoride Ingot
+item.itemDustThoriumHexafluoride.name=Пыль Ториевого Гексафторида
+item.itemDustTinyThoriumHexafluoride.name=Tiny Pile of Thorium Hexafluoride Dust
+item.itemDustSmallThoriumHexafluoride.name=Small Pile of Thorium Hexafluoride Dust
+item.itemNuggetThoriumHexafluoride.name=Thorium Hexafluoride Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium Hexafluoride Plate
+item.itemPlateDoubleThoriumHexafluoride.name=Double Thorium Hexafluoride Plate
+item.itemIngotUraniumTetrafluoride.name=Uranium Tetrafluoride Ingot
+item.itemDustUraniumTetrafluoride.name=Пыль Ураниевого Тетрафторида
+item.itemDustTinyUraniumTetrafluoride.name=Tiny Pile of Uranium Tetrafluoride Dust
+item.itemDustSmallUraniumTetrafluoride.name=Small Pile of Uranium Tetrafluoride Dust
+item.itemNuggetUraniumTetrafluoride.name=Uranium Tetrafluoride Nugget
+item.itemPlateUraniumTetrafluoride.name=Uranium Tetrafluoride Plate
+item.itemPlateDoubleUraniumTetrafluoride.name=Double Uranium Tetrafluoride Plate
+item.itemIngotUraniumHexafluoride.name=Uranium Hexafluoride Ingot
+item.itemDustUraniumHexafluoride.name=Пыль Ураниевого Гексафторида
+item.itemDustTinyUraniumHexafluoride.name=Tiny Pile of Uranium Hexafluoride Dust
+item.itemDustSmallUraniumHexafluoride.name=Small Pile of Uranium Hexafluoride Dust
+item.itemNuggetUraniumHexafluoride.name=Uranium Hexafluoride Nugget
+item.itemPlateUraniumHexafluoride.name=Uranium Hexafluoride Plate
+item.itemPlateDoubleUraniumHexafluoride.name=Double Uranium Hexafluoride Plate
+item.itemIngotZirconiumTetrafluoride.name=Zirconium Tetrafluoride Ingot
+item.itemDustZirconiumTetrafluoride.name=Пыль Циркониевого Тетрафторида
+item.itemDustTinyZirconiumTetrafluoride.name=Tiny Pile of Zirconium Tetrafluoride Dust
+item.itemDustSmallZirconiumTetrafluoride.name=Small Pile of Zirconium Tetrafluoride Dust
+item.itemNuggetZirconiumTetrafluoride.name=Zirconium Tetrafluoride Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirconium Tetrafluoride Plate
+item.itemPlateDoubleZirconiumTetrafluoride.name=Double Zirconium Tetrafluoride Plate
+item.itemIngotNeptuniumHexafluoride.name=Neptunium Hexafluoride Ingot
+item.itemDustNeptuniumHexafluoride.name=Пыль Нептуниевого Гексафторида
+item.itemDustTinyNeptuniumHexafluoride.name=Tiny Pile of Neptunium Hexafluoride Dust
+item.itemDustSmallNeptuniumHexafluoride.name=Small Pile of Neptunium Hexafluoride Dust
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium Hexafluoride Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium Hexafluoride Plate
+item.itemPlateDoubleNeptuniumHexafluoride.name=Double Neptunium Hexafluoride Plate
+item.itemIngotTechnetiumHexafluoride.name=Technetium Hexafluoride Ingot
+item.itemDustTechnetiumHexafluoride.name=Пыль Технециевого Гексафторида
+item.itemDustTinyTechnetiumHexafluoride.name=Tiny Pile of Technetium Hexafluoride Dust
+item.itemDustSmallTechnetiumHexafluoride.name=Small Pile of Technetium Hexafluoride Dust
+item.itemNuggetTechnetiumHexafluoride.name=Technetium Hexafluoride Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium Hexafluoride Plate
+item.itemPlateDoubleTechnetiumHexafluoride.name=Double Technetium Hexafluoride Plate
+item.itemIngotSeleniumHexafluoride.name=Selenium Hexafluoride Ingot
+item.itemDustSeleniumHexafluoride.name=Пыль Гексафторида Селена
+item.itemDustTinySeleniumHexafluoride.name=Tiny Pile of Selenium Hexafluoride Dust
+item.itemDustSmallSeleniumHexafluoride.name=Small Pile of Selenium Hexafluoride Dust
+item.itemNuggetSeleniumHexafluoride.name=Selenium Hexafluoride Nugget
+item.itemPlateSeleniumHexafluoride.name=Selenium Hexafluoride Plate
+item.itemPlateDoubleSeleniumHexafluoride.name=Double Selenium Hexafluoride Plate
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Ingot
+item.itemDustLiFBeF2ZrF4U235.name=Пыль Железорана 235
+item.itemDustTinyLiFBeF2ZrF4U235.name=Tiny Pile of LiFBeF2ZrF4U235 Dust
+item.itemDustSmallLiFBeF2ZrF4U235.name=Small Pile of LiFBeF2ZrF4U235 Dust
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Plate
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Double LiFBeF2ZrF4U235 Plate
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Ingot
+item.itemDustLiFBeF2ZrF4UF4.name=Пыль Циркониевого Железорана
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Tiny Pile of LiFBeF2ZrF4UF4 Dust
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Small Pile of LiFBeF2ZrF4UF4 Dust
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Double LiFBeF2ZrF4UF4 Plate
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Ingot
+item.itemDustLiFBeF2ThF4UF4.name=Пыль Ториевого Железорана
+item.itemDustTinyLiFBeF2ThF4UF4.name=Tiny Pile of LiFBeF2ThF4UF4 Dust
+item.itemDustSmallLiFBeF2ThF4UF4.name=Small Pile of LiFBeF2ThF4UF4 Dust
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Double LiFBeF2ThF4UF4 Plate
+item.itemIngotEnergyCrystal.name=Energy Crystal Ingot
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal Ingot
+item.itemDustEnergyCrystal.name=Пыль Энергетического Кристалла
+item.itemDustTinyEnergyCrystal.name=Tiny Pile of Energy Crystal Dust
+item.itemDustSmallEnergyCrystal.name=Small Pile of Energy Crystal Dust
+item.itemNuggetEnergyCrystal.name=Energy Crystal Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal Plate
+item.itemPlateDoubleEnergyCrystal.name=Double Energy Crystal Plate
+item.itemBoltEnergyCrystal.name=Energy Crystal Bolt
+item.itemRodEnergyCrystal.name=Energy Crystal Rod
+item.itemRodLongEnergyCrystal.name=Long Energy Crystal Rod
+item.itemRingEnergyCrystal.name=Energy Crystal Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal Screw
+item.itemRotorEnergyCrystal.name=Energy Crystal Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal Gear
+item.itemIngotBloodSteel.name=Blood Steel Ingot
+item.itemDustBloodSteel.name=Пыль Кровавой Стали
+item.itemDustTinyBloodSteel.name=Tiny Pile of Blood Steel Dust
+item.itemDustSmallBloodSteel.name=Small Pile of Blood Steel Dust
+item.itemNuggetBloodSteel.name=Blood Steel Nugget
+item.itemPlateBloodSteel.name=Blood Steel Plate
+item.itemPlateDoubleBloodSteel.name=Double Blood Steel Plate
+item.itemBoltBloodSteel.name=Blood Steel Bolt
+item.itemRodBloodSteel.name=Blood Steel Rod
+item.itemRodLongBloodSteel.name=Long Blood Steel Rod
+item.itemRingBloodSteel.name=Blood Steel Ring
+item.itemScrewBloodSteel.name=Blood Steel Screw
+item.itemRotorBloodSteel.name=Blood Steel Rotor
+item.itemGearBloodSteel.name=Blood Steel Gear
+item.itemIngotZeron100.name=Zeron-100 Ingot
+item.itemHotIngotZeron100.name=Hot Zeron-100 Ingot
+item.itemDustZeron100.name=Пыль Церона 100
+item.itemDustTinyZeron100.name=Tiny Pile of Zeron-100 Dust
+item.itemDustSmallZeron100.name=Small Pile of Zeron-100 Dust
+item.itemNuggetZeron100.name=Zeron-100 Nugget
+item.itemPlateZeron100.name=Zeron-100 Plate
+item.itemPlateDoubleZeron100.name=Double Zeron-100 Plate
+item.itemBoltZeron100.name=Zeron-100 Bolt
+item.itemRodZeron100.name=Zeron-100 Rod
+item.itemRodLongZeron100.name=Long Zeron-100 Rod
+item.itemRingZeron100.name=Zeron-100 Ring
+item.itemScrewZeron100.name=Zeron-100 Screw
+item.itemRotorZeron100.name=Zeron-100 Rotor
+item.itemGearZeron100.name=Zeron-100 Gear
+item.itemIngotTumbaga.name=Tumbaga Ingot
+item.itemDustTumbaga.name=Пыль Тумбага
+item.itemDustTinyTumbaga.name=Tiny Pile of Tumbaga Dust
+item.itemDustSmallTumbaga.name=Small Pile of Tumbaga Dust
+item.itemNuggetTumbaga.name=Tumbaga Nugget
+item.itemPlateTumbaga.name=Tumbaga Plate
+item.itemPlateDoubleTumbaga.name=Double Tumbaga Plate
+item.itemBoltTumbaga.name=Tumbaga Bolt
+item.itemRodTumbaga.name=Tumbaga Rod
+item.itemRodLongTumbaga.name=Long Tumbaga Rod
+item.itemRingTumbaga.name=Tumbaga Ring
+item.itemScrewTumbaga.name=Tumbaga Screw
+item.itemRotorTumbaga.name=Tumbaga Rotor
+item.itemGearTumbaga.name=Tumbaga Gear
+item.itemIngotPotin.name=Potin Ingot
+item.itemDustPotin.name=Пыль Потина
+item.itemDustTinyPotin.name=Tiny Pile of Potin Dust
+item.itemDustSmallPotin.name=Small Pile of Potin Dust
+item.itemNuggetPotin.name=Potin Nugget
+item.itemPlatePotin.name=Potin Plate
+item.itemPlateDoublePotin.name=Double Potin Plate
+item.itemBoltPotin.name=Potin Bolt
+item.itemRodPotin.name=Potin Rod
+item.itemRodLongPotin.name=Long Potin Rod
+item.itemRingPotin.name=Potin Ring
+item.itemScrewPotin.name=Potin Screw
+item.itemRotorPotin.name=Potin Rotor
+item.itemGearPotin.name=Potin Gear
+item.itemIngotStaballoy.name=Staballoy Ingot
+item.itemHotIngotStaballoy.name=Hot Staballoy Ingot
+item.itemDustStaballoy.name=Пыль Стального Сплава
+item.itemDustTinyStaballoy.name=Tiny Pile of Staballoy Dust
+item.itemDustSmallStaballoy.name=Small Pile of Staballoy Dust
+item.itemNuggetStaballoy.name=Staballoy Nugget
+item.itemPlateStaballoy.name=Staballoy Plate
+item.itemPlateDoubleStaballoy.name=Double Staballoy Plate
+item.itemBoltStaballoy.name=Staballoy Bolt
+item.itemRodStaballoy.name=Staballoy Rod
+item.itemRodLongStaballoy.name=Long Staballoy Rod
+item.itemRingStaballoy.name=Staballoy Ring
+item.itemScrewStaballoy.name=Staballoy Screw
+item.itemRotorStaballoy.name=Staballoy Rotor
+item.itemGearStaballoy.name=Staballoy Gear
+item.itemIngotTantalloy60.name=Tantalloy-60 Ingot
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60 Ingot
+item.itemDustTantalloy60.name=Пыль Сплава Тантала 60
+item.itemDustTinyTantalloy60.name=Tiny Pile of Tantalloy-60 Dust
+item.itemDustSmallTantalloy60.name=Small Pile of Tantalloy-60 Dust
+item.itemNuggetTantalloy60.name=Tantalloy-60 Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60 Plate
+item.itemPlateDoubleTantalloy60.name=Double Tantalloy-60 Plate
+item.itemBoltTantalloy60.name=Tantalloy-60 Bolt
+item.itemRodTantalloy60.name=Tantalloy-60 Rod
+item.itemRodLongTantalloy60.name=Long Tantalloy-60 Rod
+item.itemRingTantalloy60.name=Tantalloy-60 Ring
+item.itemScrewTantalloy60.name=Tantalloy-60 Screw
+item.itemRotorTantalloy60.name=Tantalloy-60 Rotor
+item.itemGearTantalloy60.name=Tantalloy-60 Gear
+item.itemIngotTantalloy61.name=Tantalloy-61 Ingot
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61 Ingot
+item.itemDustTantalloy61.name=Пыль Сплава Тантала 61
+item.itemDustTinyTantalloy61.name=Tiny Pile of Tantalloy-61 Dust
+item.itemDustSmallTantalloy61.name=Small Pile of Tantalloy-61 Dust
+item.itemNuggetTantalloy61.name=Tantalloy-61 Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61 Plate
+item.itemPlateDoubleTantalloy61.name=Double Tantalloy-61 Plate
+item.itemBoltTantalloy61.name=Tantalloy-61 Bolt
+item.itemRodTantalloy61.name=Tantalloy-61 Rod
+item.itemRodLongTantalloy61.name=Long Tantalloy-61 Rod
+item.itemRingTantalloy61.name=Tantalloy-61 Ring
+item.itemScrewTantalloy61.name=Tantalloy-61 Screw
+item.itemRotorTantalloy61.name=Tantalloy-61 Rotor
+item.itemGearTantalloy61.name=Tantalloy-61 Gear
+item.itemIngotInconel625.name=Inconel-625 Ingot
+item.itemHotIngotInconel625.name=Hot Inconel-625 Ingot
+item.itemDustInconel625.name=Пыль Инконеля 625
+item.itemDustTinyInconel625.name=Tiny Pile of Inconel-625 Dust
+item.itemDustSmallInconel625.name=Small Pile of Inconel-625 Dust
+item.itemNuggetInconel625.name=Inconel-625 Nugget
+item.itemPlateInconel625.name=Inconel-625 Plate
+item.itemPlateDoubleInconel625.name=Double Inconel-625 Plate
+item.itemBoltInconel625.name=Inconel-625 Bolt
+item.itemRodInconel625.name=Inconel-625 Rod
+item.itemRodLongInconel625.name=Long Inconel-625 Rod
+item.itemRingInconel625.name=Inconel-625 Ring
+item.itemScrewInconel625.name=Inconel-625 Screw
+item.itemRotorInconel625.name=Inconel-625 Rotor
+item.itemGearInconel625.name=Inconel-625 Gear
+item.itemIngotInconel690.name=Inconel-690 Ingot
+item.itemHotIngotInconel690.name=Hot Inconel-690 Ingot
+item.itemDustInconel690.name=Пыль Инконеля 690
+item.itemDustTinyInconel690.name=Tiny Pile of Inconel-690 Dust
+item.itemDustSmallInconel690.name=Small Pile of Inconel-690 Dust
+item.itemNuggetInconel690.name=Inconel-690 Nugget
+item.itemPlateInconel690.name=Inconel-690 Plate
+item.itemPlateDoubleInconel690.name=Double Inconel-690 Plate
+item.itemBoltInconel690.name=Inconel-690 Bolt
+item.itemRodInconel690.name=Inconel-690 Rod
+item.itemRodLongInconel690.name=Long Inconel-690 Rod
+item.itemRingInconel690.name=Inconel-690 Ring
+item.itemScrewInconel690.name=Inconel-690 Screw
+item.itemRotorInconel690.name=Inconel-690 Rotor
+item.itemGearInconel690.name=Inconel-690 Gear
+item.itemIngotInconel792.name=Inconel-792 Ingot
+item.itemHotIngotInconel792.name=Hot Inconel-792 Ingot
+item.itemDustInconel792.name=Пыль Инконеля 792
+item.itemDustTinyInconel792.name=Tiny Pile of Inconel-792 Dust
+item.itemDustSmallInconel792.name=Small Pile of Inconel-792 Dust
+item.itemNuggetInconel792.name=Inconel-792 Nugget
+item.itemPlateInconel792.name=Inconel-792 Plate
+item.itemPlateDoubleInconel792.name=Double Inconel-792 Plate
+item.itemBoltInconel792.name=Inconel-792 Bolt
+item.itemRodInconel792.name=Inconel-792 Rod
+item.itemRodLongInconel792.name=Long Inconel-792 Rod
+item.itemRingInconel792.name=Inconel-792 Ring
+item.itemScrewInconel792.name=Inconel-792 Screw
+item.itemRotorInconel792.name=Inconel-792 Rotor
+item.itemGearInconel792.name=Inconel-792 Gear
+item.itemDustEglinSteelBaseCompound.name=Пыль Эглинового Стального Базового Соединения
+item.itemDustTinyEglinSteelBaseCompound.name=Tiny Pile of Eglin Steel Base Compound Dust
+item.itemDustSmallEglinSteelBaseCompound.name=Small Pile of Eglin Steel Base Compound Dust
+item.itemIngotEglinSteel.name=Eglin Steel Ingot
+item.itemDustEglinSteel.name=Пыль Эглиновой Стали
+item.itemDustTinyEglinSteel.name=Tiny Pile of Eglin Steel Dust
+item.itemDustSmallEglinSteel.name=Small Pile of Eglin Steel Dust
+item.itemNuggetEglinSteel.name=Eglin Steel Nugget
+item.itemPlateEglinSteel.name=Eglin Steel Plate
+item.itemPlateDoubleEglinSteel.name=Double Eglin Steel Plate
+item.itemBoltEglinSteel.name=Eglin Steel Bolt
+item.itemRodEglinSteel.name=Eglin Steel Rod
+item.itemRodLongEglinSteel.name=Long Eglin Steel Rod
+item.itemRingEglinSteel.name=Eglin Steel Ring
+item.itemScrewEglinSteel.name=Eglin Steel Screw
+item.itemRotorEglinSteel.name=Eglin Steel Rotor
+item.itemGearEglinSteel.name=Eglin Steel Gear
+item.itemIngotMaragingSteel250.name=Maraging Steel 250 Ingot
+item.itemHotIngotMaragingSteel250.name=Hot Maraging Steel 250 Ingot
+item.itemDustMaragingSteel250.name=Пыль Марагинской Стали 250
+item.itemDustTinyMaragingSteel250.name=Tiny Pile of Maraging Steel 250 Dust
+item.itemDustSmallMaragingSteel250.name=Small Pile of Maraging Steel 250 Dust
+item.itemNuggetMaragingSteel250.name=Maraging Steel 250 Nugget
+item.itemPlateMaragingSteel250.name=Maraging Steel 250 Plate
+item.itemPlateDoubleMaragingSteel250.name=Double Maraging Steel 250 Plate
+item.itemBoltMaragingSteel250.name=Maraging Steel 250 Bolt
+item.itemRodMaragingSteel250.name=Maraging Steel 250 Rod
+item.itemRodLongMaragingSteel250.name=Long Maraging Steel 250 Rod
+item.itemRingMaragingSteel250.name=Maraging Steel 250 Ring
+item.itemScrewMaragingSteel250.name=Maraging Steel 250 Screw
+item.itemRotorMaragingSteel250.name=Maraging Steel 250 Rotor
+item.itemGearMaragingSteel250.name=Maraging Steel 250 Gear
+item.itemIngotMaragingSteel300.name=Maraging Steel 300 Ingot
+item.itemHotIngotMaragingSteel300.name=Hot Maraging Steel 300 Ingot
+item.itemDustMaragingSteel300.name=Пыль Марагинской Стали 300
+item.itemDustTinyMaragingSteel300.name=Tiny Pile of Maraging Steel 300 Dust
+item.itemDustSmallMaragingSteel300.name=Small Pile of Maraging Steel 300 Dust
+item.itemNuggetMaragingSteel300.name=Maraging Steel 300 Nugget
+item.itemPlateMaragingSteel300.name=Maraging Steel 300 Plate
+item.itemPlateDoubleMaragingSteel300.name=Double Maraging Steel 300 Plate
+item.itemBoltMaragingSteel300.name=Maraging Steel 300 Bolt
+item.itemRodMaragingSteel300.name=Maraging Steel 300 Rod
+item.itemRodLongMaragingSteel300.name=Long Maraging Steel 300 Rod
+item.itemRingMaragingSteel300.name=Maraging Steel 300 Ring
+item.itemScrewMaragingSteel300.name=Maraging Steel 300 Screw
+item.itemRotorMaragingSteel300.name=Maraging Steel 300 Rotor
+item.itemGearMaragingSteel300.name=Maraging Steel 300 Gear
+item.itemIngotMaragingSteel350.name=Maraging Steel 350 Ingot
+item.itemHotIngotMaragingSteel350.name=Hot Maraging Steel 350 Ingot
+item.itemDustMaragingSteel350.name=Пыль Марагинской Стали 350
+item.itemDustTinyMaragingSteel350.name=Tiny Pile of Maraging Steel 350 Dust
+item.itemDustSmallMaragingSteel350.name=Small Pile of Maraging Steel 350 Dust
+item.itemNuggetMaragingSteel350.name=Maraging Steel 350 Nugget
+item.itemPlateMaragingSteel350.name=Maraging Steel 350 Plate
+item.itemPlateDoubleMaragingSteel350.name=Double Maraging Steel 350 Plate
+item.itemBoltMaragingSteel350.name=Maraging Steel 350 Bolt
+item.itemRodMaragingSteel350.name=Maraging Steel 350 Rod
+item.itemRodLongMaragingSteel350.name=Long Maraging Steel 350 Rod
+item.itemRingMaragingSteel350.name=Maraging Steel 350 Ring
+item.itemScrewMaragingSteel350.name=Maraging Steel 350 Screw
+item.itemRotorMaragingSteel350.name=Maraging Steel 350 Rotor
+item.itemGearMaragingSteel350.name=Maraging Steel 350 Gear
+item.itemIngotStellite.name=Stellite Ingot
+item.itemHotIngotStellite.name=Hot Stellite Ingot
+item.itemDustStellite.name=Пыль Стеллита
+item.itemDustTinyStellite.name=Tiny Pile of Stellite Dust
+item.itemDustSmallStellite.name=Small Pile of Stellite Dust
+item.itemNuggetStellite.name=Stellite Nugget
+item.itemPlateStellite.name=Stellite Plate
+item.itemPlateDoubleStellite.name=Double Stellite Plate
+item.itemBoltStellite.name=Stellite Bolt
+item.itemRodStellite.name=Stellite Rod
+item.itemRodLongStellite.name=Long Stellite Rod
+item.itemRingStellite.name=Stellite Ring
+item.itemScrewStellite.name=Stellite Screw
+item.itemRotorStellite.name=Stellite Rotor
+item.itemGearStellite.name=Stellite Gear
+item.itemIngotTalonite.name=Talonite Ingot
+item.itemDustTalonite.name=пыль Талонита
+item.itemDustTinyTalonite.name=Tiny Pile of Talonite Dust
+item.itemDustSmallTalonite.name=Small Pile of Talonite Dust
+item.itemNuggetTalonite.name=Talonite Nugget
+item.itemPlateTalonite.name=Talonite Plate
+item.itemPlateDoubleTalonite.name=Double Talonite Plate
+item.itemBoltTalonite.name=Talonite Bolt
+item.itemRodTalonite.name=Talonite Rod
+item.itemRodLongTalonite.name=Long Talonite Rod
+item.itemRingTalonite.name=Talonite Ring
+item.itemScrewTalonite.name=Talonite Screw
+item.itemRotorTalonite.name=Talonite Rotor
+item.itemGearTalonite.name=Talonite Gear
+item.itemIngotHastelloyW.name=Hastelloy-W Ingot
+item.itemDustHastelloyW.name=Пыль Хастеллоя W
+item.itemDustTinyHastelloyW.name=Tiny Pile of Hastelloy-W Dust
+item.itemDustSmallHastelloyW.name=Small Pile of Hastelloy-W Dust
+item.itemNuggetHastelloyW.name=Hastelloy-W Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W Plate
+item.itemPlateDoubleHastelloyW.name=Double Hastelloy-W Plate
+item.itemBoltHastelloyW.name=Hastelloy-W Bolt
+item.itemRodHastelloyW.name=Hastelloy-W Rod
+item.itemRodLongHastelloyW.name=Long Hastelloy-W Rod
+item.itemRingHastelloyW.name=Hastelloy-W Ring
+item.itemScrewHastelloyW.name=Hastelloy-W Screw
+item.itemRotorHastelloyW.name=Hastelloy-W Rotor
+item.itemGearHastelloyW.name=Hastelloy-W Gear
+item.itemIngotHastelloyX.name=Hastelloy-X Ingot
+item.itemDustHastelloyX.name=Пыль Хастеллоя X
+item.itemDustTinyHastelloyX.name=Tiny Pile of Hastelloy-X Dust
+item.itemDustSmallHastelloyX.name=Small Pile of Hastelloy-X Dust
+item.itemNuggetHastelloyX.name=Hastelloy-X Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X Plate
+item.itemPlateDoubleHastelloyX.name=Double Hastelloy-X Plate
+item.itemBoltHastelloyX.name=Hastelloy-X Bolt
+item.itemRodHastelloyX.name=Hastelloy-X Rod
+item.itemRodLongHastelloyX.name=Long Hastelloy-X Rod
+item.itemRingHastelloyX.name=Hastelloy-X Ring
+item.itemScrewHastelloyX.name=Hastelloy-X Screw
+item.itemRotorHastelloyX.name=Hastelloy-X Rotor
+item.itemGearHastelloyX.name=Hastelloy-X Gear
+item.itemIngotHastelloyC276.name=Hastelloy-C276 Ingot
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276 Ingot
+item.itemDustHastelloyC276.name=Пыль Хастеллоя C276
+item.itemDustTinyHastelloyC276.name=Tiny Pile of Hastelloy-C276 Dust
+item.itemDustSmallHastelloyC276.name=Small Pile of Hastelloy-C276 Dust
+item.itemNuggetHastelloyC276.name=Hastelloy-C276 Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276 Plate
+item.itemPlateDoubleHastelloyC276.name=Double Hastelloy-C276 Plate
+item.itemBoltHastelloyC276.name=Hastelloy-C276 Bolt
+item.itemRodHastelloyC276.name=Hastelloy-C276 Rod
+item.itemRodLongHastelloyC276.name=Long Hastelloy-C276 Rod
+item.itemRingHastelloyC276.name=Hastelloy-C276 Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276 Screw
+item.itemRotorHastelloyC276.name=Hastelloy-C276 Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276 Gear
+item.itemIngotHastelloyN.name=Hastelloy-N Ingot
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N Ingot
+item.itemDustHastelloyN.name=Пыль Хастеллоя N
+item.itemDustTinyHastelloyN.name=Tiny Pile of Hastelloy-N Dust
+item.itemDustSmallHastelloyN.name=Small Pile of Hastelloy-N Dust
+item.itemNuggetHastelloyN.name=Hastelloy-N Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N Plate
+item.itemPlateDoubleHastelloyN.name=Double Hastelloy-N Plate
+item.itemBoltHastelloyN.name=Hastelloy-N Bolt
+item.itemRodHastelloyN.name=Hastelloy-N Rod
+item.itemRodLongHastelloyN.name=Long Hastelloy-N Rod
+item.itemRingHastelloyN.name=Hastelloy-N Ring
+item.itemScrewHastelloyN.name=Hastelloy-N Screw
+item.itemRotorHastelloyN.name=Hastelloy-N Rotor
+item.itemGearHastelloyN.name=Hastelloy-N Gear
+item.itemIngotIncoloy020.name=Incoloy-020 Ingot
+item.itemDustIncoloy020.name=Пыль Инколоя 020
+item.itemDustTinyIncoloy020.name=Tiny Pile of Incoloy-020 Dust
+item.itemDustSmallIncoloy020.name=Small Pile of Incoloy-020 Dust
+item.itemNuggetIncoloy020.name=Incoloy-020 Nugget
+item.itemPlateIncoloy020.name=Incoloy-020 Plate
+item.itemPlateDoubleIncoloy020.name=Double Incoloy-020 Plate
+item.itemBoltIncoloy020.name=Incoloy-020 Bolt
+item.itemRodIncoloy020.name=Incoloy-020 Rod
+item.itemRodLongIncoloy020.name=Long Incoloy-020 Rod
+item.itemRingIncoloy020.name=Incoloy-020 Ring
+item.itemScrewIncoloy020.name=Incoloy-020 Screw
+item.itemRotorIncoloy020.name=Incoloy-020 Rotor
+item.itemGearIncoloy020.name=Incoloy-020 Gear
+item.itemIngotIncoloyDS.name=Incoloy-DS Ingot
+item.itemDustIncoloyDS.name=Пыль Инколоя DS
+item.itemDustTinyIncoloyDS.name=Tiny Pile of Incoloy-DS Dust
+item.itemDustSmallIncoloyDS.name=Small Pile of Incoloy-DS Dust
+item.itemNuggetIncoloyDS.name=Incoloy-DS Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS Plate
+item.itemPlateDoubleIncoloyDS.name=Double Incoloy-DS Plate
+item.itemBoltIncoloyDS.name=Incoloy-DS Bolt
+item.itemRodIncoloyDS.name=Incoloy-DS Rod
+item.itemRodLongIncoloyDS.name=Long Incoloy-DS Rod
+item.itemRingIncoloyDS.name=Incoloy-DS Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS Screw
+item.itemRotorIncoloyDS.name=Incoloy-DS Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS Gear
+item.itemIngotIncoloyMA956.name=Incoloy-MA956 Ingot
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956 Ingot
+item.itemDustIncoloyMA956.name=Пыль Инколоя MA956
+item.itemDustTinyIncoloyMA956.name=Tiny Pile of Incoloy-MA956 Dust
+item.itemDustSmallIncoloyMA956.name=Small Pile of Incoloy-MA956 Dust
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956 Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956 Plate
+item.itemPlateDoubleIncoloyMA956.name=Double Incoloy-MA956 Plate
+item.itemBoltIncoloyMA956.name=Incoloy-MA956 Bolt
+item.itemRodIncoloyMA956.name=Incoloy-MA956 Rod
+item.itemRodLongIncoloyMA956.name=Long Incoloy-MA956 Rod
+item.itemRingIncoloyMA956.name=Incoloy-MA956 Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956 Screw
+item.itemRotorIncoloyMA956.name=Incoloy-MA956 Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956 Gear
+item.itemIngotGrisium.name=Grisium Ingot
+item.itemHotIngotGrisium.name=Hot Grisium Ingot
+item.itemDustGrisium.name=Пыль Грисиума
+item.itemDustTinyGrisium.name=Tiny Pile of Grisium Dust
+item.itemDustSmallGrisium.name=Small Pile of Grisium Dust
+item.itemNuggetGrisium.name=Grisium Nugget
+item.itemPlateGrisium.name=Grisium Plate
+item.itemPlateDoubleGrisium.name=Double Grisium Plate
+item.itemBoltGrisium.name=Grisium Bolt
+item.itemRodGrisium.name=Grisium Rod
+item.itemRodLongGrisium.name=Long Grisium Rod
+item.itemRingGrisium.name=Grisium Ring
+item.itemScrewGrisium.name=Grisium Screw
+item.itemRotorGrisium.name=Grisium Rotor
+item.itemGearGrisium.name=Grisium Gear
+item.itemIngotHG1223.name=HG-1223 Ingot
+item.itemDustHG1223.name=Пыль HG1223
+item.itemDustTinyHG1223.name=Tiny Pile of HG-1223 Dust
+item.itemDustSmallHG1223.name=Small Pile of HG-1223 Dust
+item.itemNuggetHG1223.name=HG-1223 Nugget
+item.itemPlateHG1223.name=HG-1223 Plate
+item.itemPlateDoubleHG1223.name=Double HG-1223 Plate
+item.itemIngotTrinium.name=Trinium Ingot
+item.itemDustTrinium.name=Trinium Dust
+item.itemDustTinyTrinium.name=Tiny Pile of Trinium Dust
+item.itemDustSmallTrinium.name=Small Pile of Trinium Dust
+item.itemNuggetTrinium.name=Trinium Nugget
+item.itemPlateTrinium.name=Trinium Plate
+item.itemPlateDoubleTrinium.name=Double Trinium Plate
+item.itemIngotRefinedTrinium.name=Refined Trinium Ingot
+item.itemDustRefinedTrinium.name=Refined Trinium Dust
+item.itemDustTinyRefinedTrinium.name=Tiny Pile of Refined Trinium Dust
+item.itemDustSmallRefinedTrinium.name=Small Pile of Refined Trinium Dust
+item.itemNuggetRefinedTrinium.name=Refined Trinium Nugget
+item.itemPlateRefinedTrinium.name=Refined Trinium Plate
+item.itemPlateDoubleRefinedTrinium.name=Double Refined Trinium Plate
+item.itemIngotTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ingot
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium Titanium Alloy Ingot
+item.itemDustTriniumTitaniumAlloy.name=Пыль Сплава Тритий Титана
+item.itemDustTinyTriniumTitaniumAlloy.name=Tiny Pile of Trinium Titanium Alloy Dust
+item.itemDustSmallTriniumTitaniumAlloy.name=Small Pile of Trinium Titanium Alloy Dust
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium Titanium Alloy Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium Titanium Alloy Plate
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Double Trinium Titanium Alloy Plate
+item.itemBoltTriniumTitaniumAlloy.name=Trinium Titanium Alloy Bolt
+item.itemRodTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rod
+item.itemRodLongTriniumTitaniumAlloy.name=Long Trinium Titanium Alloy Rod
+item.itemRingTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium Titanium Alloy Screw
+item.itemRotorTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium Titanium Alloy Gear
+item.itemIngotTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Ingot
+item.itemDustTriniumNaquadahAlloy.name=Пыль Сплава Тритий Наквадаха
+item.itemDustTinyTriniumNaquadahAlloy.name=Tiny Pile of Trinium Naquadah Alloy Dust
+item.itemDustSmallTriniumNaquadahAlloy.name=Small Pile of Trinium Naquadah Alloy Dust
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Plate
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Double Trinium Naquadah Alloy Plate
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ingot
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium Naquadah Carbonite Ingot
+item.itemDustTriniumNaquadahCarbonite.name=Пыль Карбонита Тритий Наквадаха
+item.itemDustTinyTriniumNaquadahCarbonite.name=Tiny Pile of Trinium Naquadah Carbonite Dust
+item.itemDustSmallTriniumNaquadahCarbonite.name=Small Pile of Trinium Naquadah Carbonite Dust
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Plate
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Double Trinium Naquadah Carbonite Plate
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Bolt
+item.itemRodTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rod
+item.itemRodLongTriniumNaquadahCarbonite.name=Long Trinium Naquadah Carbonite Rod
+item.itemRingTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Screw
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Gear
+item.itemIngotQuantum.name=Quantum Ingot
+item.itemHotIngotQuantum.name=Hot Quantum Ingot
+item.itemDustQuantum.name=Пыль Кванта
+item.itemDustTinyQuantum.name=Tiny Pile of Quantum Dust
+item.itemDustSmallQuantum.name=Small Pile of Quantum Dust
+item.itemNuggetQuantum.name=Quantum Nugget
+item.itemPlateQuantum.name=Quantum Plate
+item.itemPlateDoubleQuantum.name=Double Quantum Plate
+item.itemBoltQuantum.name=Quantum Bolt
+item.itemRodQuantum.name=Quantum Rod
+item.itemRodLongQuantum.name=Long Quantum Rod
+item.itemRingQuantum.name=Quantum Ring
+item.itemScrewQuantum.name=Quantum Screw
+item.itemRotorQuantum.name=Quantum Rotor
+item.itemGearQuantum.name=Quantum Gear
+item.itemDustFluoriteF.name=Fluorite (F) Dust
+item.itemDustTinyFluoriteF.name=Tiny Pile of Fluorite (F) Dust
+item.itemDustSmallFluoriteF.name=Small Pile of Fluorite (F) Dust
+item.crushedFluoriteF.name=Crushed Fluorite (F) Ore
+item.crushedCentrifugedFluoriteF.name=Centrifuged Crushed Fluorite (F) Ore
+item.crushedPurifiedFluoriteF.name=Purified Crushed Fluorite (F) Ore
+item.dustImpureFluoriteF.name=Impure Fluorite (F) Dust
+item.dustPureFluoriteF.name=Purified Fluorite (F) Dust
+item.itemDustCrocoite.name=Пыль Крокоита
+item.itemDustTinyCrocoite.name=Tiny Pile of Crocoite Dust
+item.itemDustSmallCrocoite.name=Small Pile of Crocoite Dust
+item.crushedCrocoite.name=Crushed Crocoite Ore
+item.crushedCentrifugedCrocoite.name=Centrifuged Crushed Crocoite Ore
+item.crushedPurifiedCrocoite.name=Purified Crushed Crocoite Ore
+item.dustImpureCrocoite.name=Impure Crocoite Dust
+item.dustPureCrocoite.name=Purified Crocoite Dust
+item.itemDustGeikielite.name=Пыль Гейкелита
+item.itemDustTinyGeikielite.name=Tiny Pile of Geikielite Dust
+item.itemDustSmallGeikielite.name=Small Pile of Geikielite Dust
+item.crushedGeikielite.name=Crushed Geikielite Ore
+item.crushedCentrifugedGeikielite.name=Centrifuged Crushed Geikielite Ore
+item.crushedPurifiedGeikielite.name=Purified Crushed Geikielite Ore
+item.dustImpureGeikielite.name=Impure Geikielite Dust
+item.dustPureGeikielite.name=Purified Geikielite Dust
+item.itemDustNichromite.name=Пыль Нихромата
+item.itemDustTinyNichromite.name=Tiny Pile of Nichromite Dust
+item.itemDustSmallNichromite.name=Small Pile of Nichromite Dust
+item.crushedNichromite.name=Crushed Nichromite Ore
+item.crushedCentrifugedNichromite.name=Centrifuged Crushed Nichromite Ore
+item.crushedPurifiedNichromite.name=Purified Crushed Nichromite Ore
+item.dustImpureNichromite.name=Impure Nichromite Dust
+item.dustPureNichromite.name=Purified Nichromite Dust
+item.itemDustTitanite.name=Пыль Титанита
+item.itemDustTinyTitanite.name=Tiny Pile of Titanite Dust
+item.itemDustSmallTitanite.name=Small Pile of Titanite Dust
+item.crushedTitanite.name=Crushed Titanite Ore
+item.crushedCentrifugedTitanite.name=Centrifuged Crushed Titanite Ore
+item.crushedPurifiedTitanite.name=Purified Crushed Titanite Ore
+item.dustImpureTitanite.name=Impure Titanite Dust
+item.dustPureTitanite.name=Purified Titanite Dust
+item.itemDustZimbabweite.name=Пыль Зимбабвайта
+item.itemDustTinyZimbabweite.name=Tiny Pile of Zimbabweite Dust
+item.itemDustSmallZimbabweite.name=Small Pile of Zimbabweite Dust
+item.crushedZimbabweite.name=Crushed Zimbabweite Ore
+item.crushedCentrifugedZimbabweite.name=Centrifuged Crushed Zimbabweite Ore
+item.crushedPurifiedZimbabweite.name=Purified Crushed Zimbabweite Ore
+item.dustImpureZimbabweite.name=Impure Zimbabweite Dust
+item.dustPureZimbabweite.name=Purified Zimbabweite Dust
+item.itemDustZirconolite.name=Пыль Цирконолита
+item.itemDustTinyZirconolite.name=Tiny Pile of Zirconolite Dust
+item.itemDustSmallZirconolite.name=Small Pile of Zirconolite Dust
+item.crushedZirconolite.name=Crushed Zirconolite Ore
+item.crushedCentrifugedZirconolite.name=Centrifuged Crushed Zirconolite Ore
+item.crushedPurifiedZirconolite.name=Purified Crushed Zirconolite Ore
+item.dustImpureZirconolite.name=Impure Zirconolite Dust
+item.dustPureZirconolite.name=Purified Zirconolite Dust
+item.itemDustGadoliniteCe.name=Пыль Пыль Гадолинита Ce
+item.itemDustTinyGadoliniteCe.name=Tiny Pile of Gadolinite (Ce) Dust
+item.itemDustSmallGadoliniteCe.name=Small Pile of Gadolinite (Ce) Dust
+item.crushedGadoliniteCe.name=Crushed Gadolinite (Ce) Ore
+item.crushedCentrifugedGadoliniteCe.name=Centrifuged Crushed Gadolinite (Ce) Ore
+item.crushedPurifiedGadoliniteCe.name=Purified Crushed Gadolinite (Ce) Ore
+item.dustImpureGadoliniteCe.name=Impure Gadolinite (Ce) Dust
+item.dustPureGadoliniteCe.name=Purified Gadolinite (Ce) Dust
+item.itemDustGadoliniteY.name=Пыль Гадолинита Y
+item.itemDustTinyGadoliniteY.name=Tiny Pile of Gadolinite (Y) Dust
+item.itemDustSmallGadoliniteY.name=Small Pile of Gadolinite (Y) Dust
+item.crushedGadoliniteY.name=Crushed Gadolinite (Y) Ore
+item.crushedCentrifugedGadoliniteY.name=Centrifuged Crushed Gadolinite (Y) Ore
+item.crushedPurifiedGadoliniteY.name=Purified Crushed Gadolinite (Y) Ore
+item.dustImpureGadoliniteY.name=Impure Gadolinite (Y) Dust
+item.dustPureGadoliniteY.name=Purified Gadolinite (Y) Dust
+item.itemDustLepersonnite.name=Пыль Леперсоннита
+item.itemDustTinyLepersonnite.name=Tiny Pile of Lepersonnite Dust
+item.itemDustSmallLepersonnite.name=Small Pile of Lepersonnite Dust
+item.crushedLepersonnite.name=Crushed Lepersonnite Ore
+item.crushedCentrifugedLepersonnite.name=Centrifuged Crushed Lepersonnite Ore
+item.crushedPurifiedLepersonnite.name=Purified Crushed Lepersonnite Ore
+item.dustImpureLepersonnite.name=Impure Lepersonnite Dust
+item.dustPureLepersonnite.name=Purified Lepersonnite Dust
+item.itemDustSamarskiteY.name=Пыль Самарскита Y
+item.itemDustTinySamarskiteY.name=Tiny Pile of Samarskite (Y) Dust
+item.itemDustSmallSamarskiteY.name=Small Pile of Samarskite (Y) Dust
+item.crushedSamarskiteY.name=Crushed Samarskite (Y) Ore
+item.crushedCentrifugedSamarskiteY.name=Centrifuged Crushed Samarskite (Y) Ore
+item.crushedPurifiedSamarskiteY.name=Purified Crushed Samarskite (Y) Ore
+item.dustImpureSamarskiteY.name=Impure Samarskite (Y) Dust
+item.dustPureSamarskiteY.name=Purified Samarskite (Y) Dust
+item.itemDustSamarskiteYb.name=Пыль Самарскита Yb
+item.itemDustTinySamarskiteYb.name=Tiny Pile of Samarskite (Yb) Dust
+item.itemDustSmallSamarskiteYb.name=Small Pile of Samarskite (Yb) Dust
+item.crushedSamarskiteYb.name=Crushed Samarskite (Yb) Ore
+item.crushedCentrifugedSamarskiteYb.name=Centrifuged Crushed Samarskite (Yb) Ore
+item.crushedPurifiedSamarskiteYb.name=Purified Crushed Samarskite (Yb) Ore
+item.dustImpureSamarskiteYb.name=Impure Samarskite (Yb) Dust
+item.dustPureSamarskiteYb.name=Purified Samarskite (Yb) Dust
+item.itemDustXenotime.name=Пыль Ксенотима
+item.itemDustTinyXenotime.name=Tiny Pile of Xenotime Dust
+item.itemDustSmallXenotime.name=Small Pile of Xenotime Dust
+item.crushedXenotime.name=Crushed Xenotime Ore
+item.crushedCentrifugedXenotime.name=Centrifuged Crushed Xenotime Ore
+item.crushedPurifiedXenotime.name=Purified Crushed Xenotime Ore
+item.dustImpureXenotime.name=Impure Xenotime Dust
+item.dustPureXenotime.name=Purified Xenotime Dust
+item.itemDustYttriaite.name=Yttriaite Dust
+item.itemDustTinyYttriaite.name=Tiny Pile of Yttriaite Dust
+item.itemDustSmallYttriaite.name=Small Pile of Yttriaite Dust
+item.crushedYttriaite.name=Crushed Yttriaite Ore
+item.crushedCentrifugedYttriaite.name=Centrifuged Crushed Yttriaite Ore
+item.crushedPurifiedYttriaite.name=Purified Crushed Yttriaite Ore
+item.dustImpureYttriaite.name=Impure Yttriaite Dust
+item.dustPureYttriaite.name=Purified Yttriaite Dust
+item.itemDustYttrialite.name=Пыль Иттриалита
+item.itemDustTinyYttrialite.name=Tiny Pile of Yttrialite Dust
+item.itemDustSmallYttrialite.name=Small Pile of Yttrialite Dust
+item.crushedYttrialite.name=Crushed Yttrialite Ore
+item.crushedCentrifugedYttrialite.name=Centrifuged Crushed Yttrialite Ore
+item.crushedPurifiedYttrialite.name=Purified Crushed Yttrialite Ore
+item.dustImpureYttrialite.name=Impure Yttrialite Dust
+item.dustPureYttrialite.name=Purified Yttrialite Dust
+item.itemDustYttrocerite.name=Пыль Иттроцерита
+item.itemDustTinyYttrocerite.name=Tiny Pile of Yttrocerite Dust
+item.itemDustSmallYttrocerite.name=Small Pile of Yttrocerite Dust
+item.crushedYttrocerite.name=Crushed Yttrocerite Ore
+item.crushedCentrifugedYttrocerite.name=Centrifuged Crushed Yttrocerite Ore
+item.crushedPurifiedYttrocerite.name=Purified Crushed Yttrocerite Ore
+item.dustImpureYttrocerite.name=Impure Yttrocerite Dust
+item.dustPureYttrocerite.name=Purified Yttrocerite Dust
+item.itemDustZircon.name=Пыль Циркона
+item.itemDustTinyZircon.name=Tiny Pile of Zircon Dust
+item.itemDustSmallZircon.name=Small Pile of Zircon Dust
+item.crushedZircon.name=Crushed Zircon Ore
+item.crushedCentrifugedZircon.name=Centrifuged Crushed Zircon Ore
+item.crushedPurifiedZircon.name=Purified Crushed Zircon Ore
+item.dustImpureZircon.name=Impure Zircon Dust
+item.dustPureZircon.name=Purified Zircon Dust
+item.itemDustPolycrase.name=Пыль Поликраса
+item.itemDustTinyPolycrase.name=Tiny Pile of Polycrase Dust
+item.itemDustSmallPolycrase.name=Small Pile of Polycrase Dust
+item.crushedPolycrase.name=Crushed Polycrase Ore
+item.crushedCentrifugedPolycrase.name=Centrifuged Crushed Polycrase Ore
+item.crushedPurifiedPolycrase.name=Purified Crushed Polycrase Ore
+item.dustImpurePolycrase.name=Impure Polycrase Dust
+item.dustPurePolycrase.name=Purified Polycrase Dust
+item.itemDustZircophyllite.name=Пыль Циркофиллита
+item.itemDustTinyZircophyllite.name=Tiny Pile of Zircophyllite Dust
+item.itemDustSmallZircophyllite.name=Small Pile of Zircophyllite Dust
+item.crushedZircophyllite.name=Crushed Zircophyllite Ore
+item.crushedCentrifugedZircophyllite.name=Centrifuged Crushed Zircophyllite Ore
+item.crushedPurifiedZircophyllite.name=Purified Crushed Zircophyllite Ore
+item.dustImpureZircophyllite.name=Impure Zircophyllite Dust
+item.dustPureZircophyllite.name=Purified Zircophyllite Dust
+item.itemDustZirkelite.name=Пыль Циркелита
+item.itemDustTinyZirkelite.name=Tiny Pile of Zirkelite Dust
+item.itemDustSmallZirkelite.name=Small Pile of Zirkelite Dust
+item.crushedZirkelite.name=Crushed Zirkelite Ore
+item.crushedCentrifugedZirkelite.name=Centrifuged Crushed Zirkelite Ore
+item.crushedPurifiedZirkelite.name=Purified Crushed Zirkelite Ore
+item.dustImpureZirkelite.name=Impure Zirkelite Dust
+item.dustPureZirkelite.name=Purified Zirkelite Dust
+item.itemDustLanthaniteLa.name=Пыль Лантанита La
+item.itemDustTinyLanthaniteLa.name=Tiny Pile of Lanthanite (La) Dust
+item.itemDustSmallLanthaniteLa.name=Small Pile of Lanthanite (La) Dust
+item.crushedLanthaniteLa.name=Crushed Lanthanite (La) Ore
+item.crushedCentrifugedLanthaniteLa.name=Centrifuged Crushed Lanthanite (La) Ore
+item.crushedPurifiedLanthaniteLa.name=Purified Crushed Lanthanite (La) Ore
+item.dustImpureLanthaniteLa.name=Impure Lanthanite (La) Dust
+item.dustPureLanthaniteLa.name=Purified Lanthanite (La) Dust
+item.itemDustLanthaniteCe.name=Пыль Лантанита Ce
+item.itemDustTinyLanthaniteCe.name=Tiny Pile of Lanthanite (Ce) Dust
+item.itemDustSmallLanthaniteCe.name=Small Pile of Lanthanite (Ce) Dust
+item.crushedLanthaniteCe.name=Crushed Lanthanite (Ce) Ore
+item.crushedCentrifugedLanthaniteCe.name=Centrifuged Crushed Lanthanite (Ce) Ore
+item.crushedPurifiedLanthaniteCe.name=Purified Crushed Lanthanite (Ce) Ore
+item.dustImpureLanthaniteCe.name=Impure Lanthanite (Ce) Dust
+item.dustPureLanthaniteCe.name=Purified Lanthanite (Ce) Dust
+item.itemDustLanthaniteNd.name=Пыль Лантанита Nd
+item.itemDustTinyLanthaniteNd.name=Tiny Pile of Lanthanite (Nd) Dust
+item.itemDustSmallLanthaniteNd.name=Small Pile of Lanthanite (Nd) Dust
+item.crushedLanthaniteNd.name=Crushed Lanthanite (Nd) Ore
+item.crushedCentrifugedLanthaniteNd.name=Centrifuged Crushed Lanthanite (Nd) Ore
+item.crushedPurifiedLanthaniteNd.name=Purified Crushed Lanthanite (Nd) Ore
+item.dustImpureLanthaniteNd.name=Impure Lanthanite (Nd) Dust
+item.dustPureLanthaniteNd.name=Purified Lanthanite (Nd) Dust
+item.itemDustAgarditeY.name=Пыль Агардита Y
+item.itemDustTinyAgarditeY.name=Tiny Pile of Agardite (Y) Dust
+item.itemDustSmallAgarditeY.name=Small Pile of Agardite (Y) Dust
+item.crushedAgarditeY.name=Crushed Agardite (Y) Ore
+item.crushedCentrifugedAgarditeY.name=Centrifuged Crushed Agardite (Y) Ore
+item.crushedPurifiedAgarditeY.name=Purified Crushed Agardite (Y) Ore
+item.dustImpureAgarditeY.name=Impure Agardite (Y) Dust
+item.dustPureAgarditeY.name=Purified Agardite (Y) Dust
+item.itemDustAgarditeCd.name=Пыль Агардита Cd
+item.itemDustTinyAgarditeCd.name=Tiny Pile of Agardite (Cd) Dust
+item.itemDustSmallAgarditeCd.name=Small Pile of Agardite (Cd) Dust
+item.crushedAgarditeCd.name=Crushed Agardite (Cd) Ore
+item.crushedCentrifugedAgarditeCd.name=Centrifuged Crushed Agardite (Cd) Ore
+item.crushedPurifiedAgarditeCd.name=Purified Crushed Agardite (Cd) Ore
+item.dustImpureAgarditeCd.name=Impure Agardite (Cd) Dust
+item.dustPureAgarditeCd.name=Purified Agardite (Cd) Dust
+item.itemDustAgarditeLa.name=Пыль Агардита La
+item.itemDustTinyAgarditeLa.name=Tiny Pile of Agardite (La) Dust
+item.itemDustSmallAgarditeLa.name=Small Pile of Agardite (La) Dust
+item.crushedAgarditeLa.name=Crushed Agardite (La) Ore
+item.crushedCentrifugedAgarditeLa.name=Centrifuged Crushed Agardite (La) Ore
+item.crushedPurifiedAgarditeLa.name=Purified Crushed Agardite (La) Ore
+item.dustImpureAgarditeLa.name=Impure Agardite (La) Dust
+item.dustPureAgarditeLa.name=Purified Agardite (La) Dust
+item.itemDustAgarditeNd.name=Пыль Агардита Nd
+item.itemDustTinyAgarditeNd.name=Tiny Pile of Agardite (Nd) Dust
+item.itemDustSmallAgarditeNd.name=Small Pile of Agardite (Nd) Dust
+item.crushedAgarditeNd.name=Crushed Agardite (Nd) Ore
+item.crushedCentrifugedAgarditeNd.name=Centrifuged Crushed Agardite (Nd) Ore
+item.crushedPurifiedAgarditeNd.name=Purified Crushed Agardite (Nd) Ore
+item.dustImpureAgarditeNd.name=Impure Agardite (Nd) Dust
+item.dustPureAgarditeNd.name=Purified Agardite (Nd) Dust
+item.itemDustHibonite.name=Пыль Гибонита
+item.itemDustTinyHibonite.name=Tiny Pile of Hibonite Dust
+item.itemDustSmallHibonite.name=Small Pile of Hibonite Dust
+item.crushedHibonite.name=Crushed Hibonite Ore
+item.crushedCentrifugedHibonite.name=Centrifuged Crushed Hibonite Ore
+item.crushedPurifiedHibonite.name=Purified Crushed Hibonite Ore
+item.dustImpureHibonite.name=Impure Hibonite Dust
+item.dustPureHibonite.name=Purified Hibonite Dust
+item.itemDustCerite.name=Пыль Церита
+item.itemDustTinyCerite.name=Tiny Pile of Cerite Dust
+item.itemDustSmallCerite.name=Small Pile of Cerite Dust
+item.crushedCerite.name=Crushed Cerite Ore
+item.crushedCentrifugedCerite.name=Centrifuged Crushed Cerite Ore
+item.crushedPurifiedCerite.name=Purified Crushed Cerite Ore
+item.dustImpureCerite.name=Impure Cerite Dust
+item.dustPureCerite.name=Purified Cerite Dust
+item.itemDustFluorcaphite.name=Пыль Фторокафита
+item.itemDustTinyFluorcaphite.name=Tiny Pile of Fluorcaphite Dust
+item.itemDustSmallFluorcaphite.name=Small Pile of Fluorcaphite Dust
+item.crushedFluorcaphite.name=Crushed Fluorcaphite Ore
+item.crushedCentrifugedFluorcaphite.name=Centrifuged Crushed Fluorcaphite Ore
+item.crushedPurifiedFluorcaphite.name=Purified Crushed Fluorcaphite Ore
+item.dustImpureFluorcaphite.name=Impure Fluorcaphite Dust
+item.dustPureFluorcaphite.name=Purified Fluorcaphite Dust
+item.itemDustFlorencite.name=Пыль Флоренцита
+item.itemDustTinyFlorencite.name=Tiny Pile of Florencite Dust
+item.itemDustSmallFlorencite.name=Small Pile of Florencite Dust
+item.crushedFlorencite.name=Crushed Florencite Ore
+item.crushedCentrifugedFlorencite.name=Centrifuged Crushed Florencite Ore
+item.crushedPurifiedFlorencite.name=Purified Crushed Florencite Ore
+item.dustImpureFlorencite.name=Impure Florencite Dust
+item.dustPureFlorencite.name=Purified Florencite Dust
+item.itemDustCryoliteF.name=Cryolite (F) Dust
+item.itemDustTinyCryoliteF.name=Tiny Pile of Cryolite (F) Dust
+item.itemDustSmallCryoliteF.name=Small Pile of Cryolite (F) Dust
+item.crushedCryoliteF.name=Crushed Cryolite (F) Ore
+item.crushedCentrifugedCryoliteF.name=Centrifuged Crushed Cryolite (F) Ore
+item.crushedPurifiedCryoliteF.name=Purified Crushed Cryolite (F) Ore
+item.dustImpureCryoliteF.name=Impure Cryolite (F) Dust
+item.dustPureCryoliteF.name=Purified Cryolite (F) Dust
+item.itemDustTinyYellorium.name=Tiny Pile of Yellorium Dust
+item.itemDustSmallYellorium.name=Small Pile of Yellorium Dust
+item.crushedYellorium.name=Crushed Yellorium Ore
+item.crushedCentrifugedYellorium.name=Centrifuged Crushed Yellorium Ore
+item.crushedPurifiedYellorium.name=Purified Crushed Yellorium Ore
+item.dustImpureYellorium.name=Impure Yellorium Dust
+item.dustPureYellorium.name=Purified Yellorium Dust
+
+//Shards
+item.itemDrained.name=Drained Shard
+item.itemDustInfusedAir.name=Infused Air Dust
+item.itemDustInfusedFire.name=Infused Fire Dust
+item.itemDustInfusedEarth.name=Infused Earth Dust
+item.itemDustInfusedWater.name=Infused Water Dust
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium Carbonate Dust
+item.itemDustSmallLithiumCarbonate.name=Small Pile of Lithium Carbonate Dust
+item.itemDustTinyLithiumCarbonate.name=Tiny Pile of Lithium Carbonate Dust
+item.itemDustLithiumPeroxide.name=Lithium Peroxide Dust
+item.itemDustSmallLithiumPeroxide.name=Small Pile of Lithium Peroxide Dust
+item.itemDustTinyLithiumPeroxide.name=Tiny Pile of Lithium Peroxide Dust
+item.itemDustLithiumHydroxide.name=Lithium Hydroxide Dust
+item.itemDustSmallLithiumHydroxide.name=Small Pile of Lithium Hydroxide Dust
+item.itemDustTinyLithiumHydroxide.name=Tiny Pile of Lithium Hydroxide Dust
+item.itemDustCalciumHydroxide.name=Hydrated Lime Dust
+item.itemDustSmallCalciumHydroxide.name=Small Pile of Hydrated Lime Dust
+item.itemDustTinyCalciumHydroxide.name=Tiny Pile of Hydrated Lime Dust
+item.itemDustCalciumCarbonate.name=Calcium Carbonate Dust
+item.itemDustSmallCalciumCarbonate.name=Small Pile of Calcium Carbonate Dust
+item.itemDustTinyCalciumCarbonate.name=Tiny Pile of Calcium Carbonate Dust
+item.itemDustGypsum.name=Calcium Sulfate (Gypsum) Dust
+item.itemDustSmallGypsum.name=Small Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustTinyGypsum.name=Tiny Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustSmallLi2CO3CaOH2.name=Small Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustTinyLi2CO3CaOH2.name=Tiny Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustLi2BeF4.name=Li2BeF4 Fuel Compound Dust
+item.itemDustSmallLi2BeF4.name=Small Pile of Li2BeF4 Fuel Compound Dust
+item.itemDustTinyLi2BeF4.name=Tiny Pile of Li2BeF4 Fuel Compound Dust
+item.Li2BeF4.name=Li2BeF4 Cell
+item.itemCircuitLFTR.name=§aControl Circuit
+item.itemZirconiumPellet.name=Zirconium Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4 Dust
+item.itemDustSmallZrCl4.name=Small Pile of ZrCl4 Dust
+item.itemDustTinyZrCl4.name=Tiny Pile of ZrCl4 Dust
+item.itemDustCookedZrCl4.name=Cooked ZrCl4 Dust
+item.itemDustSmallCookedZrCl4.name=Small Pile of Cooked ZrCl4 Dust
+item.itemDustTinyCookedZrCl4.name=Tiny Pile of Cooked ZrCl4 Dust
+item.itemDustUN18Fertiliser.name=UN-18 Fertiliser Dust
+item.itemDustSmallUN18Fertiliser.name=Small Pile of UN-18 Fertiliser Dust
+item.itemDustTinyUN18Fertiliser.name=Tiny Pile of UN-18 Fertiliser Dust
+item.itemDustUN32Fertiliser.name=UN-32 Fertiliser Dust
+item.itemDustSmallUN32Fertiliser.name=Small Pile of UN-32 Fertiliser Dust
+item.itemDustTinyUN32Fertiliser.name=Tiny Pile of UN-32 Fertiliser Dust
+
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium Multipick
+item.AluminiumMultispade.name=Aluminium Multispade
+item.BerylliumMultispade.name=Beryllium Multispade
+item.BismuthMultispade.name=Bismuth Multispade
+item.CarbonMultispade.name=Carbon Multispade
+item.ChromeMultipick.name=Chrome Multipick
+item.ChromeMultispade.name=Chrome Multispade
+item.CobaltMultipick.name=Cobalt Multipick
+item.CobaltMultispade.name=Cobalt Multispade
+item.GoldMultispade.name=Gold Multispade
+item.IridiumMultipick.name=Iridium Multipick
+item.IridiumMultispade.name=Iridium Multispade
+item.IronMultipick.name=Iron Multipick
+item.IronMultispade.name=Iron Multispade
+item.LeadMultispade.name=Lead Multispade
+item.ManganeseMultipick.name=Manganese Multipick
+item.ManganeseMultispade.name=Manganese Multispade
+item.MolybdenumMultipick.name=Molybdenum Multipick
+item.MolybdenumMultispade.name=Molybdenum Multispade
+item.NeodymiumMultipick.name=Neodymium Multipick
+item.NeodymiumMultispade.name=Neodymium Multispade
+item.NeutroniumMultipick.name=Neutronium Multipick
+item.NeutroniumMultispade.name=Neutronium Multispade
+item.NickelMultispade.name=Nickel Multispade
+item.OsmiumMultipick.name=Osmium Multipick
+item.OsmiumMultispade.name=Osmium Multispade
+item.PalladiumMultipick.name=Palladium Multipick
+item.PalladiumMultispade.name=Palladium Multispade
+item.PlatinumMultispade.name=Platinum Multispade
+item.Plutonium241Multipick.name=Plutonium 241 Multipick
+item.Plutonium241Multispade.name=Plutonium 241 Multispade
+item.SilverMultispade.name=Silver Multispade
+item.ThoriumMultipick.name=Thorium Multipick
+item.ThoriumMultispade.name=Thorium Multispade
+item.TitaniumMultipick.name=Titanium Multipick
+item.TitaniumMultispade.name=Titanium Multispade
+item.TungstenMultipick.name=Tungsten Multipick
+item.TungstenMultispade.name=Tungsten Multispade
+item.Uranium235Multipick.name=Uranium 235 Multipick
+item.Uranium235Multispade.name=Uranium 235 Multispade
+item.DarkSteelMultipick.name=Dark Steel Multipick
+item.DarkSteelMultispade.name=Dark Steel Multispade
+item.DuraniumMultipick.name=Duranium Multipick
+item.DuraniumMultispade.name=Duranium Multispade
+item.InfusedGoldMultispade.name=Infused Gold Multispade
+item.NaquadahMultipick.name=Naquadah Multipick
+item.NaquadahMultispade.name=Naquadah Multispade
+item.NaquadahAlloyMultipick.name=Naquadah Alloy Multipick
+item.NaquadahAlloyMultispade.name=Naquadah Alloy Multispade
+item.NaquadriaMultipick.name=Naquadria Multipick
+item.NaquadriaMultispade.name=Naquadria Multispade
+item.TritaniumMultipick.name=Tritanium Multipick
+item.TritaniumMultispade.name=Tritanium Multispade
+item.OsmiridiumMultipick.name=Osmiridium Multipick
+item.OsmiridiumMultispade.name=Osmiridium Multispade
+item.BrassMultispade.name=Brass Multispade
+item.BronzeMultipick.name=Bronze Multipick
+item.BronzeMultispade.name=Bronze Multispade
+item.CupronickelMultispade.name=Cupronickel Multispade
+item.ElectrumMultispade.name=Electrum Multispade
+item.InvarMultipick.name=Invar Multipick
+item.InvarMultispade.name=Invar Multispade
+item.KanthalMultispade.name=Kanthal Multispade
+item.MagnaliumMultipick.name=Magnalium Multipick
+item.MagnaliumMultispade.name=Magnalium Multispade
+item.NichromeMultispade.name=Nichrome Multispade
+item.PigIronMultipick.name=Pig Iron Multipick
+item.PigIronMultispade.name=Pig Iron Multispade
+item.PolycaprolactamMultispade.name=Polycaprolactam Multispade
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene Multispade
+item.NickelZincFerriteMultispade.name=Nickel-Zinc Ferrite Multispade
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene Sulfide Multispade
+item.StainlessSteelMultipick.name=Stainless Steel Multipick
+item.StainlessSteelMultispade.name=Stainless Steel Multispade
+item.SteelMultipick.name=Steel Multipick
+item.SteelMultispade.name=Steel Multispade
+item.TinAlloyMultispade.name=Tin Alloy Multispade
+item.UltimetMultipick.name=Ultimet Multipick
+item.UltimetMultispade.name=Ultimet Multispade
+item.WroughtIronMultipick.name=Wrought Iron Multipick
+item.WroughtIronMultispade.name=Wrought Iron Multispade
+item.SterlingSilverMultipick.name=Sterling Silver Multipick
+item.SterlingSilverMultispade.name=Sterling Silver Multispade
+item.RoseGoldMultipick.name=Rose Gold Multipick
+item.RoseGoldMultispade.name=Rose Gold Multispade
+item.BlackBronzeMultipick.name=Black Bronze Multipick
+item.BlackBronzeMultispade.name=Black Bronze Multispade
+item.BismuthBronzeMultipick.name=Bismuth Bronze Multipick
+item.BismuthBronzeMultispade.name=Bismuth Bronze Multispade
+item.BlackSteelMultipick.name=Black Steel Multipick
+item.BlackSteelMultispade.name=Black Steel Multispade
+item.RedSteelMultipick.name=Red Steel Multipick
+item.RedSteelMultispade.name=Red Steel Multispade
+item.BlueSteelMultipick.name=Blue Steel Multipick
+item.BlueSteelMultispade.name=Blue Steel Multispade
+item.DamascusSteelMultipick.name=Damascus Steel Multipick
+item.DamascusSteelMultispade.name=Damascus Steel Multispade
+item.MithrilMultispade.name=Mithril Multispade
+item.CobaltBrassMultipick.name=Cobalt Brass Multipick
+item.CobaltBrassMultispade.name=Cobalt Brass Multispade
+item.ThaumiumMultipick.name=Thaumium Multipick
+item.ThaumiumMultispade.name=Thaumium Multispade
+item.HSSGMultipick.name=HSS-G Multipick
+item.HSSGMultispade.name=HSS-G Multispade
+item.HSSEMultipick.name=HSS-E Multipick
+item.HSSEMultispade.name=HSS-E Multispade
+item.HSSSMultipick.name=HSS-S Multipick
+item.HSSSMultispade.name=HSS-S Multispade
+item.HastelloyC276Multipick.name=Hastelloy-C276 Multipick
+item.HastelloyC276Multispade.name=Hastelloy-C276 Multispade
+item.HastelloyNMultipick.name=Hastelloy-N Multipick
+item.HastelloyNMultispade.name=Hastelloy-N Multispade
+item.HastelloyWMultipick.name=Hastelloy-W Multipick
+item.HastelloyWMultispade.name=Hastelloy-W Multispade
+item.HastelloyXMultipick.name=Hastelloy-X Multipick
+item.HastelloyXMultispade.name=Hastelloy-X Multispade
+item.Incoloy020Multipick.name=Incoloy-020 Multipick
+item.Incoloy020Multispade.name=Incoloy-020 Multispade
+item.IncoloyDSMultipick.name=Incoloy-DS Multipick
+item.IncoloyDSMultispade.name=Incoloy-DS Multispade
+item.IncoloyMA956Multipick.name=Incoloy-MA956 Multipick
+item.IncoloyMA956Multispade.name=Incoloy-MA956 Multispade
+item.Inconel625Multipick.name=Inconel-625 Multipick
+item.Inconel625Multispade.name=Inconel-625 Multispade
+item.Inconel690Multipick.name=Inconel-690 Multipick
+item.Inconel690Multispade.name=Inconel-690 Multispade
+item.Inconel792Multipick.name=Inconel-792 Multipick
+item.Inconel792Multispade.name=Inconel-792 Multispade
+item.GrisiumMultipick.name=Grisium Multipick
+item.GrisiumMultispade.name=Grisium Multispade
+item.Tantalloy60Multipick.name=Tantalloy-60 Multipick
+item.Tantalloy60Multispade.name=Tantalloy-60 Multispade
+item.Tantalloy61Multipick.name=Tantalloy-61 Multipick
+item.Tantalloy61Multispade.name=Tantalloy-61 Multispade
+item.StaballoyMultipick.name=Staballoy Multipick
+item.StaballoyMultispade.name=Staballoy Multispade
+item.QuantumMultipick.name=Quantum Multipick
+item.QuantumMultispade.name=Quantum Multispade
+item.PotinMultipick.name=Potin Multipick
+item.PotinMultispade.name=Potin Multispade
+item.TumbagaMultipick.name=Tumbaga Multipick
+item.TumbagaMultispade.name=Tumbaga Multispade
+item.TaloniteMultipick.name=Talonite Multipick
+item.TaloniteMultispade.name=Talonite Multispade
+item.StelliteMultipick.name=Stellite Multipick
+item.StelliteMultispade.name=Stellite Multispade
+item.TungstenCarbideMultipick.name=Tungsten Carbide Multipick
+item.TungstenCarbideMultispade.name=Tungsten Carbide Multispade
+item.TantalumCarbideMultipick.name=Tantalum Carbide Multipick
+item.TantalumCarbideMultispade.name=Tantalum Carbide Multispade
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=Clay Plate
+item.itemPlateDoubleClay.name=Double Clay Plate
+item.itemPlateLithium.name=Lithium Plate
+item.itemPlateDoubleEuropium.name=Double Europium Plate
+
+//Gears
+item.itemSmallGearWroughtIron.name=Small Wrought Iron Gear
+
+//Misc
+item.itemFoilUranium235.name=Uranium 235 Foil
+
+item.itemBoilerChassis_0.name=Advanced Boiler Chassis [Tier 1]
+item.itemDehydratorCoilWire_0.name=Coil Wire [EV]
+item.itemDehydratorCoil_0.name=Dehydrator Coil [EV]
+item.itemAirFilter_0.name=Air Filter
+item.itemAirFilter_1.name=Air Filter
+item.itemLavaFilter.name=Lava Filter
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=Dragon Capture Jar
+item.CoalGas.name=Coal Gas Cell
+item.Ethylbenzene.name=Ethylbenzene Cell
+item.Anthracene.name=Anthracene Cell
+item.Toluene.name=Toluene Cell
+item.CoalTar.name=Coal Tar Cell
+item.CoalTarOil.name=Coal Tar Oil Cell
+item.SulfuricCoalTarOil.name=Sulfuric Coal Tar Oil Cell
+item.Naphthalene.name=Naphthalene Cell
+item.itemDustPhthalicAnhydride.name=Phthalic Anhydride Dust
+item.itemDustSmallPhthalicAnhydride.name=Small Pile of Phthalic Anhydride Dust
+item.itemDustTinyPhthalicAnhydride.name=Tiny Pile of Phthalic Anhydride Dust
+item.2Ethylanthraquinone.name=2-Ethylanthraquinone Cell
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrahydroquinone Cell
+item.HydrogenPeroxide.name=Hydrogen Peroxide Cell
+item.itemDustLithiumHydroperoxide.name=Lithium Hydroperoxide Dust
+item.itemDustSmallLithiumHydroperoxide.name=Small Pile of Lithium Hydroperoxide Dust
+item.itemDustTinyLithiumHydroperoxide.name=Tiny Pile of Lithium Hydroperoxide Dust
+item.LithiumPeroxide.name=Lithium Peroxide Cell
+item.itemPotionChilly.name=Chilly Potion
+item.itemKeyBig4000DC's.name=4000DC's Big Key
+item.itemGemDull.name=Dull Gemstone
+item.itemMushroomForest.name=Forest Mushroom
+item.itemPlateVanadium.name=Vanadium Plate
+item.thekeytothecity.name=The Key to the City
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium Dust
+item.itemDustSmallSoularium.name=Small Pile of Soularium Dust
+item.itemDustTinySoularium.name=Tiny Pile of Soularium Dust
+item.itemDustRedstoneAlloy.name=Redstone Alloy Dust
+item.itemDustSmallRedstoneAlloy.name=Small Pile of Redstone Alloy Dust
+item.itemDustTinyRedstoneAlloy.name=Tiny Pile of Redstone Alloy Dust
+item.itemDustElectricalSteel.name=Electrical Steel Dust
+item.itemDustSmallElectricalSteel.name=Small Pile of Electrical Steel Dust
+item.itemDustTinyElectricalSteel.name=Tiny Pile of Electrical Steel Dust
+item.itemDustPulsatingIron.name=Pulsating Iron Dust
+item.itemDustSmallPulsatingIron.name=Small Pile of Pulsating Iron Dust
+item.itemDustTinyPulsatingIron.name=Tiny Pile of Pulsating Iron Dust
+item.itemDustEnergeticAlloy.name=Energetic Alloy Dust
+item.itemDustSmallEnergeticAlloy.name=Small Pile of Energetic Alloy Dust
+item.itemDustTinyEnergeticAlloy.name=Tiny Pile of Energetic Alloy Dust
+item.itemDustVibrantAlloy.name=Vibrant Alloy Dust
+item.itemDustSmallVibrantAlloy.name=Small Pile of Vibrant Alloy Dust
+item.itemDustTinyVibrantAlloy.name=Tiny Pile of Vibrant Alloy Dust
+item.itemDustConductiveIron.name=Conductive Iron Dust
+item.itemDustSmallConductiveIron.name=Small Pile of Conductive Iron Dust
+item.itemDustTinyConductiveIron.name=Tiny Pile of Conductive Iron Dust
+item.itemPlateSoularium.name=Soularium plate
+item.itemPlateRedstoneAlloy.name=Redstone Alloy plate
+item.itemPlateElectricalSteel.name=Electrical Steel plate
+item.itemPlatePhasedIron.name=Phased Iron plate
+item.itemPlateEnergeticAlloy.name=Energetic Alloy plate
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium plate
+item.itemPlateCyanite.name=Cyanite plate
+item.itemPlateLudicrite.name=Ludicrite plate
+item.itemPlateVoid.name=Void plate
+item.itemPlateDimensionShard.name=Dimensional Shard plate
+item.rfEUBattery.name=Universally Chargeable Battery
+item.personalCloakingDevice.name=§9Personal Cloaking Device§7
+item.personalHealingDevice.name=§9Personal Healing NanoBooster§r
+item.SlowBuildingRing.name=§eSlow Building Ring§7
+item.itemStaballoyPickaxe.name=Туннелекопатель
+item.itemStaballoyAxe.name=Лесоруб
+item.itemSandstoneHammer.name=Дробилка булыжников
+item.itemBufferCore1.name=Энергетическое ядро [ULV].
+item.itemBufferCore2.name=Энергетическое ядро [LV].
+item.itemBufferCore3.name=Энергетическое ядро [MV].
+item.itemBufferCore4.name=Энергетическое ядро [HV].
+item.itemBufferCore5.name=Энергетическое ядро [EV].
+item.itemBufferCore6.name=Энергетическое ядро [IV].
+item.itemBufferCore7.name=Энергетическое ядро [LuV].
+item.itemBufferCore8.name=Энергетическое ядро [ZPM].
+item.itemBufferCore9.name=Энергетическое ядро [UV].
+item.itemBufferCore10.name=Энергетическое ядро [MAX].
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itembookgt.name=§oThermal Boiler Manual
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Disk [§cActivated§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Тропическое дерево
+tile.blockRainforestOakLeaves.name=Тропические листва
+tile.blockRainforestOakSapling.name=Тропические саженцы
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Broken
+tile.blockFastArcaneAlembic.1.name=Broken
+
+//Frame Boxes
+tile.Block of Selenium.name=Блок Селена
+tile.Selenium Frame Box.name=Каркас Из Селена
+tile.Block of Bromine.name=Блок Брома
+tile.Block of Strontium.name=Блок Стронция
+tile.Strontium Frame Box.name=Каркас Из Стронция
+tile.Block of Zirconium.name=Блок Циркония
+tile.Zirconium Frame Box.name=Каркас Из Циркония
+tile.Block of Ruthenium.name=Блок Рутения
+tile.Ruthenium Frame Box.name=Каркас Из Рутения
+tile.Block of Iodine.name=Блок Йода
+tile.Iodine Frame Box.name=Каркас Из Йода
+tile.Block of Hafnium.name=Блок Гафния
+tile.Hafnium Frame Box.name=Каркас Из Гафния
+tile.Block of Dysprosium.name=Блок Диспрозия
+tile.Dysprosium Frame Box.name=Каркас Из Дипрозия
+tile.Block of Tellurium.name=Блок Теллура
+tile.Tellurium Frame Box.name=Каркас Из Теллура
+tile.Block of Rhodium.name=Блок Родия
+tile.Rhodium Frame Box.name=Каркас Из Родия
+tile.Block of Rhenium.name=Блок Рения
+tile.Rhenium Frame Box.name=Каркас Из Рения
+tile.Block of Thallium.name=Блок Таллия
+tile.Thallium Frame Box.name=Каркас Из Таллия
+tile.Block of Technetium.name=Блок Технеция
+tile.Block of Polonium.name=Блок Полония
+tile.Block of Astatine.name=Блок Астатина
+tile.Block of Francium.name=Блок Франция
+tile.Block of Radium.name=Блок Радия
+tile.Block of Actinium.name=Блок Актиния
+tile.Block of Protactinium.name=Блок Протактиния
+tile.Block of Neptunium.name=Блок Нептуния
+tile.Block of Curium.name=Блок Кюрия
+tile.Block of Berkelium.name=Блок Беркилия
+tile.Block of Californium.name=Блок Калифорния
+tile.Block of Einsteinium.name=Блок Эйнштейния
+tile.Block of Fermium.name=Блок Фермия
+tile.Block of Thorium 232.name=Блок Тория 232
+tile.Block of Uranium 232.name=Блок Урана 232
+tile.Block of Uranium 233.name=Блок Урана 233
+tile.Block of Plutonium-238.name=Блок Плутона 238
+tile.Block of Strontium-90.name=Блок Стронция 90
+tile.Block of Polonium-210.name=Блок Полония 210
+tile.Block of Americium-241.name=Блок Америция 241
+tile.Block of Silicon Carbide.name=Блок Силиконового Карбида
+tile.Silicon Carbide Frame Box.name=Каркас Из Силиконового Карбида
+tile.Block of Zirconium Carbide.name=Блок Циркониевого Карбида
+tile.Zirconium Carbide Frame Box.name=Каркас Из Циркониевого Карбида
+tile.Block of Tantalum Carbide.name=Блок Карбида Тантала
+tile.Tantalum Carbide Frame Box.name=Каркас Из Карбида Тантала
+tile.Block of Niobium Carbide.name=Блок Ниобиевого Карбида
+tile.Niobium Carbide Frame Box.name=Каркас Из Ниобиевого Карбида
+tile.Block of Beryllium Fluoride.name=Блок Бериллиевого Фторида
+tile.Block of Lithium Fluoride.name=Блок Литиевого Фторида
+tile.Block of Thorium Tetrafluoride.name=Блок Ториевого Тетрафторида
+tile.Block of Thorium Hexafluoride.name=Блок Ториевого Гексафторида
+tile.Block of Uranium Tetrafluoride.name=Блок Ураниевого Тетрафторида
+tile.Block of Uranium Hexafluoride.name=Блок Ураниевого Гексафторида
+tile.Block of Zirconium Tetrafluoride.name=Блок Циркониевого Тетрафторида
+tile.Block of Neptunium Hexafluoride.name=Блок Нептуниевого Гексафторида
+tile.Block of Technetium Hexafluoride.name=Блок Технециевого Гексафторида
+tile.Block of Selenium Hexafluoride.name=Блок Гексафторида Селена
+tile.Block of LiFBeF2ZrF4U235.name=Блок Железорана 235
+tile.Block of LiFBeF2ZrF4UF4.name=Блок Циркониевого Железорана
+tile.Block of LiFBeF2ThF4UF4.name=Блок Ториевого Железорана
+tile.Block of Energy Crystal.name=Блок Энергетического Кристалла
+tile.Energy Crystal Frame Box.name=Каркас Из Энергетического Кристалла
+tile.Block of Blood Steel.name=Блок Кровавой Стали
+tile.Blood Steel Frame Box.name=Каркас Из Кровавой Стали
+tile.Block of Zeron-100.name=Блок Церона 100
+tile.Zeron-100 Frame Box.name=Каркас Из Церона 100
+tile.Block of Tumbaga.name=Блок Из Тумбага
+tile.Tumbaga Frame Box.name=Каркас Из Тумбага
+tile.Block of Potin.name=Блок Потина
+tile.Potin Frame Box.name=Каркас Из Потина
+tile.Block of Staballoy.name=Блок Стального Сплава
+tile.Staballoy Frame Box.name=Каркас Из Стального Сплава
+tile.Block of Tantalloy-60.name=Блок Сплава Тантала 60
+tile.Tantalloy-60 Frame Box.name=Каркас Из Сплава Тантала 60
+tile.Block of Tantalloy-61.name=Блок Сплава Тантала 61
+tile.Tantalloy-61 Frame Box.name=Каркас Из Сплава Тантала 61
+tile.Block of Inconel-625.name=Блок Инконеля 625
+tile.Inconel-625 Frame Box.name=Каркас Из Инконеля 625
+tile.Block of Inconel-690.name=Блок Инконеля 690
+tile.Inconel-690 Frame Box.name=Каркас Из Инконеля 690
+tile.Block of Inconel-792.name=Блок Инконеля 792
+tile.Inconel-792 Frame Box.name=Каркас Из Инконеля 792
+tile.Block of Eglin Steel.name=Блок Эглиновой Стали
+tile.Eglin Steel Frame Box.name=Каркас Из Эглиновой Стали
+tile.Block of Maraging Steel 250.name=Блок Марагинской Стали 250
+tile.Maraging Steel 250 Frame Box.name=Каркас Из Марагинской Стали 250
+tile.Block of Maraging Steel 300.name=Блок Марагинской Стали 300
+tile.Maraging Steel 300 Frame Box.name=Каркас Из Марагинской Стали 300
+tile.Block of Maraging Steel 350.name=Блок Марагинской Стали 350
+tile.Maraging Steel 350 Frame Box.name=Каркас Из Марагинской Стали 350
+tile.Block of Stellite.name=Блок Стеллита
+tile.Stellite Frame Box.name=Каркас Из Стеллита
+tile.Block of Talonite.name=Блок Талонита
+tile.Talonite Frame Box.name=Каркас Из Талонита
+tile.Block of Hastelloy-W.name=Блок Хастеллоя W
+tile.Hastelloy-W Frame Box.name=Каркас Из Хастеллоя W
+tile.Block of Hastelloy-X.name=Блок Хастеллоя X
+tile.Hastelloy-X Frame Box.name=Каркас Из Хастеллоя X
+tile.Block of Hastelloy-C276.name=Блок Хастеллоя C276
+tile.Hastelloy-C276 Frame Box.name=Каркас Из Хастеллоя C276
+tile.Block of Hastelloy-N.name=Блок Хастеллоя N
+tile.Hastelloy-N Frame Box.name=Каркас Из Хастеллоя N
+tile.Block of Incoloy-020.name=Блок Инколоя 020
+tile.Incoloy-020 Frame Box.name=Каркас Из Инколоя 020
+tile.Block of Incoloy-DS.name=Блок Инколоя DS
+tile.Incoloy-DS Frame Box.name=Каркас Из Инколоя DS
+tile.Block of Incoloy-MA956.name=Блок Инколоя MA956
+tile.Incoloy-MA956 Frame Box.name=Каркас Из Инколоя MA956
+tile.Block of Grisium.name=Блок Грисиума
+tile.Grisium Frame Box.name=Каркас Из Грисиума
+tile.Block of Trinium.name=Block of Trinium
+tile.Block of Refined Trinium.name=Block of Refined Trinium
+tile.Block of Trinium Titanium Alloy.name=Блок Сплава Тритий Титана
+tile.Trinium Titanium Alloy Frame Box.name=Каркас Из Сплава Тритий Титана
+tile.Block of Trinium Naquadah Alloy.name=Блок Сплава Тритий Наквадаха
+tile.Block of Trinium Naquadah Carbonite.name=Блок Карбонита Тритий Наквадаха
+tile.Trinium Naquadah Carbonite Frame Box.name=Каркас Из Карбонита Тритий Наквадаха
+tile.Block of Quantum.name=Блок Кванта
+tile.Quantum Frame Box.name=Каркас Из Кванта
+
+//Ores
+tile.OreFluoriteF.name=Fluorite (F) Ore
+tile.OreCrocoite.name=Руда Крокоита
+tile.OreGeikielite.name=Руда Гейкелита
+tile.OreNichromite.name=Руда Нихромата
+tile.OreTitanite.name=Руда Титанита
+tile.OreZimbabweite.name=Руда Зимбабвайта
+tile.OreZirconolite.name=Руда Цирконолита
+tile.OreGadoliniteCe.name=Руда Гадолинита Ce
+tile.OreGadoliniteY.name=Руда Гадолинита Y
+tile.OreLepersonnite.name=Руда Леперсоннита
+tile.OreSamarskiteY.name=Руда Самарскита Y
+tile.OreSamarskiteYb.name=Руда Самарскита Yb
+tile.OreXenotime.name=Руда Ксенотима
+tile.OreYttriaite.name=Руда Иттриайта
+tile.OreYttrialite.name=Руда Иттриалита
+tile.OreYttrocerite.name=Руда Иттроцерита
+tile.OreZircon.name=Руда Циркона
+tile.OrePolycrase.name=Руда Поликраса
+tile.OreZircophyllite.name=Руда Циркофиллита
+tile.OreZirkelite.name=Руда Циркелита
+tile.OreLanthaniteLa.name=Руда Лантанита La
+tile.OreLanthaniteCe.name=Руда Лантанита Ce
+tile.OreLanthaniteNd.name=Руда Лантанита Nd
+tile.OreAgarditeY.name=Руда Агардита Y
+tile.OreAgarditeCd.name=Руда Агардита Cd
+tile.OreAgarditeLa.name=Руда Агардита La
+tile.OreAgarditeNd.name=Руда Агардита Nd
+tile.OreHibonite.name=Руда Гибонита
+tile.OreCerite.name=Руда Церита
+tile.OreFluorcaphite.name=Руда Фторокафита
+tile.OreFlorencite.name=Руда Флоренцита
+tile.OreCryoliteF.name=Cryolite (F) Ore
+
+//Misc
+tile.blockMFEffect.name=Эффект MF
+tile.fluidBlockSludge.name=Жидкий Блок Грязи
+tile.blockWorkbenchGT.name=Верстак
+tile.blockWorkbenchGTAdvanced.name=Улучшенный Верстак
+tile.blockHeliumGenerator.name=Гелиевый Генератор
+tile.blockFirePit.name=Огненная Яма
+tile.blockFishTrap.name=Рыбная Ловушка
+tile.blockInfiniteFluidTank.name=Бесконечный Жидкостный Резервуар
+tile.blockMiningExplosives.name=Взрывчатые Вещества
+tile.blockHellFire.name=Адский огонь
+tile.blockProjectBench.name=Проектный стол
+tile.blockTradeBench.name=Торговая лавка
+tile.blockModularity.name=Модульность
+tile.blockBlackGate.name=Черные Ворота
+tile.blockTankXpConverter.name=Резервуар Конвертора Опыта
+
+//Everglades Blocks
+tile.fluidSludge.0.name=Stagnant Waste Water
+tile.blockDarkWorldPortal.name=A Glimpse of the Future
+tile.blockDarkWorldGround.name=Unstable Earth
+tile.blockDarkWorldGround2.name=Polluted Soil
+tile.blockDarkWorldGround2.2.name=Highly Polluted Soil
+tile.blockDarkWorldPortalFrame.name=Containment Frame
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=Strengthened Mining Pipe
+tile.blockMiningHeadFake.name=Bedrock Drill
+item.itemPlateMeatRaw.name=Fleshy Panel
+tile.Block of MeatRaw.name=Block of Raw Meat
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ThF4UF4]
+item.BurntLiFBeF2ZrF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4UF4]
+item.BurntLiFBeF2ZrF4U235.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4U235]
+item.itemBigEgg.name= ounce Chicken Egg
+item.itemPlateSodium.name=Sodium Plate
+
+item.itemNuggetPromethium.name=Promethium Nugget
+item.itemIngotPromethium.name=Promethium Ingot
+item.itemDustSmallPromethium.name=Small Pile of Promethium
+item.itemDustTinyPromethium.name=Tiny Pile of Promethium
+item.itemDustPromethium.name=Promethium Dust
+tile.Block of Promethium.name=Блок Прометия
+
+item.itemCellAmericium241.name=Americium 241 Cell
+item.itemCellPolonium210.name=Polonium 210 Cell
+item.itemCellStrontium90.name=Strontium 90 Cell
+item.itemCellPlutonium238.name=Plutonium 238 Cell
+
+entity.MiningCharge.name=Mining Charge
+entity.throwablePotionSulfuric.name=Flask of Sulfuric Acid
+entity.throwablePotionHydrofluoric.name=Flask of Hydrofluoric Acid
+entity.toxinBall.name=Toxin globule
+entity.plasmaBolt.name=Plasma
+entity.bigChickenFriendly.name=Giant Chicken
+
+//Added 26/6/18
+tile.OreTrinium.name=Trinium Ore
+item.crushedTrinium.name=Crushed Trinium Ore
+item.crushedCentrifugedTrinium.name=Centrifuged Crushed Trinium Ore
+item.crushedPurifiedTrinium.name=Purified Crushed Trinium Ore
+item.dustImpureTrinium.name=Impure Trinium Dust
+item.dustPureTrinium.name=Purified Trinium Dust
+
+//Added 1/7/18
+entity.WiseVillager.name=Wise Villager
+tile.blockMobSpawnerEx.0.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.1.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.2.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.3.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.4.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.5.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.6.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.7.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.8.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.9.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.10.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.11.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.12.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.13.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.14.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.15.name=Спавнер Монстров Ex
+description.villager.profession.miscutils.banker=Banker
+description.villager.profession.miscutils.technician=GT Technician
+description.villager.profession.miscutils.trader=Ore Trader
+description.villager.profession.miscutils.aboriginal=Native Australian
+
+//Added 23/8/18
+item.itemHatTinFoil.name=Tin Foil Hat
+
+//Added 13/9/18
+entity.WiseVillager.name=Wise Villager
+entity.Aboriginal.name=Native
+entity.miscutils.constructStaballoy.name=Staballoy Construct
+entity.miscutils.sickBlaze.name=Infected Zealot
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.Formaldehyde.name=Formaldehyde Cell
+item.RocketFuelMixA.name=H8N4C2O4 Rocket Fuel Cell
+item.RocketFuelMixB.name=RP-1 Rocket Fuel Cell
+item.RocketFuelMixC.name=CN3H7O3 Rocket Fuel Cell
+item.RocketFuelMixD.name=Dense Hydrazine Rocket Fuel Cell
+item.RP1Fuel.name=RP-1 Fuel Cell
+item.Monomethylhydrazine.name=Monomethylhydrazine Cell
+item.Hydrazine.name=Hydrazine Cell
+item.NitrogenTetroxide.name=Nitrogen Tetroxide Cell
+item.NitrousOxide.name=Nitrous Oxide Cell
+item.AmmoniumNitrateSlurry.name=Ammonium Nitrate Slurry Cell
+item.Kerosene.name=Kerosene Cell
+item.LiquidOxygen.name=Liquid Oxygen Cell [LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=Irarsite Ore
+item.crushedIrarsite.name=Crushed Irarsite Ore
+item.crushedCentrifugedIrarsite.name=Centrifuged Crushed Irarsite Ore
+item.crushedPurifiedIrarsite.name=Purified Crushed Irarsite Ore
+item.dustImpureIrarsite.name=Impure Irarsite Dust
+item.dustPureIrarsite.name=Purified Irarsite Dust
+item.itemDustIrarsite.name=Irarsite Dust
+item.itemDustTinyIrarsite.name=Tiny Pile of Irarsite Dust
+item.itemDustSmallIrarsite.name=Small Pile of Irarsite Dust
+
+tile.OreMiessiite.name=Miessiite Ore
+item.crushedMiessiite.name=Crushed Miessiite Ore
+item.crushedCentrifugedMiessiite.name=Centrifuged Crushed Miessiite Ore
+item.crushedPurifiedMiessiite.name=Purified Crushed Miessiite Ore
+item.dustImpureMiessiite.name=Impure Miessiite Dust
+item.dustPureMiessiite.name=Purified Miessiite Dust
+item.itemDustMiessiite.name=Miessiite Dust
+item.itemDustTinyMiessiite.name=Tiny Pile of Miessiite Dust
+item.itemDustSmallMiessiite.name=Small Pile of Miessiite Dust
+
+tile.OreComancheite.name=Comancheite Ore
+item.crushedComancheite.name=Crushed Comancheite Ore
+item.crushedCentrifugedComancheite.name=Centrifuged Crushed Comancheite Ore
+item.crushedPurifiedComancheite.name=Purified Crushed Comancheite Ore
+item.dustImpureComancheite.name=Impure Comancheite Dust
+item.dustPureComancheite.name=Purified Comancheite Dust
+item.itemDustComancheite.name=Comancheite Dust
+item.itemDustTinyComancheite.name=Tiny Pile of Comancheite Dust
+item.itemDustSmallComancheite.name=Small Pile of Comancheite Dust
+
+tile.OreKoboldite.name=Koboldite Ore
+item.crushedKoboldite.name=Crushed Koboldite Ore
+item.crushedCentrifugedKoboldite.name=Centrifuged Crushed Koboldite Ore
+item.crushedPurifiedKoboldite.name=Purified Crushed Koboldite Ore
+item.dustImpureKoboldite.name=Impure Koboldite Dust
+item.dustPureKoboldite.name=Purified Koboldite Dust
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+
+tile.OrePerroudite.name=Perroudite Ore
+item.crushedPerroudite.name=Crushed Perroudite Ore
+item.crushedCentrifugedPerroudite.name=Centrifuged Crushed Perroudite Ore
+item.crushedPurifiedPerroudite.name=Purified Crushed Perroudite Ore
+item.dustImpurePerroudite.name=Impure Perroudite Dust
+item.dustPurePerroudite.name=Purified Perroudite Dust
+item.itemDustPerroudite.name=Perroudite Dust
+item.itemDustTinyPerroudite.name=Tiny Pile of Perroudite Dust
+item.itemDustSmallPerroudite.name=Small Pile of Perroudite Dust
+
+tile.OreDemicheleite.name=Demicheleite Ore
+item.crushedDemicheleite.name=Crushed Demicheleite Ore
+item.crushedCentrifugedDemicheleite.name=Centrifuged Crushed Demicheleite Ore
+item.crushedPurifiedDemicheleite.name=Purified Crushed Demicheleite Ore
+item.dustImpureDemicheleite.name=Impure Demicheleite Dust
+item.dustPureDemicheleite.name=Purified Demicheleite Dust
+item.itemDustDemicheleite.name=Demicheleite Dust
+item.itemDustTinyDemicheleite.name=Tiny Pile of Demicheleite Dust
+item.itemDustSmallDemicheleite.name=Small Pile of Demicheleite Dust
+
+tile.OreAlburnite.name=Alburnite Ore
+item.crushedAlburnite.name=Crushed Alburnite Ore
+item.crushedCentrifugedAlburnite.name=Centrifuged Crushed Alburnite Ore
+item.crushedPurifiedAlburnite.name=Purified Crushed Alburnite Ore
+item.dustImpureAlburnite.name=Impure Alburnite Dust
+item.dustPureAlburnite.name=Purified Alburnite Dust
+item.itemDustAlburnite.name=Alburnite Dust
+item.itemDustTinyAlburnite.name=Tiny Pile of Alburnite Dust
+item.itemDustSmallAlburnite.name=Small Pile of Alburnite Dust
+
+tile.OreLautarite.name=Lautarite Ore
+item.crushedLautarite.name=Crushed Lautarite Ore
+item.crushedCentrifugedLautarite.name=Centrifuged Crushed Lautarite Ore
+item.crushedPurifiedLautarite.name=Purified Crushed Lautarite Ore
+item.dustImpureLautarite.name=Impure Lautarite Dust
+item.dustPureLautarite.name=Purified Lautarite Dust
+item.itemDustLautarite.name=Lautarite Dust
+item.itemDustTinyLautarite.name=Tiny Pile of Lautarite Dust
+item.itemDustSmallLautarite.name=Small Pile of Lautarite Dust
+
+tile.OreBariteRd.name=Barite (Rd) Ore
+item.crushedBariteRd.name=Crushed Barite (Rd) Ore
+item.crushedCentrifugedBariteRd.name=Centrifuged Crushed Barite (Rd) Ore
+item.crushedPurifiedBariteRd.name=Purified Crushed Barite (Rd) Ore
+item.dustImpureBariteRd.name=Impure Barite (Rd) Dust
+item.dustPureBariteRd.name=Purified Barite (Rd) Dust
+item.itemDustBariteRd.name=Barite (Rd) Dust
+item.itemDustTinyBariteRd.name=Tiny Pile of Barite (Rd) Dust
+item.itemDustSmallBariteRd.name=Small Pile of Barite (Rd) Dust
+
+tile.OreHoneaite.name=Honeaite Ore
+item.crushedHoneaite.name=Crushed Honeaite Ore
+item.crushedCentrifugedHoneaite.name=Centrifuged Crushed Honeaite Ore
+item.crushedPurifiedHoneaite.name=Purified Crushed Honeaite Ore
+item.dustImpureHoneaite.name=Impure Honeaite Dust
+item.dustPureHoneaite.name=Purified Honeaite Dust
+item.itemDustHoneaite.name=Honeaite Dust
+item.itemDustTinyHoneaite.name=Tiny Pile of Honeaite Dust
+item.itemDustSmallHoneaite.name=Small Pile of Honeaite Dust
+
+tile.OreLafossaite.name=Lafossaite Ore
+item.crushedLafossaite.name=Crushed Lafossaite Ore
+item.crushedCentrifugedLafossaite.name=Centrifuged Crushed Lafossaite Ore
+item.crushedPurifiedLafossaite.name=Purified Crushed Lafossaite Ore
+item.dustImpureLafossaite.name=Impure Lafossaite Dust
+item.dustPureLafossaite.name=Purified Lafossaite Dust
+item.itemDustLafossaite.name=Lafossaite Dust
+item.itemDustTinyLafossaite.name=Tiny Pile of Lafossaite Dust
+item.itemDustSmallLafossaite.name=Small Pile of Lafossaite Dust
+
+tile.OreKashinite.name=Kashinite Ore
+item.crushedKashinite.name=Crushed Kashinite Ore
+item.crushedCentrifugedKashinite.name=Centrifuged Crushed Kashinite Ore
+item.crushedPurifiedKashinite.name=Purified Crushed Kashinite Ore
+item.dustImpureKashinite.name=Impure Kashinite Dust
+item.dustPureKashinite.name=Purified Kashinite Dust
+item.itemDustKashinite.name=Kashinite Dust
+item.itemDustTinyKashinite.name=Tiny Pile of Kashinite Dust
+item.itemDustSmallKashinite.name=Small Pile of Kashinite Dust
+
+tile.OreRadioactiveMineralMix.name=Strange Ore
+item.crushedRadioactiveMineralMix.name=Crushed Strange Ore
+item.crushedCentrifugedRadioactiveMineralMix.name=Centrifuged Crushed Strange Ore
+item.crushedPurifiedRadioactiveMineralMix.name=Purified Crushed Strange Ore
+item.dustImpureRadioactiveMineralMix.name=Impure Strange Dust
+item.dustPureRadioactiveMineralMix.name=Purified Strange Dust
+item.itemDustRadioactiveMineralMix.name=Strange Dust
+item.itemDustTinyRadioactiveMineralMix.name=Tiny Pile of Strange Dust
+item.itemDustSmallRadioactiveMineralMix.name=Small Pile of Strange Dust
+
+tile.OreDemicheleiteBr.name=Demicheleite (Br) Ore
+item.crushedDemicheleiteBr.name=Crushed Demicheleite (Br) Ore
+item.crushedCentrifugedDemicheleiteBr.name=Centrifuged Crushed Demicheleite (Br) Ore
+item.crushedPurifiedDemicheleiteBr.name=Purified Crushed Demicheleite (Br) Ore
+item.dustImpureDemicheleiteBr.name=Impure Demicheleite (Br) Dust
+item.dustPureDemicheleiteBr.name=Purified Demicheleite (Br) Dust
+item.itemDustDemicheleiteBr.name=Demicheleite (Br) Dust
+
+
+//Materials
+
+item.itemIngotTitansteel.name=Titansteel Ingot
+item.itemHotIngotTitansteel.name=Hot Titansteel Ingot
+item.itemDustTitansteel.name=Titansteel Dust
+item.itemDustTinyTitansteel.name=Tiny Pile of Titansteel Dust
+item.itemDustSmallTitansteel.name=Small Pile of Titansteel Dust
+item.itemNuggetTitansteel.name=Titansteel Nugget
+item.itemPlateTitansteel.name=Titansteel Plate
+item.itemPlateDoubleTitansteel.name=Double Titansteel Plate
+item.itemBoltTitansteel.name=Titansteel Bolt
+item.itemRodTitansteel.name=Titansteel Rod
+item.itemRodLongTitansteel.name=Long Titansteel Rod
+item.itemRingTitansteel.name=Titansteel Ring
+item.itemScrewTitansteel.name=Titansteel Screw
+item.itemRotorTitansteel.name=Titansteel Rotor
+item.itemGearTitansteel.name=Titansteel Gear
+item.itemCellTitansteel.name=Titansteel Cell
+tile.Block of Titansteel.name=Block of Titansteel
+tile.Titansteel Frame Box.name=Titansteel Frame Box
+
+item.itemIngotOctiron.name=Octiron Ingot
+item.itemHotIngotOctiron.name=Hot Octiron Ingot
+item.itemDustOctiron.name=Octiron Dust
+item.itemDustTinyOctiron.name=Tiny Pile of Octiron Dust
+item.itemDustSmallOctiron.name=Small Pile of Octiron Dust
+item.itemNuggetOctiron.name=Octiron Nugget
+item.itemPlateOctiron.name=Octiron Plate
+item.itemPlateDoubleOctiron.name=Double Octiron Plate
+item.itemBoltOctiron.name=Octiron Bolt
+item.itemRodOctiron.name=Octiron Rod
+item.itemRodLongOctiron.name=Long Octiron Rod
+item.itemRingOctiron.name=Octiron Ring
+item.itemScrewOctiron.name=Octiron Screw
+item.itemRotorOctiron.name=Octiron Rotor
+item.itemGearOctiron.name=Octiron Gear
+item.itemCellOctiron.name=Octiron Cell
+tile.Block of Octiron.name=Block of Octiron
+tile.Octiron Frame Box.name=Octiron Frame Box
+
+item.itemIngotWatertightSteel.name=Watertight Steel Ingot
+item.itemHotIngotWatertightSteel.name=Hot Watertight Steel Ingot
+item.itemDustWatertightSteel.name=Watertight Steel Dust
+item.itemDustTinyWatertightSteel.name=Tiny Pile of Watertight Steel Dust
+item.itemDustSmallWatertightSteel.name=Small Pile of Watertight Steel Dust
+item.itemNuggetWatertightSteel.name=Watertight Steel Nugget
+item.itemPlateWatertightSteel.name=Watertight Steel Plate
+item.itemPlateDoubleWatertightSteel.name=Double Watertight Steel Plate
+item.itemBoltWatertightSteel.name=Watertight Steel Bolt
+item.itemRodWatertightSteel.name=Watertight Steel Rod
+item.itemRodLongWatertightSteel.name=Long Watertight Steel Rod
+item.itemRingWatertightSteel.name=Watertight Steel Ring
+item.itemScrewWatertightSteel.name=Watertight Steel Screw
+item.itemRotorWatertightSteel.name=Watertight Steel Rotor
+item.itemGearWatertightSteel.name=Watertight Steel Gear
+item.itemCellWatertightSteel.name=Watertight Steel Cell
+tile.Block of Watertight Steel.name=Block of Watertight Steel
+tile.Watertight Steel Frame Box.name=Watertight Steel Frame Box
+
+item.itemIngotCelestialTungsten.name=Celestial Tungsten Ingot
+item.itemHotIngotCelestialTungsten.name=Hot Celestial Tungsten Ingot
+item.itemDustCelestialTungsten.name=Celestial Tungsten Dust
+item.itemDustTinyCelestialTungsten.name=Tiny Pile of Celestial Tungsten Dust
+item.itemDustSmallCelestialTungsten.name=Small Pile of Celestial Tungsten Dust
+item.itemNuggetCelestialTungsten.name=Celestial Tungsten Nugget
+item.itemPlateCelestialTungsten.name=Celestial Tungsten Plate
+item.itemPlateDoubleCelestialTungsten.name=Double Celestial Tungsten Plate
+item.itemBoltCelestialTungsten.name=Celestial Tungsten Bolt
+item.itemRodCelestialTungsten.name=Celestial Tungsten Rod
+item.itemRodLongCelestialTungsten.name=Long Celestial Tungsten Rod
+item.itemRingCelestialTungsten.name=Celestial Tungsten Ring
+item.itemScrewCelestialTungsten.name=Celestial Tungsten Screw
+item.itemRotorCelestialTungsten.name=Celestial Tungsten Rotor
+item.itemGearCelestialTungsten.name=Celestial Tungsten Gear
+item.itemCellCelestialTungsten.name=Celestial Tungsten Cell
+tile.Block of Celestial Tungsten.name=Block of Celestial Tungsten
+tile.Celestial Tungsten Frame Box.name=Celestial Tungsten Frame Box
+
+item.itemIngotHypogen.name=Hypogen Ingot
+item.itemHotIngotHypogen.name=Hot Hypogen Ingot
+item.itemDustHypogen.name=Hypogen Dust
+item.itemDustTinyHypogen.name=Tiny Pile of Hypogen Dust
+item.itemDustSmallHypogen.name=Small Pile of Hypogen Dust
+item.itemNuggetHypogen.name=Hypogen Nugget
+item.itemPlateHypogen.name=Hypogen Plate
+item.itemPlateDoubleHypogen.name=Double Hypogen Plate
+item.itemBoltHypogen.name=Hypogen Bolt
+item.itemRodHypogen.name=Hypogen Rod
+item.itemRodLongHypogen.name=Long Hypogen Rod
+item.itemRingHypogen.name=Hypogen Ring
+item.itemScrewHypogen.name=Hypogen Screw
+item.itemRotorHypogen.name=Hypogen Rotor
+item.itemGearHypogen.name=Hypogen Gear
+item.itemCellHypogen.name=Hypogen Cell
+tile.Block of Hypogen.name=Block of Hypogen
+tile.Hypogen Frame Box.name=Hypogen Frame Box
+
+item.itemIngotArceusAlloy2B.name=Arceus Alloy 2B Ingot
+item.itemHotIngotArceusAlloy2B.name=Hot Arceus Alloy 2B Ingot
+item.itemDustArceusAlloy2B.name=Arceus Alloy 2B Dust
+item.itemDustTinyArceusAlloy2B.name=Tiny Pile of Arceus Alloy 2B Dust
+item.itemDustSmallArceusAlloy2B.name=Small Pile of Arceus Alloy 2B Dust
+item.itemNuggetArceusAlloy2B.name=Arceus Alloy 2B Nugget
+item.itemPlateArceusAlloy2B.name=Arceus Alloy 2B Plate
+item.itemPlateDoubleArceusAlloy2B.name=Double Arceus Alloy 2B Plate
+item.itemBoltArceusAlloy2B.name=Arceus Alloy 2B Bolt
+item.itemRodArceusAlloy2B.name=Arceus Alloy 2B Rod
+item.itemRodLongArceusAlloy2B.name=Long Arceus Alloy 2B Rod
+item.itemRingArceusAlloy2B.name=Arceus Alloy 2B Ring
+item.itemScrewArceusAlloy2B.name=Arceus Alloy 2B Screw
+item.itemRotorArceusAlloy2B.name=Arceus Alloy 2B Rotor
+item.itemGearArceusAlloy2B.name=Arceus Alloy 2B Gear
+item.itemCellArceusAlloy2B.name=Arceus Alloy 2B Cell
+tile.Block of Arceus Alloy 2B.name=Block of Arceus Alloy 2B
+tile.Arceus Alloy 2B Frame Box.name=Arceus Alloy 2B Frame Box
+
+item.itemIngotChromaticGlass.name=Chromatic Glass Ingot
+item.itemHotIngotChromaticGlass.name=Hot Chromatic Glass Ingot
+item.itemDustChromaticGlass.name=Chromatic Glass Dust
+item.itemDustTinyChromaticGlass.name=Tiny Pile of Chromatic Glass Dust
+item.itemDustSmallChromaticGlass.name=Small Pile of Chromatic Glass Dust
+item.itemNuggetChromaticGlass.name=Chromatic Glass Nugget
+item.itemPlateChromaticGlass.name=Chromatic Glass Plate
+item.itemPlateDoubleChromaticGlass.name=Double Chromatic Glass Plate
+item.itemBoltChromaticGlass.name=Chromatic Glass Bolt
+item.itemRodChromaticGlass.name=Chromatic Glass Rod
+item.itemRodLongChromaticGlass.name=Long Chromatic Glass Rod
+item.itemRingChromaticGlass.name=Chromatic Glass Ring
+item.itemScrewChromaticGlass.name=Chromatic Glass Screw
+item.itemRotorChromaticGlass.name=Chromatic Glass Rotor
+item.itemGearChromaticGlass.name=Chromatic Glass Gear
+item.itemCellChromaticGlass.name=Chromatic Glass Cell
+tile.Block of Chromatic Glass.name=Block of Chromatic Glass
+tile.Chromatic Glass Frame Box.name=Chromatic Glass Frame Box
+
+item.itemIngotAstralTitanium.name=Astral Titanium Ingot
+item.itemHotIngotAstralTitanium.name=Hot Astral Titanium Ingot
+item.itemDustAstralTitanium.name=Astral Titanium Dust
+item.itemDustTinyAstralTitanium.name=Tiny Pile of Astral Titanium Dust
+item.itemDustSmallAstralTitanium.name=Small Pile of Astral Titanium Dust
+item.itemNuggetAstralTitanium.name=Astral Titanium Nugget
+item.itemPlateAstralTitanium.name=Astral Titanium Plate
+item.itemPlateDoubleAstralTitanium.name=Double Astral Titanium Plate
+item.itemBoltAstralTitanium.name=Astral Titanium Bolt
+item.itemRodAstralTitanium.name=Astral Titanium Rod
+item.itemRodLongAstralTitanium.name=Long Astral Titanium Rod
+item.itemRingAstralTitanium.name=Astral Titanium Ring
+item.itemScrewAstralTitanium.name=Astral Titanium Screw
+item.itemRotorAstralTitanium.name=Astral Titanium Rotor
+item.itemGearAstralTitanium.name=Astral Titanium Gear
+item.itemCellAstralTitanium.name=Astral Titanium Cell
+tile.Block of Astral Titanium.name=Block of Astral Titanium
+tile.Astral Titanium Frame Box.name=Astral Titanium Frame Box
+
+item.itemIngotTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ingot
+item.itemHotIngotTungstenTitaniumCarbide.name=Hot Tungsten Titanium Carbide Ingot
+item.itemDustTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Dust
+item.itemDustTinyTungstenTitaniumCarbide.name=Tiny Pile of Tungsten Titanium Carbide Dust
+item.itemDustSmallTungstenTitaniumCarbide.name=Small Pile of Tungsten Titanium Carbide Dust
+item.itemNuggetTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Nugget
+item.itemPlateTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Plate
+item.itemPlateDoubleTungstenTitaniumCarbide.name=Double Tungsten Titanium Carbide Plate
+item.itemBoltTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Bolt
+item.itemRodTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rod
+item.itemRodLongTungstenTitaniumCarbide.name=Long Tungsten Titanium Carbide Rod
+item.itemRingTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ring
+item.itemScrewTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Screw
+item.itemRotorTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rotor
+item.itemGearTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Gear
+item.itemCellTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Cell
+tile.Block of Tungsten Titanium Carbide.name=Block of Tungsten Titanium Carbide
+tile.Tungsten Titanium Carbide Frame Box.name=Tungsten Titanium Carbide Frame Box
+
+item.itemIngotNitinol60.name=Nitinol 60 Ingot
+item.itemHotIngotNitinol60.name=Hot Nitinol 60 Ingot
+item.itemDustNitinol60.name=Nitinol 60 Dust
+item.itemDustTinyNitinol60.name=Tiny Pile of Nitinol 60 Dust
+item.itemDustSmallNitinol60.name=Small Pile of Nitinol 60 Dust
+item.itemNuggetNitinol60.name=Nitinol 60 Nugget
+item.itemPlateNitinol60.name=Nitinol 60 Plate
+item.itemPlateDoubleNitinol60.name=Double Nitinol 60 Plate
+item.itemBoltNitinol60.name=Nitinol 60 Bolt
+item.itemRodNitinol60.name=Nitinol 60 Rod
+item.itemRodLongNitinol60.name=Long Nitinol 60 Rod
+item.itemRingNitinol60.name=Nitinol 60 Ring
+item.itemScrewNitinol60.name=Nitinol 60 Screw
+item.itemRotorNitinol60.name=Nitinol 60 Rotor
+item.itemGearNitinol60.name=Nitinol 60 Gear
+item.itemCellNitinol60.name=Nitinol 60 Cell
+tile.Block of Nitinol 60.name=Block of Nitinol 60
+tile.Nitinol 60 Frame Box.name=Nitinol 60 Frame Box
+
+item.itemIngotAdvancedNitinol.name=Advanced Nitinol Ingot
+item.itemHotIngotAdvancedNitinol.name=Hot Advanced Nitinol Ingot
+item.itemDustAdvancedNitinol.name=Advanced Nitinol Dust
+item.itemDustTinyAdvancedNitinol.name=Tiny Pile of Advanced Nitinol Dust
+item.itemDustSmallAdvancedNitinol.name=Small Pile of Advanced Nitinol Dust
+item.itemNuggetAdvancedNitinol.name=Advanced Nitinol Nugget
+item.itemPlateAdvancedNitinol.name=Advanced Nitinol Plate
+item.itemPlateDoubleAdvancedNitinol.name=Double Advanced Nitinol Plate
+item.itemBoltAdvancedNitinol.name=Advanced Nitinol Bolt
+item.itemRodAdvancedNitinol.name=Advanced Nitinol Rod
+item.itemRodLongAdvancedNitinol.name=Long Advanced Nitinol Rod
+item.itemRingAdvancedNitinol.name=Advanced Nitinol Ring
+item.itemScrewAdvancedNitinol.name=Advanced Nitinol Screw
+item.itemRotorAdvancedNitinol.name=Advanced Nitinol Rotor
+item.itemGearAdvancedNitinol.name=Advanced Nitinol Gear
+item.itemCellAdvancedNitinol.name=Advanced Nitinol Cell
+tile.Block of Advanced Nitinol.name=Block of Advanced Nitinol
+tile.Advanced Nitinol Frame Box.name=Advanced Nitinol Frame Box
+
+item.itemIngotArcanite.name=Arcanite Ingot
+item.itemHotIngotArcanite.name=Hot Arcanite Ingot
+item.itemDustArcanite.name=Arcanite Dust
+item.itemDustTinyArcanite.name=Tiny Pile of Arcanite Dust
+item.itemDustSmallArcanite.name=Small Pile of Arcanite Dust
+item.itemNuggetArcanite.name=Arcanite Nugget
+item.itemPlateArcanite.name=Arcanite Plate
+item.itemPlateDoubleArcanite.name=Double Arcanite Plate
+item.itemBoltArcanite.name=Arcanite Bolt
+item.itemRodArcanite.name=Arcanite Rod
+item.itemRodLongArcanite.name=Long Arcanite Rod
+item.itemRingArcanite.name=Arcanite Ring
+item.itemScrewArcanite.name=Arcanite Screw
+item.itemRotorArcanite.name=Arcanite Rotor
+item.itemGearArcanite.name=Arcanite Gear
+item.itemCellArcanite.name=Arcanite Cell
+tile.Block of Arcanite.name=Block of Arcanite
+tile.Arcanite Frame Box.name=Arcanite Frame Box
+
+item.itemIngotPikyonium64B.name=Pikyonium 64B Ingot
+item.itemHotIngotPikyonium64B.name=Hot Pikyonium 64B Ingot
+item.itemDustPikyonium64B.name=Pikyonium 64B Dust
+item.itemDustTinyPikyonium64B.name=Tiny Pile of Pikyonium 64B Dust
+item.itemDustSmallPikyonium64B.name=Small Pile of Pikyonium 64B Dust
+item.itemNuggetPikyonium64B.name=Pikyonium 64B Nugget
+item.itemPlatePikyonium64B.name=Pikyonium 64B Plate
+item.itemPlateDoublePikyonium64B.name=Double Pikyonium 64B Plate
+item.itemBoltPikyonium64B.name=Pikyonium 64B Bolt
+item.itemRodPikyonium64B.name=Pikyonium 64B Rod
+item.itemRodLongPikyonium64B.name=Long Pikyonium 64B Rod
+item.itemRingPikyonium64B.name=Pikyonium 64B Ring
+item.itemScrewPikyonium64B.name=Pikyonium 64B Screw
+item.itemRotorPikyonium64B.name=Pikyonium 64B Rotor
+item.itemGearPikyonium64B.name=Pikyonium 64B Gear
+item.itemCellPikyonium64B.name=Pikyonium 64B Cell
+tile.Block of Pikyonium 64B.name=Block of Pikyonium 64B
+tile.Pikyonium 64B Frame Box.name=Pikyonium 64B Frame Box
+
+item.itemIngotCinobiteA243.name=Cinobite A243 Ingot
+item.itemHotIngotCinobiteA243.name=Hot Cinobite A243 Ingot
+item.itemDustCinobiteA243.name=Cinobite A243 Dust
+item.itemDustTinyCinobiteA243.name=Tiny Pile of Cinobite A243 Dust
+item.itemDustSmallCinobiteA243.name=Small Pile of Cinobite A243 Dust
+item.itemNuggetCinobiteA243.name=Cinobite A243 Nugget
+item.itemPlateCinobiteA243.name=Cinobite A243 Plate
+item.itemPlateDoubleCinobiteA243.name=Double Cinobite A243 Plate
+item.itemBoltCinobiteA243.name=Cinobite A243 Bolt
+item.itemRodCinobiteA243.name=Cinobite A243 Rod
+item.itemRodLongCinobiteA243.name=Long Cinobite A243 Rod
+item.itemRingCinobiteA243.name=Cinobite A243 Ring
+item.itemScrewCinobiteA243.name=Cinobite A243 Screw
+item.itemRotorCinobiteA243.name=Cinobite A243 Rotor
+item.itemGearCinobiteA243.name=Cinobite A243 Gear
+item.itemCellCinobiteA243.name=Cinobite A243 Cell
+tile.Block of Cinobite A243.name=Block of Cinobite A243
+tile.Cinobite A243 Frame Box.name=Cinobite A243 Frame Box
+
+item.itemIngotLafiumCompound.name=Lafium Compound Ingot
+item.itemHotIngotLafiumCompound.name=Hot Lafium Compound Ingot
+item.itemDustLafiumCompound.name=Lafium Compound Dust
+item.itemDustTinyLafiumCompound.name=Tiny Pile of Lafium Compound Dust
+item.itemDustSmallLafiumCompound.name=Small Pile of Lafium Compound Dust
+item.itemNuggetLafiumCompound.name=Lafium Compound Nugget
+item.itemPlateLafiumCompound.name=Lafium Compound Plate
+item.itemPlateDoubleLafiumCompound.name=Double Lafium Compound Plate
+item.itemBoltLafiumCompound.name=Lafium Compound Bolt
+item.itemRodLafiumCompound.name=Lafium Compound Rod
+item.itemRodLongLafiumCompound.name=Long Lafium Compound Rod
+item.itemRingLafiumCompound.name=Lafium Compound Ring
+item.itemScrewLafiumCompound.name=Lafium Compound Screw
+item.itemRotorLafiumCompound.name=Lafium Compound Rotor
+item.itemGearLafiumCompound.name=Lafium Compound Gear
+item.itemCellLafiumCompound.name=Lafium Compound Cell
+tile.Block of Lafium Compound.name=Block of Lafium Compound
+tile.Lafium Compound Frame Box.name=Lafium Compound Frame Box
+
+item.itemIngotKoboldite.name=Koboldite Ingot
+item.itemHotIngotKoboldite.name=Hot Koboldite Ingot
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+item.itemNuggetKoboldite.name=Koboldite Nugget
+item.itemPlateKoboldite.name=Koboldite Plate
+item.itemPlateDoubleKoboldite.name=Double Koboldite Plate
+item.itemBoltKoboldite.name=Koboldite Bolt
+item.itemRodKoboldite.name=Koboldite Rod
+item.itemRodLongKoboldite.name=Long Koboldite Rod
+item.itemRingKoboldite.name=Koboldite Ring
+item.itemScrewKoboldite.name=Koboldite Screw
+item.itemRotorKoboldite.name=Koboldite Rotor
+item.itemGearKoboldite.name=Koboldite Gear
+item.itemCellKoboldite.name=Koboldite Cell
+tile.Block of Koboldite.name=Block of Koboldite
+tile.Koboldite Frame Box.name=Koboldite Frame Box
+
+item.itemIngotAbyssalAlloy.name=Abyssal Alloy Ingot
+item.itemHotIngotAbyssalAlloy.name=Hot Abyssal Alloy Ingot
+item.itemDustAbyssalAlloy.name=Abyssal Alloy Dust
+item.itemDustTinyAbyssalAlloy.name=Tiny Pile of Abyssal Alloy Dust
+item.itemDustSmallAbyssalAlloy.name=Small Pile of Abyssal Alloy Dust
+item.itemNuggetAbyssalAlloy.name=Abyssal Alloy Nugget
+item.itemPlateAbyssalAlloy.name=Abyssal Alloy Plate
+item.itemPlateDoubleAbyssalAlloy.name=Double Abyssal Alloy Plate
+item.itemBoltAbyssalAlloy.name=Abyssal Alloy Bolt
+item.itemRodAbyssalAlloy.name=Abyssal Alloy Rod
+item.itemRodLongAbyssalAlloy.name=Long Abyssal Alloy Rod
+item.itemRingAbyssalAlloy.name=Abyssal Alloy Ring
+item.itemScrewAbyssalAlloy.name=Abyssal Alloy Screw
+item.itemRotorAbyssalAlloy.name=Abyssal Alloy Rotor
+item.itemGearAbyssalAlloy.name=Abyssal Alloy Gear
+item.itemCellAbyssalAlloy.name=Abyssal Alloy Cell
+tile.Block of Abyssal Alloy.name=Block of Abyssal Alloy
+tile.Abyssal Alloy Frame Box.name=Abyssal Alloy Frame Box
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=Technetium 99M Dust
+item.dustTechnetium99.name=Technetium 99 Dust
+item.dustMolybdenum99.name=Molybdenum 99 Dust
+
+//Bags
+item.item.MysticBag.name=Mystic Pouch
+item.item.Eatotron9000.name=Eatotronic 9000
+item.item.ToolBox.name=Workers Toolbox
+
+//Cells
+item.Bromine.name=Bromine Cell
+item.Krypton.name=Krypton Cell
+item.cryotheum.name=Cryotheum Cell
+item.pyrotheum.name=Pyrotheum Cell
+item.GeneticMutagen.name=Mutagen Cell
+
+//Ingots
+item.itemHotIngotIncoloy020.name=Hot Incoloy-020 Ingot
+item.itemHotIngotIncoloyDS.name=Hot Incoloy-DS Ingot
+item.itemHotIngotTalonite.name=Hot Talonite Ingot
+item.itemHotIngotHastelloyX.name=Hot Hastelloy-X Ingot
+item.itemHotIngotHastelloyW.name=Hot Hastelloy-W Carbide Ingot
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=Lead Plate
+
+//Ions
+item.particle.ion.Hydrogen.name=Hydrogen Ion
+item.particle.ion.Helium.name=Helium Ion
+item.particle.ion.Lithium.name=Lithium Ion
+item.particle.ion.Beryllium.name=Beryllium Ion
+item.particle.ion.Boron.name=Boron Ion
+item.particle.ion.Carbon.name=Carbon Ion
+item.particle.ion.Nitrogen.name=Nitrogen Ion
+item.particle.ion.Oxygen.name=Oxygen Ion
+item.particle.ion.Fluorine.name=Fluorine Ion
+item.particle.ion.Neon.name=Neon Ion
+item.particle.ion.Sodium.name=Sodium Ion
+item.particle.ion.Magnesium.name=Magnesium Ion
+item.particle.ion.Aluminum.name=Aluminum Ion
+item.particle.ion.Silicon.name=Silicon Ion
+item.particle.ion.Phosphorus.name=Phosphorus Ion
+item.particle.ion.Sulfur.name=Sulfur Ion
+item.particle.ion.Chlorine.name=Chlorine Ion
+item.particle.ion.Argon.name=Argon Ion
+item.particle.ion.Potassium.name=Potassium Ion
+item.particle.ion.Calcium.name=Calcium Ion
+item.particle.ion.Scandium.name=Scandium Ion
+item.particle.ion.Titanium.name=Titanium Ion
+item.particle.ion.Vanadium.name=Vanadium Ion
+item.particle.ion.Chromium.name=Chromium Ion
+item.particle.ion.Manganese.name=Manganese Ion
+item.particle.ion.Iron.name=Iron Ion
+item.particle.ion.Cobalt.name=Cobalt Ion
+item.particle.ion.Nickel.name=Nickel Ion
+item.particle.ion.Copper.name=Copper Ion
+item.particle.ion.Zinc.name=Zinc Ion
+item.particle.ion.Gallium.name=Gallium Ion
+item.particle.ion.Germanium.name=Germanium Ion
+item.particle.ion.Arsenic.name=Arsenic Ion
+item.particle.ion.Selenium.name=Selenium Ion
+item.particle.ion.Bromine.name=Bromine Ion
+item.particle.ion.Krypton.name=Krypton Ion
+item.particle.ion.Rubidium.name=Rubidium Ion
+item.particle.ion.Strontium.name=Strontium Ion
+item.particle.ion.Yttrium.name=Yttrium Ion
+item.particle.ion.Zirconium.name=Zirconium Ion
+item.particle.ion.Niobium.name=Niobium Ion
+item.particle.ion.Molybdenum.name=Molybdenum Ion
+item.particle.ion.Technetium.name=Technetium Ion
+item.particle.ion.Ruthenium.name=Ruthenium Ion
+item.particle.ion.Rhodium.name=Rhodium Ion
+item.particle.ion.Palladium.name=Palladium Ion
+item.particle.ion.Silver.name=Silver Ion
+item.particle.ion.Cadmium.name=Cadmium Ion
+item.particle.ion.Indium.name=Indium Ion
+item.particle.ion.Tin.name=Tin Ion
+item.particle.ion.Antimony.name=Antimony Ion
+item.particle.ion.Tellurium.name=Tellurium Ion
+item.particle.ion.Iodine.name=Iodine Ion
+item.particle.ion.Xenon.name=Xenon Ion
+item.particle.ion.Cesium.name=Caesium Ion
+item.particle.ion.Barium.name=Barium Ion
+item.particle.ion.Lanthanum.name=Lanthanum Ion
+item.particle.ion.Cerium.name=Cerium Ion
+item.particle.ion.Praseodymium.name=Praseodymium Ion
+item.particle.ion.Neodymium.name=Neodymium Ion
+item.particle.ion.Promethium.name=Promethium Ion
+item.particle.ion.Samarium.name=Samarium Ion
+item.particle.ion.Europium.name=Europium Ion
+item.particle.ion.Gadolinium.name=Gadolinium Ion
+item.particle.ion.Terbium.name=Terbium Ion
+item.particle.ion.Dysprosium.name=Dysprosium Ion
+item.particle.ion.Holmium.name=Holmium Ion
+item.particle.ion.Erbium.name=Erbium Ion
+item.particle.ion.Thulium.name=Thulium Ion
+item.particle.ion.Ytterbium.name=Ytterbium Ion
+item.particle.ion.Lutetium.name=Lutetium Ion
+item.particle.ion.Hafnium.name=Hafnium Ion
+item.particle.ion.Tantalum.name=Tantalum Ion
+item.particle.ion.Tungsten.name=Tungsten Ion
+item.particle.ion.Rhenium.name=Rhenium Ion
+item.particle.ion.Osmium.name=Osmium Ion
+item.particle.ion.Iridium.name=Iridium Ion
+item.particle.ion.Platinum.name=Platinum Ion
+item.particle.ion.Gold.name=Gold Ion
+item.particle.ion.Mercury.name=Mercury Ion
+item.particle.ion.Thallium.name=Thallium Ion
+item.particle.ion.Lead.name=Lead Ion
+item.particle.ion.Bismuth.name=Bismuth Ion
+item.particle.ion.Polonium.name=Polonium Ion
+item.particle.ion.Astatine.name=Astatine Ion
+item.particle.ion.Radon.name=Radon Ion
+item.particle.ion.Francium.name=Francium Ion
+item.particle.ion.Radium.name=Radium Ion
+item.particle.ion.Actinium.name=Actinium Ion
+item.particle.ion.Thorium.name=Thorium Ion
+item.particle.ion.Protactinium.name=Protactinium Ion
+item.particle.ion.Uranium.name=Uranium Ion
+item.particle.ion.Neptunium.name=Neptunium Ion
+item.particle.ion.Plutonium.name=Plutonium Ion
+item.particle.ion.Americium.name=Americium Ion
+item.particle.ion.Curium.name=Curium Ion
+item.particle.ion.Berkelium.name=Berkelium Ion
+item.particle.ion.Californium.name=Californium Ion
+item.particle.ion.Einsteinium.name=Einsteinium Ion
+item.particle.ion.Fermium.name=Fermium Ion
+item.particle.ion.Mendelevium.name=Mendelevium Ion
+item.particle.ion.Nobelium.name=Nobelium Ion
+item.particle.ion.Lawrencium.name=Lawrencium Ion
+item.particle.ion.Rutherfordium.name=Rutherfordium Ion
+item.particle.ion.Dubnium.name=Dubnium Ion
+item.particle.ion.Seaborgium.name=Seaborgium Ion
+item.particle.ion.Bohrium.name=Bohrium Ion
+item.particle.ion.Hassium.name=Hassium Ion
+item.particle.ion.Meitnerium.name=Meitnerium Ion
+item.particle.ion.Darmstadtium.name=Darmstadtium Ion
+item.particle.ion.Roentgenium.name=Roentgenium Ion
+item.particle.ion.Copernicium.name=Copernicium Ion
+item.particle.ion.Nihonium.name=Nihonium Ion
+item.particle.ion.Flerovium.name=Flerovium Ion
+item.particle.ion.Moscovium.name=Moscovium Ion
+item.particle.ion.Livermorium.name=Livermorium Ion
+item.particle.ion.Tennessine.name=Tennessine Ion
+item.particle.ion.Oganesson.name=Oganesson Ion
+
+
+item.particle.base.Graviton.name=Graviton
+item.particle.base.Up.name=Up Quark
+item.particle.base.Down.name=Down Quark
+item.particle.base.Charm.name=Charm Quark
+item.particle.base.Strange.name=Strange Quark
+item.particle.base.Top.name=Top Quark
+item.particle.base.Bottom.name=Bottom Quark
+item.particle.base.Electron.name=Electron
+item.particle.base.Electron Neutrino.name=Electron Neutrino
+item.particle.base.Muon.name=Muon
+item.particle.base.Muon Neutrino.name=Muon Neutrino
+item.particle.base.Tau.name=Tau
+item.particle.base.Tau Neutrino.name=Tau Neutrino
+item.particle.base.Gluon.name=Gluon
+item.particle.base.Photon.name=Photon
+item.particle.base.Z Boson.name=Z Boson
+item.particle.base.W Boson.name=W Boson
+item.particle.base.Higgs Boson.name=Higgs Boson
+item.particle.base.Proton.name=Proton
+item.particle.base.Neutron.name=Neutron
+item.particle.base.Lambda.name=Lambda
+item.particle.base.Omega.name=Omega
+item.particle.base.Pion.name=Pion
+item.particle.base.ETA Meson.name=ETA Meson
+item.particle.base.Unknown.name=Unknown Particle
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=Glass Auto-Door
+tile.playerDoorCactus.name=Cactus Auto-Door
+tile.playerDoorIce.name=Ice Auto-Door
+tile.playerDoorIron.name=Iron Auto-Door
+tile.playerDoorWood.name=Wooden Auto-Door
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=Charge Pack [LuV]
+item.GTPP.BattPack.07.name=Charge Pack [ZPM]
+item.GTPP.BattPack.08.name=Charge Pack [UV]
+item.GTPP.BattPack.09.name=Charge Pack [MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++ Debug Scanner
+item.RawWaste.name=Cell of Animal Waste
+item.ManureSlurry.name=Cell of Manure Slurry
+item.FertileManureSlurry.name=Cell of Fertile Slurry
+item.itemDustTinyDemicheleiteBr.name=Tiny Pile of Demicheleite (Br)
+item.itemDustSmallDemicheleiteBr.name=Small Pile of Demicheleite (Br)
+tile.blockPooCollector.name=Agricultural Sewer
+tile.Block of Lithium 7.name=Block of Lithium 7
+
+//Added 14/3/19
+item.blood.name=Cell of Blood
+item.aniline.name=Aniline Cell
+item.cadaverine.name=Cadaverine Cell
+item.polyurethane.name=Polyurethane Cell
+item.putrescine.name=Putrescine Cell
+item.cyclohexane.name=Cyclohexane Cell
+item.cyclohexanone.name=Cyclohexanone Cell
+item.nitrobenzene.name=Nitrobenzene Cell
+item.ender.name=Cell of Liquid Ender
+item.xpjuice.name=Cell of Liquid Xp
+item.itemBombUnf.name=Throwable Bomb (unf)
+item.itemBombCasing.name=Bomb Casing
+item.gtpp.throwable.bomb.name=Throwable Bomb
+item.itemDetCable.name=Bomb Fuse
+tile.blockPooCollector.0.name=Agricultural Sewer
+tile.blockPooCollector.8.name=Biocomposite Collector
+item.itemIngotBakelite.name=Bakelite Ingot
+item.itemDustBakelite.name=Bakelite Dust
+item.itemDustTinyBakelite.name=Tiny Pile of Bakelite Dust
+item.itemDustSmallBakelite.name=Small Pile of Bakelite Dust
+item.itemNuggetBakelite.name=Bakelite Nugget
+item.itemPlateBakelite.name=Bakelite Plate
+item.itemPlateDoubleBakelite.name=Double Bakelite Plate
+item.itemCellBakelite.name=Bakelite Cell
+tile.Block of Bakelite.name=Block of Bakelite
+item.itemIngotNylon.name=Nylon Ingot
+item.itemDustNylon.name=Nylon Dust
+item.itemDustTinyNylon.name=Tiny Pile of Nylon Dust
+item.itemDustSmallNylon.name=Small Pile of Nylon Dust
+item.itemNuggetNylon.name=Nylon Nugget
+item.itemPlateNylon.name=Nylon Plate
+item.itemPlateDoubleNylon.name=Double Nylon Plate
+item.itemCellNylon.name=Nylon Cell
+tile.Block of Nylon.name=Block of Nylon
+item.itemIngotTeflon.name=Teflon Ingot
+item.itemDustTeflon.name=Teflon Dust
+item.itemDustTinyTeflon.name=Tiny Pile of Teflon Dust
+item.itemDustSmallTeflon.name=Small Pile of Teflon Dust
+item.itemNuggetTeflon.name=Teflon Nugget
+item.itemPlateTeflon.name=Teflon Plate
+item.itemPlateDoubleTeflon.name=Double Teflon Plate
+item.itemCellTeflon.name=Teflon Cell
+tile.Block of Teflon.name=Block of Teflon
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=Aluminium Ion
+item.particle.ion.Caesium.name=Caesium Ion
+
+item.GTPP.MonsterKiller.Enderman.name=Enderman Killer
+item.GTPP.MonsterKiller.Spider.name=Spider Killer
+item.GTPP.MonsterKiller.Skeleton.name=Skeleton Killer
+item.GTPP.MonsterKiller.Creeper.name=Creeper Killer
+item.GTPP.MonsterKiller.Zombie.name=Zombie Killer
+item.GTPP.MonsterKiller.Hellish.name=Nether Mob Killer
+
+item.itemIngotRunite.name=Runite Ingot
+item.itemDustRunite.name=Runite Dust
+item.itemDustTinyRunite.name=Tiny Pile of Runite Dust
+item.itemDustSmallRunite.name=Small Pile of Runite Dust
+item.itemNuggetRunite.name=Runite Nugget
+item.itemPlateRunite.name=Runite Plate
+item.itemPlateDoubleRunite.name=Double Runite Plate
+item.itemCellRunite.name=Runite Cell
+tile.Block of Runite.name=Block of Runite
+
+item.itemIngotDragonblood.name=Dragon Metal Ingot
+item.itemDustDragonblood.name=Dragon Metal Dust
+item.itemDustTinyDragonblood.name=Tiny Pile of Dragon Metal Dust
+item.itemDustSmallDragonblood.name=Small Pile of Dragon Metal Dust
+item.itemNuggetDragonblood.name=Shard of Dragonblood
+item.itemPlateDragonblood.name=Dragon Metal Plate
+item.itemPlateDoubleDragonblood.name=Double Dragon Metal Plate
+item.itemCellDragonblood.name=Dragonblood Cell
+tile.Block of Dragonblood.name=Block of Dragon Metal
+
+item.itemIngotBlackTitanium.name=Black Titanium Ingot
+item.itemDustBlackTitanium.name=Black Titanium Dust
+item.itemDustTinyBlackTitanium.name=Tiny Pile of Black Titanium Dust
+item.itemDustSmallBlackTitanium.name=Small Pile of Black Titanium Dust
+item.itemNuggetBlackTitanium.name=Black Titanium Nugget
+item.itemPlateBlackTitanium.name=Black Titanium Plate
+item.itemPlateDoubleBlackTitanium.name=Double Black Titanium Plate
+item.itemCellBlackTitanium.name=Black Titanium Cell
+tile.Block of Black Titanium.name=Block of Black Titanium
+
+item.itemIngotAncientGranite.name=Ancient Granite Ingot
+item.itemHotIngotAncientGranite.name=Hot Ancient Granite Ingot
+item.itemDustAncientGranite.name=Ancient Granite Dust
+item.itemDustTinyAncientGranite.name=Tiny Pile of Ancient Granite Dust
+item.itemDustSmallAncientGranite.name=Small Pile of Ancient Granite Dust
+item.itemNuggetAncientGranite.name=Ancient Granite Nugget
+item.itemPlateAncientGranite.name=Ancient Granite Plate
+item.itemPlateDoubleAncientGranite.name=Double Ancient Granite Plate
+tile.Block of Ancient Granite.name=Block of Ancient Granite
+
+item.itemIngotBabbitAlloy.name=Babbit Alloy Ingot
+item.itemHotIngotBabbitAlloy.name=Hot Babbit Alloy Ingot
+item.itemDustBabbitAlloy.name=Babbit Alloy Dust
+item.itemDustTinyBabbitAlloy.name=Tiny Pile of Babbit Alloy Dust
+item.itemDustSmallBabbitAlloy.name=Small Pile of Babbit Alloy Dust
+item.itemNuggetBabbitAlloy.name=Babbit Alloy Nugget
+item.itemPlateBabbitAlloy.name=Babbit Alloy Plate
+item.itemPlateDoubleBabbitAlloy.name=Double Babbit Alloy Plate
+item.itemCellBabbitAlloy.name=Babbit Alloy Cell
+tile.Block of Babbit Alloy.name=Block of Babbit Alloy
+
+item.itemIngotBlackMetal.name=Black Metal Ingot
+item.itemHotIngotBlackMetal.name=Hot Black Metal Ingot
+item.itemDustBlackMetal.name=Black Metal Dust
+item.itemDustTinyBlackMetal.name=Tiny Pile of Black Metal Dust
+item.itemDustSmallBlackMetal.name=Small Pile of Black Metal Dust
+item.itemNuggetBlackMetal.name=Black Metal Nugget
+item.itemPlateBlackMetal.name=Black Metal Plate
+item.itemPlateDoubleBlackMetal.name=Double Black Metal Plate
+item.itemBoltBlackMetal.name=Black Metal Bolt
+item.itemRodBlackMetal.name=Black Metal Rod
+item.itemRodLongBlackMetal.name=Long Black Metal Rod
+item.itemRingBlackMetal.name=Black Metal Ring
+item.itemScrewBlackMetal.name=Black Metal Screw
+item.itemRotorBlackMetal.name=Black Metal Rotor
+item.itemGearBlackMetal.name=Black Metal Gear
+item.itemCellBlackMetal.name=Black Metal Cell
+tile.Block of Black Metal.name=Block of Black Metal
+tile.Black Metal Frame Box.name=Black Metal Frame Box
+
+item.itemIngotWhiteMetal.name=White Metal Ingot
+item.itemHotIngotWhiteMetal.name=Hot White Metal Ingot
+item.itemDustWhiteMetal.name=White Metal Dust
+item.itemDustTinyWhiteMetal.name=Tiny Pile of White Metal Dust
+item.itemDustSmallWhiteMetal.name=Small Pile of White Metal Dust
+item.itemNuggetWhiteMetal.name=White Metal Nugget
+item.itemPlateWhiteMetal.name=White Metal Plate
+item.itemPlateDoubleWhiteMetal.name=Double White Metal Plate
+item.itemBoltWhiteMetal.name=White Metal Bolt
+item.itemRodWhiteMetal.name=White Metal Rod
+item.itemRodLongWhiteMetal.name=Long White Metal Rod
+item.itemRingWhiteMetal.name=White Metal Ring
+item.itemScrewWhiteMetal.name=White Metal Screw
+item.itemRotorWhiteMetal.name=White Metal Rotor
+item.itemGearWhiteMetal.name=White Metal Gear
+item.itemCellWhiteMetal.name=White Metal Cell
+tile.Block of White Metal.name=Block of White Metal
+tile.White Metal Frame Box.name=White Metal Frame Box
+
+//Added 29/04/2019
+tile.OreRunite.name=Runite Ore
+item.crushedRunite.name=Crushed Runite Ore
+item.crushedCentrifugedRunite.name=Centrifuged Crushed Runite Ore
+item.crushedPurifiedRunite.name=Purified Crushed Runite Ore
+item.dustImpureRunite.name=Impure Runite Dust
+item.dustPureRunite.name=Purified Runite Dust
+
+tile.OreAncientGranite.name=Ancient Granite Ore
+item.crushedAncientGranite.name=Crushed Ancient Granite Ore
+item.crushedCentrifugedAncientGranite.name=Centrifuged Crushed Ancient Granite Ore
+item.crushedPurifiedAncientGranite.name=Purified Crushed Ancient Granite Ore
+item.dustImpureAncientGranite.name=Impure Ancient Granite Dust
+item.dustPureAncientGranite.name=Purified Ancient Granite Dust
+
+item.itemIngotRhugnor.name=Rhugnor Ingot
+item.itemDustRhugnor.name=Rhugnor Dust
+item.itemDustTinyRhugnor.name=Tiny Pile of Rhugnor Dust
+item.itemDustSmallRhugnor.name=Small Pile of Rhugnor Dust
+item.itemNuggetRhugnor.name=Rhugnor Nugget
+item.itemPlateRhugnor.name=Rhugnor Plate
+item.itemPlateDoubleRhugnor.name=Double Rhugnor Plate
+item.itemCellRhugnor.name=Rhugnor Cell
+tile.Block of Rhugnor.name=Block of Rhugnor
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=Charge Pack [LV]
+item.GTPP.BattPack.02.name=Charge Pack [MV]
+item.GTPP.BattPack.03.name=Charge Pack [HV]
+item.GTPP.BattPack.04.name=Charge Pack [EV]
+item.GTPP.BattPack.05.name=Charge Pack [IV]
+item.IndustrialDiamondExquisite.name=Exquisite Industrial Diamond
+
+item.itemSpringCelestialTungsten.name=Celestial Tungsten Spring
+item.itemSpringWhiteMetal.name=White Metal Spring
+item.itemSpringNitinol60.name=Nitinol 60 Spring
+item.itemSpringWatertightSteel.name=Watertight Steel Spring
+item.itemSpringEglinSteel.name=Eglin Steel Spring
+
+item.itemSmallSpringMaragingSteel250.name=Small Maraging Steel 250 Spring
+item.itemSmallSpringNichrome.name=Small Nichrome Spring
+item.itemSmallSpringStaballoy.name=Small Staballoy Spring
+item.itemSmallSpringBlackSteel.name=Small Black Steel Spring
+item.itemSmallSpringBlackTitanium.name=Small Black Titanium Spring
+
+item.itemFineWireWhiteMetal.name=Fine White Metal Wire
+item.itemFineWirePalladium.name=Fine Palladium Wire
+item.itemFineWireZirconium.name=Fine Zirconium Wire
+item.itemFineWireGrisium.name=Fine Grisium Wire
+item.itemFineWireBabbitAlloy.name=Fine Babbit Alloy Wire
+item.itemFineWireKoboldite.name=Fine Koboldite Wire
+item.itemFineWireHG1223.name=Fine HG-1223 Wire
+item.itemFineWireQuantum.name=Fine Quantum Wire
+
+item.itemHeavyPlatePotin.name=Heavy Potin Plate
+item.itemHeavyPlateWatertightSteel.name=Heavy Watertight Steel Plate
+item.itemHeavyPlateBronze.name=Heavy Bronze Plate
+item.itemHeavyPlateOsmiridium.name=Heavy Osmiridium Plate
+item.itemHeavyPlateQuantum.name=Heavy Quantum Plate
+item.itemHeavyPlateBlackSteel.name=Heavy Black Steel Plate
+item.itemHeavyPlateStainlessSteel.name=Heavy Stainless Steel Plate
+item.itemHeavyPlateEglinSteel.name=Heavy Eglin Steel Plate
+item.itemHeavyPlateMaragingSteel300.name=Heavy Maraging Steel 300 Plate
+item.itemHeavyPlateTalonite.name=Heavy Talonite Plate
+item.itemHeavyPlateHypogen.name=Heavy Hypogen Plate
+item.itemHeavyPlateRhugnor.name=Heavy Rhugnor Plate
+item.itemHeavyPlateAdvancedNitinol.name=Heavy Advanced Nitinol Plate
+item.itemHeavyPlateAstralTitanium.name=Heavy Astral Titanium Plate
+item.itemHeavyPlateCelestialTungsten.name=Heavy Celestial Tungsten Plate
+item.itemHeavyPlateWhiteMetal.name=Heavy White Metal Plate
+item.itemHeavyPlateBlackMetal.name=Heavy Black Metal Plate
+item.itemHeavyPlateAncientGranite.name=Heavy Ancient Granite Plate
+
+item.GTPP.bauble.fireprotection.0.name=Supreme Pizza Gloves
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=Selenium Dioxide Cell
+item.itemCellSeleniousAcid.name=Selenious Acid Cell
+
+//Added 25/7/19
+container.pestkiller=Pest Killer
+
+//Added 15/8/19
+gtpp.nei.decayables=Decayables Chest
+entity.batKing.name=Bat King
+item.itemCellCarbyne.name=Carbyne Cell
+item.itemCellHydrogenCyanide.name=Cell of Hydrogen Cyanide
+item.itemCactusCharcoal.name=Cactus Charcoal
+item.itemCactusCoke.name=Cactus Coke
+item.itemSugarCharcoal.name=Sugar Charcoal
+item.itemSugarCoke.name=Sugar Coke
+item.LiquidHydrogen.name=Liquid Hydrogen Cell [LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=Reinforced Door
+tile.blockInhibitorObelisk.name=Inhibitor Obelisk
+tile.Battlesign.name=Battlesign
+tile.blockMagicBox.name=Magic Box
+tile.blockManaPod.name=Mana Pod Stem
+tile.buildToolBlock.name=Tool Block
+tile.blockRedPlasma.name=Red Plasma Block
+tile.pipeBlock.name=Pipe
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=Greenockite Ore
+item.crushedGreenockite.name=Crushed Greenockite Ore
+item.crushedCentrifugedGreenockite.name=Centrifuged Crushed Greenockite Ore
+item.crushedPurifiedGreenockite.name=Purified Crushed Greenockite Ore
+item.dustImpureGreenockite.name=Impure Greenockite Dust
+item.dustPureGreenockite.name=Purified Greenockite Dust
+item.itemDustGreenockite.name=Greenockite Dust
+item.itemDustTinyGreenockite.name=Tiny Pile of Greenockite Dust
+item.itemDustSmallGreenockite.name=Small Pile of Greenockite Dust
+
+tile.OreRareEarthI.name=Rare Earth (I) Ore
+item.crushedRareEarthI.name=Crushed Rare Earth (I) Ore
+item.crushedCentrifugedRareEarthI.name=Centrifuged Crushed Rare Earth (I) Ore
+item.crushedPurifiedRareEarthI.name=Purified Crushed Rare Earth (I) Ore
+item.dustImpureRareEarthI.name=Impure Rare Earth (I) Dust
+item.dustPureRareEarthI.name=Purified Rare Earth (I) Dust
+item.itemDustRareEarthI.name=Rare Earth (I) Dust
+item.itemDustTinyRareEarthI.name=Tiny Pile of Rare Earth (I) Dust
+item.itemDustSmallRareEarthI.name=Small Pile of Rare Earth (I) Dust
+
+tile.OreRareEarthII.name=Rare Earth (II) Ore
+item.crushedRareEarthII.name=Crushed Rare Earth (II) Ore
+item.crushedCentrifugedRareEarthII.name=Centrifuged Crushed Rare Earth (II) Ore
+item.crushedPurifiedRareEarthII.name=Purified Crushed Rare Earth (II) Ore
+item.dustImpureRareEarthII.name=Impure Rare Earth (II) Dust
+item.dustPureRareEarthII.name=Purified Rare Earth (II) Dust
+item.itemDustRareEarthII.name=Rare Earth (II) Dust
+item.itemDustTinyRareEarthII.name=Tiny Pile of Rare Earth (II) Dust
+item.itemDustSmallRareEarthII.name=Small Pile of Rare Earth (II) Dust
+
+tile.OreRareEarthIII.name=Rare Earth (III) Ore
+item.crushedRareEarthIII.name=Crushed Rare Earth (III) Ore
+item.crushedCentrifugedRareEarthIII.name=Centrifuged Crushed Rare Earth (III) Ore
+item.crushedPurifiedRareEarthIII.name=Purified Crushed Rare Earth (III) Ore
+item.dustImpureRareEarthIII.name=Impure Rare Earth (III) Dust
+item.dustPureRareEarthIII.name=Purified Rare Earth (III) Dust
+item.itemDustRareEarthIII.name=Rare Earth (III) Dust
+item.itemDustTinyRareEarthIII.name=Tiny Pile of Rare Earth (III) Dust
+item.itemDustSmallRareEarthIII.name=Small Pile of Rare Earth (III) Dust
+
+//Added 16/10/19
+item.BioRecipeSelector.name=Programmed Bio Circuit
+item.FermentationBase.name=Cell of Fermentation Base
+item.ureamix.name=Cell of Urea Mix
+item.liquidresin.name=Cell of Liquid Resin
+item.propionicacid.name=Propionic Acid Cell
+item.aceticacid.name=Acetic Acid Cell
+item.BasicAgrichemItem.0.name=Algae Biomass
+item.BasicAgrichemItem.1.name=Green Algae Biomass
+item.BasicAgrichemItem.2.name=Brown Algae Biomass
+item.BasicAgrichemItem.3.name=Golden-Brown Algae Biomass
+item.BasicAgrichemItem.4.name=Red Algae Biomass
+item.BasicAgrichemItem.5.name=Cellulose Fiber
+item.BasicAgrichemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicAgrichemItem.7.name=Red Cellulose Fiber
+item.BasicAgrichemItem.8.name=Compost
+item.BasicAgrichemItem.9.name=Wood Pellet
+item.BasicAgrichemItem.10.name=Wood Brick
+item.BasicAgrichemItem.11.name=Cellulose Pulp
+item.BasicAgrichemItem.12.name=Raw Bio Resin
+item.BasicAgrichemItem.13.name=Catalyst Carrier
+item.BasicAgrichemItem.14.name=Green Metal Catalyst
+item.BasicAgrichemItem.15.name=Alginic Acid
+item.BasicAgrichemItem.16.name=Alumina
+item.BasicAgrichemItem.17.name=Aluminium Pellet
+item.BasicAgrichemItem.18.name=Sodium Aluminate
+item.BasicAgrichemItem.19.name=Sodium Hydroxide
+item.BasicAgrichemItem.20.name=Sodium Carbonate
+item.BasicAgrichemItem.21.name=Lithium Chloride
+
+//Added 24/10/19
+item.butanol.name=Butanol Cell
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=Heated Water
+fluidHotWater.name=Heated Water
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=Hot Titanium Ingot
+item.OilHeavy.name=Heavy Oil Cell
+item.UnsymmetricalDimethylhydrazine.name=Unsymmetrical Dimethylhydrazine Cell
+item.benzene.name=Benzene Cell
+item.Benzene.name=Benzene Cell
+item.phenol.name=Phenol Cell
+item.CarbonDioxide.name=Carbon Dioxide Cell
+item.itemCellCarbonDioxide.name=Carbon Dioxide Cell
+item.CarbonMonoxide.name=Carbon Monoxide Cell
+item.itemCellCarbonMonoxide.name=Carbon Monoxide Cell
+item.acetone.name=Acetone Cell
+item.saltwater.name=Salt Water Cell
+item.BasicAgrichemItem.22.name=Mold (Pellet)
+item.BasicAgrichemItem.23.name=Clean Aluminium Mix
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=Red Metal Catalyst
+item.BasicGenericChemItem.1.name=Yellow Metal Catalyst
+item.BasicGenericChemItem.2.name=Blue Metal Catalyst
+item.BasicGenericChemItem.3.name=Orange Metal Catalyst
+item.BasicGenericChemItem.4.name=Purple Metal Catalyst
+item.BasicGenericChemItem.5.name=Brown Metal Catalyst
+item.MudRedSlurry.name=Cell of Red Mud Slurry
+item.liquid_toluene.name=Toluene Cell
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=Pink Metal Catalyst
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=Raw Human Meat
+item.BasicMetaFood.1.name=Cooked Human Meat
+item.BasicMetaFood.2.name=Raw Horse Meat
+item.BasicMetaFood.3.name=Cooked Horse Meat
+item.BasicMetaFood.4.name=Raw Wolf Meat
+item.BasicMetaFood.5.name=Cooked Wolf Meat
+item.BasicMetaFood.6.name=Raw Ocelot Meat
+item.BasicMetaFood.7.name=Cooked Ocelot Meat
+item.BasicMetaFood.8.name=Blaze Flesh
+
+item.itemCellNaquadahFuel.name=Naquadah Fuel Cell
+item.itemCellEnrichedNaquadahFuel.name=Enriched Naquadah Fuel Cell
+item.itemCellNaquadriaFuel.name=Naquadria Fuel Cell
+item.boricacid.name=Boric Acid Cell
+item.hydrochloricacid.name=Hydrochloric Acid Cell
+
+item.BasicAlgaeItem.name=Breedable Algae
+item.BasicAlgaeItem.0.name=Breedable Algae
+item.BasicAlgaeItem.1.name=Breedable Algae
+item.BasicAlgaeItem.2.name=Breedable Algae
+item.BasicAlgaeItem.3.name=Breedable Algae
+item.BasicAlgaeItem.4.name=Breedable Algae
+item.BasicAlgaeItem.5.name=Breedable Algae
+item.BasicAlgaeItem.6.name=Breedable Algae
+
+//Added 30/03/20
+item.milledChalcopyrite.name=Milled Chalcopyrite
+item.milledSphalerite.name=Milled Sphalerite
+item.milledNickel.name=Milled Nickel
+item.milledPlatinum.name=Milled Platinum
+item.milledPentlandite.name=Milled Pentlandite
+item.FrothZincflotation.name=Sphalerite Flotation Froth Cell
+item.FrothCopperflotation.name=Chalcopyrite Flotation Froth Cell
+item.FrothNickelflotation.name=Nickel Flotation Froth Cell
+item.FrothPlatinumflotation.name=Platinum Flotation Froth Cell
+item.FrothPentlanditeflotation.name=Pentlandite Flotation Froth Cell
+item.BasicGenericChemItem.7.name=Alumina Milling Ball
+item.BasicGenericChemItem.8.name=Soapstone Milling Ball
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=Sodium Ethoxide Dust
+item.BasicGenericChemItem.10.name=Sodium Ethyl Xanthate Dust
+item.BasicGenericChemItem.11.name=Potassium Ethyl Xanthate Dust
+item.BasicGenericChemItem.12.name=Potassium Hydroxide Dust
+item.CarbonDisulfide.name=Carbon Disulfide Cell
+item.HydrogenSulfide.name=Hydrogen Sulfide Cell
+item.BasicAgrichemItem.24.name=Pinecone
+item.BasicAgrichemItem.25.name=Crushed Pine Materials
+item.pineoil.name=Pine Oil Cell
+
+//Added 11/4/20
+item.milledRedstone.name=Milled Redstone
+item.milledSpessartine.name=Milled Spessartine
+item.milledGrossular.name=Milled Grossular
+item.milledAlmandine.name=Milled Almandine
+item.milledPyrope.name=Milled Pyrope
+item.FrothRedstoneflotation.name=Redstone Flotation Froth Cell
+item.FrothSpessartineflotation.name=Spessartine Flotation Froth Cell
+item.FrothGrossularflotation.name=Grossular Flotation Froth Cell
+item.FrothAlmandineflotation.name=Almandine Flotation Froth Cell
+item.FrothPyropeflotation.name=Pyrope Flotation Froth Cell
+
+//Added 13/04/20
+item.T3RecipeSelector.name=Programmed Breakthrough Circuit
+
+//Added 03/05/20
+entity.miscutils.batKing.name=Spectral Bat
+entity.miscutils.bigChickenFriendly.name=Giant Chicken
+entity.miscutils.AusDingo.name=Dingo
+entity.miscutils.AusBoar.name=Wild Boar
+entity.miscutils.AusSpider.name=Forest Spider
+entity.miscutils.AusOctopus.name=Octopus
+container.EggBox=Egg Hatching Box
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=Volumetric Flask Configurator
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=Laurenium Ingot
+item.itemHotIngotLaurenium.name=Hot Laurenium Ingot
+item.itemDustLaurenium.name=Laurenium Dust
+item.itemDustTinyLaurenium.name=Tiny Pile of Laurenium Dust
+item.itemDustSmallLaurenium.name=Small Pile of Laurenium Dust
+item.itemNuggetLaurenium.name=Laurenium Nugget
+item.itemPlateLaurenium.name=Laurenium Plate
+item.itemPlateDoubleLaurenium.name=Double Laurenium Plate
+item.itemBoltLaurenium.name=Laurenium Bolt
+item.itemRodLaurenium.name=Laurenium Rod
+item.itemRodLongLaurenium.name=Long Laurenium Rod
+item.itemRingLaurenium.name=Laurenium Ring
+item.itemScrewLaurenium.name=Laurenium Screw
+item.itemRotorLaurenium.name=Laurenium Rotor
+item.itemGearLaurenium.name=Laurenium Gear
+item.itemCellLaurenium.name=Laurenium Cell
+tile.Block of Laurenium.name=Block of Laurenium
+tile.Laurenium Frame Box.name=Laurenium Frame Box
+item.itemIngotBotmium.name=Botmium Ingot
+item.itemHotIngotBotmium.name=Hot Botmium Ingot
+item.itemDustBotmium.name=Botmium Dust
+item.itemDustTinyBotmium.name=Tiny Pile of Botmium Dust
+item.itemDustSmallBotmium.name=Small Pile of Botmium Dust
+item.itemNuggetBotmium.name=Botmium Nugget
+item.itemPlateBotmium.name=Botmium Plate
+item.itemPlateDoubleBotmium.name=Double Botmium Plate
+item.itemBoltBotmium.name=Botmium Bolt
+item.itemRodBotmium.name=Botmium Rod
+item.itemRodLongBotmium.name=Long Botmium Rod
+item.itemRingBotmium.name=Botmium Ring
+item.itemScrewBotmium.name=Botmium Screw
+item.itemRotorBotmium.name=Botmium Rotor
+item.itemGearBotmium.name=Botmium Gear
+item.itemCellBotmium.name=Botmium Cell
+tile.Block of Botmium.name=Block of Botmium
+tile.Botmium Frame Box.name=Botmium Frame Box
+
+//Added 29/05/20
+item.itemBasicTurbine.name=Basic Turbine
+item.itemBasicTurbine_0.name=Basic Iron Turbine
+item.itemBasicTurbine_1.name=Basic Bronze Turbine
+item.itemBasicTurbine_2.name=Basic Steel Turbine
+
+interaction.voidexcess.enabled=Void Excess Enabled
+interaction.voidexcess.disabled=Void Excess Disabled
+
+interaction.separateBusses.enabled=Input busses are separated
+interaction.separateBusses.disabled=Input busses are not separated
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=Uranium Residue Mix
+item.BasicNuclearChemItem.1.name=Plutonium Residue Mix
+item.BasicNuclearChemItem.2.name=Fluoride Residue Mix
+item.BasicNuclearChemItem.3.name=Noble Residue Mix
+item.BasicNuclearChemItem.4.name=Red Algae Biomass
+item.BasicNuclearChemItem.5.name=Cellulose Fiber
+item.BasicNuclearChemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicNuclearChemItem.7.name=Red Cellulose Fiber
+
+item.itemCellLiFBeF2ZrF4U235.name=LFTR Fuel I Cell
+item.itemCellLiFBeF2ZrF4UF4.name=LFTR Fuel II Cell
+item.itemCellLiFBeF2ThF4UF4.name=LFTR Fuel III Cell
+item.Li2BeF2UF4.name=Burnt Li2BeF2UF4 Cell
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP Cell
+item.itemCellUF6F2.name=UF6F2 Cell
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4 Cell
+item.itemCellUF6F2FP.name=UF6F2FP Cell
+item.dustProtactinium233.name=Protactinium-233 Dust
+item.itemCellLiFThF4.name=LiFThF4 Cell
+item.NuclearWaste.name=Nuclear Waste Cell
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4 Cell
+item.itemCellSodiumFluoride.name=Sodium Fluoride Cell
+item.itemCellLiFBeF2.name=LiFBeF2 Cell
+
+//Added 7/12/21
+item.itemCellDysprosium.name=Dysprosium Cell
+item.itemCellThorium.name=Thorium Cell
+item.itemCellTellurium.name=Tellurium Cell
+item.itemCellThorium232.name=Thorium-232 Cell
+item.itemCellLithiumTetrafluoroberyllate.name=Lithium Tetrafluoroberyllate Cell
+item.itemCellBurntReactorFuelI.name=Spent LFTR Fuel I Cell
+item.itemCellBurntReactorFuelII.name=Spent LFTR Fuel II Cell
+item.itemDustTinyIndium.name=Tiny Indium Dust
+item.itemDustSmallIndium.name=Small Indium Dust
+item.itemDustIndium.name=Indium Dust
+item.itemDustTinyBerylliumHydroxide.name=Tiny Beryllium Hydroxide Dust
+item.itemDustSmallBerylliumHydroxide.name=Small Beryllium Hydroxide Dust
+item.itemDustBerylliumHydroxide.name=Beryllium Hydroxide Dust
+item.itemDustTinyAmmoniumBifluoride.name=Tiny Ammonium Bifluoride Dust
+item.itemDustSmallAmmoniumBifluoride.name=Small Ammonium Bifluoride Dust
+item.itemDustAmmoniumBifluoride.name=Ammonium Bifluoride Dust
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=Tiny Ammonium Tetrafluoroberyllate Dust
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=Small Ammonium Tetrafluoroberyllate Dust
+item.itemDustAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Dust
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=Impure LiFBeF2 Cell
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=Helium Sparged LiFBeF2UF4FP Cell
+item.itemCellFluorineSpargedLiFThF4.name=Fluorine Sparged LiFThF4 Cell
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=Fluorine Sparged LiFBeF2ThF4 Cell
+item.itemIngotHS188A.name=HS-188A Ingot
+item.itemHotIngotHS188A.name=Hot HS-188A Ingot
+item.itemDustHS188A.name=HS-188A Dust
+item.itemDustTinyHS188A.name=Tiny Pile of HS-188A Dust
+item.itemDustSmallHS188A.name=Small Pile of HS-188A Dust
+item.itemNuggetHS188A.name=HS-188A Nugget
+item.itemPlateHS188A.name=HS-188A Plate
+item.itemPlateDoubleHS188A.name=Double HS-188A Plate
+item.itemBoltHS188A.name=HS-188A Bolt
+item.itemRodHS188A.name=HS-188A Rod
+item.itemRodLongHS188A.name=Long HS-188A Rod
+item.itemRingHS188A.name=HS-188A Ring
+item.itemScrewHS188A.name=HS-188A Screw
+item.itemRotorHS188A.name=HS-188A Rotor
+item.itemGearHS188A.name=HS-188A Gear
+item.itemCellHS188A.name=HS-188A Cell
+
+//Added 12/12/21
+item.itemIngotErbium.name=Erbium Ingot
+item.itemHotIngotErbium.name=Hot Erbium Ingot
+item.itemDustErbium.name=Erbium Dust
+item.itemDustTinyErbium.name=Tiny Pile of Erbium Dust
+item.itemDustSmallErbium.name=Small Pile of Erbium Dust
+item.itemNuggetErbium.name=Erbium Nugget
+item.itemPlateErbium.name=Erbium Plate
+item.itemPlateDoubleErbium.name=Double Erbium Plate
+item.itemBoltErbium.name=Erbium Bolt
+item.itemRodErbium.name=Erbium Rod
+item.itemRodLongErbium.name=Long Erbium Rod
+item.itemRingErbium.name=Erbium Ring
+item.itemScrewErbium.name=Erbium Screw
+item.itemRotorErbium.name=Erbium Rotor
+item.itemGearErbium.name=Erbium Gear
+item.itemCellErbium.name=Erbium Cell
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr Ingot
+item.itemHotIngotHeLiCoPtEr.name=Hot HeLiCoPtEr Ingot
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr Dust
+item.itemDustTinyHeLiCoPtEr.name=Tiny Pile of HeLiCoPtEr Dust
+item.itemDustSmallHeLiCoPtEr.name=Small Pile of HeLiCoPtEr Dust
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr Nugget
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr Plate
+item.itemPlateDoubleHeLiCoPtEr.name=Double HeLiCoPtEr Plate
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr Bolt
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr Rod
+item.itemRodLongHeLiCoPtEr.name=Long HeLiCoPtEr Rod
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr Ring
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr Screw
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr Rotor
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr Gear
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr Cell
+item.itemIngotPraseodymium.name=Praseodymium Ingot
+item.itemHotIngotPraseodymium.name=Hot Praseodymium Ingot
+item.itemDustPraseodymium.name=Praseodymium Dust
+item.itemDustTinyPraseodymium.name=Tiny Pile of Praseodymium Dust
+item.itemDustSmallPraseodymium.name=Small Pile of Praseodymium Dust
+item.itemNuggetPraseodymium.name=Praseodymium Nugget
+item.itemPlatePraseodymium.name=Praseodymium Plate
+item.itemPlateDoublePraseodymium.name=Double Praseodymium Plate
+item.itemBoltPraseodymium.name=Praseodymium Bolt
+item.itemRodPraseodymium.name=Praseodymium Rod
+item.itemRodLongPraseodymium.name=Long Praseodymium Rod
+item.itemRingPraseodymium.name=Praseodymium Ring
+item.itemScrewPraseodymium.name=Praseodymium Screw
+item.itemRotorPraseodymium.name=Praseodymium Rotor
+item.itemGearPraseodymium.name=Praseodymium Gear
+item.itemCellPraseodymium.name=Praseodymium Cell
+item.milledMonazite.name=Milled Monazite
+item.FrothMonaziteflotation.name=Monazite Flotation Froth Cell
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=Formaldehyde Catalyst
+item.hydrogenchloridemix.name=Hydrogen Chlorine Mix
+
+//Added 19/01/22
+item.SunnariumBit.name=Sunnarium Bit
+
+//Added 29/01/22
+sleep.event.okay=Вы хорошо выспались и теперь чувствуете себя немного лучше.
+sleep.event.good=Вы хорошо выспались и теперь чувствуете себя намного лучше.
+sleep.event.wellrested=Вы чувствуете себя хорошо отдохнувшим.
+sleep.event.downsides=Слабое здоровье больше не беспокоит вас.
+item.miscutils:magicfeather.name=Magical Feather
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=Solid-Acid Catalyst
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=Infinite Mutation Catalyst \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/lang/zh_CN.lang b/src/main/resources/assets/miscutils/lang/zh_CN.lang
new file mode 100644
index 0000000000..83304b8697
--- /dev/null
+++ b/src/main/resources/assets/miscutils/lang/zh_CN.lang
@@ -0,0 +1,3351 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] 方块
+itemGroup.MiscUtilMiscTab=[GT++] 物品
+itemGroup.MiscUtilCombatTab=[GT++] 战斗
+itemGroup.MiscUtilToolsTab=[GT++] 工具
+itemGroup.MiscUtilMachineTab=[GT++] 机器
+itemGroup.MiscUtilOtherTab=[GT++] 物品 II
+itemGroup.MiscUtilBOP=[GT++]超多生物群系附属
+
+//Debug
+item.AAA_Broken.name=[不存在的物品]请在Github上反馈这个合成
+item.itemBedLocator_Base.name=床定位器[NBT测试]
+item.itemBaseItemWithCharge.name=基础可充电物品
+item.miscutils_itemDebugShapeSpawner.name=[调试用]塑形
+
+//Fluids
+tile.fluidSludge.name=不流动的废水
+tile.fluidSludge.0.name=不流动的废水
+
+//Death Messages
+death.attack.plasmabolt=%s 死于滚烫的等离子体.
+death.attack.plasmabolt.player=%1$s 被 %2$s 使用等离子体击杀.
+death.attack.gtpp.grinder=%s 被艾萨研磨机磨成了渣渣.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=电池合金板
+item.itemIngotBatteryAlloy.name=电池合金锭
+item.itemStickyRubber.name=粘性橡胶团
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=空燃料棒
+item.itemFuelRod_Thorium.name=钍燃料棒
+item.itemFuelRod_Uranium.name=铀燃料棒
+item.itemFuelRod_Plutonium.name=钚燃料棒
+
+//Entities
+entity.constructStaballoy.name=贫铀合金结构
+entity.sickBlaze.name=被感染的狂热者
+
+//Tile Entities
+tile.blockToolBuilder.name=格雷工具组装台
+
+//Tools
+item.itemBufferCore.name=能量核心
+item.itemStaballoyPickaxe.name=隧道挖掘者
+item.itemStaballoyAxe.name=树林砍伐者
+item.itemSandstoneHammer.name=圆石粉碎者
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=烈焰之炽焱桶
+item.MiscUtils.bucket.bucketCryotheum.name=极寒之凛冰桶
+item.MiscUtils.bucket.bucketEnder.name=谐振熔融末影珍珠桶
+item.MiscUtils.material.dustPyrotheum.name=炽焱之尘
+item.MiscUtils.material.dustCryotheum.name=凛冰之尘
+item.MiscUtils.material.rodBlizz.name=暴雪棒
+item.MiscUtils.material.dustBlizz.name=暴雪粉
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=烈焰之炽焱
+tile.miscutils.fluid.cryotheum.name=极寒之凛冰
+tile.miscutils.fluid.ender.name=谐振熔融末影珍珠
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=加速框架
+item.frameVoid.name=虚空框架
+item.frameMutagenic.name=诱变框架
+item.frameBusy.name=工作框架
+item.frameChocolate.name=巧克力框架
+item.frameRestraint.name=约束框架
+item.frameSoul.name=灵魂框架
+item.frameHealing.name=治愈框架
+item.frameNova.name=新星框架
+item.frameArborists.name=树艺框架
+item.frameDecaying.name=腐烂框架
+item.frameSlowing.name=减速框架
+item.frameStabilizing.name=稳定框架
+item.frameUseless.name=无用框架
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=充能合金扇叶
+item.itemTungstenSteelRotorBlade.name=钨钢扇叶
+item.itemVibrantRotorBlade.name=脉冲合金扇叶
+item.itemIridiumRotorBlade.name=铱扇叶
+item.itemEnergeticShaft.name=充能合金轴
+item.itemTungstenSteelShaft.name=钨钢轴
+item.itemVibrantShaft.name=脉冲合金轴
+item.itemIridiumShaft.name=铱轴
+item.itemMagnaliumRotorBlade.name=镁铝合金扇叶
+item.itemUltimetRotorBlade.name=哈氏合金扇叶
+item.itemMagnaliumShaft.name=镁铝合金轴
+item.itemUltimetShaft.name=哈氏合金轴
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=夸克操纵者 (UV)
+item.itemPlateEnrichedSoularium.name=富集阳光合金板
+item.itemHeliumBlob.name=神秘氢气物质
+item.itemAlkalusDisk.name=Alkalus圆盘
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=压缩黑曜石(9)
+tile.blockCompressedObsidian.1.name=二重压缩黑曜石(81)
+tile.blockCompressedObsidian.2.name=三重压缩黑曜石(729)
+tile.blockCompressedObsidian.3.name=四重压缩黑曜石(6561)
+tile.blockCompressedObsidian.4.name=五重压缩黑曜石(59049)
+tile.blockCompressedObsidian.5.name=反转黑曜石
+tile.blockCompressedObsidian.6.name=压缩萤石(9)
+tile.blockCompressedObsidian.7.name=二重压缩萤石(81)
+tile.blockCompressedObsidian.8.name=三重压缩萤石(729)
+tile.blockCompressedObsidian.9.name=四重压缩萤石(6561)
+tile.blockCompressedObsidian.10.name=五重压缩萤石(59049)
+tile.blockNet.name=网
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=优质二氧化硫单元
+item.mobessence.name=怪物精华液单元
+item.Fertiliser.name=流体肥料单元
+item.UN32Fertiliser.name=UN-32肥料单元
+item.UN18Fertiliser.name=UN-18肥料单元
+item.RaisinJuice.name=葡萄汁单元
+item.BerylliumHydroxide.name=氢氧化铍单元
+item.AmmoniumBifluoride.name=氟化氢铵单元
+item.Hydroxide.name=氢氧化物单元
+item.Ammonium.name=铵单元
+item.AmmoniumTetrafluoroberyllate.name=四氟硼酸铵单元
+
+//Resources
+item.itemStickyRubber.name=粘性橡胶团
+item.itemCoalCoke.name=焦煤
+item.itemHydrogenBlob.name=神秘氢气团
+item.itemHeliumBlob.name=神秘氢气物质
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus圆盘
+item.itemSimpleFiremaker.name=基础起火器
+item.itemFiber.name=植物纤维
+item.itemRope.name=绳索
+item.backpackRed.name=红色背包
+item.backpackGreen.name=绿色背包
+item.backpackBlue.name=蓝色背包
+item.backpackYellow.name=黄色背包
+item.backpackPurple.name=紫色背包
+item.backpackCyan.name=青色背包
+item.backpackMaroon.name=棕色背包
+item.backpackOlive.name=橄榄绿色背包
+item.backpackDarkGreen.name=深绿色背包
+item.backpackDarkPurple.name=深紫色背包
+item.backpackTeal.name=蓝绿色背包
+item.backpackNavy.name=深蓝色背包
+item.backpackSilver.name=银色背包
+item.backpackGray.name=灰色背包
+item.backpackBlack.name=黑色背包
+item.backpackWhite.name=白色背包
+item.itemBlueprint.name=蓝图[无用]
+item.itemGemShards.name=钻石碎片
+item.itemHalfCompleteCasings.name=半成品机械方块
+item.itemSulfuricPotion.name=喷溅型 硫酸
+item.itemHydrofluoricPotion.name=喷溅型 氢氟酸
+
+
+//Conversion Dusts
+item.dustNeptunium238.name=镎-238粉
+item.dustRadium226.name=镭-226粉
+item.itemDustDecayedRadium226.name=衰变镭-226粉
+item.itemDustSmallDecayedRadium226.name=小堆衰变镭-226粉
+item.itemDustTinyDecayedRadium226.name=小撮衰变镭-226粉
+
+//Material Items
+item.itemDustGadolinium.name=钆粉
+item.itemDustSmallGadolinium.name=小堆钆粉
+item.itemDustTinyGadolinium.name=小撮钆粉
+item.itemDustYtterbium.name=镱粉
+item.itemDustSmallYtterbium.name=小堆镱粉
+item.itemDustTinyYtterbium.name=小撮镱粉
+item.itemDustSamarium.name=钐粉
+item.itemDustSmallSamarium.name=小堆钐粉
+item.itemDustTinySamarium.name=小撮钐粉
+item.itemDustLanthanum.name=镧粉
+item.itemDustSmallLanthanum.name=小堆镧粉
+item.itemDustTinyLanthanum.name=小撮镧粉
+item.itemCellNeon.name=氖单元
+item.itemCellGermanium.name=锗单元
+item.itemCellSelenium.name=硒单元
+item.itemCellBromine.name=溴单元
+item.itemCellKrypton.name=氪单元
+item.itemCellZirconium.name=锆单元
+item.itemCellTechnetium.name=锝单元
+item.itemCellRuthenium.name=钌单元
+item.itemCellRhodium.name=铑单元
+item.itemCellIodine.name=碘单元
+item.itemCellXenon.name=氙单元
+item.itemCellHafnium.name=铪单元
+item.itemCellRhenium.name=铼单元
+item.itemCellThallium.name=铊单元
+item.itemCellPolonium.name=钋单元
+item.itemCellAstatine.name=砹单元
+item.itemCellFrancium.name=钫单元
+item.itemCellRadium.name=镭单元
+item.itemCellActinium.name=锕单元
+item.itemCellProtactinium.name=镤单元
+item.itemCellNeptunium.name=镎单元
+item.itemCellCurium.name=锔单元
+item.itemCellBerkelium.name=锫单元
+item.itemCellCalifornium.name=锎单元
+item.itemCellEinsteinium.name=锿单元
+item.itemCellFermium.name=镄单元
+item.itemCellRefinedTrinium.name=精制三元金属单元
+item.itemIngotSelenium.name=硒锭
+item.itemDustSelenium.name=硒粉
+item.itemDustTinySelenium.name=小撮硒粉
+item.itemDustSmallSelenium.name=小堆硒粉
+item.itemNuggetSelenium.name=硒粒
+item.itemPlateSelenium.name=硒板
+item.itemPlateDoubleSelenium.name=双重硒板
+item.itemBoltSelenium.name=硒螺栓
+item.itemRodSelenium.name=硒杆
+item.itemRodLongSelenium.name=长硒杆
+item.itemRingSelenium.name=硒环
+item.itemScrewSelenium.name=硒螺丝
+item.itemRotorSelenium.name=硒转子
+item.itemGearSelenium.name=硒齿轮
+item.itemCellUranium232.name=铀-232单元
+item.itemCellUranium233.name=铀-233单元
+item.itemCellThoriumTetrafluoride.name=四氟化钍单元
+item.itemCellThoriumHexafluoride.name=六氟化钍单元
+item.itemCellUraniumTetrafluoride.name=四氟化铀单元
+item.itemCellUraniumHexafluoride.name=六氟化铀单元
+item.itemCellZirconiumTetrafluoride.name=四氟化锆单元
+item.itemCellBerylliumFluoride.name=氟化铍单元
+item.itemCellLithiumFluoride.name=氟化锂单元
+item.itemCellHydroxide.name=氢氧化物单元
+item.itemCellAmmonium.name=铵单元
+item.itemCellAmmoniumBifluoride.name=氟化氢铵单元
+item.itemCellBerylliumHydroxide.name=氢氧化铍单元
+item.itemCellAmmoniumTetrafluoroberyllate.name=氟铍酸铵单元
+item.itemCellNeptuniumHexafluoride.name=六氟化铀单元
+item.itemCellTechnetiumHexafluoride.name=六氟化锝单元
+item.itemCellSeleniumHexafluoride.name=六氟化硒单元
+item.itemCellEnergyCrystal.name=能量水晶单元
+item.itemCellBloodSteel.name=血钢单元
+item.itemCellStaballoy.name=贫铀合金单元
+item.itemCellTantalloy60.name=钽钨合金-60单元
+item.itemCellTantalloy61.name=钽钨合金-61单元
+item.itemCellTumbaga.name=铜金合金单元
+item.itemCellPotin.name=粗青铜合金单元
+item.itemCellInconel625.name=镍铬基合金-625单元
+item.itemCellInconel690.name=镍铬基合金-690单元
+item.itemCellInconel792.name=镍铬基合金-792单元
+item.itemCellZeron100.name=塞龙-100单元
+item.itemCellMaragingSteel250.name=马氏体时效钢250单元
+item.itemCellMaragingSteel300.name=马氏体时效钢300单元
+item.itemCellMaragingSteel350.name=马氏体时效钢350单元
+item.itemCellStellite.name=铬钴锰钛合金单元
+item.itemCellTalonite.name=铬钴磷酸盐合金单元
+item.itemCellHastelloyW.name=哈斯特洛依合金-W单元
+item.itemCellHastelloyX.name=哈斯特洛依合金-X单元
+item.itemCellHastelloyN.name=哈斯特洛依合金-N单元
+item.itemCellHastelloyC276.name=哈斯特洛依合金-C276单元
+item.itemCellIncoloy020.name=耐热铬铁合金-020单元
+item.itemCellIncoloyDS.name=耐热铬铁合金-DS单元
+item.itemCellIncoloyMA956.name=耐热铬铁合金-MA956单元
+item.itemCellTungstenCarbide.name=碳化钨单元
+item.itemCellSiliconCarbide.name=碳化硅单元
+item.itemCellTantalumCarbide.name=碳化钽单元
+item.itemCellZirconiumCarbide.name=碳化锆单元
+item.itemCellNiobiumCarbide.name=碳化铌单元
+item.itemCellGrisium.name=灰钛合金单元
+item.itemCellEglinSteelBaseCompound.name=埃格林钢单元
+item.itemCellEglinSteel.name=埃格林钢单元
+item.itemCellHG1223.name=HG-1223单元
+item.itemCellTriniumTitaniumAlloy.name=三元钛合金单元
+item.itemCellTriniumNaquadahAlloy.name=三元硅岩合金单元
+item.itemCellTriniumNaquadahCarbonite.name=碳化三元硅岩合金单元
+item.itemCellQuantum.name=量子合金单元
+item.itemIngotBromine.name=溴锭
+item.itemDustBromine.name=溴粉
+item.itemDustTinyBromine.name=小撮溴粉
+item.itemDustSmallBromine.name=小堆溴粉
+item.itemNuggetBromine.name=溴粒
+item.itemPlateBromine.name=溴板
+item.itemPlateDoubleBromine.name=双重溴板
+item.itemIngotStrontium.name=锶锭
+item.itemDustStrontium.name=锶粉
+item.itemDustTinyStrontium.name=小撮锶粉
+item.itemDustSmallStrontium.name=小堆锶粉
+item.itemNuggetStrontium.name=锶粒
+item.itemPlateStrontium.name=锶板
+item.itemPlateDoubleStrontium.name=双重锶板
+item.itemBoltStrontium.name=锶螺栓
+item.itemRodStrontium.name=锶杆
+item.itemRodLongStrontium.name=长锶杆
+item.itemRingStrontium.name=锶环
+item.itemScrewStrontium.name=锶螺丝
+item.itemRotorStrontium.name=锶转子
+item.itemGearStrontium.name=锶齿轮
+item.itemIngotZirconium.name=锆锭
+item.itemDustZirconium.name=锆粉
+item.itemDustTinyZirconium.name=小撮锆粉
+item.itemDustSmallZirconium.name=小堆锆粉
+item.itemNuggetZirconium.name=锆粒
+item.itemPlateZirconium.name=锆板
+item.itemPlateDoubleZirconium.name=双重锆板
+item.itemBoltZirconium.name=锆螺栓
+item.itemRodZirconium.name=锆杆
+item.itemRodLongZirconium.name=长锆杆
+item.itemRingZirconium.name=锆环
+item.itemScrewZirconium.name=锆螺丝
+item.itemRotorZirconium.name=锆转子
+item.itemGearZirconium.name=锆齿轮
+item.itemIngotRuthenium.name=钌锭
+item.itemDustRuthenium.name=钌粉
+item.itemDustTinyRuthenium.name=小撮钌粉
+item.itemDustSmallRuthenium.name=小堆钌粉
+item.itemNuggetRuthenium.name=钌粒
+item.itemPlateRuthenium.name=钌板
+item.itemPlateDoubleRuthenium.name=双重钌板
+item.itemBoltRuthenium.name=钌螺栓
+item.itemRodRuthenium.name=钌杆
+item.itemRodLongRuthenium.name=长钌杆
+item.itemRingRuthenium.name=钌环
+item.itemScrewRuthenium.name=钌螺丝
+item.itemRotorRuthenium.name=钌转子
+item.itemGearRuthenium.name=钌齿轮
+item.itemIngotIodine.name=碘锭
+item.itemDustIodine.name=碘粉
+item.itemDustTinyIodine.name=小撮碘粉
+item.itemDustSmallIodine.name=小堆碘粉
+item.itemNuggetIodine.name=碘粒
+item.itemPlateIodine.name=碘板
+item.itemPlateDoubleIodine.name=双重碘板
+item.itemBoltIodine.name=碘螺栓
+item.itemRodIodine.name=碘杆
+item.itemRodLongIodine.name=长碘杆
+item.itemRingIodine.name=碘环
+item.itemScrewIodine.name=碘螺丝
+item.itemRotorIodine.name=碘转子
+item.itemGearIodine.name=碘齿轮
+item.itemIngotHafnium.name=铪锭
+item.itemDustHafnium.name=铪粉
+item.itemDustTinyHafnium.name=小撮铪粉
+item.itemDustSmallHafnium.name=小堆铪粉
+item.itemNuggetHafnium.name=铪粒
+item.itemPlateHafnium.name=铪板
+item.itemPlateDoubleHafnium.name=双重铪板
+item.itemBoltHafnium.name=铪螺栓
+item.itemRodHafnium.name=铪杆
+item.itemRodLongHafnium.name=长铪杆
+item.itemRingHafnium.name=铪环
+item.itemScrewHafnium.name=铪螺丝
+item.itemRotorHafnium.name=铪转子
+item.itemGearHafnium.name=铪齿轮
+item.itemIngotDysprosium.name=镝锭
+item.itemDustDysprosium.name=镝粉
+item.itemDustTinyDysprosium.name=小撮镝粉
+item.itemDustSmallDysprosium.name=小堆镝粉
+item.itemNuggetDysprosium.name=镝粒
+item.itemPlateDysprosium.name=镝板
+item.itemPlateDoubleDysprosium.name=双重镝板
+item.itemBoltDysprosium.name=镝螺栓
+item.itemRodDysprosium.name=镝杆
+item.itemRodLongDysprosium.name=长镝杆
+item.itemRingDysprosium.name=镝环
+item.itemScrewDysprosium.name=镝螺丝
+item.itemRotorDysprosium.name=镝转子
+item.itemGearDysprosium.name=镝齿轮
+item.itemIngotTellurium.name=碲锭
+item.itemDustTellurium.name=碲粉
+item.itemDustTinyTellurium.name=小撮碲粉
+item.itemDustSmallTellurium.name=小堆碲粉
+item.itemNuggetTellurium.name=碲粒
+item.itemPlateTellurium.name=碲板
+item.itemPlateDoubleTellurium.name=双重碲板
+item.itemBoltTellurium.name=碲螺栓
+item.itemRodTellurium.name=碲杆
+item.itemRodLongTellurium.name=长碲杆
+item.itemRingTellurium.name=碲环
+item.itemScrewTellurium.name=碲螺丝
+item.itemRotorTellurium.name=碲转子
+item.itemGearTellurium.name=碲齿轮
+item.itemIngotRhodium.name=铑锭
+item.itemDustRhodium.name=铑粉
+item.itemDustTinyRhodium.name=小撮铑粉
+item.itemDustSmallRhodium.name=小堆铑粉
+item.itemNuggetRhodium.name=铑粒
+item.itemPlateRhodium.name=铑板
+item.itemPlateDoubleRhodium.name=双重铑板
+item.itemBoltRhodium.name=铑螺栓
+item.itemRodRhodium.name=铑杆
+item.itemRodLongRhodium.name=长铑杆
+item.itemRingRhodium.name=铑环
+item.itemScrewRhodium.name=铑螺丝
+item.itemRotorRhodium.name=铑转子
+item.itemGearRhodium.name=铑齿轮
+item.itemIngotRhenium.name=铼锭
+item.itemDustRhenium.name=铼粉
+item.itemDustTinyRhenium.name=小撮铼粉
+item.itemDustSmallRhenium.name=小堆铼粉
+item.itemNuggetRhenium.name=铼粒
+item.itemPlateRhenium.name=铼板
+item.itemPlateDoubleRhenium.name=双重铼板
+item.itemBoltRhenium.name=铼螺栓
+item.itemRodRhenium.name=铼杆
+item.itemRodLongRhenium.name=长铼杆
+item.itemRingRhenium.name=铼环
+item.itemScrewRhenium.name=铼螺丝
+item.itemRotorRhenium.name=铼转子
+item.itemGearRhenium.name=铼齿轮
+item.itemIngotThallium.name=铊锭
+item.itemDustThallium.name=铊粉
+item.itemDustTinyThallium.name=小撮铊粉
+item.itemDustSmallThallium.name=小堆铊粉
+item.itemNuggetThallium.name=铊粒
+item.itemPlateThallium.name=铊板
+item.itemPlateDoubleThallium.name=双重铊板
+item.itemBoltThallium.name=铊螺栓
+item.itemRodThallium.name=铊杆
+item.itemRodLongThallium.name=长铊杆
+item.itemRingThallium.name=铊环
+item.itemScrewThallium.name=铊螺丝
+item.itemRotorThallium.name=铊转子
+item.itemGearThallium.name=铊齿轮
+item.itemIngotTechnetium.name=锝锭
+item.itemDustTechnetium.name=锝粉
+item.itemDustTinyTechnetium.name=小撮锝粉
+item.itemDustSmallTechnetium.name=小堆锝粉
+item.itemNuggetTechnetium.name=锝粒
+item.itemPlateTechnetium.name=锝板
+item.itemPlateDoubleTechnetium.name=双重锝板
+item.itemIngotPolonium.name=钋锭
+item.itemDustPolonium.name=钋粉
+item.itemDustTinyPolonium.name=小撮钋粉
+item.itemDustSmallPolonium.name=小堆钋粉
+item.itemNuggetPolonium.name=钋粒
+item.itemPlatePolonium.name=钋板
+item.itemPlateDoublePolonium.name=双重钋板
+item.itemIngotAstatine.name=砹锭
+item.itemDustAstatine.name=砹粉
+item.itemDustTinyAstatine.name=小撮砹粉
+item.itemDustSmallAstatine.name=小堆砹粉
+item.itemNuggetAstatine.name=砹粒
+item.itemPlateAstatine.name=砹板
+item.itemPlateDoubleAstatine.name=双重砹板
+item.itemIngotFrancium.name=钫锭
+item.itemDustFrancium.name=钫粉
+item.itemDustTinyFrancium.name=小撮钫粉
+item.itemDustSmallFrancium.name=小堆钫粉
+item.itemNuggetFrancium.name=钫粒
+item.itemPlateFrancium.name=钫板
+item.itemPlateDoubleFrancium.name=双重钫板
+item.itemIngotRadium.name=镭锭
+item.itemDustRadium.name=镭粉
+item.itemDustTinyRadium.name=小撮镭粉
+item.itemDustSmallRadium.name=小堆镭粉
+item.itemNuggetRadium.name=镭粒
+item.itemPlateRadium.name=镭板
+item.itemPlateDoubleRadium.name=双重镭板
+item.itemIngotActinium.name=锕锭
+item.itemDustActinium.name=锕粉
+item.itemDustTinyActinium.name=小撮锕粉
+item.itemDustSmallActinium.name=小堆锕粉
+item.itemNuggetActinium.name=锕粒
+item.itemPlateActinium.name=锕板
+item.itemPlateDoubleActinium.name=双重锕板
+item.itemIngotProtactinium.name=镤锭
+item.itemDustProtactinium.name=镤粉
+item.itemDustTinyProtactinium.name=小撮镤粉
+item.itemDustSmallProtactinium.name=小堆镤粉
+item.itemNuggetProtactinium.name=镤粒
+item.itemPlateProtactinium.name=镤板
+item.itemPlateDoubleProtactinium.name=双重镤板
+item.itemIngotNeptunium.name=镎锭
+item.itemDustNeptunium.name=镎粉
+item.itemDustTinyNeptunium.name=小撮镎粉
+item.itemDustSmallNeptunium.name=小堆镎粉
+item.itemNuggetNeptunium.name=镎粒
+item.itemPlateNeptunium.name=镎板
+item.itemPlateDoubleNeptunium.name=双重镎板
+item.itemIngotCurium.name=锔锭
+item.itemDustCurium.name=锔粉
+item.itemDustTinyCurium.name=小撮锔粉
+item.itemDustSmallCurium.name=小堆锔粉
+item.itemNuggetCurium.name=锔粒
+item.itemPlateCurium.name=锔板
+item.itemPlateDoubleCurium.name=双重锔板
+item.itemIngotBerkelium.name=锫锭
+item.itemDustBerkelium.name=锫粉
+item.itemDustTinyBerkelium.name=小撮锫粉
+item.itemDustSmallBerkelium.name=小堆锫粉
+item.itemNuggetBerkelium.name=锫粒
+item.itemPlateBerkelium.name=锫板
+item.itemPlateDoubleBerkelium.name=双重锫板
+item.itemIngotCalifornium.name=锎锭
+item.itemDustCalifornium.name=锎粉
+item.itemDustTinyCalifornium.name=小撮锎粉
+item.itemDustSmallCalifornium.name=小堆锎粉
+item.itemNuggetCalifornium.name=锎粒
+item.itemPlateCalifornium.name=锎板
+item.itemPlateDoubleCalifornium.name=双重锎板
+item.itemDustEinsteinium.name=锿粉
+item.itemDustTinyEinsteinium.name=小撮锿粉
+item.itemDustSmallEinsteinium.name=小堆锿粉
+item.itemNuggetEinsteinium.name=锿粒
+item.itemPlateEinsteinium.name=锿板
+item.itemPlateDoubleEinsteinium.name=双重锿板
+item.itemIngotFermium.name=镄锭
+item.itemDustFermium.name=镄粉
+item.itemDustTinyFermium.name=小撮镄粉
+item.itemDustSmallFermium.name=小堆镄粉
+item.itemNuggetFermium.name=镄粒
+item.itemPlateFermium.name=镄板
+item.itemPlateDoubleFermium.name=双重镄板
+item.itemIngotLithium7.name=锂 7锭
+item.itemDustLithium7.name=锂 7粉
+item.itemDustTinyLithium7.name=小撮锂 7粉
+item.itemDustSmallLithium7.name=小堆锂 7粉
+item.itemNuggetLithium7.name=锂 7粒
+item.itemPlateLithium7.name=锂 7板
+item.itemPlateDoubleLithium7.name=双重锂 7板
+item.itemIngotThorium232.name=钍-232锭
+item.itemDustThorium232.name=钍-232粉
+item.itemDustTinyThorium232.name=小撮钍-232粉
+item.itemDustSmallThorium232.name=小堆钍-232粉
+item.itemNuggetThorium232.name=钍-232粒
+item.itemPlateThorium232.name=钍-232板
+item.itemPlateDoubleThorium232.name=双重钍-232板
+item.itemIngotUranium232.name=铀-232锭
+item.itemDustUranium232.name=铀-232粉
+item.itemDustTinyUranium232.name=小撮铀-232粉
+item.itemDustSmallUranium232.name=小堆铀-232粉
+item.itemNuggetUranium232.name=铀-232粒
+item.itemPlateUranium232.name=铀-232板
+item.itemRodUranium232.name=铀-232杆
+item.itemRodLongUranium232.name=长铀-232杆
+item.itemIngotUranium233.name=铀-233锭
+item.itemDustUranium233.name=铀-233粉
+item.itemDustTinyUranium233.name=小撮铀-233粉
+item.itemDustSmallUranium233.name=小堆铀-233粉
+item.itemNuggetUranium233.name=铀-233粒
+item.itemPlateUranium233.name=铀-233板
+item.itemRodUranium233.name=铀-233杆
+item.itemRodLongUranium233.name=长铀-233杆
+item.itemIngotPlutonium238.name=钚-238锭
+item.itemDustPlutonium238.name=钚-238粉
+item.itemDustTinyPlutonium238.name=小撮钚-238粉
+item.itemDustSmallPlutonium238.name=小堆钚-238粉
+item.itemNuggetPlutonium238.name=钚-238粒
+item.itemPlatePlutonium238.name=钚-238板
+item.itemPlateDoublePlutonium238.name=双重钚-238板
+item.itemIngotStrontium90.name=锶-90锭
+item.itemDustStrontium90.name=锶-90粉
+item.itemDustTinyStrontium90.name=小撮锶-90粉
+item.itemDustSmallStrontium90.name=小堆锶-90粉
+item.itemNuggetStrontium90.name=锶-90粒
+item.itemPlateStrontium90.name=锶-90板
+item.itemPlateDoubleStrontium90.name=双重锶-90板
+item.itemIngotPolonium210.name=钋-210锭
+item.itemDustPolonium210.name=钋-210粉
+item.itemDustTinyPolonium210.name=小撮钋-210粉
+item.itemDustSmallPolonium210.name=小堆钋-210粉
+item.itemNuggetPolonium210.name=钋-210粒
+item.itemPlatePolonium210.name=钋-210板
+item.itemPlateDoublePolonium210.name=双重钋-210板
+item.itemIngotAmericium241.name=镅-241锭
+item.itemDustAmericium241.name=镅-241粉
+item.itemDustTinyAmericium241.name=小撮镅-241粉
+item.itemDustSmallAmericium241.name=小堆镅-241粉
+item.itemNuggetAmericium241.name=镅-241粒
+item.itemPlateAmericium241.name=镅-241板
+item.itemPlateDoubleAmericium241.name=双重镅-241板
+item.itemIngotSiliconCarbide.name=碳化硅锭
+item.itemDustSiliconCarbide.name=碳化硅粉
+item.itemDustTinySiliconCarbide.name=小撮碳化硅粉
+item.itemDustSmallSiliconCarbide.name=小堆碳化硅粉
+item.itemNuggetSiliconCarbide.name=碳化硅粒
+item.itemPlateSiliconCarbide.name=碳化硅板
+item.itemPlateDoubleSiliconCarbide.name=双重碳化硅板
+item.itemBoltSiliconCarbide.name=碳化硅螺栓
+item.itemRodSiliconCarbide.name=碳化硅杆
+item.itemRodLongSiliconCarbide.name=长碳化硅杆
+item.itemRingSiliconCarbide.name=碳化硅环
+item.itemScrewSiliconCarbide.name=碳化硅螺丝
+item.itemRotorSiliconCarbide.name=碳化硅转子
+item.itemGearSiliconCarbide.name=碳化硅齿轮
+item.itemIngotZirconiumCarbide.name=碳化锆锭
+item.itemHotIngotZirconiumCarbide.name=热碳化锆锭
+item.itemDustZirconiumCarbide.name=碳化锆粉
+item.itemDustTinyZirconiumCarbide.name=小撮碳化锆粉
+item.itemDustSmallZirconiumCarbide.name=小堆碳化锆粉
+item.itemNuggetZirconiumCarbide.name=碳化锆粒
+item.itemPlateZirconiumCarbide.name=碳化锆板
+item.itemPlateDoubleZirconiumCarbide.name=双重碳化锆板
+item.itemBoltZirconiumCarbide.name=碳化锆螺栓
+item.itemRodZirconiumCarbide.name=碳化锆杆
+item.itemRodLongZirconiumCarbide.name=长碳化锆杆
+item.itemRingZirconiumCarbide.name=碳化锆环
+item.itemScrewZirconiumCarbide.name=碳化锆螺丝
+item.itemRotorZirconiumCarbide.name=碳化锆转子
+item.itemGearZirconiumCarbide.name=碳化锆齿轮
+item.itemIngotTantalumCarbide.name=碳化钽锭
+item.itemHotIngotTantalumCarbide.name=热碳化钽锭
+item.itemDustTantalumCarbide.name=碳化钽粉
+item.itemDustTinyTantalumCarbide.name=小撮碳化钽粉
+item.itemDustSmallTantalumCarbide.name=小堆碳化钽粉
+item.itemNuggetTantalumCarbide.name=碳化钽粒
+item.itemPlateTantalumCarbide.name=碳化钽板
+item.itemPlateDoubleTantalumCarbide.name=双重碳化钽板
+item.itemBoltTantalumCarbide.name=碳化钽螺栓
+item.itemRodTantalumCarbide.name=碳化钽杆
+item.itemRodLongTantalumCarbide.name=长碳化钽杆
+item.itemRingTantalumCarbide.name=碳化钽环
+item.itemScrewTantalumCarbide.name=碳化钽螺丝
+item.itemRotorTantalumCarbide.name=碳化钽转子
+item.itemGearTantalumCarbide.name=碳化钽齿轮
+item.itemIngotNiobiumCarbide.name=碳化铌锭
+item.itemHotIngotNiobiumCarbide.name=热碳化铌锭
+item.itemDustNiobiumCarbide.name=碳化铌粉
+item.itemDustTinyNiobiumCarbide.name=小撮碳化铌粉
+item.itemDustSmallNiobiumCarbide.name=小堆碳化铌粉
+item.itemNuggetNiobiumCarbide.name=碳化铌粒
+item.itemPlateNiobiumCarbide.name=碳化铌板
+item.itemPlateDoubleNiobiumCarbide.name=双重碳化铌板
+item.itemBoltNiobiumCarbide.name=碳化铌螺栓
+item.itemRodNiobiumCarbide.name=碳化铌杆
+item.itemRodLongNiobiumCarbide.name=长碳化铌杆
+item.itemRingNiobiumCarbide.name=碳化铌环
+item.itemScrewNiobiumCarbide.name=碳化铌螺丝
+item.itemRotorNiobiumCarbide.name=碳化铌转子
+item.itemGearNiobiumCarbide.name=碳化铌齿轮
+item.itemIngotBerylliumFluoride.name=氟化铍锭
+item.itemDustBerylliumFluoride.name=氟化铍粉
+item.itemDustTinyBerylliumFluoride.name=小撮氟化铍粉
+item.itemDustSmallBerylliumFluoride.name=小堆氟化铍粉
+item.itemNuggetBerylliumFluoride.name=氟化铍粒
+item.itemPlateBerylliumFluoride.name=氟化铍板
+item.itemPlateDoubleBerylliumFluoride.name=双重氟化铍板
+item.itemIngotLithiumFluoride.name=氟化锂锭
+item.itemDustLithiumFluoride.name=氟化锂粉
+item.itemDustTinyLithiumFluoride.name=小撮氟化锂粉
+item.itemDustSmallLithiumFluoride.name=小堆氟化锂粉
+item.itemNuggetLithiumFluoride.name=氟化锂粒
+item.itemPlateLithiumFluoride.name=氟化锂板
+item.itemPlateDoubleLithiumFluoride.name=双重氟化锂板
+item.itemIngotThoriumTetrafluoride.name=四氟化钍锭
+item.itemDustThoriumTetrafluoride.name=四氟化钍粉
+item.itemDustTinyThoriumTetrafluoride.name=小撮四氟化钍粉
+item.itemDustSmallThoriumTetrafluoride.name=小堆四氟化钍粉
+item.itemNuggetThoriumTetrafluoride.name=四氟化钍粒
+item.itemPlateThoriumTetrafluoride.name=四氟化钍板
+item.itemPlateDoubleThoriumTetrafluoride.name=双重四氟化钍板
+item.itemIngotThoriumHexafluoride.name=六氟化钍锭
+item.itemDustThoriumHexafluoride.name=六氟化钍粉
+item.itemDustTinyThoriumHexafluoride.name=小撮六氟化钍粉
+item.itemDustSmallThoriumHexafluoride.name=小堆六氟化钍粉
+item.itemNuggetThoriumHexafluoride.name=六氟化钍粒
+item.itemPlateThoriumHexafluoride.name=六氟化钍板
+item.itemPlateDoubleThoriumHexafluoride.name=双重六氟化钍板
+item.itemIngotUraniumTetrafluoride.name=四氟化铀锭
+item.itemDustUraniumTetrafluoride.name=四氟化铀粉
+item.itemDustTinyUraniumTetrafluoride.name=小撮四氟化铀粉
+item.itemDustSmallUraniumTetrafluoride.name=小堆四氟化铀粉
+item.itemNuggetUraniumTetrafluoride.name=四氟化铀粒
+item.itemPlateUraniumTetrafluoride.name=四氟化铀板
+item.itemPlateDoubleUraniumTetrafluoride.name=双重四氟化铀板
+item.itemIngotUraniumHexafluoride.name=六氟化铀锭
+item.itemDustUraniumHexafluoride.name=六氟化铀粉
+item.itemDustTinyUraniumHexafluoride.name=小撮六氟化铀粉
+item.itemDustSmallUraniumHexafluoride.name=小堆六氟化铀粉
+item.itemNuggetUraniumHexafluoride.name=六氟化铀粒
+item.itemPlateUraniumHexafluoride.name=六氟化铀板
+item.itemPlateDoubleUraniumHexafluoride.name=双重六氟化铀板
+item.itemIngotZirconiumTetrafluoride.name=四氟化锆锭
+item.itemDustZirconiumTetrafluoride.name=四氟化锆粉
+item.itemDustTinyZirconiumTetrafluoride.name=小撮四氟化锆粉
+item.itemDustSmallZirconiumTetrafluoride.name=小堆四氟化锆粉
+item.itemNuggetZirconiumTetrafluoride.name=四氟化锆粒
+item.itemPlateZirconiumTetrafluoride.name=四氟化锆板
+item.itemPlateDoubleZirconiumTetrafluoride.name=双重四氟化锆板
+item.itemIngotNeptuniumHexafluoride.name=六氟化镎锭
+item.itemDustNeptuniumHexafluoride.name=六氟化镎粉
+item.itemDustTinyNeptuniumHexafluoride.name=小撮六氟化镎粉
+item.itemDustSmallNeptuniumHexafluoride.name=小堆六氟化镎粉
+item.itemNuggetNeptuniumHexafluoride.name=六氟化镎粒
+item.itemPlateNeptuniumHexafluoride.name=六氟化镎板
+item.itemPlateDoubleNeptuniumHexafluoride.name=双重六氟化镎板
+item.itemIngotTechnetiumHexafluoride.name=六氟化锝锭
+item.itemDustTechnetiumHexafluoride.name=六氟化锝粉
+item.itemDustTinyTechnetiumHexafluoride.name=小撮六氟化锝粉
+item.itemDustSmallTechnetiumHexafluoride.name=小堆六氟化锝粉
+item.itemNuggetTechnetiumHexafluoride.name=六氟化锝粒
+item.itemPlateTechnetiumHexafluoride.name=六氟化锝板
+item.itemPlateDoubleTechnetiumHexafluoride.name=双重六氟化锝板
+item.itemIngotSeleniumHexafluoride.name=六氟化硒锭
+item.itemDustSeleniumHexafluoride.name=六氟化硒粉
+item.itemDustTinySeleniumHexafluoride.name=小撮六氟化硒粉
+item.itemDustSmallSeleniumHexafluoride.name=小堆六氟化硒粉
+item.itemNuggetSeleniumHexafluoride.name=六氟化硒粒
+item.itemPlateSeleniumHexafluoride.name=六氟化硒板
+item.itemPlateDoubleSeleniumHexafluoride.name=双重六氟化硒板
+item.itemIngotLiFBeF2ZrF4U235.name=铀235复合氟化物锭
+item.itemDustLiFBeF2ZrF4U235.name=铀235复合氟化物粉
+item.itemDustTinyLiFBeF2ZrF4U235.name=小撮铀235复合氟化物粉
+item.itemDustSmallLiFBeF2ZrF4U235.name=小堆铀235复合氟化物粉
+item.itemNuggetLiFBeF2ZrF4U235.name=铀235复合氟化物粒
+item.itemPlateLiFBeF2ZrF4U235.name=铀235复合氟化物板
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=双重铀235复合氟化物板
+item.itemIngotLiFBeF2ZrF4UF4.name=铀锆复合氟化物锭
+item.itemDustLiFBeF2ZrF4UF4.name=铀锆复合氟化物粉
+item.itemDustTinyLiFBeF2ZrF4UF4.name=小撮铀锆复合氟化物粉
+item.itemDustSmallLiFBeF2ZrF4UF4.name=小堆铀锆复合氟化物粉
+item.itemNuggetLiFBeF2ZrF4UF4.name=铀锆复合氟化物粒
+item.itemPlateLiFBeF2ZrF4UF4.name=铀锆复合氟化物板
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=双重铀锆复合氟化物板
+item.itemIngotLiFBeF2ThF4UF4.name=铀钍复合氟化物锭
+item.itemDustLiFBeF2ThF4UF4.name=铀钍复合氟化物粉
+item.itemDustTinyLiFBeF2ThF4UF4.name=小撮铀钍复合氟化物粉
+item.itemDustSmallLiFBeF2ThF4UF4.name=小堆铀钍复合氟化物粉
+item.itemNuggetLiFBeF2ThF4UF4.name=铀钍复合氟化物粒
+item.itemPlateLiFBeF2ThF4UF4.name=铀钍复合氟化物板
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=双重铀钍复合氟化物板
+item.itemIngotEnergyCrystal.name=能量水晶锭
+item.itemHotIngotEnergyCrystal.name=热能量水晶锭
+item.itemDustEnergyCrystal.name=能量水晶粉
+item.itemDustTinyEnergyCrystal.name=小撮能量水晶粉
+item.itemDustSmallEnergyCrystal.name=小堆能量水晶粉
+item.itemNuggetEnergyCrystal.name=能量水晶粒
+item.itemPlateEnergyCrystal.name=能量水晶板
+item.itemPlateDoubleEnergyCrystal.name=双重能量水晶板
+item.itemBoltEnergyCrystal.name=能量水晶螺栓
+item.itemRodEnergyCrystal.name=能量水晶杆
+item.itemRodLongEnergyCrystal.name=长能量水晶杆
+item.itemRingEnergyCrystal.name=能量水晶环
+item.itemScrewEnergyCrystal.name=能量水晶螺丝
+item.itemRotorEnergyCrystal.name=能量水晶转子
+item.itemGearEnergyCrystal.name=能量水晶齿轮
+item.itemIngotBloodSteel.name=血钢锭
+item.itemDustBloodSteel.name=血钢粉
+item.itemDustTinyBloodSteel.name=小撮血钢粉
+item.itemDustSmallBloodSteel.name=小堆血钢粉
+item.itemNuggetBloodSteel.name=血钢粒
+item.itemPlateBloodSteel.name=血钢板
+item.itemPlateDoubleBloodSteel.name=双重血钢板
+item.itemBoltBloodSteel.name=血钢螺栓
+item.itemRodBloodSteel.name=血钢杆
+item.itemRodLongBloodSteel.name=长血钢杆
+item.itemRingBloodSteel.name=血钢环
+item.itemScrewBloodSteel.name=血钢螺丝
+item.itemRotorBloodSteel.name=血钢转子
+item.itemGearBloodSteel.name=血钢齿轮
+item.itemIngotZeron100.name=塞龙-100锭
+item.itemHotIngotZeron100.name=热塞龙-100锭
+item.itemDustZeron100.name=塞龙-100粉
+item.itemDustTinyZeron100.name=小撮塞龙-100粉
+item.itemDustSmallZeron100.name=小堆塞龙-100粉
+item.itemNuggetZeron100.name=塞龙-100粒
+item.itemPlateZeron100.name=塞龙-100板
+item.itemPlateDoubleZeron100.name=双重塞龙-100板
+item.itemBoltZeron100.name=塞龙-100螺栓
+item.itemRodZeron100.name=塞龙-100杆
+item.itemRodLongZeron100.name=长塞龙100杆
+item.itemRingZeron100.name=塞龙-100环
+item.itemScrewZeron100.name=塞龙-100螺丝
+item.itemRotorZeron100.name=塞龙-100转子
+item.itemGearZeron100.name=塞龙-100齿轮
+item.itemIngotTumbaga.name=铜金合金锭
+item.itemDustTumbaga.name=铜金合金粉
+item.itemDustTinyTumbaga.name=小撮铜金合金粉
+item.itemDustSmallTumbaga.name=小堆铜金合金粉
+item.itemNuggetTumbaga.name=铜金合金粒
+item.itemPlateTumbaga.name=铜金合金板
+item.itemPlateDoubleTumbaga.name=双重铜金合金板
+item.itemBoltTumbaga.name=铜金合金螺栓
+item.itemRodTumbaga.name=铜金合金杆
+item.itemRodLongTumbaga.name=长铜金合金杆
+item.itemRingTumbaga.name=铜金合金环
+item.itemScrewTumbaga.name=铜金合金螺丝
+item.itemRotorTumbaga.name=铜金合金转子
+item.itemGearTumbaga.name=铜金合金齿轮
+item.itemIngotPotin.name=粗青铜合金锭
+item.itemDustPotin.name=粗青铜合金粉
+item.itemDustTinyPotin.name=小撮粗青铜合金粉
+item.itemDustSmallPotin.name=小堆粗青铜合金粉
+item.itemNuggetPotin.name=粗青铜合金粒
+item.itemPlatePotin.name=粗青铜合金板
+item.itemPlateDoublePotin.name=双重粗青铜合金板
+item.itemBoltPotin.name=粗青铜合金螺栓
+item.itemRodPotin.name=粗青铜合金杆
+item.itemRodLongPotin.name=长粗青铜合金杆
+item.itemRingPotin.name=粗青铜合金环
+item.itemScrewPotin.name=粗青铜合金螺丝
+item.itemRotorPotin.name=粗青铜合金转子
+item.itemGearPotin.name=粗青铜合金齿轮
+item.itemIngotStaballoy.name=贫铀合金锭
+item.itemHotIngotStaballoy.name=热贫铀合金锭
+item.itemDustStaballoy.name=贫铀合金粉
+item.itemDustTinyStaballoy.name=小撮贫铀合金粉
+item.itemDustSmallStaballoy.name=小堆贫铀合金粉
+item.itemNuggetStaballoy.name=贫铀合金粒
+item.itemPlateStaballoy.name=贫铀合金板
+item.itemPlateDoubleStaballoy.name=双重贫铀合金板
+item.itemBoltStaballoy.name=贫铀合金螺栓
+item.itemRodStaballoy.name=贫铀合金杆
+item.itemRodLongStaballoy.name=长贫铀合金杆
+item.itemRingStaballoy.name=贫铀合金环
+item.itemScrewStaballoy.name=贫铀合金螺丝
+item.itemRotorStaballoy.name=贫铀合金转子
+item.itemGearStaballoy.name=贫铀合金齿轮
+item.itemIngotTantalloy60.name=钽钨合金-60锭
+item.itemHotIngotTantalloy60.name=热钽钨合金-60锭
+item.itemDustTantalloy60.name=钽钨合金-60粉
+item.itemDustTinyTantalloy60.name=小撮钽钨合金-60粉
+item.itemDustSmallTantalloy60.name=小堆钽钨合金-60粉
+item.itemNuggetTantalloy60.name=钽钨合金-60粒
+item.itemPlateTantalloy60.name=钽钨合金-60板
+item.itemPlateDoubleTantalloy60.name=双重钽钨合金-60板
+item.itemBoltTantalloy60.name=钽钨合金-60螺栓
+item.itemRodTantalloy60.name=钽钨合金-60杆
+item.itemRodLongTantalloy60.name=长钽钨合金-60杆
+item.itemRingTantalloy60.name=钽钨合金-60环
+item.itemScrewTantalloy60.name=钽钨合金-60螺丝
+item.itemRotorTantalloy60.name=钽钨合金-60转子
+item.itemGearTantalloy60.name=钽钨合金-60齿轮
+item.itemIngotTantalloy61.name=钽钨合金-61锭
+item.itemHotIngotTantalloy61.name=热钽钨合金-61锭
+item.itemDustTantalloy61.name=钽钨合金-61粉
+item.itemDustTinyTantalloy61.name=小撮钽钨合金-61粉
+item.itemDustSmallTantalloy61.name=小堆钽钨合金-61粉
+item.itemNuggetTantalloy61.name=钽钨合金-61粒
+item.itemPlateTantalloy61.name=钽钨合金-61板
+item.itemPlateDoubleTantalloy61.name=双重钽钨合金-61板
+item.itemBoltTantalloy61.name=钽钨合金-61螺栓
+item.itemRodTantalloy61.name=钽钨合金-61杆
+item.itemRodLongTantalloy61.name=长钽钨合金-61杆
+item.itemRingTantalloy61.name=钽钨合金-61环
+item.itemScrewTantalloy61.name=钽钨合金-61螺丝
+item.itemRotorTantalloy61.name=钽钨合金-61转子
+item.itemGearTantalloy61.name=钽钨合金-61齿轮
+item.itemIngotInconel625.name=镍铬基合金-625锭
+item.itemHotIngotInconel625.name=热镍铬基合金-625锭
+item.itemDustInconel625.name=镍铬基合金-625粉
+item.itemDustTinyInconel625.name=小撮镍铬基合金-625粉
+item.itemDustSmallInconel625.name=小堆镍铬基合金-625粉
+item.itemNuggetInconel625.name=镍铬基合金-625粒
+item.itemPlateInconel625.name=镍铬基合金-625板
+item.itemPlateDoubleInconel625.name=双重镍铬基合金-625板
+item.itemBoltInconel625.name=镍铬基合金-625螺栓
+item.itemRodInconel625.name=镍铬基合金-625杆
+item.itemRodLongInconel625.name=长镍铬基合金-625杆
+item.itemRingInconel625.name=镍铬基合金-625环
+item.itemScrewInconel625.name=镍铬基合金-625螺丝
+item.itemRotorInconel625.name=镍铬基合金-625转子
+item.itemGearInconel625.name=镍铬基合金-625齿轮
+item.itemIngotInconel690.name=镍铬基合金-690锭
+item.itemHotIngotInconel690.name=热镍铬基合金-690锭
+item.itemDustInconel690.name=镍铬基合金-690粉
+item.itemDustTinyInconel690.name=小撮镍铬基合金-690粉
+item.itemDustSmallInconel690.name=小堆镍铬基合金-690粉
+item.itemNuggetInconel690.name=镍铬基合金-690粒
+item.itemPlateInconel690.name=镍铬基合金-690板
+item.itemPlateDoubleInconel690.name=双重镍铬基合金-690板
+item.itemBoltInconel690.name=镍铬基合金-690螺栓
+item.itemRodInconel690.name=镍铬基合金-690杆
+item.itemRodLongInconel690.name=长镍铬基合金-690杆
+item.itemRingInconel690.name=镍铬基合金-690环
+item.itemScrewInconel690.name=镍铬基合金-690螺丝
+item.itemRotorInconel690.name=镍铬基合金-690转子
+item.itemGearInconel690.name=镍铬基合金-690齿轮
+item.itemIngotInconel792.name=镍铬基合金-792锭
+item.itemHotIngotInconel792.name=热镍铬基合金-792锭
+item.itemDustInconel792.name=镍铬基合金-792粉
+item.itemDustTinyInconel792.name=小撮镍铬基合金-792粉
+item.itemDustSmallInconel792.name=小堆镍铬基合金-792粉
+item.itemNuggetInconel792.name=镍铬基合金-792粒
+item.itemPlateInconel792.name=镍铬基合金-792板
+item.itemPlateDoubleInconel792.name=双重镍铬基合金-792板
+item.itemBoltInconel792.name=镍铬基合金-792螺栓
+item.itemRodInconel792.name=镍铬基合金-792杆
+item.itemRodLongInconel792.name=长镍铬基合金-792杆
+item.itemRingInconel792.name=镍铬基合金-792环
+item.itemScrewInconel792.name=镍铬基合金-792螺丝
+item.itemRotorInconel792.name=镍铬基合金-792转子
+item.itemGearInconel792.name=镍铬基合金-792齿轮
+item.itemDustEglinSteelBaseCompound.name=埃格林钢基础化合物粉
+item.itemDustTinyEglinSteelBaseCompound.name=小撮埃格林钢基础化合物粉
+item.itemDustSmallEglinSteelBaseCompound.name=小堆埃格林钢基础化合物粉
+item.itemIngotEglinSteel.name=埃格林钢锭
+item.itemDustEglinSteel.name=埃格林钢粉
+item.itemDustTinyEglinSteel.name=小撮埃格林钢粉
+item.itemDustSmallEglinSteel.name=小堆埃格林钢粉
+item.itemNuggetEglinSteel.name=埃格林钢粒
+item.itemPlateEglinSteel.name=埃格林钢板
+item.itemPlateDoubleEglinSteel.name=双重埃格林钢板
+item.itemBoltEglinSteel.name=埃格林钢螺栓
+item.itemRodEglinSteel.name=埃格林钢杆
+item.itemRodLongEglinSteel.name=长埃格林钢杆
+item.itemRingEglinSteel.name=埃格林钢环
+item.itemScrewEglinSteel.name=埃格林钢螺丝
+item.itemRotorEglinSteel.name=埃格林钢转子
+item.itemGearEglinSteel.name=埃格林钢齿轮
+item.itemIngotMaragingSteel250.name=马氏体时效钢250锭
+item.itemHotIngotMaragingSteel250.name=热马氏体时效钢250锭
+item.itemDustMaragingSteel250.name=马氏体时效钢250粉
+item.itemDustTinyMaragingSteel250.name=小撮马氏体时效钢250粉
+item.itemDustSmallMaragingSteel250.name=小堆马氏体时效钢250粉
+item.itemNuggetMaragingSteel250.name=马氏体时效钢250粒
+item.itemPlateMaragingSteel250.name=马氏体时效钢250板
+item.itemPlateDoubleMaragingSteel250.name=双重马氏体时效钢250板
+item.itemBoltMaragingSteel250.name=马氏体时效钢250螺栓
+item.itemRodMaragingSteel250.name=马氏体时效钢250杆
+item.itemRodLongMaragingSteel250.name=长马氏体时效钢250杆
+item.itemRingMaragingSteel250.name=马氏体时效钢250环
+item.itemScrewMaragingSteel250.name=马氏体时效钢250螺丝
+item.itemRotorMaragingSteel250.name=马氏体时效钢250转子
+item.itemGearMaragingSteel250.name=马氏体时效钢250齿轮
+item.itemIngotMaragingSteel300.name=马氏体时效钢300锭
+item.itemHotIngotMaragingSteel300.name=热马氏体时效钢300锭
+item.itemDustMaragingSteel300.name=马氏体时效钢300粉
+item.itemDustTinyMaragingSteel300.name=小撮马氏体时效钢300粉
+item.itemDustSmallMaragingSteel300.name=小堆马氏体时效钢300粉
+item.itemNuggetMaragingSteel300.name=马氏体时效钢300粒
+item.itemPlateMaragingSteel300.name=马氏体时效钢300板
+item.itemPlateDoubleMaragingSteel300.name=双重马氏体时效钢300板
+item.itemBoltMaragingSteel300.name=马氏体时效钢300螺栓
+item.itemRodMaragingSteel300.name=马氏体时效钢300杆
+item.itemRodLongMaragingSteel300.name=长马氏体时效钢300杆
+item.itemRingMaragingSteel300.name=马氏体时效钢300环
+item.itemScrewMaragingSteel300.name=马氏体时效钢300螺丝
+item.itemRotorMaragingSteel300.name=马氏体时效钢300转子
+item.itemGearMaragingSteel300.name=马氏体时效钢300齿轮
+item.itemIngotMaragingSteel350.name=马氏体时效钢350锭
+item.itemHotIngotMaragingSteel350.name=热马氏体时效钢350锭
+item.itemDustMaragingSteel350.name=马氏体时效钢350粉
+item.itemDustTinyMaragingSteel350.name=小撮马氏体时效钢350粉
+item.itemDustSmallMaragingSteel350.name=小堆马氏体时效钢350粉
+item.itemNuggetMaragingSteel350.name=马氏体时效钢350粒
+item.itemPlateMaragingSteel350.name=马氏体时效钢350板
+item.itemPlateDoubleMaragingSteel350.name=双重马氏体时效钢350板
+item.itemBoltMaragingSteel350.name=马氏体时效钢350螺栓
+item.itemRodMaragingSteel350.name=马氏体时效钢350杆
+item.itemRodLongMaragingSteel350.name=长马氏体时效钢350杆
+item.itemRingMaragingSteel350.name=马氏体时效钢350环
+item.itemScrewMaragingSteel350.name=马氏体时效钢350螺丝
+item.itemRotorMaragingSteel350.name=马氏体时效钢350转子
+item.itemGearMaragingSteel350.name=马氏体时效钢350齿轮
+item.itemIngotStellite.name=铬钴锰钛合金锭
+item.itemHotIngotStellite.name=热铬钴锰钛合金锭
+item.itemDustStellite.name=铬钴锰钛合金粉
+item.itemDustTinyStellite.name=小撮铬钴锰钛合金粉
+item.itemDustSmallStellite.name=小堆铬钴锰钛合金粉
+item.itemNuggetStellite.name=铬钴锰钛合金粒
+item.itemPlateStellite.name=铬钴锰钛合金板
+item.itemPlateDoubleStellite.name=双重铬钴锰钛合金板
+item.itemBoltStellite.name=铬钴锰钛合金螺栓
+item.itemRodStellite.name=铬钴锰钛合金杆
+item.itemRodLongStellite.name=长铬钴锰钛合金杆
+item.itemRingStellite.name=铬钴锰钛合金环
+item.itemScrewStellite.name=铬钴锰钛合金螺丝
+item.itemRotorStellite.name=铬钴锰钛合金转子
+item.itemGearStellite.name=铬钴锰钛合金齿轮
+item.itemIngotTalonite.name=铬钴磷酸盐合金锭
+item.itemDustTalonite.name=铬钴磷酸盐合金粉
+item.itemDustTinyTalonite.name=小撮铬钴磷酸盐合金粉
+item.itemDustSmallTalonite.name=小堆铬钴磷酸盐合金粉
+item.itemNuggetTalonite.name=铬钴磷酸盐合金粒
+item.itemPlateTalonite.name=铬钴磷酸盐合金板
+item.itemPlateDoubleTalonite.name=双重铬钴磷酸盐合金板
+item.itemBoltTalonite.name=铬钴磷酸盐合金螺栓
+item.itemRodTalonite.name=铬钴磷酸盐合金杆
+item.itemRodLongTalonite.name=长铬钴磷酸盐合金杆
+item.itemRingTalonite.name=铬钴磷酸盐合金环
+item.itemScrewTalonite.name=铬钴磷酸盐合金螺丝
+item.itemRotorTalonite.name=铬钴磷酸盐合金转子
+item.itemGearTalonite.name=铬钴磷酸盐合金齿轮
+item.itemIngotHastelloyW.name=哈斯特洛依合金-W锭
+item.itemDustHastelloyW.name=哈斯特洛依合金-W粉
+item.itemDustTinyHastelloyW.name=小撮哈斯特洛依合金-W粉
+item.itemDustSmallHastelloyW.name=小堆哈斯特洛依合金-W粉
+item.itemNuggetHastelloyW.name=哈斯特洛依合金-W粒
+item.itemPlateHastelloyW.name=哈斯特洛依合金-W板
+item.itemPlateDoubleHastelloyW.name=双重哈斯特洛依合金-W板
+item.itemBoltHastelloyW.name=哈斯特洛依合金-W螺栓
+item.itemRodHastelloyW.name=哈斯特洛依合金-W杆
+item.itemRodLongHastelloyW.name=长哈斯特洛依合金-W杆
+item.itemRingHastelloyW.name=哈斯特洛依合金-W环
+item.itemScrewHastelloyW.name=哈斯特洛依合金-W螺丝
+item.itemRotorHastelloyW.name=哈斯特洛依合金-W转子
+item.itemGearHastelloyW.name=哈斯特洛依合金-W齿轮
+item.itemIngotHastelloyX.name=哈斯特洛依合金-X锭
+item.itemDustHastelloyX.name=哈斯特洛依合金-X粉
+item.itemDustTinyHastelloyX.name=小撮哈斯特洛依合金-X粉
+item.itemDustSmallHastelloyX.name=小堆哈斯特洛依合金-X粉
+item.itemNuggetHastelloyX.name=哈斯特洛依合金-X粒
+item.itemPlateHastelloyX.name=哈斯特洛依合金-X板
+item.itemPlateDoubleHastelloyX.name=双重哈斯特洛依合金-X板
+item.itemBoltHastelloyX.name=哈斯特洛依合金-X螺栓
+item.itemRodHastelloyX.name=哈斯特洛依合金-X杆
+item.itemRodLongHastelloyX.name=长哈斯特洛依合金-X杆
+item.itemRingHastelloyX.name=哈斯特洛依合金-X环
+item.itemScrewHastelloyX.name=哈斯特洛依合金-X螺丝
+item.itemRotorHastelloyX.name=哈斯特洛依合金-X转子
+item.itemGearHastelloyX.name=哈斯特洛依合金-X齿轮
+item.itemIngotHastelloyC276.name=哈斯特洛依合金-C276锭
+item.itemHotIngotHastelloyC276.name=热哈斯特洛依合金-C276锭
+item.itemDustHastelloyC276.name=哈斯特洛依合金-C276粉
+item.itemDustTinyHastelloyC276.name=小撮哈斯特洛依合金-C276粉
+item.itemDustSmallHastelloyC276.name=小堆哈斯特洛依合金-C276粉
+item.itemNuggetHastelloyC276.name=哈斯特洛依合金-C276粒
+item.itemPlateHastelloyC276.name=哈斯特洛依合金-C276板
+item.itemPlateDoubleHastelloyC276.name=双重哈斯特洛依合金-C276板
+item.itemBoltHastelloyC276.name=哈斯特洛依合金-C276螺栓
+item.itemRodHastelloyC276.name=哈斯特洛依合金-C276杆
+item.itemRodLongHastelloyC276.name=长哈斯特洛依合金-C276杆
+item.itemRingHastelloyC276.name=哈斯特洛依合金-C276环
+item.itemScrewHastelloyC276.name=哈斯特洛依合金-C276螺丝
+item.itemRotorHastelloyC276.name=哈斯特洛依合金-C276转子
+item.itemGearHastelloyC276.name=哈斯特洛依合金-C276齿轮
+item.itemIngotHastelloyN.name=哈斯特洛依合金-N锭
+item.itemHotIngotHastelloyN.name=热哈斯特洛依合金-N锭
+item.itemDustHastelloyN.name=哈斯特洛依合金-N粉
+item.itemDustTinyHastelloyN.name=小撮哈斯特洛依合金-N粉
+item.itemDustSmallHastelloyN.name=小堆哈斯特洛依合金-N粉
+item.itemNuggetHastelloyN.name=哈斯特洛依合金-N粒
+item.itemPlateHastelloyN.name=哈斯特洛依合金-N板
+item.itemPlateDoubleHastelloyN.name=双重哈斯特洛依合金-N板
+item.itemBoltHastelloyN.name=哈斯特洛依合金-N螺栓
+item.itemRodHastelloyN.name=哈斯特洛依合金-N杆
+item.itemRodLongHastelloyN.name=长哈斯特洛依合金-N杆
+item.itemRingHastelloyN.name=哈斯特洛依合金-N环
+item.itemScrewHastelloyN.name=哈斯特洛依合金-N螺丝
+item.itemRotorHastelloyN.name=哈斯特洛依合金-N转子
+item.itemGearHastelloyN.name=哈斯特洛依合金-N齿轮
+item.itemIngotIncoloy020.name=耐热铬铁合金-020锭
+item.itemDustIncoloy020.name=耐热铬铁合金-020粉
+item.itemDustTinyIncoloy020.name=小撮耐热铬铁合金-020粉
+item.itemDustSmallIncoloy020.name=小堆耐热铬铁合金-020粉
+item.itemNuggetIncoloy020.name=耐热铬铁合金-020粒
+item.itemPlateIncoloy020.name=耐热铬铁合金-020板
+item.itemPlateDoubleIncoloy020.name=双重耐热铬铁合金-020板
+item.itemBoltIncoloy020.name=耐热铬铁合金-020螺栓
+item.itemRodIncoloy020.name=耐热铬铁合金-020杆
+item.itemRodLongIncoloy020.name=长耐热铬铁合金-020杆
+item.itemRingIncoloy020.name=耐热铬铁合金-020环
+item.itemScrewIncoloy020.name=耐热铬铁合金-020螺丝
+item.itemRotorIncoloy020.name=耐热铬铁合金-020转子
+item.itemGearIncoloy020.name=耐热铬铁合金-020齿轮
+item.itemIngotIncoloyDS.name=耐热铬铁合金-DS锭
+item.itemDustIncoloyDS.name=耐热铬铁合金-DS粉
+item.itemDustTinyIncoloyDS.name=小撮耐热铬铁合金-DS粉
+item.itemDustSmallIncoloyDS.name=小堆耐热铬铁合金-DS粉
+item.itemNuggetIncoloyDS.name=耐热铬铁合金-DS粒
+item.itemPlateIncoloyDS.name=耐热铬铁合金-DS板
+item.itemPlateDoubleIncoloyDS.name=双重耐热铬铁合金-DS板
+item.itemBoltIncoloyDS.name=耐热铬铁合金-DS螺栓
+item.itemRodIncoloyDS.name=耐热铬铁合金-DS杆
+item.itemRodLongIncoloyDS.name=长耐热铬铁合金-DS杆
+item.itemRingIncoloyDS.name=耐热铬铁合金-DS环
+item.itemScrewIncoloyDS.name=耐热铬铁合金-DS螺丝
+item.itemRotorIncoloyDS.name=耐热铬铁合金-DS转子
+item.itemGearIncoloyDS.name=耐热铬铁合金-DS齿轮
+item.itemIngotIncoloyMA956.name=耐热铬铁合金-MA956锭
+item.itemHotIngotIncoloyMA956.name=热耐热铬铁合金-MA956锭
+item.itemDustIncoloyMA956.name=耐热铬铁合金-MA956粉
+item.itemDustTinyIncoloyMA956.name=小撮耐热铬铁合金-MA956粉
+item.itemDustSmallIncoloyMA956.name=小堆耐热铬铁合金-MA956粉
+item.itemNuggetIncoloyMA956.name=耐热铬铁合金-MA956粒
+item.itemPlateIncoloyMA956.name=耐热铬铁合金-MA956板
+item.itemPlateDoubleIncoloyMA956.name=双重耐热铬铁合金-MA956板
+item.itemBoltIncoloyMA956.name=耐热铬铁合金-MA956螺栓
+item.itemRodIncoloyMA956.name=耐热铬铁合金-MA956杆
+item.itemRodLongIncoloyMA956.name=长耐热铬铁合金-MA956杆
+item.itemRingIncoloyMA956.name=耐热铬铁合金-MA956环
+item.itemScrewIncoloyMA956.name=耐热铬铁合金-MA956螺丝
+item.itemRotorIncoloyMA956.name=耐热铬铁合金-MA956转子
+item.itemGearIncoloyMA956.name=耐热铬铁合金-MA956齿轮
+item.itemIngotGrisium.name=灰钛合金锭
+item.itemHotIngotGrisium.name=热灰钛合金锭
+item.itemDustGrisium.name=灰钛合金粉
+item.itemDustTinyGrisium.name=小撮灰钛合金粉
+item.itemDustSmallGrisium.name=小堆灰钛合金粉
+item.itemNuggetGrisium.name=灰钛合金粒
+item.itemPlateGrisium.name=灰钛合金板
+item.itemPlateDoubleGrisium.name=双重灰钛合金板
+item.itemBoltGrisium.name=灰钛合金螺栓
+item.itemRodGrisium.name=灰钛合金杆
+item.itemRodLongGrisium.name=长灰钛合金杆
+item.itemRingGrisium.name=灰钛合金环
+item.itemScrewGrisium.name=灰钛合金螺丝
+item.itemRotorGrisium.name=灰钛合金转子
+item.itemGearGrisium.name=灰钛合金齿轮
+item.itemIngotHG1223.name=HG-1223锭
+item.itemDustHG1223.name=HG-1223粉
+item.itemDustTinyHG1223.name=小撮HG-1223粉
+item.itemDustSmallHG1223.name=小堆HG-1223粉
+item.itemNuggetHG1223.name=HG-1223粒
+item.itemPlateHG1223.name=HG-1223板
+item.itemPlateDoubleHG1223.name=双重HG-1223板
+item.itemIngotTrinium.name=三元金属锭
+item.itemDustTrinium.name=三元金属粉
+item.itemDustTinyTrinium.name=小撮三元金属粉
+item.itemDustSmallTrinium.name=小堆三元金属粉
+item.itemNuggetTrinium.name=三元金属粒
+item.itemPlateTrinium.name=三元金属板
+item.itemPlateDoubleTrinium.name=双重三元金属板
+item.itemIngotRefinedTrinium.name=精制三元金属锭
+item.itemDustRefinedTrinium.name=精制三元金属粉
+item.itemDustTinyRefinedTrinium.name=小撮精制三元金属粉
+item.itemDustSmallRefinedTrinium.name=小堆精制三元金属粉
+item.itemNuggetRefinedTrinium.name=精制三元金属粒
+item.itemPlateRefinedTrinium.name=精制三元金属板
+item.itemPlateDoubleRefinedTrinium.name=双重精制三元金属板
+item.itemIngotTriniumTitaniumAlloy.name=三元钛合金锭
+item.itemHotIngotTriniumTitaniumAlloy.name=热三元钛合金锭
+item.itemDustTriniumTitaniumAlloy.name=三元钛合金粉
+item.itemDustTinyTriniumTitaniumAlloy.name=小撮三元钛合金粉
+item.itemDustSmallTriniumTitaniumAlloy.name=小堆三元钛合金粉
+item.itemNuggetTriniumTitaniumAlloy.name=三元钛合金粒
+item.itemPlateTriniumTitaniumAlloy.name=三元钛合金板
+item.itemPlateDoubleTriniumTitaniumAlloy.name=双重三元钛合金板
+item.itemBoltTriniumTitaniumAlloy.name=三元钛合金螺栓
+item.itemRodTriniumTitaniumAlloy.name=三元钛合金杆
+item.itemRodLongTriniumTitaniumAlloy.name=长三元钛合金杆
+item.itemRingTriniumTitaniumAlloy.name=三元钛合金环
+item.itemScrewTriniumTitaniumAlloy.name=三元钛合金螺丝
+item.itemRotorTriniumTitaniumAlloy.name=三元钛合金转子
+item.itemGearTriniumTitaniumAlloy.name=三元钛合金齿轮
+item.itemIngotTriniumNaquadahAlloy.name=三元硅岩合金锭
+item.itemDustTriniumNaquadahAlloy.name=三元硅岩合金粉
+item.itemDustTinyTriniumNaquadahAlloy.name=小撮三元硅岩合金粉
+item.itemDustSmallTriniumNaquadahAlloy.name=小堆三元硅岩合金粉
+item.itemNuggetTriniumNaquadahAlloy.name=三元硅岩合金粒
+item.itemPlateTriniumNaquadahAlloy.name=三元硅岩合金板
+item.itemPlateDoubleTriniumNaquadahAlloy.name=双重三元硅岩合金板
+item.itemIngotTriniumNaquadahCarbonite.name=碳化三元硅岩合金锭
+item.itemHotIngotTriniumNaquadahCarbonite.name=热碳化三元硅岩合金锭
+item.itemDustTriniumNaquadahCarbonite.name=碳化三元硅岩合金粉
+item.itemDustTinyTriniumNaquadahCarbonite.name=小撮碳化三元硅岩合金粉
+item.itemDustSmallTriniumNaquadahCarbonite.name=小堆碳化三元硅岩合金粉
+item.itemNuggetTriniumNaquadahCarbonite.name=碳化三元硅岩合金粒
+item.itemPlateTriniumNaquadahCarbonite.name=碳化三元硅岩合金板
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=双重碳化三元硅岩合金板
+item.itemBoltTriniumNaquadahCarbonite.name=碳化三元硅岩合金螺栓
+item.itemRodTriniumNaquadahCarbonite.name=碳化三元硅岩合金杆
+item.itemRodLongTriniumNaquadahCarbonite.name=长碳化三元硅岩合金杆
+item.itemRingTriniumNaquadahCarbonite.name=碳化三元硅岩合金环
+item.itemScrewTriniumNaquadahCarbonite.name=碳化三元硅岩合金螺丝
+item.itemRotorTriniumNaquadahCarbonite.name=碳化三元硅岩合金转子
+item.itemGearTriniumNaquadahCarbonite.name=碳化三元硅岩合金齿轮
+item.itemIngotQuantum.name=量子合金锭
+item.itemHotIngotQuantum.name=热量子合金锭
+item.itemDustQuantum.name=量子合金粉
+item.itemDustTinyQuantum.name=小撮量子合金粉
+item.itemDustSmallQuantum.name=小堆量子合金粉
+item.itemNuggetQuantum.name=量子合金粒
+item.itemPlateQuantum.name=量子合金板
+item.itemPlateDoubleQuantum.name=双重量子合金板
+item.itemBoltQuantum.name=量子合金螺栓
+item.itemRodQuantum.name=量子合金杆
+item.itemRodLongQuantum.name=长量子合金杆
+item.itemRingQuantum.name=量子合金环
+item.itemScrewQuantum.name=量子合金螺丝
+item.itemRotorQuantum.name=量子合金转子
+item.itemGearQuantum.name=量子合金齿轮
+item.itemDustFluoriteF.name=氟石(F)粉
+item.itemDustTinyFluoriteF.name=小撮氟石(F)粉
+item.itemDustSmallFluoriteF.name=小堆氟石(F)粉
+item.crushedFluoriteF.name=粉碎的氟石(F)矿石
+item.crushedCentrifugedFluoriteF.name=离心氟石(F)矿石
+item.crushedPurifiedFluoriteF.name=洗净的氟石(F)矿石
+item.dustImpureFluoriteF.name=含杂氟石(F)粉
+item.dustPureFluoriteF.name=洁净氟石(F)粉
+item.itemDustCrocoite.name=赤铅矿粉
+item.itemDustTinyCrocoite.name=小撮赤铅矿粉
+item.itemDustSmallCrocoite.name=小堆赤铅矿粉
+item.crushedCrocoite.name=粉碎的赤铅矿矿石
+item.crushedCentrifugedCrocoite.name=离心赤铅矿矿石
+item.crushedPurifiedCrocoite.name=洗净的赤铅矿矿石
+item.dustImpureCrocoite.name=含杂赤铅矿粉
+item.dustPureCrocoite.name=洁净赤铅矿粉
+item.itemDustGeikielite.name=镁钛矿粉
+item.itemDustTinyGeikielite.name=小撮镁钛矿粉
+item.itemDustSmallGeikielite.name=小堆镁钛矿粉
+item.crushedGeikielite.name=粉碎的镁钛矿矿石
+item.crushedCentrifugedGeikielite.name=离心镁钛矿矿石
+item.crushedPurifiedGeikielite.name=洗净的镁钛矿矿石
+item.dustImpureGeikielite.name=含杂镁钛矿粉
+item.dustPureGeikielite.name=洁净镁钛矿粉
+item.itemDustNichromite.name=镍铬矿粉
+item.itemDustTinyNichromite.name=小撮镍铬矿粉
+item.itemDustSmallNichromite.name=小堆镍铬矿粉
+item.crushedNichromite.name=粉碎的镍铬矿矿石
+item.crushedCentrifugedNichromite.name=离心镍铬矿矿石
+item.crushedPurifiedNichromite.name=洗净的镍铬矿矿石
+item.dustImpureNichromite.name=含杂镍铬矿粉
+item.dustPureNichromite.name=洁净镍铬矿粉
+item.itemDustTitanite.name=榍石粉
+item.itemDustTinyTitanite.name=小撮榍石粉
+item.itemDustSmallTitanite.name=小堆榍石粉
+item.crushedTitanite.name=粉碎的榍石矿石
+item.crushedCentrifugedTitanite.name=离心榍石矿石
+item.crushedPurifiedTitanite.name=洗净的榍石矿石
+item.dustImpureTitanite.name=含杂榍石粉
+item.dustPureTitanite.name=洁净榍石粉
+item.itemDustZimbabweite.name=钛铌铅钠石粉
+item.itemDustTinyZimbabweite.name=小撮钛铌铅钠石粉
+item.itemDustSmallZimbabweite.name=小堆钛铌铅钠石粉
+item.crushedZimbabweite.name=粉碎的钛铌铅钠石矿石
+item.crushedCentrifugedZimbabweite.name=离心钛铌铅钠石矿石
+item.crushedPurifiedZimbabweite.name=洗净的钛铌铅钠石矿石
+item.dustImpureZimbabweite.name=含杂钛铌铅钠石粉
+item.dustPureZimbabweite.name=洁净钛铌铅钠石粉
+item.itemDustZirconolite.name=钛锆钍矿粉
+item.itemDustTinyZirconolite.name=小撮钛锆钍矿粉
+item.itemDustSmallZirconolite.name=小堆钛锆钍矿粉
+item.crushedZirconolite.name=粉碎的钛锆钍矿矿石
+item.crushedCentrifugedZirconolite.name=离心钛锆钍矿矿石
+item.crushedPurifiedZirconolite.name=洗净的钛锆钍矿矿石
+item.dustImpureZirconolite.name=含杂钛锆钍矿粉
+item.dustPureZirconolite.name=洁净钛锆钍矿粉
+item.itemDustGadoliniteCe.name=硅铍钇矿(Ce)粉
+item.itemDustTinyGadoliniteCe.name=小撮硅铍钇矿(Ce)粉
+item.itemDustSmallGadoliniteCe.name=小堆硅铍钇矿(Ce)粉
+item.crushedGadoliniteCe.name=粉碎的硅铍钇矿(Ce)矿石
+item.crushedCentrifugedGadoliniteCe.name=离心硅铍钇矿(Ce)矿石
+item.crushedPurifiedGadoliniteCe.name=洗净的硅铍钇矿(Ce)矿石
+item.dustImpureGadoliniteCe.name=含杂硅铍钇矿(Ce)粉
+item.dustPureGadoliniteCe.name=洁净硅铍钇矿(Ce)粉
+item.itemDustGadoliniteY.name=硅铍钇矿(Y)粉
+item.itemDustTinyGadoliniteY.name=小撮硅铍钇矿(Y)粉
+item.itemDustSmallGadoliniteY.name=小堆硅铍钇矿(Y)粉
+item.crushedGadoliniteY.name=粉碎的硅铍钇矿(Y)矿石
+item.crushedCentrifugedGadoliniteY.name=离心硅铍钇矿(Y)矿石
+item.crushedPurifiedGadoliniteY.name=洗净的硅铍钇矿(Y)矿石
+item.dustImpureGadoliniteY.name=含杂硅铍钇矿(Y)粉
+item.dustPureGadoliniteY.name=洁净硅铍钇矿(Y)粉
+item.itemDustLepersonnite.name=绿泥石粉
+item.itemDustTinyLepersonnite.name=小撮绿泥石粉
+item.itemDustSmallLepersonnite.name=小堆绿泥石粉
+item.crushedLepersonnite.name=粉碎的绿泥石矿石
+item.crushedCentrifugedLepersonnite.name=离心绿泥石矿石
+item.crushedPurifiedLepersonnite.name=洗净的绿泥石矿石
+item.dustImpureLepersonnite.name=含杂绿泥石粉
+item.dustPureLepersonnite.name=洁净绿泥石粉
+item.itemDustSamarskiteY.name=铌钇矿(Y)粉
+item.itemDustTinySamarskiteY.name=小撮铌钇矿(Y)粉
+item.itemDustSmallSamarskiteY.name=小堆铌钇矿(Y)粉
+item.crushedSamarskiteY.name=粉碎的铌钇矿(Y)矿石
+item.crushedCentrifugedSamarskiteY.name=离心铌钇矿(Y)矿石
+item.crushedPurifiedSamarskiteY.name=洗净的铌钇矿(Y)矿石
+item.dustImpureSamarskiteY.name=含杂铌钇矿(Y)粉
+item.dustPureSamarskiteY.name=洁净铌钇矿(Y)粉
+item.itemDustSamarskiteYb.name=铌钇矿(Yb)粉
+item.itemDustTinySamarskiteYb.name=小撮铌钇矿(Yb)粉
+item.itemDustSmallSamarskiteYb.name=小堆铌钇矿(Yb)粉
+item.crushedSamarskiteYb.name=粉碎的铌钇矿(Yb)矿石
+item.crushedCentrifugedSamarskiteYb.name=离心铌钇矿(Yb)矿石
+item.crushedPurifiedSamarskiteYb.name=洗净的铌钇矿(Yb)矿石
+item.dustImpureSamarskiteYb.name=含杂铌钇矿(Yb)粉
+item.dustPureSamarskiteYb.name=洁净铌钇矿(Yb)粉
+item.itemDustXenotime.name=磷钇矿粉
+item.itemDustTinyXenotime.name=小撮磷钇矿粉
+item.itemDustSmallXenotime.name=小堆磷钇矿粉
+item.crushedXenotime.name=粉碎的磷钇矿矿石
+item.crushedCentrifugedXenotime.name=离心磷钇矿矿石
+item.crushedPurifiedXenotime.name=洗净的磷钇矿矿石
+item.dustImpureXenotime.name=含杂磷钇矿粉
+item.dustPureXenotime.name=洁净磷钇矿粉
+item.itemDustYttriaite.name=钇矿粉
+item.itemDustTinyYttriaite.name=小撮钇矿粉
+item.itemDustSmallYttriaite.name=小堆钇矿粉
+item.crushedYttriaite.name=粉碎的钇矿矿石
+item.crushedCentrifugedYttriaite.name=离心钇矿矿石
+item.crushedPurifiedYttriaite.name=洗净的钇矿矿石
+item.dustImpureYttriaite.name=含杂钇矿粉
+item.dustPureYttriaite.name=洁净钇矿粉
+item.itemDustYttrialite.name=硅钍钇矿粉
+item.itemDustTinyYttrialite.name=小撮硅钍钇矿粉
+item.itemDustSmallYttrialite.name=小堆硅钍钇矿粉
+item.crushedYttrialite.name=粉碎的硅钍钇矿矿石
+item.crushedCentrifugedYttrialite.name=离心硅钍钇矿矿石
+item.crushedPurifiedYttrialite.name=洗净的硅钍钇矿矿石
+item.dustImpureYttrialite.name=含杂硅钍钇矿粉
+item.dustPureYttrialite.name=洁净硅钍钇矿粉
+item.itemDustYttrocerite.name=铈钇矿粉
+item.itemDustTinyYttrocerite.name=小撮铈钇矿粉
+item.itemDustSmallYttrocerite.name=小堆铈钇矿粉
+item.crushedYttrocerite.name=粉碎的铈钇矿矿石
+item.crushedCentrifugedYttrocerite.name=离心铈钇矿矿石
+item.crushedPurifiedYttrocerite.name=洗净的铈钇矿矿石
+item.dustImpureYttrocerite.name=含杂铈钇矿粉
+item.dustPureYttrocerite.name=洁净铈钇矿粉
+item.itemDustZircon.name=锆石粉
+item.itemDustTinyZircon.name=小撮锆石粉
+item.itemDustSmallZircon.name=小堆锆石粉
+item.crushedZircon.name=粉碎的锆石矿石
+item.crushedCentrifugedZircon.name=离心锆石矿石
+item.crushedPurifiedZircon.name=洗净的锆石矿石
+item.dustImpureZircon.name=含杂锆石粉
+item.dustPureZircon.name=洁净锆石粉
+item.itemDustPolycrase.name=锗铀钇矿粉
+item.itemDustTinyPolycrase.name=小撮锗铀钇矿粉
+item.itemDustSmallPolycrase.name=小堆锗铀钇矿粉
+item.crushedPolycrase.name=粉碎的锗铀钇矿矿石
+item.crushedCentrifugedPolycrase.name=离心锗铀钇矿矿石
+item.crushedPurifiedPolycrase.name=洗净的锗铀钇矿矿石
+item.dustImpurePolycrase.name=含杂锗铀钇矿粉
+item.dustPurePolycrase.name=洁净锗铀钇矿粉
+item.itemDustZircophyllite.name=锆星叶石粉
+item.itemDustTinyZircophyllite.name=小撮锆星叶石粉
+item.itemDustSmallZircophyllite.name=小堆锆星叶石粉
+item.crushedZircophyllite.name=粉碎的锆星叶石矿石
+item.crushedCentrifugedZircophyllite.name=离心锆星叶石矿石
+item.crushedPurifiedZircophyllite.name=洗净的锆星叶石矿石
+item.dustImpureZircophyllite.name=含杂锆星叶石粉
+item.dustPureZircophyllite.name=洁净锆星叶石粉
+item.itemDustZirkelite.name=锆英石粉
+item.itemDustTinyZirkelite.name=小撮锆英石粉
+item.itemDustSmallZirkelite.name=小堆锆英石粉
+item.crushedZirkelite.name=粉碎的锆英石矿石
+item.crushedCentrifugedZirkelite.name=离心锆英石矿石
+item.crushedPurifiedZirkelite.name=洗净的锆英石矿石
+item.dustImpureZirkelite.name=含杂锆英石粉
+item.dustPureZirkelite.name=洁净锆英石粉
+item.itemDustLanthaniteLa.name=镧石(La)粉
+item.itemDustTinyLanthaniteLa.name=小撮镧石(La)粉
+item.itemDustSmallLanthaniteLa.name=小堆镧石(La)粉
+item.crushedLanthaniteLa.name=粉碎的镧石(La)矿石
+item.crushedCentrifugedLanthaniteLa.name=离心镧石(La)矿石
+item.crushedPurifiedLanthaniteLa.name=洗净的镧石(La)矿石
+item.dustImpureLanthaniteLa.name=含杂镧石(La)粉
+item.dustPureLanthaniteLa.name=洁净镧石(La)粉
+item.itemDustLanthaniteCe.name=镧石(Ce)粉
+item.itemDustTinyLanthaniteCe.name=小撮镧石(Ce)粉
+item.itemDustSmallLanthaniteCe.name=小堆镧石(Ce)粉
+item.crushedLanthaniteCe.name=粉碎的镧石(Ce)矿石
+item.crushedCentrifugedLanthaniteCe.name=离心镧石(Ce)矿石
+item.crushedPurifiedLanthaniteCe.name=洗净的镧石(Ce)矿石
+item.dustImpureLanthaniteCe.name=含杂镧石(Ce)粉
+item.dustPureLanthaniteCe.name=洁净镧石(Ce)粉
+item.itemDustLanthaniteNd.name=镧石(Nd)粉
+item.itemDustTinyLanthaniteNd.name=小撮镧石(Nd)粉
+item.itemDustSmallLanthaniteNd.name=小堆镧石(Nd)粉
+item.crushedLanthaniteNd.name=粉碎的镧石(Nd)矿石
+item.crushedCentrifugedLanthaniteNd.name=离心镧石(Nd)矿石
+item.crushedPurifiedLanthaniteNd.name=洗净的镧石(Nd)矿石
+item.dustImpureLanthaniteNd.name=含杂镧石(Nd)粉
+item.dustPureLanthaniteNd.name=洁净镧石(Nd)粉
+item.itemDustAgarditeY.name=菱铁矿(Y)粉
+item.itemDustTinyAgarditeY.name=小撮菱铁矿(Y)粉
+item.itemDustSmallAgarditeY.name=小堆菱铁矿(Y)粉
+item.crushedAgarditeY.name=粉碎的菱铁矿(Y)矿石
+item.crushedCentrifugedAgarditeY.name=离心菱铁矿(Y)矿石
+item.crushedPurifiedAgarditeY.name=洗净的菱铁矿(Y)矿石
+item.dustImpureAgarditeY.name=含杂菱铁矿(Y)粉
+item.dustPureAgarditeY.name=洁净菱铁矿(Y)粉
+item.itemDustAgarditeCd.name=菱铁矿(Cd)粉
+item.itemDustTinyAgarditeCd.name=小撮菱铁矿(Cd)粉
+item.itemDustSmallAgarditeCd.name=小堆菱铁矿(Cd)粉
+item.crushedAgarditeCd.name=粉碎的菱铁矿(Cd)矿石
+item.crushedCentrifugedAgarditeCd.name=离心菱铁矿(Cd)矿石
+item.crushedPurifiedAgarditeCd.name=洗净的菱铁矿(Cd)矿石
+item.dustImpureAgarditeCd.name=含杂菱铁矿(Cd)粉
+item.dustPureAgarditeCd.name=洁净菱铁矿(Cd)粉
+item.itemDustAgarditeLa.name=菱铁矿(La)粉
+item.itemDustTinyAgarditeLa.name=小撮菱铁矿(La)粉
+item.itemDustSmallAgarditeLa.name=小堆菱铁矿(La)粉
+item.crushedAgarditeLa.name=粉碎的菱铁矿(La)矿石
+item.crushedCentrifugedAgarditeLa.name=离心菱铁矿(La)矿石
+item.crushedPurifiedAgarditeLa.name=洗净的菱铁矿(La)矿石
+item.dustImpureAgarditeLa.name=含杂菱铁矿(La)粉
+item.dustPureAgarditeLa.name=洁净菱铁矿(La)粉
+item.itemDustAgarditeNd.name=菱铁矿(Nd)粉
+item.itemDustTinyAgarditeNd.name=小撮菱铁矿(Nd)粉
+item.itemDustSmallAgarditeNd.name=小堆菱铁矿(Nd)粉
+item.crushedAgarditeNd.name=粉碎的菱铁矿(Nd)矿石
+item.crushedCentrifugedAgarditeNd.name=离心菱铁矿(Nd)矿石
+item.crushedPurifiedAgarditeNd.name=洗净的菱铁矿(Nd)矿石
+item.dustImpureAgarditeNd.name=含杂菱铁矿(Nd)粉
+item.dustPureAgarditeNd.name=洁净菱铁矿(Nd)粉
+item.itemDustHibonite.name=黑铝钙石粉
+item.itemDustTinyHibonite.name=小撮黑铝钙石粉
+item.itemDustSmallHibonite.name=小堆黑铝钙石粉
+item.crushedHibonite.name=粉碎的黑铝钙石矿石
+item.crushedCentrifugedHibonite.name=离心黑铝钙石矿石
+item.crushedPurifiedHibonite.name=洗净的黑铝钙石矿石
+item.dustImpureHibonite.name=含杂黑铝钙石粉
+item.dustPureHibonite.name=洁净黑铝钙石粉
+item.itemDustCerite.name=铈硅石粉
+item.itemDustTinyCerite.name=小撮铈硅石粉
+item.itemDustSmallCerite.name=小堆铈硅石粉
+item.crushedCerite.name=粉碎的铈硅石矿石
+item.crushedCentrifugedCerite.name=离心铈硅石矿石
+item.crushedPurifiedCerite.name=洗净的铈硅石矿石
+item.dustImpureCerite.name=含杂铈硅石粉
+item.dustPureCerite.name=洁净铈硅石粉
+item.itemDustFluorcaphite.name=氟碳铈矿粉
+item.itemDustTinyFluorcaphite.name=小撮氟碳铈矿粉
+item.itemDustSmallFluorcaphite.name=小堆氟碳铈矿粉
+item.crushedFluorcaphite.name=粉碎的氟碳铈矿矿石
+item.crushedCentrifugedFluorcaphite.name=离心氟碳铈矿矿石
+item.crushedPurifiedFluorcaphite.name=洗净的氟碳铈矿矿石
+item.dustImpureFluorcaphite.name=含杂氟碳铈矿粉
+item.dustPureFluorcaphite.name=洁净氟碳铈矿粉
+item.itemDustFlorencite.name=磷铝铈矿粉
+item.itemDustTinyFlorencite.name=小撮磷铝铈矿粉
+item.itemDustSmallFlorencite.name=小堆磷铝铈矿粉
+item.crushedFlorencite.name=粉碎的磷铝铈矿矿石
+item.crushedCentrifugedFlorencite.name=离心磷铝铈矿矿石
+item.crushedPurifiedFlorencite.name=洗净的磷铝铈矿矿石
+item.dustImpureFlorencite.name=含杂磷铝铈矿粉
+item.dustPureFlorencite.name=洁净磷铝铈矿粉
+item.itemDustCryoliteF.name=冰晶石(F)粉
+item.itemDustTinyCryoliteF.name=小撮冰晶石(F)粉
+item.itemDustSmallCryoliteF.name=小堆冰晶石(F)粉
+item.crushedCryoliteF.name=粉碎的冰晶石(F)矿石
+item.crushedCentrifugedCryoliteF.name=离心冰晶石(F)矿石
+item.crushedPurifiedCryoliteF.name=洗净的冰晶石(F)矿石
+item.dustImpureCryoliteF.name=含杂冰晶石(F)粉
+item.dustPureCryoliteF.name=洁净冰晶石(F)粉
+item.itemDustTinyYellorium.name=小撮黄铀矿粉
+item.itemDustSmallYellorium.name=小堆黄铀矿粉
+item.crushedYellorium.name=粉碎的黄铀矿矿石
+item.crushedCentrifugedYellorium.name=离心黄铀矿矿石
+item.crushedPurifiedYellorium.name=洗净的黄铀矿矿石
+item.dustImpureYellorium.name=含杂黄铀矿粉
+item.dustPureYellorium.name=洁净黄铀矿粉
+
+//Shards
+item.itemDrained.name=枯竭碎片
+item.itemDustInfusedAir.name=风之魔晶粉
+item.itemDustInfusedFire.name=火之魔晶粉
+item.itemDustInfusedEarth.name=地之魔晶粉
+item.itemDustInfusedWater.name=水之魔晶粉
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=碳酸锂粉
+item.itemDustSmallLithiumCarbonate.name=小堆碳酸锂粉
+item.itemDustTinyLithiumCarbonate.name=小撮碳酸锂粉
+item.itemDustLithiumPeroxide.name=过氧化锂粉
+item.itemDustSmallLithiumPeroxide.name=小堆过氧化锂粉
+item.itemDustTinyLithiumPeroxide.name=小撮过氧化锂粉
+item.itemDustLithiumHydroxide.name=氢氧化锂粉
+item.itemDustSmallLithiumHydroxide.name=小堆氢氧化锂粉
+item.itemDustTinyLithiumHydroxide.name=小撮氢氧化锂粉
+item.itemDustCalciumHydroxide.name=氢氧化钙粉
+item.itemDustSmallCalciumHydroxide.name=小堆氢氧化钙粉
+item.itemDustTinyCalciumHydroxide.name=小撮氢氧化钙粉
+item.itemDustCalciumCarbonate.name=碳酸钙粉
+item.itemDustSmallCalciumCarbonate.name=小堆碳酸钙粉
+item.itemDustTinyCalciumCarbonate.name=小撮碳酸钙粉
+item.itemDustGypsum.name=硫酸钙(石膏)粉
+item.itemDustSmallGypsum.name=小堆硫酸钙(石膏)粉
+item.itemDustTinyGypsum.name=小撮硫酸钙(石膏)粉
+item.itemDustLi2CO3CaOH2.name=碳酸锂+氢氧化钙复合物粉
+item.itemDustSmallLi2CO3CaOH2.name=小堆碳酸锂+氢氧化钙复合物粉
+item.itemDustTinyLi2CO3CaOH2.name=小撮碳酸锂+氢氧化钙复合物粉
+item.itemDustLi2BeF4.name=Li2BeF4 燃料复合物粉
+item.itemDustSmallLi2BeF4.name=小堆Li2BeF4燃料复合物粉
+item.itemDustTinyLi2BeF4.name=小撮Li2BeF4燃料复合物粉
+item.Li2BeF4.name=Li2BeF4单元
+item.itemCircuitLFTR.name=§a§a控制电路
+item.itemZirconiumPellet.name=锆颗粒[氯化锆]
+item.itemDustZrCl4.name=氯化锆粉
+item.itemDustSmallZrCl4.name=小堆氯化锆粉
+item.itemDustTinyZrCl4.name=小撮氯化锆粉
+item.itemDustCookedZrCl4.name=焙烧过的氯化锆粉
+item.itemDustSmallCookedZrCl4.name=小堆焙烧过的氯化锆粉
+item.itemDustTinyCookedZrCl4.name=小撮焙烧过的氯化锆粉
+item.itemDustUN18Fertiliser.name=流体肥料UN-18粉
+item.itemDustSmallUN18Fertiliser.name=小堆流体肥料UN-18粉
+item.itemDustTinyUN18Fertiliser.name=小撮流体肥料un-18粉
+item.itemDustUN32Fertiliser.name=流体肥料UN-32粉
+item.itemDustSmallUN32Fertiliser.name=小堆流体肥料UN-32粉
+item.itemDustTinyUN32Fertiliser.name=小撮流体肥料UN-32粉
+
+
+//Multitools
+item.AluminiumMultipick.name=铝复合稿
+item.AluminiumMultispade.name=铝复合铲
+item.BerylliumMultispade.name=铍复合铲
+item.BismuthMultispade.name=铋复合铲
+item.CarbonMultispade.name=碳复合铲
+item.ChromeMultipick.name=铬复合稿
+item.ChromeMultispade.name=铬复合铲
+item.CobaltMultipick.name=钴复合稿
+item.CobaltMultispade.name=钴复合铲
+item.GoldMultispade.name=金复合铲
+item.IridiumMultipick.name=铱复合稿
+item.IridiumMultispade.name=铱复合铲
+item.IronMultipick.name=铁复合稿
+item.IronMultispade.name=铁复合铲
+item.LeadMultispade.name=铅复合铲
+item.ManganeseMultipick.name=锰复合稿
+item.ManganeseMultispade.name=锰复合铲
+item.MolybdenumMultipick.name=钼复合稿
+item.MolybdenumMultispade.name=钼复合铲
+item.NeodymiumMultipick.name=钕复合镐
+item.NeodymiumMultispade.name=钕复合铲
+item.NeutroniumMultipick.name=中子素复合镐
+item.NeutroniumMultispade.name=中子素复合铲
+item.NickelMultispade.name=镍复合铲
+item.OsmiumMultipick.name=锇复合镐
+item.OsmiumMultispade.name=锇复合铲
+item.PalladiumMultipick.name=钯复合镐
+item.PalladiumMultispade.name=钯复合铲
+item.PlatinumMultispade.name=铂复合铲
+item.Plutonium241Multipick.name=钚-241复合镐
+item.Plutonium241Multispade.name=钚-241复合铲
+item.SilverMultispade.name=银复合铲
+item.ThoriumMultipick.name=钍复合镐
+item.ThoriumMultispade.name=钍复合铲
+item.TitaniumMultipick.name=钛复合镐
+item.TitaniumMultispade.name=钛复合铲
+item.TungstenMultipick.name=钨复合镐
+item.TungstenMultispade.name=钨复合铲
+item.Uranium235Multipick.name=铀-235复合镐
+item.Uranium235Multispade.name=铀-235复合铲
+item.DarkSteelMultipick.name=玄钢复合镐
+item.DarkSteelMultispade.name=玄钢复合铲
+item.DuraniumMultipick.name=铿铀复合镐
+item.DuraniumMultispade.name=铿铀复合铲
+item.InfusedGoldMultispade.name=注魔金复合铲
+item.NaquadahMultipick.name=硅岩复合镐
+item.NaquadahMultispade.name=硅岩复合铲
+item.NaquadahAlloyMultipick.name=硅岩合金复合镐
+item.NaquadahAlloyMultispade.name=硅岩合金复合铲
+item.NaquadriaMultipick.name=超能硅岩复合镐
+item.NaquadriaMultispade.name=超能硅岩复合铲
+item.TritaniumMultipick.name=三钛复合镐
+item.TritaniumMultispade.name=三钛复合铲
+item.OsmiridiumMultipick.name=铱锇合金复合镐
+item.OsmiridiumMultispade.name=铱锇合金复合铲
+item.BrassMultispade.name=黄铜复合铲
+item.BronzeMultipick.name=青铜复合镐
+item.BronzeMultispade.name=青铜复合铲
+item.CupronickelMultispade.name=白铜复合铲
+item.ElectrumMultispade.name=琥珀金复合铲
+item.InvarMultipick.name=殷钢复合镐
+item.InvarMultispade.name=殷钢复合铲
+item.KanthalMultispade.name=坎塔尔合金复合铲
+item.MagnaliumMultipick.name=镁铝合金复合镐
+item.MagnaliumMultispade.name=镁铝合金复合铲
+item.NichromeMultispade.name=镍铬合金复合铲
+item.PigIronMultipick.name=生铁复合镐
+item.PigIronMultispade.name=生铁复合铲
+item.PolycaprolactamMultispade.name=聚己内酰胺复合铲
+item.PolytetrafluoroethyleneMultispade.name=聚四氟乙烯复合铲
+item.NickelZincFerriteMultispade.name=镍锌铁氧体复合铲
+item.PolyphenyleneSulfideMultispade.name=聚苯硫醚复合铲
+item.StainlessSteelMultipick.name=不锈钢复合镐
+item.StainlessSteelMultispade.name=不锈钢复合铲
+item.SteelMultipick.name=钢复合镐
+item.SteelMultispade.name=钢复合铲
+item.TinAlloyMultispade.name=锡铁合金复合铲
+item.UltimetMultipick.name=哈氏合金复合镐
+item.UltimetMultispade.name=哈氏合金复合铲
+item.WroughtIronMultipick.name=锻铁复合镐
+item.WroughtIronMultispade.name=锻铁复合铲
+item.SterlingSilverMultipick.name=标准纯银复合镐
+item.SterlingSilverMultispade.name=标准纯银复合铲
+item.RoseGoldMultipick.name=玫瑰金复合镐
+item.RoseGoldMultispade.name=玫瑰金复合铲
+item.BlackBronzeMultipick.name=黑青铜复合镐
+item.BlackBronzeMultispade.name=黑青铜复合铲
+item.BismuthBronzeMultipick.name=铋青铜复合镐
+item.BismuthBronzeMultispade.name=铋青铜复合铲
+item.BlackSteelMultipick.name=黑钢复合镐
+item.BlackSteelMultispade.name=黑钢复合铲
+item.RedSteelMultipick.name=红钢复合镐
+item.RedSteelMultispade.name=红钢复合铲
+item.BlueSteelMultipick.name=蓝钢复合镐
+item.BlueSteelMultispade.name=蓝钢复合铲
+item.DamascusSteelMultipick.name=大马士革钢复合镐
+item.DamascusSteelMultispade.name=大马士革钢复合铲
+item.MithrilMultispade.name=秘银复合铲
+item.CobaltBrassMultipick.name=钴黄铜复合镐
+item.CobaltBrassMultispade.name=钴黄铜复合铲
+item.ThaumiumMultipick.name=神秘锭复合镐
+item.ThaumiumMultispade.name=神秘锭复合铲
+item.HSSGMultipick.name=高速钢-G复合镐
+item.HSSGMultispade.name=高速钢-G复合铲
+item.HSSEMultipick.name=高速钢-E复合镐
+item.HSSEMultispade.name=高速钢-E复合铲
+item.HSSSMultipick.name=高速钢-S复合镐
+item.HSSSMultispade.name=高速钢-S复合铲
+item.HastelloyC276Multipick.name=哈斯特洛依合金-C276复合镐
+item.HastelloyC276Multispade.name=哈斯特洛依合金-C276复合铲
+item.HastelloyNMultipick.name=哈斯特洛依合金-N复合镐
+item.HastelloyNMultispade.name=哈斯特洛依合金-N复合铲
+item.HastelloyWMultipick.name=哈斯特洛依合金-W复合镐
+item.HastelloyWMultispade.name=哈斯特洛依合金-W复合铲
+item.HastelloyXMultipick.name=哈斯特洛依合金-X复合镐
+item.HastelloyXMultispade.name=哈斯特洛依合金-X复合铲
+item.Incoloy020Multipick.name=耐热铬铁合金-020复合镐
+item.Incoloy020Multispade.name=耐热铬铁合金-020复合铲
+item.IncoloyDSMultipick.name=耐热铬铁合金-DS复合镐
+item.IncoloyDSMultispade.name=耐热铬铁合金-DS复合铲
+item.IncoloyMA956Multipick.name=耐热铬铁合金-MA956复合镐
+item.IncoloyMA956Multispade.name=耐热铬铁合金-MA956复合铲
+item.Inconel625Multipick.name=镍铬基合金-625复合镐
+item.Inconel625Multispade.name=镍铬基合金-625复合铲
+item.Inconel690Multipick.name=镍铬基合金-690复合镐
+item.Inconel690Multispade.name=镍铬基合金-690复合铲
+item.Inconel792Multipick.name=镍铬基合金-792复合镐
+item.Inconel792Multispade.name=镍铬基合金-792复合铲
+item.GrisiumMultipick.name=灰钛合金复合镐
+item.GrisiumMultispade.name=灰钛合金复合铲
+item.Tantalloy60Multipick.name=钽钨合金-60复合镐
+item.Tantalloy60Multispade.name=钽钨合金-60复合铲
+item.Tantalloy61Multipick.name=钽钨合金-61复合镐
+item.Tantalloy61Multispade.name=钽钨合金-61复合铲
+item.StaballoyMultipick.name=贫铀合金复合镐
+item.StaballoyMultispade.name=贫铀合金复合铲
+item.QuantumMultipick.name=量子合金复合镐
+item.QuantumMultispade.name=量子合金复合铲
+item.PotinMultipick.name=粗青铜合金复合镐
+item.PotinMultispade.name=粗青铜合金复合铲
+item.TumbagaMultipick.name=铜金合金复合镐
+item.TumbagaMultispade.name=铜金合金复合铲
+item.TaloniteMultipick.name=铬钴磷酸盐合金复合镐
+item.TaloniteMultispade.name=铬钴磷酸盐合金复合铲
+item.StelliteMultipick.name=铬钴锰钛合金复合镐
+item.StelliteMultispade.name=铬钴锰钛合金复合铲
+item.TungstenCarbideMultipick.name=碳化钨复合镐
+item.TungstenCarbideMultispade.name=碳化钨复合铲
+item.TantalumCarbideMultipick.name=碳化钽复合镐
+item.TantalumCarbideMultispade.name=碳化钽复合铲
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=粘土板
+item.itemPlateDoubleClay.name=双重粘土板
+item.itemPlateLithium.name=锂板
+item.itemPlateDoubleEuropium.name=双重铕板
+
+//Gears
+item.itemSmallGearWroughtIron.name=小型锻铁齿轮
+
+//Misc
+item.itemFoilUranium235.name=铀235箔
+
+item.itemBoilerChassis_0.name=高级锅炉外壳[1级]
+item.itemDehydratorCoilWire_0.name=缠绕导线 [EV]
+item.itemDehydratorCoil_0.name=脱水线圈 [EV]
+item.itemAirFilter_0.name=空气过滤器
+item.itemAirFilter_1.name=空气过滤器
+item.itemLavaFilter.name=岩浆过滤器
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=龙捕获之壶
+item.CoalGas.name=煤气单元
+item.Ethylbenzene.name=乙苯单元
+item.Anthracene.name=蒽单元
+item.Toluene.name=甲苯单元
+item.CoalTar.name=煤焦油单元
+item.CoalTarOil.name=煤焦油单元
+item.SulfuricCoalTarOil.name=硫酸煤焦油单元
+item.Naphthalene.name=萘单元
+item.itemDustPhthalicAnhydride.name=邻苯二甲酸酐粉
+item.itemDustSmallPhthalicAnhydride.name=小堆邻苯二甲酸酐粉
+item.itemDustTinyPhthalicAnhydride.name=小撮邻苯二甲酸酐粉
+item.2Ethylanthraquinone.name=2-乙基蒽醌单元
+item.2Ethylanthrahydroquinone.name=2-乙基氢蒽醌单元
+item.HydrogenPeroxide.name=过氧化氢单元
+item.itemDustLithiumHydroperoxide.name=过氧化氢锂粉
+item.itemDustSmallLithiumHydroperoxide.name=小堆过氧化氢锂粉
+item.itemDustTinyLithiumHydroperoxide.name=小撮过氧化氢锂粉
+item.LithiumPeroxide.name=过氧化锂单元
+item.itemPotionChilly.name=冰凉药水
+item.itemKeyBig4000DC's.name=4000DC的大钥匙
+item.itemGemDull.name=沉闷宝石
+item.itemMushroomForest.name=森林蘑菇
+item.itemPlateVanadium.name=钒钢板
+item.thekeytothecity.name=通往城市的钥匙
+item.modularbauble.name=模块化饰品
+item.itemDustSoularium.name=魂金粉
+item.itemDustSmallSoularium.name=小堆魂金粉
+item.itemDustTinySoularium.name=小撮魂金粉
+item.itemDustRedstoneAlloy.name=红石合金粉
+item.itemDustSmallRedstoneAlloy.name=小堆红石合金粉
+item.itemDustTinyRedstoneAlloy.name=小撮红石合金粉
+item.itemDustElectricalSteel.name=磁钢粉
+item.itemDustSmallElectricalSteel.name=小堆磁钢粉
+item.itemDustTinyElectricalSteel.name=小撮磁钢粉
+item.itemDustPulsatingIron.name=脉冲铁粉
+item.itemDustSmallPulsatingIron.name=小堆脉冲铁粉
+item.itemDustTinyPulsatingIron.name=小撮脉冲铁粉
+item.itemDustEnergeticAlloy.name=充能合金粉
+item.itemDustSmallEnergeticAlloy.name=小堆充能合金粉
+item.itemDustTinyEnergeticAlloy.name=小撮充能合金粉
+item.itemDustVibrantAlloy.name=脉冲合金粉
+item.itemDustSmallVibrantAlloy.name=小堆脉冲合金粉
+item.itemDustTinyVibrantAlloy.name=小撮脉冲合金粉
+item.itemDustConductiveIron.name=导电铁粉
+item.itemDustSmallConductiveIron.name=小堆导电铁粉
+item.itemDustTinyConductiveIron.name=小撮导电铁粉
+item.itemPlateSoularium.name=魂金板
+item.itemPlateRedstoneAlloy.name=红石合金板
+item.itemPlateElectricalSteel.name=磁钢板
+item.itemPlatePhasedIron.name=脉冲铁板
+item.itemPlateEnergeticAlloy.name=充能合金板
+item.itemPlateVibrantAlloy.name=脉冲合金板
+item.itemPlateConductiveIron.name=导电铁板
+item.itemPlateBlutonium.name=蓝钚板
+item.itemPlateCyanite.name=蓝晶石板
+item.itemPlateLudicrite.name=纯镥板
+item.itemPlateVoid.name=虚空板
+item.itemPlateDimensionShard.name=维度碎片板
+item.rfEUBattery.name=通用充电电池
+item.personalCloakingDevice.name=§9§9个人隐形装置§7
+item.personalHealingDevice.name=§9§9个人纳米治疗加速器§r
+item.SlowBuildingRing.name=§e§e缓建指环§7
+item.itemStaballoyPickaxe.name=隧道挖掘者
+item.itemStaballoyAxe.name=树林砍伐者
+item.itemSandstoneHammer.name=圆石粉碎者
+item.itemBufferCore1.name=能量核心 [ULV]
+item.itemBufferCore2.name=能量核心 [LV]
+item.itemBufferCore3.name=能量核心 [MV]
+item.itemBufferCore4.name=能量核心 [HV]
+item.itemBufferCore5.name=能量核心 [EV]
+item.itemBufferCore6.name=能量核心 [IV]
+item.itemBufferCore7.name=能量核心 [LuV]
+item.itemBufferCore8.name=能量核心 [ZPM]
+item.itemBufferCore9.name=能量核心 [UV]
+item.itemBufferCore10.name=能量核心 [MAX]
+item.itemPLACEHOLDER_Circuit.name=夸克操纵者 (UV)
+item.itembookgt.name=§o§o热力锅炉手册
+
+// Everglade Items
+item.everglades.trigger.name=§6§6Alkalus圆盘[§c激活§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=雨林橡木
+tile.blockRainforestOakLeaves.name=橡树树叶
+tile.blockRainforestOakSapling.name=雨林橡树树苗
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=损坏
+tile.blockFastArcaneAlembic.1.name=损坏
+
+//Frame Boxes
+tile.Block of Selenium.name=硒块
+tile.Selenium Frame Box.name=硒框架
+tile.Block of Bromine.name=溴块
+tile.Block of Strontium.name=锶块
+tile.Strontium Frame Box.name=锶框架
+tile.Block of Zirconium.name=锆块
+tile.Zirconium Frame Box.name=锆框架
+tile.Block of Ruthenium.name=钌块
+tile.Ruthenium Frame Box.name=钌框架
+tile.Block of Iodine.name=碘块
+tile.Iodine Frame Box.name=碘框架
+tile.Block of Hafnium.name=铪块
+tile.Hafnium Frame Box.name=铪框架
+tile.Block of Dysprosium.name=镝块
+tile.Dysprosium Frame Box.name=镝框架
+tile.Block of Tellurium.name=碲块
+tile.Tellurium Frame Box.name=碲框架
+tile.Block of Rhodium.name=铑块
+tile.Rhodium Frame Box.name=铑框架
+tile.Block of Rhenium.name=铼块
+tile.Rhenium Frame Box.name=铼框架
+tile.Block of Thallium.name=铊块
+tile.Thallium Frame Box.name=铊框架
+tile.Block of Technetium.name=锝块
+tile.Block of Polonium.name=钋块
+tile.Block of Astatine.name=砹块
+tile.Block of Francium.name=钫块
+tile.Block of Radium.name=镭块
+tile.Block of Actinium.name=锕块
+tile.Block of Protactinium.name=镤块
+tile.Block of Neptunium.name=镎块
+tile.Block of Curium.name=锔块
+tile.Block of Berkelium.name=锫块
+tile.Block of Californium.name=锎块
+tile.Block of Einsteinium.name=锿块
+tile.Block of Fermium.name=镄块
+tile.Block of Thorium 232.name=钍-232块
+tile.Block of Uranium 232.name=铀-232块
+tile.Block of Uranium 233.name=铀-233块
+tile.Block of Plutonium-238.name=钚-238块
+tile.Block of Strontium-90.name=锶-90块
+tile.Block of Polonium-210.name=钋-210块
+tile.Block of Americium-241.name=镅-241块
+tile.Block of Silicon Carbide.name=碳化硅块
+tile.Silicon Carbide Frame Box.name=碳化硅框架
+tile.Block of Zirconium Carbide.name=碳化锆块
+tile.Zirconium Carbide Frame Box.name=碳化锆框架
+tile.Block of Tantalum Carbide.name=碳化钽块
+tile.Tantalum Carbide Frame Box.name=碳化钽框架
+tile.Block of Niobium Carbide.name=碳化铌块
+tile.Niobium Carbide Frame Box.name=碳化铌框架
+tile.Block of Beryllium Fluoride.name=氟化铍块
+tile.Block of Lithium Fluoride.name=氟化锂块
+tile.Block of Thorium Tetrafluoride.name=四氟化钍块
+tile.Block of Thorium Hexafluoride.name=六氟化钍块
+tile.Block of Uranium Tetrafluoride.name=四氟化铀块
+tile.Block of Uranium Hexafluoride.name=六氟化铀块
+tile.Block of Zirconium Tetrafluoride.name=四氟化锆块
+tile.Block of Neptunium Hexafluoride.name=六氟化镎块
+tile.Block of Technetium Hexafluoride.name=六氟化锝块
+tile.Block of Selenium Hexafluoride.name=六氟化硒块
+tile.Block of LiFBeF2ZrF4U235.name=铀235复合氟化物块
+tile.Block of LiFBeF2ZrF4UF4.name=铀锆复合氟化物块
+tile.Block of LiFBeF2ThF4UF4.name=铀钍复合氟化物块
+tile.Block of Energy Crystal.name=能量水晶块
+tile.Energy Crystal Frame Box.name=能量水晶框架
+tile.Block of Blood Steel.name=血钢块
+tile.Blood Steel Frame Box.name=血钢框架
+tile.Block of Zeron-100.name=塞龙-100块
+tile.Zeron-100 Frame Box.name=塞龙-100框架
+tile.Block of Tumbaga.name=铜金合金块
+tile.Tumbaga Frame Box.name=铜金合金框架
+tile.Block of Potin.name=粗青铜合金块
+tile.Potin Frame Box.name=粗青铜合金框架
+tile.Block of Staballoy.name=贫铀合金块
+tile.Staballoy Frame Box.name=贫铀合金框架
+tile.Block of Tantalloy-60.name=钽钨合金-60块
+tile.Tantalloy-60 Frame Box.name=钽钨合金-60框架
+tile.Block of Tantalloy-61.name=钽钨合金-61块
+tile.Tantalloy-61 Frame Box.name=钽钨合金-61框架
+tile.Block of Inconel-625.name=镍铬基合金-625块
+tile.Inconel-625 Frame Box.name=镍铬基合金-625框架
+tile.Block of Inconel-690.name=镍铬基合金-690块
+tile.Inconel-690 Frame Box.name=镍铬基合金-690框架
+tile.Block of Inconel-792.name=镍铬基合金-792块
+tile.Inconel-792 Frame Box.name=镍铬基合金-792框架
+tile.Block of Eglin Steel.name=埃格林钢块
+tile.Eglin Steel Frame Box.name=埃格林钢框架
+tile.Block of Maraging Steel 250.name=马氏体时效钢250块
+tile.Maraging Steel 250 Frame Box.name=马氏体时效钢250框架
+tile.Block of Maraging Steel 300.name=马氏体时效钢300块
+tile.Maraging Steel 300 Frame Box.name=马氏体时效钢300框架
+tile.Block of Maraging Steel 350.name=马氏体时效钢350块
+tile.Maraging Steel 350 Frame Box.name=马氏体时效钢350框架
+tile.Block of Stellite.name=铬钴锰钛合金块
+tile.Stellite Frame Box.name=铬钴锰钛合金框架
+tile.Block of Talonite.name=铬钴磷酸盐合金块
+tile.Talonite Frame Box.name=铬钴磷酸盐合金框架
+tile.Block of Hastelloy-W.name=哈斯特洛依合金-W块
+tile.Hastelloy-W Frame Box.name=哈斯特洛依合金-W框架
+tile.Block of Hastelloy-X.name=哈斯特洛依合金-X块
+tile.Hastelloy-X Frame Box.name=哈斯特洛依合金-X框架
+tile.Block of Hastelloy-C276.name=哈斯特洛依合金-C276块
+tile.Hastelloy-C276 Frame Box.name=哈斯特洛依合金-C276框架
+tile.Block of Hastelloy-N.name=哈斯特洛依合金-N块
+tile.Hastelloy-N Frame Box.name=哈斯特洛依合金-N框架
+tile.Block of Incoloy-020.name=耐热铬铁合金-020块
+tile.Incoloy-020 Frame Box.name=耐热铬铁合金-020框架
+tile.Block of Incoloy-DS.name=耐热铬铁合金-DS块
+tile.Incoloy-DS Frame Box.name=耐热铬铁合金-DS框架
+tile.Block of Incoloy-MA956.name=耐热铬铁合金-MA956块
+tile.Incoloy-MA956 Frame Box.name=耐热铬铁合金-MA956框架
+tile.Block of Grisium.name=灰钛合金块
+tile.Grisium Frame Box.name=灰钛合金框架
+tile.Block of Trinium.name=三元金属块
+tile.Block of Refined Trinium.name=精制三元金属块
+tile.Block of Trinium Titanium Alloy.name=三元钛合金块
+tile.Trinium Titanium Alloy Frame Box.name=三元钛合金框架
+tile.Block of Trinium Naquadah Alloy.name=三元硅岩合金块
+tile.Block of Trinium Naquadah Carbonite.name=碳化三元硅岩合金块
+tile.Trinium Naquadah Carbonite Frame Box.name=碳化三元硅岩合金框架
+tile.Block of Quantum.name=量子合金块
+tile.Quantum Frame Box.name=量子合金框架
+
+//Ores
+tile.OreFluoriteF.name=氟石(F)矿石
+tile.OreCrocoite.name=赤铅矿矿石
+tile.OreGeikielite.name=镁钛矿矿石
+tile.OreNichromite.name=镍铬矿矿石
+tile.OreTitanite.name=榍石矿石
+tile.OreZimbabweite.name=钛铌铅钠石矿石
+tile.OreZirconolite.name=钛锆钍矿矿石
+tile.OreGadoliniteCe.name=硅铍钇矿(Ce)矿石
+tile.OreGadoliniteY.name=硅铍钇矿(Y)矿石
+tile.OreLepersonnite.name=绿泥石矿石
+tile.OreSamarskiteY.name=铌钇矿(Y)矿石
+tile.OreSamarskiteYb.name=铌钇矿(Yb)矿石
+tile.OreXenotime.name=磷钇矿矿石
+tile.OreYttriaite.name=钇矿矿石
+tile.OreYttrialite.name=硅钍钇矿矿石
+tile.OreYttrocerite.name=铈钇矿矿石
+tile.OreZircon.name=锆石矿石
+tile.OrePolycrase.name=锗铀钇矿矿石
+tile.OreZircophyllite.name=锆星叶石矿石
+tile.OreZirkelite.name=锆英石矿石
+tile.OreLanthaniteLa.name=镧石(La)矿石
+tile.OreLanthaniteCe.name=镧石(Ce)矿石
+tile.OreLanthaniteNd.name=镧石(Nd)矿石
+tile.OreAgarditeY.name=菱铁矿(Y)矿石
+tile.OreAgarditeCd.name=菱铁矿(Cd)矿石
+tile.OreAgarditeLa.name=菱铁矿(La)矿石
+tile.OreAgarditeNd.name=菱铁矿(Nd)矿石
+tile.OreHibonite.name=黑铝钙石矿石
+tile.OreCerite.name=铈硅石矿石
+tile.OreFluorcaphite.name=氟碳铈矿矿石
+tile.OreFlorencite.name=磷铝铈矿矿石
+tile.OreCryoliteF.name=冰晶石(F)矿石
+
+//Misc
+tile.blockMFEffect.name=特殊
+tile.fluidBlockSludge.name=污泥
+tile.blockWorkbenchGT.name=工作台
+tile.blockWorkbenchGTAdvanced.name=高级工作台
+tile.blockHeliumGenerator.name=氦发生器
+tile.blockFirePit.name=火坑
+tile.blockFishTrap.name=捕鱼者
+tile.blockInfiniteFluidTank.name=无限流体储罐
+tile.blockMiningExplosives.name=矿用炸药
+tile.blockHellFire.name=地狱之火
+tile.blockProjectBench.name=工程台
+tile.blockTradeBench.name=贸易台
+tile.blockModularity.name=模块化工作台
+tile.blockBlackGate.name=凋灵笼子
+tile.blockTankXpConverter.name=经验转换器
+
+//Everglades Blocks
+tile.fluidSludge.0.name=不流动的废水
+tile.blockDarkWorldPortal.name=未来的掠影
+tile.blockDarkWorldGround.name=不稳定的土壤
+tile.blockDarkWorldGround2.name=污染的土壤
+tile.blockDarkWorldGround2.2.name=高度污染的土壤
+tile.blockDarkWorldPortalFrame.name=遏制框架
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=强化钢筋挖掘管道
+tile.blockMiningHeadFake.name=基岩钻头
+item.itemPlateMeatRaw.name=生肉板
+tile.Block of MeatRaw.name=生肉块
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=枯竭熔盐单元[铀钍复合氟化物]
+item.BurntLiFBeF2ZrF4UF4.name=枯竭熔盐单元[铀锆复合氟化物]
+item.BurntLiFBeF2ZrF4U235.name=枯竭熔盐单元[铀235复合氟化物]
+item.itemBigEgg.name= 盎司的大鸡蛋
+item.itemPlateSodium.name=钠板
+
+item.itemNuggetPromethium.name=钷粒
+item.itemIngotPromethium.name=钷锭
+item.itemDustSmallPromethium.name=小堆钷粉
+item.itemDustTinyPromethium.name=小撮钷粉
+item.itemDustPromethium.name=钷粉
+tile.Block of Promethium.name=钷块
+
+item.itemCellAmericium241.name=镅-241单元
+item.itemCellPolonium210.name=钋-210单元
+item.itemCellStrontium90.name=锶-90单元
+item.itemCellPlutonium238.name=钚-238单元
+
+entity.MiningCharge.name=采矿费用
+entity.throwablePotionSulfuric.name=硫酸烧瓶
+entity.throwablePotionHydrofluoric.name=氢氟酸烧瓶
+entity.toxinBall.name=毒素小球
+entity.plasmaBolt.name=等离子体
+entity.bigChickenFriendly.name=巨大的鸡
+
+//Added 26/6/18
+tile.OreTrinium.name=三元金属矿石
+item.crushedTrinium.name=粉碎三元金属矿石
+item.crushedCentrifugedTrinium.name=离心三元金属矿石
+item.crushedPurifiedTrinium.name=洗净的三元金属矿石
+item.dustImpureTrinium.name=含杂三元金属粉
+item.dustPureTrinium.name=洗净的三元金属粉
+
+//Added 1/7/18
+entity.WiseVillager.name=聪明的村民
+tile.blockMobSpawnerEx.0.name=刷怪笼
+tile.blockMobSpawnerEx.1.name=刷怪笼
+tile.blockMobSpawnerEx.2.name=刷怪笼
+tile.blockMobSpawnerEx.3.name=刷怪笼
+tile.blockMobSpawnerEx.4.name=刷怪笼
+tile.blockMobSpawnerEx.5.name=刷怪笼
+tile.blockMobSpawnerEx.6.name=刷怪笼
+tile.blockMobSpawnerEx.7.name=刷怪笼
+tile.blockMobSpawnerEx.8.name=刷怪笼
+tile.blockMobSpawnerEx.9.name=刷怪笼
+tile.blockMobSpawnerEx.10.name=刷怪笼
+tile.blockMobSpawnerEx.11.name=刷怪笼
+tile.blockMobSpawnerEx.12.name=刷怪笼
+tile.blockMobSpawnerEx.13.name=刷怪笼
+tile.blockMobSpawnerEx.14.name=刷怪笼
+tile.blockMobSpawnerEx.15.name=刷怪笼
+description.villager.profession.miscutils.banker=银行家
+description.villager.profession.miscutils.technician=GT技术员
+description.villager.profession.miscutils.trader=矿石交易员
+description.villager.profession.miscutils.aboriginal=澳大利亚土著
+
+//Added 23/8/18
+item.itemHatTinFoil.name=锡薄帽
+
+//Added 13/9/18
+entity.WiseVillager.name=聪明的村民
+entity.Aboriginal.name=澳大利亚土著
+entity.miscutils.constructStaballoy.name=贫铀合金结构
+entity.miscutils.sickBlaze.name=被感染的狂热者
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=四氟化锆单元
+item.Formaldehyde.name=甲醛单元
+item.RocketFuelMixA.name=H8N4C2O4火箭燃料单元
+item.RocketFuelMixB.name=RP-1火箭燃料单元
+item.RocketFuelMixC.name=CN3H7O3火箭燃料单元
+item.RocketFuelMixD.name=密集肼火箭燃料单元
+item.RP1Fuel.name=RP-1燃料单元
+item.Monomethylhydrazine.name=甲基肼单元
+item.Hydrazine.name=肼单元
+item.NitrogenTetroxide.name=四氧化二氮单元
+item.NitrousOxide.name=一氧化二氮单元
+item.AmmoniumNitrateSlurry.name=硝酸铵浆液单元
+item.Kerosene.name=煤油单元
+item.LiquidOxygen.name=液化氧单元[LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=硫砷铱矿石
+item.crushedIrarsite.name=粉碎硫砷铱矿石
+item.crushedCentrifugedIrarsite.name=离心粉碎硫砷铱矿石
+item.crushedPurifiedIrarsite.name=纯净粉碎硫砷铱矿石
+item.dustImpureIrarsite.name=含杂硫砷铱粉
+item.dustPureIrarsite.name=纯净硫砷铱粉
+item.itemDustIrarsite.name=硫砷铱粉
+item.itemDustTinyIrarsite.name=小撮硫砷铱粉
+item.itemDustSmallIrarsite.name=小堆硫砷铱粉
+
+tile.OreMiessiite.name=硅灰石矿石
+item.crushedMiessiite.name=粉碎硅灰石矿石
+item.crushedCentrifugedMiessiite.name=离心粉碎硅灰石矿石
+item.crushedPurifiedMiessiite.name=纯净硅灰石矿石
+item.dustImpureMiessiite.name=含杂硅灰石粉
+item.dustPureMiessiite.name=纯净硅灰石粉
+item.itemDustMiessiite.name=硅灰石粉
+item.itemDustTinyMiessiite.name=小撮硅灰石粉
+item.itemDustSmallMiessiite.name=小堆硅灰石粉
+
+tile.OreComancheite.name=溴汞石矿石
+item.crushedComancheite.name=粉碎溴汞石矿石
+item.crushedCentrifugedComancheite.name=离心粉碎溴汞石矿石
+item.crushedPurifiedComancheite.name=纯净粉碎溴汞石矿石
+item.dustImpureComancheite.name=含杂溴汞石矿石
+item.dustPureComancheite.name=纯净溴汞石粉
+item.itemDustComancheite.name=溴汞石粉
+item.itemDustTinyComancheite.name=小撮溴汞石粉
+item.itemDustSmallComancheite.name=小堆溴汞石粉
+
+tile.OreKoboldite.name=妖金矿石
+item.crushedKoboldite.name=粉碎妖金矿石
+item.crushedCentrifugedKoboldite.name=离心粉碎妖金矿石
+item.crushedPurifiedKoboldite.name=纯净粉碎妖金矿石
+item.dustImpureKoboldite.name=含杂妖金粉
+item.dustPureKoboldite.name=纯净妖金粉
+item.itemDustKoboldite.name=妖金粉
+item.itemDustTinyKoboldite.name=小撮妖金粉
+item.itemDustSmallKoboldite.name=小堆妖金粉
+
+tile.OrePerroudite.name=溴硫银汞矿石
+item.crushedPerroudite.name=粉碎溴硫银汞矿石
+item.crushedCentrifugedPerroudite.name=离心溴硫银汞矿石
+item.crushedPurifiedPerroudite.name=纯净溴硫银汞矿石
+item.dustImpurePerroudite.name=含杂溴硫银汞粉
+item.dustPurePerroudite.name=纯净溴硫银汞粉
+item.itemDustPerroudite.name=溴硫银汞粉
+item.itemDustTinyPerroudite.name=小撮溴硫银汞粉
+item.itemDustSmallPerroudite.name=小堆溴硫银汞粉
+
+tile.OreDemicheleite.name=重闪石矿石
+item.crushedDemicheleite.name=粉碎重闪石矿石
+item.crushedCentrifugedDemicheleite.name=离心粉碎重闪石矿石
+item.crushedPurifiedDemicheleite.name=纯净粉碎重闪石矿石
+item.dustImpureDemicheleite.name=含杂重闪石粉
+item.dustPureDemicheleite.name=纯净重闪石粉
+item.itemDustDemicheleite.name=重闪石粉
+item.itemDustTinyDemicheleite.name=小撮重闪石粉
+item.itemDustSmallDemicheleite.name=小堆重闪石粉
+
+tile.OreAlburnite.name=铝尖晶石矿石
+item.crushedAlburnite.name=粉碎铝尖晶石矿石
+item.crushedCentrifugedAlburnite.name=离心粉碎铝尖晶石矿石
+item.crushedPurifiedAlburnite.name=纯净粉碎铝尖晶石矿石
+item.dustImpureAlburnite.name=含杂铝尖晶石粉
+item.dustPureAlburnite.name=纯净铝尖晶石粉
+item.itemDustAlburnite.name=铝尖晶石粉
+item.itemDustTinyAlburnite.name=小撮铝尖晶石粉
+item.itemDustSmallAlburnite.name=小堆铝尖晶石粉
+
+tile.OreLautarite.name=碘钙石矿石
+item.crushedLautarite.name=粉碎碘钙石矿石
+item.crushedCentrifugedLautarite.name=离心粉碎碘钙石矿石
+item.crushedPurifiedLautarite.name=纯净粉碎碘钙石矿石
+item.dustImpureLautarite.name=含杂碘钙石粉
+item.dustPureLautarite.name=纯净碘钙石粉
+item.itemDustLautarite.name=碘钙石粉
+item.itemDustTinyLautarite.name=小撮碘钙石粉
+item.itemDustSmallLautarite.name=小堆碘钙石粉
+
+tile.OreBariteRd.name=重晶石(Rd)矿石
+item.crushedBariteRd.name=粉碎重晶石(Rd)矿石
+item.crushedCentrifugedBariteRd.name=离心粉碎 重晶石(Rd)矿石
+item.crushedPurifiedBariteRd.name=纯净粉碎重晶石(Rd)矿石
+item.dustImpureBariteRd.name=含杂 重晶石(Rd)粉
+item.dustPureBariteRd.name=纯净 重晶石(Rd)粉
+item.itemDustBariteRd.name=重晶石(Rd)粉
+item.itemDustTinyBariteRd.name=小撮重晶石(Rd)粉
+item.itemDustSmallBariteRd.name=小堆重晶石(Rd)粉
+
+tile.OreHoneaite.name=碲化金铊矿石
+item.crushedHoneaite.name=粉碎碲化金铊矿石
+item.crushedCentrifugedHoneaite.name=离心粉碎碲化金铊矿石
+item.crushedPurifiedHoneaite.name=纯净粉碎碲化金铊矿石
+item.dustImpureHoneaite.name=含杂碲化金铊粉
+item.dustPureHoneaite.name=纯净碲化金铊粉
+item.itemDustHoneaite.name=碲化金铊粉
+item.itemDustTinyHoneaite.name=小撮碲化金铊粉
+item.itemDustSmallHoneaite.name=小堆碲化金铊粉
+
+tile.OreLafossaite.name=铊盐矿石
+item.crushedLafossaite.name=粉碎铊盐矿石
+item.crushedCentrifugedLafossaite.name=离心粉碎铊盐矿石
+item.crushedPurifiedLafossaite.name=纯净粉碎铊盐矿石
+item.dustImpureLafossaite.name=含杂铊盐粉
+item.dustPureLafossaite.name=纯净铊盐粉
+item.itemDustLafossaite.name=铊盐粉
+item.itemDustTinyLafossaite.name=小撮铊盐粉
+item.itemDustSmallLafossaite.name=小堆铊盐粉
+
+tile.OreKashinite.name=硫铑钛铜矿石
+item.crushedKashinite.name=粉碎硫铑钛铜矿石
+item.crushedCentrifugedKashinite.name=离心粉碎硫铑钛铜矿石
+item.crushedPurifiedKashinite.name=纯净粉碎硫铑钛铜矿石
+item.dustImpureKashinite.name=含杂硫铑钛铜粉
+item.dustPureKashinite.name=纯净硫铑钛铜粉
+item.itemDustKashinite.name=硫铑钛铜粉
+item.itemDustTinyKashinite.name=小撮硫铑钛铜粉
+item.itemDustSmallKashinite.name=小堆硫铑钛铜粉
+
+tile.OreRadioactiveMineralMix.name=奇异矿石
+item.crushedRadioactiveMineralMix.name=粉碎奇异矿石
+item.crushedCentrifugedRadioactiveMineralMix.name=离心粉碎奇异矿石
+item.crushedPurifiedRadioactiveMineralMix.name=纯净粉碎奇异矿石
+item.dustImpureRadioactiveMineralMix.name=含杂奇异粉
+item.dustPureRadioactiveMineralMix.name=纯净奇异粉
+item.itemDustRadioactiveMineralMix.name=奇异粉
+item.itemDustTinyRadioactiveMineralMix.name=小撮奇异粉
+item.itemDustSmallRadioactiveMineralMix.name=小堆奇异粉
+
+tile.OreDemicheleiteBr.name=重闪石(Br)矿石
+item.crushedDemicheleiteBr.name=粉碎重闪石(Br)矿石
+item.crushedCentrifugedDemicheleiteBr.name=离心粉碎重闪石(Br)矿石
+item.crushedPurifiedDemicheleiteBr.name=纯净粉碎重闪石(Br)矿石
+item.dustImpureDemicheleiteBr.name=含杂重闪石(Br)粉
+item.dustPureDemicheleiteBr.name=纯净重闪石(Br)粉
+item.itemDustDemicheleiteBr.name=重闪石(Br)粉
+
+
+//Materials
+
+item.itemIngotTitansteel.name=泰坦精钢
+item.itemHotIngotTitansteel.name=热泰坦精钢
+item.itemDustTitansteel.name=泰坦精钢粉
+item.itemDustTinyTitansteel.name=小撮泰坦精钢粉
+item.itemDustSmallTitansteel.name=小堆泰坦精钢粉
+item.itemNuggetTitansteel.name=泰坦精钢粒
+item.itemPlateTitansteel.name=泰坦精钢板
+item.itemPlateDoubleTitansteel.name=双重泰坦精钢板
+item.itemBoltTitansteel.name=泰坦精钢螺栓
+item.itemRodTitansteel.name=泰坦精钢杆
+item.itemRodLongTitansteel.name=长泰坦精钢杆
+item.itemRingTitansteel.name=泰坦精钢环
+item.itemScrewTitansteel.name=泰坦精钢螺丝
+item.itemRotorTitansteel.name=泰坦精钢转子
+item.itemGearTitansteel.name=泰坦精钢齿轮
+item.itemCellTitansteel.name=泰坦精钢单元
+tile.Block of Titansteel.name=泰坦精钢块
+tile.Titansteel Frame Box.name=泰坦精钢框架
+
+item.itemIngotOctiron.name=八角铁锭
+item.itemHotIngotOctiron.name=热八角铁锭
+item.itemDustOctiron.name=八角铁粉
+item.itemDustTinyOctiron.name=小撮八角铁粉
+item.itemDustSmallOctiron.name=小堆八角铁粉
+item.itemNuggetOctiron.name=八角铁粒
+item.itemPlateOctiron.name=八角铁板
+item.itemPlateDoubleOctiron.name=双重八角铁板
+item.itemBoltOctiron.name=八角铁螺栓
+item.itemRodOctiron.name=八角铁杆
+item.itemRodLongOctiron.name=长八角铁杆
+item.itemRingOctiron.name=八角铁环
+item.itemScrewOctiron.name=八角铁螺丝
+item.itemRotorOctiron.name=八角铁转子
+item.itemGearOctiron.name=八角铁齿轮
+item.itemCellOctiron.name=八角铁单元
+tile.Block of Octiron.name=八角铁块
+tile.Octiron Frame Box.name=八角铁框架
+
+item.itemIngotWatertightSteel.name=防水钢锭
+item.itemHotIngotWatertightSteel.name=热防水钢锭
+item.itemDustWatertightSteel.name=防水钢粉
+item.itemDustTinyWatertightSteel.name=小撮防水钢粉
+item.itemDustSmallWatertightSteel.name=小堆防水钢粉
+item.itemNuggetWatertightSteel.name=防水钢粒
+item.itemPlateWatertightSteel.name=防水钢板
+item.itemPlateDoubleWatertightSteel.name=双重防水钢板
+item.itemBoltWatertightSteel.name=防水钢螺栓
+item.itemRodWatertightSteel.name=防水钢杆
+item.itemRodLongWatertightSteel.name=长防水钢杆
+item.itemRingWatertightSteel.name=防水钢环
+item.itemScrewWatertightSteel.name=防水钢螺丝
+item.itemRotorWatertightSteel.name=防水钢转子
+item.itemGearWatertightSteel.name=防水钢齿轮
+item.itemCellWatertightSteel.name=防水钢单元
+tile.Block of Watertight Steel.name=防水钢块
+tile.Watertight Steel Frame Box.name=防水钢框架
+
+item.itemIngotCelestialTungsten.name=天体钨锭
+item.itemHotIngotCelestialTungsten.name=热天体钨锭
+item.itemDustCelestialTungsten.name=天体钨粉
+item.itemDustTinyCelestialTungsten.name=小撮天体钨粉
+item.itemDustSmallCelestialTungsten.name=小堆天体钨粉
+item.itemNuggetCelestialTungsten.name=天体钨粒
+item.itemPlateCelestialTungsten.name=天体钨板
+item.itemPlateDoubleCelestialTungsten.name=双重天体钨板
+item.itemBoltCelestialTungsten.name=天体钨螺栓
+item.itemRodCelestialTungsten.name=天体钨杆
+item.itemRodLongCelestialTungsten.name=长天体钨杆
+item.itemRingCelestialTungsten.name=天体钨环
+item.itemScrewCelestialTungsten.name=天体钨螺丝
+item.itemRotorCelestialTungsten.name=天体钨转子
+item.itemGearCelestialTungsten.name=天体钨齿轮
+item.itemCellCelestialTungsten.name=天体钨单元
+tile.Block of Celestial Tungsten.name=天体钨块
+tile.Celestial Tungsten Frame Box.name=天体钨框架
+
+item.itemIngotHypogen.name=海珀珍锭
+item.itemHotIngotHypogen.name=热海珀珍锭
+item.itemDustHypogen.name=海珀珍粉
+item.itemDustTinyHypogen.name=小撮海珀珍粉
+item.itemDustSmallHypogen.name=小堆海珀珍粉
+item.itemNuggetHypogen.name=海珀珍粒
+item.itemPlateHypogen.name=海珀珍板
+item.itemPlateDoubleHypogen.name=双重海珀珍板
+item.itemBoltHypogen.name=海珀珍螺栓
+item.itemRodHypogen.name=海珀珍杆
+item.itemRodLongHypogen.name=长海珀珍杆
+item.itemRingHypogen.name=海珀珍环
+item.itemScrewHypogen.name=海珀珍螺丝
+item.itemRotorHypogen.name=海珀珍转子
+item.itemGearHypogen.name=海珀珍齿轮
+item.itemCellHypogen.name=海珀珍单元
+tile.Block of Hypogen.name=海珀珍块
+tile.Hypogen Frame Box.name=海珀珍框架
+
+item.itemIngotArceusAlloy2B.name=阿尔宙斯合金2B锭
+item.itemHotIngotArceusAlloy2B.name=热阿尔宙斯合金2B锭
+item.itemDustArceusAlloy2B.name=阿尔宙斯合金2B粉
+item.itemDustTinyArceusAlloy2B.name=小撮阿尔宙斯合金2B粉
+item.itemDustSmallArceusAlloy2B.name=小堆阿尔宙斯合金2B粉
+item.itemNuggetArceusAlloy2B.name=阿尔宙斯合金2B粒
+item.itemPlateArceusAlloy2B.name=阿尔宙斯合金2B板
+item.itemPlateDoubleArceusAlloy2B.name=双重阿尔宙斯合金2B板
+item.itemBoltArceusAlloy2B.name=阿尔宙斯合金2B螺栓
+item.itemRodArceusAlloy2B.name=阿尔宙斯合金2B杆
+item.itemRodLongArceusAlloy2B.name=长阿尔宙斯合金2B杆
+item.itemRingArceusAlloy2B.name=阿尔宙斯合金2B环
+item.itemScrewArceusAlloy2B.name=阿尔宙斯合金2B螺丝
+item.itemRotorArceusAlloy2B.name=阿尔宙斯合金2B转子
+item.itemGearArceusAlloy2B.name=阿尔宙斯合金2B齿轮
+item.itemCellArceusAlloy2B.name=阿尔宙斯合金2B单元
+tile.Block of Arceus Alloy 2B.name=阿尔宙斯合金2B块
+tile.Arceus Alloy 2B Frame Box.name=阿尔宙斯合金2B框架
+
+item.itemIngotChromaticGlass.name=彩色玻璃锭
+item.itemHotIngotChromaticGlass.name=热彩色玻璃锭
+item.itemDustChromaticGlass.name=彩色玻璃粉
+item.itemDustTinyChromaticGlass.name=小撮彩色玻璃粉
+item.itemDustSmallChromaticGlass.name=小堆彩色玻璃粉
+item.itemNuggetChromaticGlass.name=彩色玻璃粒
+item.itemPlateChromaticGlass.name=彩色玻璃板
+item.itemPlateDoubleChromaticGlass.name=双重彩色玻璃板
+item.itemBoltChromaticGlass.name=彩色玻璃螺栓
+item.itemRodChromaticGlass.name=彩色玻璃杆
+item.itemRodLongChromaticGlass.name=长彩色玻璃杆
+item.itemRingChromaticGlass.name=彩色玻璃环
+item.itemScrewChromaticGlass.name=彩色玻璃螺丝
+item.itemRotorChromaticGlass.name=彩色玻璃转子
+item.itemGearChromaticGlass.name=彩色玻璃齿轮
+item.itemCellChromaticGlass.name=彩色玻璃单元
+tile.Block of Chromatic Glass.name=彩色玻璃块
+tile.Chromatic Glass Frame Box.name=彩色玻璃框架
+
+item.itemIngotAstralTitanium.name=星体钛锭
+item.itemHotIngotAstralTitanium.name=热星体钛锭
+item.itemDustAstralTitanium.name=星体钛粉
+item.itemDustTinyAstralTitanium.name=小撮星体钛粉
+item.itemDustSmallAstralTitanium.name=小堆星体钛粉
+item.itemNuggetAstralTitanium.name=星体钛粒
+item.itemPlateAstralTitanium.name=星体钛板
+item.itemPlateDoubleAstralTitanium.name=双重星体钛板
+item.itemBoltAstralTitanium.name=星体钛螺栓
+item.itemRodAstralTitanium.name=星体钛杆
+item.itemRodLongAstralTitanium.name=长星体钛杆
+item.itemRingAstralTitanium.name=星体钛环
+item.itemScrewAstralTitanium.name=星体钛螺丝
+item.itemRotorAstralTitanium.name=星体钛转子
+item.itemGearAstralTitanium.name=星体钛齿轮
+item.itemCellAstralTitanium.name=星体钛单元
+tile.Block of Astral Titanium.name=星体钛块
+tile.Astral Titanium Frame Box.name=星体钛框架
+
+item.itemIngotTungstenTitaniumCarbide.name=碳化钨钛合金锭
+item.itemHotIngotTungstenTitaniumCarbide.name=热碳化钨钛合金锭
+item.itemDustTungstenTitaniumCarbide.name=碳化钨钛合金粉
+item.itemDustTinyTungstenTitaniumCarbide.name=小撮碳化钨钛合金粉
+item.itemDustSmallTungstenTitaniumCarbide.name=小堆碳化钨钛合金粉
+item.itemNuggetTungstenTitaniumCarbide.name=碳化钨钛合金粒
+item.itemPlateTungstenTitaniumCarbide.name=碳化钨钛合金板
+item.itemPlateDoubleTungstenTitaniumCarbide.name=双重碳化钨钛合金板
+item.itemBoltTungstenTitaniumCarbide.name=碳化钨钛合金螺栓
+item.itemRodTungstenTitaniumCarbide.name=碳化钨钛合金杆
+item.itemRodLongTungstenTitaniumCarbide.name=长碳化钨钛合金杆
+item.itemRingTungstenTitaniumCarbide.name=碳化钨钛合金环
+item.itemScrewTungstenTitaniumCarbide.name=碳化钨钛合金螺丝
+item.itemRotorTungstenTitaniumCarbide.name=碳化钨钛合金转子
+item.itemGearTungstenTitaniumCarbide.name=碳化钨钛合金齿轮
+item.itemCellTungstenTitaniumCarbide.name=碳化钨钛合金单元
+tile.Block of Tungsten Titanium Carbide.name=碳化钨钛合金块
+tile.Tungsten Titanium Carbide Frame Box.name=碳化钨钛合金框架
+
+item.itemIngotNitinol60.name=镍钛诺60锭
+item.itemHotIngotNitinol60.name=热镍钛诺60锭
+item.itemDustNitinol60.name=镍钛诺60粉
+item.itemDustTinyNitinol60.name=小撮镍钛诺60粉
+item.itemDustSmallNitinol60.name=小堆镍钛诺60粉
+item.itemNuggetNitinol60.name=镍钛诺60粒
+item.itemPlateNitinol60.name=镍钛诺60板
+item.itemPlateDoubleNitinol60.name=双重镍钛诺60板
+item.itemBoltNitinol60.name=镍钛诺60螺栓
+item.itemRodNitinol60.name=镍钛诺60杆
+item.itemRodLongNitinol60.name=长镍钛诺60杆
+item.itemRingNitinol60.name=镍钛诺60环
+item.itemScrewNitinol60.name=镍钛诺60螺丝
+item.itemRotorNitinol60.name=镍钛诺60转子
+item.itemGearNitinol60.name=镍钛诺60齿轮
+item.itemCellNitinol60.name=镍钛诺60单元
+tile.Block of Nitinol 60.name=镍钛诺60块
+tile.Nitinol 60 Frame Box.name=镍钛诺60框架
+
+item.itemIngotAdvancedNitinol.name=高级镍钛诺锭
+item.itemHotIngotAdvancedNitinol.name=热高级镍钛诺锭
+item.itemDustAdvancedNitinol.name=高级镍钛诺粉
+item.itemDustTinyAdvancedNitinol.name=小撮高级镍钛诺粉
+item.itemDustSmallAdvancedNitinol.name=小堆高级镍钛诺粉
+item.itemNuggetAdvancedNitinol.name=高级镍钛诺粒
+item.itemPlateAdvancedNitinol.name=高级镍钛诺板
+item.itemPlateDoubleAdvancedNitinol.name=双重高级镍钛诺板
+item.itemBoltAdvancedNitinol.name=高级镍钛诺螺栓
+item.itemRodAdvancedNitinol.name=高级镍钛诺杆
+item.itemRodLongAdvancedNitinol.name=长高级镍钛诺杆
+item.itemRingAdvancedNitinol.name=高级镍钛诺环
+item.itemScrewAdvancedNitinol.name=高级镍钛诺螺丝
+item.itemRotorAdvancedNitinol.name=高级镍钛诺转子
+item.itemGearAdvancedNitinol.name=高级镍钛诺齿轮
+item.itemCellAdvancedNitinol.name=高级镍钛诺单元
+tile.Block of Advanced Nitinol.name=高级镍钛诺块
+tile.Advanced Nitinol Frame Box.name=高级镍钛诺框架
+
+item.itemIngotArcanite.name=奥金锭
+item.itemHotIngotArcanite.name=热奥金锭
+item.itemDustArcanite.name=奥金粉
+item.itemDustTinyArcanite.name=小撮奥金粉
+item.itemDustSmallArcanite.name=小堆奥金粉
+item.itemNuggetArcanite.name=奥金粒
+item.itemPlateArcanite.name=奥金板
+item.itemPlateDoubleArcanite.name=双重奥金板
+item.itemBoltArcanite.name=奥金螺栓
+item.itemRodArcanite.name=奥金杆
+item.itemRodLongArcanite.name=长奥金杆
+item.itemRingArcanite.name=奥金环
+item.itemScrewArcanite.name=奥金螺丝
+item.itemRotorArcanite.name=奥金转子
+item.itemGearArcanite.name=奥金齿轮
+item.itemCellArcanite.name=奥金单元
+tile.Block of Arcanite.name=奥金块
+tile.Arcanite Frame Box.name=奥金框架
+
+item.itemIngotPikyonium64B.name=皮卡优合金64B锭
+item.itemHotIngotPikyonium64B.name=热皮卡优合金64B锭
+item.itemDustPikyonium64B.name=皮卡优合金64B粉
+item.itemDustTinyPikyonium64B.name=小撮皮卡优合金64B粉
+item.itemDustSmallPikyonium64B.name=小堆皮卡优合金64B粉
+item.itemNuggetPikyonium64B.name=皮卡优合金64B粒
+item.itemPlatePikyonium64B.name=皮卡优合金64B板
+item.itemPlateDoublePikyonium64B.name=双重皮卡优合金64B板
+item.itemBoltPikyonium64B.name=皮卡优合金64B螺栓
+item.itemRodPikyonium64B.name=皮卡优合金64B杆
+item.itemRodLongPikyonium64B.name=长皮卡优合金64B杆
+item.itemRingPikyonium64B.name=皮卡优合金64B环
+item.itemScrewPikyonium64B.name=皮卡优合金64B螺丝
+item.itemRotorPikyonium64B.name=皮卡优合金64B转子
+item.itemGearPikyonium64B.name=皮卡优合金64B齿轮
+item.itemCellPikyonium64B.name=皮卡优合金64B单元
+tile.Block of Pikyonium 64B.name=皮卡优合金64B块
+tile.Pikyonium 64B Frame Box.name=皮卡优合金64B框架
+
+item.itemIngotCinobiteA243.name=西诺柏A243锭
+item.itemHotIngotCinobiteA243.name=热西诺柏A243锭
+item.itemDustCinobiteA243.name=西诺柏A243粉
+item.itemDustTinyCinobiteA243.name=小撮西诺柏A243粉
+item.itemDustSmallCinobiteA243.name=小堆西诺柏A243粉
+item.itemNuggetCinobiteA243.name=西诺柏A243粒
+item.itemPlateCinobiteA243.name=西诺柏A243板
+item.itemPlateDoubleCinobiteA243.name=双重西诺柏A243板
+item.itemBoltCinobiteA243.name=西诺柏A243螺栓
+item.itemRodCinobiteA243.name=西诺柏A243杆
+item.itemRodLongCinobiteA243.name=长西诺柏A243杆
+item.itemRingCinobiteA243.name=西诺柏A243环
+item.itemScrewCinobiteA243.name=西诺柏A243螺丝
+item.itemRotorCinobiteA243.name=西诺柏A243转子
+item.itemGearCinobiteA243.name=西诺柏A243齿轮
+item.itemCellCinobiteA243.name=西诺柏A243单元
+tile.Block of Cinobite A243.name=西诺柏A243块
+tile.Cinobite A243 Frame Box.name=西诺柏A243框架
+
+item.itemIngotLafiumCompound.name=路菲恩化合物锭
+item.itemHotIngotLafiumCompound.name=热路菲恩化合物锭
+item.itemDustLafiumCompound.name=路菲恩化合物粉
+item.itemDustTinyLafiumCompound.name=小撮路菲恩化合物粉
+item.itemDustSmallLafiumCompound.name=小堆路菲恩化合物粉
+item.itemNuggetLafiumCompound.name=路菲恩化合物粒
+item.itemPlateLafiumCompound.name=路菲恩化合物板
+item.itemPlateDoubleLafiumCompound.name=双重路菲恩化合物板
+item.itemBoltLafiumCompound.name=路菲恩化合物螺栓
+item.itemRodLafiumCompound.name=路菲恩化合物杆
+item.itemRodLongLafiumCompound.name=长路菲恩化合物杆
+item.itemRingLafiumCompound.name=路菲恩化合物环
+item.itemScrewLafiumCompound.name=路菲恩化合物螺丝
+item.itemRotorLafiumCompound.name=路菲恩化合物转子
+item.itemGearLafiumCompound.name=路菲恩化合物齿轮
+item.itemCellLafiumCompound.name=路菲恩化合物单元
+tile.Block of Lafium Compound.name=路菲恩化合物块
+tile.Lafium Compound Frame Box.name=路菲恩化合物框架
+
+item.itemIngotKoboldite.name=妖金锭
+item.itemHotIngotKoboldite.name=热妖金锭
+item.itemDustKoboldite.name=妖金粉
+item.itemDustTinyKoboldite.name=小撮妖金粉
+item.itemDustSmallKoboldite.name=小堆妖金粉
+item.itemNuggetKoboldite.name=妖金粒
+item.itemPlateKoboldite.name=妖金板
+item.itemPlateDoubleKoboldite.name=双重妖金板
+item.itemBoltKoboldite.name=妖金螺栓
+item.itemRodKoboldite.name=妖金杆
+item.itemRodLongKoboldite.name=长妖金杆
+item.itemRingKoboldite.name=妖金环
+item.itemScrewKoboldite.name=妖金螺丝
+item.itemRotorKoboldite.name=妖金转子
+item.itemGearKoboldite.name=妖金齿轮
+item.itemCellKoboldite.name=妖金单元
+tile.Block of Koboldite.name=妖金块
+tile.Koboldite Frame Box.name=妖金框架
+
+item.itemIngotAbyssalAlloy.name=深渊合金锭
+item.itemHotIngotAbyssalAlloy.name=热深渊合金锭
+item.itemDustAbyssalAlloy.name=深渊合金粉
+item.itemDustTinyAbyssalAlloy.name=小撮深渊合金粉
+item.itemDustSmallAbyssalAlloy.name=小堆深渊合金粉
+item.itemNuggetAbyssalAlloy.name=深渊合金粒
+item.itemPlateAbyssalAlloy.name=深渊合金板
+item.itemPlateDoubleAbyssalAlloy.name=双重深渊合金板
+item.itemBoltAbyssalAlloy.name=深渊合金螺栓
+item.itemRodAbyssalAlloy.name=深渊合金杆
+item.itemRodLongAbyssalAlloy.name=长深渊合金杆
+item.itemRingAbyssalAlloy.name=深渊合金环
+item.itemScrewAbyssalAlloy.name=深渊合金螺丝
+item.itemRotorAbyssalAlloy.name=深渊合金转子
+item.itemGearAbyssalAlloy.name=深渊合金齿轮
+item.itemCellAbyssalAlloy.name=深渊合金单元
+tile.Block of Abyssal Alloy.name=深渊合金块
+tile.Abyssal Alloy Frame Box.name=深渊合金框架
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=锝99M粉
+item.dustTechnetium99.name=锝99粉
+item.dustMolybdenum99.name=钼99粉
+
+//Bags
+item.item.MysticBag.name=神秘袋
+item.item.Eatotron9000.name=埃托特洛尼克9000型
+item.item.ToolBox.name=工人的工具箱
+
+//Cells
+item.Bromine.name=溴单元
+item.Krypton.name=氪单元
+item.cryotheum.name=极寒之凛冰单元
+item.pyrotheum.name=烈焰之炽焱单元
+item.GeneticMutagen.name=诱变剂单元
+
+//Ingots
+item.itemHotIngotIncoloy020.name=热耐热铬铁合金-020锭
+item.itemHotIngotIncoloyDS.name=热耐热铬铁合金-DS锭
+item.itemHotIngotTalonite.name=热铬钴磷酸盐合金锭
+item.itemHotIngotHastelloyX.name=热哈斯特洛依合金-X锭
+item.itemHotIngotHastelloyW.name=热哈斯特洛依合金-W碳化物锭
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=铅板
+
+//Ions
+item.particle.ion.Hydrogen.name=氢离子
+item.particle.ion.Helium.name=氦离子
+item.particle.ion.Lithium.name=锂离子
+item.particle.ion.Beryllium.name=铍离子
+item.particle.ion.Boron.name=硼离子
+item.particle.ion.Carbon.name=碳离子
+item.particle.ion.Nitrogen.name=氮离子
+item.particle.ion.Oxygen.name=氧离子
+item.particle.ion.Fluorine.name=氟离子
+item.particle.ion.Neon.name=氖离子
+item.particle.ion.Sodium.name=钠离子
+item.particle.ion.Magnesium.name=镁离子
+item.particle.ion.Aluminum.name=铝离子
+item.particle.ion.Silicon.name=硅离子
+item.particle.ion.Phosphorus.name=磷离子
+item.particle.ion.Sulfur.name=硫离子
+item.particle.ion.Chlorine.name=氯离子
+item.particle.ion.Argon.name=氩离子
+item.particle.ion.Potassium.name=钾离子
+item.particle.ion.Calcium.name=钙离子
+item.particle.ion.Scandium.name=钪离子
+item.particle.ion.Titanium.name=钛离子
+item.particle.ion.Vanadium.name=钒离子
+item.particle.ion.Chromium.name=铬离子
+item.particle.ion.Manganese.name=锰离子
+item.particle.ion.Iron.name=铁离子
+item.particle.ion.Cobalt.name=钴离子
+item.particle.ion.Nickel.name=镍离子
+item.particle.ion.Copper.name=铜离子
+item.particle.ion.Zinc.name=锌离子
+item.particle.ion.Gallium.name=镓离子
+item.particle.ion.Germanium.name=锗离子
+item.particle.ion.Arsenic.name=砷离子
+item.particle.ion.Selenium.name=硒离子
+item.particle.ion.Bromine.name=溴离子
+item.particle.ion.Krypton.name=氪离子
+item.particle.ion.Rubidium.name=铷离子
+item.particle.ion.Strontium.name=锶离子
+item.particle.ion.Yttrium.name=钇离子
+item.particle.ion.Zirconium.name=锆离子
+item.particle.ion.Niobium.name=铌离子
+item.particle.ion.Molybdenum.name=钼离子
+item.particle.ion.Technetium.name=锝离子
+item.particle.ion.Ruthenium.name=钌离子
+item.particle.ion.Rhodium.name=铑离子
+item.particle.ion.Palladium.name=钯离子
+item.particle.ion.Silver.name=银离子
+item.particle.ion.Cadmium.name=镉离子
+item.particle.ion.Indium.name=铟离子
+item.particle.ion.Tin.name=锡离子
+item.particle.ion.Antimony.name=锑离子
+item.particle.ion.Tellurium.name=碲离子
+item.particle.ion.Iodine.name=碘离子
+item.particle.ion.Xenon.name=氙离子
+item.particle.ion.Cesium.name=铯离子
+item.particle.ion.Barium.name=钡离子
+item.particle.ion.Lanthanum.name=镧离子
+item.particle.ion.Cerium.name=铈离子
+item.particle.ion.Praseodymium.name=镨离子
+item.particle.ion.Neodymium.name=钕离子
+item.particle.ion.Promethium.name=钷离子
+item.particle.ion.Samarium.name=钐离子
+item.particle.ion.Europium.name=铕离子
+item.particle.ion.Gadolinium.name=钆离子
+item.particle.ion.Terbium.name=铽离子
+item.particle.ion.Dysprosium.name=镝离子
+item.particle.ion.Holmium.name=钬离子
+item.particle.ion.Erbium.name=铒离子
+item.particle.ion.Thulium.name=铥离子
+item.particle.ion.Ytterbium.name=镱离子
+item.particle.ion.Lutetium.name=镏离子
+item.particle.ion.Hafnium.name=铪离子
+item.particle.ion.Tantalum.name=钽离子
+item.particle.ion.Tungsten.name=钨离子
+item.particle.ion.Rhenium.name=铼离子
+item.particle.ion.Osmium.name=锇离子
+item.particle.ion.Iridium.name=铱离子
+item.particle.ion.Platinum.name=铂离子
+item.particle.ion.Gold.name=金离子
+item.particle.ion.Mercury.name=汞离子
+item.particle.ion.Thallium.name=铊离子
+item.particle.ion.Lead.name=铅离子
+item.particle.ion.Bismuth.name=铋离子
+item.particle.ion.Polonium.name=钋离子
+item.particle.ion.Astatine.name=砹离子
+item.particle.ion.Radon.name=氡离子
+item.particle.ion.Francium.name=钫离子
+item.particle.ion.Radium.name=镭离子
+item.particle.ion.Actinium.name=锕离子
+item.particle.ion.Thorium.name=钍离子
+item.particle.ion.Protactinium.name=镤离子
+item.particle.ion.Uranium.name=铀离子
+item.particle.ion.Neptunium.name=镎离子
+item.particle.ion.Plutonium.name=钚离子
+item.particle.ion.Americium.name=镅离子
+item.particle.ion.Curium.name=锔离子
+item.particle.ion.Berkelium.name=锫离子
+item.particle.ion.Californium.name=锎离子
+item.particle.ion.Einsteinium.name=锿离子
+item.particle.ion.Fermium.name=镄离子
+item.particle.ion.Mendelevium.name=钔离子
+item.particle.ion.Nobelium.name=锘离子
+item.particle.ion.Lawrencium.name=铹离子
+item.particle.ion.Rutherfordium.name=离子
+item.particle.ion.Dubnium.name=离子
+item.particle.ion.Seaborgium.name=离子
+item.particle.ion.Bohrium.name=离子
+item.particle.ion.Hassium.name=离子
+item.particle.ion.Meitnerium.name=鿏离子
+item.particle.ion.Darmstadtium.name=离子
+item.particle.ion.Roentgenium.name=离子
+item.particle.ion.Copernicium.name=鿔离子
+item.particle.ion.Nihonium.name=鿭离子
+item.particle.ion.Flerovium.name=离子
+item.particle.ion.Moscovium.name=镆离子
+item.particle.ion.Livermorium.name=离子
+item.particle.ion.Tennessine.name=鿬离子
+item.particle.ion.Oganesson.name=鿫离子
+
+
+item.particle.base.Graviton.name=引力子
+item.particle.base.Up.name=上(u)夸克
+item.particle.base.Down.name=下(d)夸克
+item.particle.base.Charm.name=粲(c)夸克
+item.particle.base.Strange.name=奇(s)夸克
+item.particle.base.Top.name=顶(t)夸克
+item.particle.base.Bottom.name=底(b)夸克
+item.particle.base.Electron.name=电子
+item.particle.base.Electron Neutrino.name=电子中微子
+item.particle.base.Muon.name=μ子
+item.particle.base.Muon Neutrino.name=μ子中微子
+item.particle.base.Tau.name=τ子
+item.particle.base.Tau Neutrino.name=τ子中微子
+item.particle.base.Gluon.name=胶子
+item.particle.base.Photon.name=光子
+item.particle.base.Z Boson.name=Z玻色子
+item.particle.base.W Boson.name=W玻色子
+item.particle.base.Higgs Boson.name=希格斯玻色子
+item.particle.base.Proton.name=质子
+item.particle.base.Neutron.name=中子
+item.particle.base.Lambda.name=λ粒子
+item.particle.base.Omega.name=Ω粒子
+item.particle.base.Pion.name=介子
+item.particle.base.ETA Meson.name=η介子
+item.particle.base.Unknown.name=未知粒子
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=玻璃自动门
+tile.playerDoorCactus.name=仙人掌自动门
+tile.playerDoorIce.name=冰自动门
+tile.playerDoorIron.name=铁自动门
+tile.playerDoorWood.name=木自动门
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=充电工具包[LuV]
+item.GTPP.BattPack.07.name=充电工具包[ZPM]
+item.GTPP.BattPack.08.name=充电工具包[UV]
+item.GTPP.BattPack.09.name=充电工具包[MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++Debug扫描器
+item.RawWaste.name=动物粪便单元
+item.ManureSlurry.name=粪浆单元
+item.FertileManureSlurry.name=肥沃的粪浆单元
+item.itemDustTinyDemicheleiteBr.name=小撮重闪石(Br)
+item.itemDustSmallDemicheleiteBr.name=小堆重闪石(Br)
+tile.blockPooCollector.name=农业下水道
+tile.Block of Lithium 7.name=锂7块
+
+//Added 14/3/19
+item.blood.name=血单元
+item.aniline.name=苯胺单元
+item.cadaverine.name=尸胺单元
+item.polyurethane.name=聚氨酯单元
+item.putrescine.name=腐胺单元
+item.cyclohexane.name=环己胺单元
+item.cyclohexanone.name=环己酮单元
+item.nitrobenzene.name=硝基苯单元
+item.ender.name=液体末影单元
+item.xpjuice.name=液体经验单元
+item.itemBombUnf.name=可投掷炸弹(未完成)
+item.itemBombCasing.name=炸弹框架
+item.gtpp.throwable.bomb.name=可投掷炸弹
+item.itemDetCable.name=炸弹保险丝
+tile.blockPooCollector.0.name=农业下水道
+tile.blockPooCollector.8.name=生物复合收集器
+item.itemIngotBakelite.name=电木锭
+item.itemDustBakelite.name=电木粉
+item.itemDustTinyBakelite.name=小撮电木粉
+item.itemDustSmallBakelite.name=小堆电木粉
+item.itemNuggetBakelite.name=电木粒
+item.itemPlateBakelite.name=电木板
+item.itemPlateDoubleBakelite.name=双重电木板
+item.itemCellBakelite.name=电木单元
+tile.Block of Bakelite.name=电木块
+item.itemIngotNylon.name=尼龙锭
+item.itemDustNylon.name=尼龙粉
+item.itemDustTinyNylon.name=小撮尼龙粉
+item.itemDustSmallNylon.name=小堆尼龙粉
+item.itemNuggetNylon.name=尼龙粒
+item.itemPlateNylon.name=尼龙板
+item.itemPlateDoubleNylon.name=双重尼龙板
+item.itemCellNylon.name=尼龙单元
+tile.Block of Nylon.name=尼龙块
+item.itemIngotTeflon.name=特氟龙锭
+item.itemDustTeflon.name=特氟龙粉
+item.itemDustTinyTeflon.name=小撮特氟龙粉
+item.itemDustSmallTeflon.name=小堆特氟龙粉
+item.itemNuggetTeflon.name=特氟龙粒
+item.itemPlateTeflon.name=特氟龙板
+item.itemPlateDoubleTeflon.name=双重特氟龙板
+item.itemCellTeflon.name=特氟龙单元
+tile.Block of Teflon.name=特氟龙块
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=铝离子
+item.particle.ion.Caesium.name=铯离子
+
+item.GTPP.MonsterKiller.Enderman.name=末影人杀手
+item.GTPP.MonsterKiller.Spider.name=蜘蛛杀手
+item.GTPP.MonsterKiller.Skeleton.name=骷髅杀手
+item.GTPP.MonsterKiller.Creeper.name=爬行者杀手
+item.GTPP.MonsterKiller.Zombie.name=僵尸杀手
+item.GTPP.MonsterKiller.Hellish.name=下界生物杀手
+
+item.itemIngotRunite.name=虚恩锭
+item.itemDustRunite.name=虚恩粉
+item.itemDustTinyRunite.name=小撮虚恩粉
+item.itemDustSmallRunite.name=小堆虚恩粉
+item.itemNuggetRunite.name=虚恩锭
+item.itemPlateRunite.name=虚恩板
+item.itemPlateDoubleRunite.name=双重虚恩板
+item.itemCellRunite.name=虚恩单元
+tile.Block of Runite.name=虚恩块
+
+item.itemIngotDragonblood.name=龙血锭
+item.itemDustDragonblood.name=龙血粉
+item.itemDustTinyDragonblood.name=小撮龙血粉
+item.itemDustSmallDragonblood.name=小堆龙血粉
+item.itemNuggetDragonblood.name=龙血粒
+item.itemPlateDragonblood.name=龙血板
+item.itemPlateDoubleDragonblood.name=双重龙血板
+item.itemCellDragonblood.name=龙血单元
+tile.Block of Dragonblood.name=龙血块
+
+item.itemIngotBlackTitanium.name=黑钛锭
+item.itemDustBlackTitanium.name=黑钛粉
+item.itemDustTinyBlackTitanium.name=小撮黑钛粉
+item.itemDustSmallBlackTitanium.name=小堆黑钛粉
+item.itemNuggetBlackTitanium.name=黑钛粒
+item.itemPlateBlackTitanium.name=黑钛板
+item.itemPlateDoubleBlackTitanium.name=双重黑钛板
+item.itemCellBlackTitanium.name=黑钛单元
+tile.Block of Black Titanium.name=黑钛块
+
+item.itemIngotAncientGranite.name=古花岗岩锭
+item.itemHotIngotAncientGranite.name=热古花岗岩锭
+item.itemDustAncientGranite.name=古花岗岩粉
+item.itemDustTinyAncientGranite.name=小撮古花岗岩粉
+item.itemDustSmallAncientGranite.name=小堆古花岗岩粉
+item.itemNuggetAncientGranite.name=古花岗岩粒
+item.itemPlateAncientGranite.name=古花岗岩板
+item.itemPlateDoubleAncientGranite.name=双重古花岗岩板
+tile.Block of Ancient Granite.name=古花岗岩块
+
+item.itemIngotBabbitAlloy.name=巴氏合金锭
+item.itemHotIngotBabbitAlloy.name=热巴氏合金锭
+item.itemDustBabbitAlloy.name=巴氏合金粉
+item.itemDustTinyBabbitAlloy.name=小撮巴氏合金粉
+item.itemDustSmallBabbitAlloy.name=小堆巴氏合金粉
+item.itemNuggetBabbitAlloy.name=巴氏合金粒
+item.itemPlateBabbitAlloy.name=巴氏合金板
+item.itemPlateDoubleBabbitAlloy.name=双重巴氏合金板
+item.itemCellBabbitAlloy.name=巴氏合金单元
+tile.Block of Babbit Alloy.name=巴氏合金块
+
+item.itemIngotBlackMetal.name=黑物质锭
+item.itemHotIngotBlackMetal.name=热黑物质锭
+item.itemDustBlackMetal.name=黑物质粉
+item.itemDustTinyBlackMetal.name=小撮黑物质粉
+item.itemDustSmallBlackMetal.name=小堆黑物质粉
+item.itemNuggetBlackMetal.name=黑物质粒
+item.itemPlateBlackMetal.name=黑物质板
+item.itemPlateDoubleBlackMetal.name=双重黑物质板
+item.itemBoltBlackMetal.name=黑物质螺栓
+item.itemRodBlackMetal.name=黑物质杆
+item.itemRodLongBlackMetal.name=长黑物质杆
+item.itemRingBlackMetal.name=黑物质环
+item.itemScrewBlackMetal.name=黑物质螺丝
+item.itemRotorBlackMetal.name=黑物质转子
+item.itemGearBlackMetal.name=黑物质齿轮
+item.itemCellBlackMetal.name=黑物质单元
+tile.Block of Black Metal.name=黑物质块
+tile.Black Metal Frame Box.name=黑物质框架
+
+item.itemIngotWhiteMetal.name=白物质锭
+item.itemHotIngotWhiteMetal.name=热白物质锭
+item.itemDustWhiteMetal.name=白物质粉
+item.itemDustTinyWhiteMetal.name=小撮白物质粉
+item.itemDustSmallWhiteMetal.name=小堆白物质粉
+item.itemNuggetWhiteMetal.name=白物质粒
+item.itemPlateWhiteMetal.name=白物质板
+item.itemPlateDoubleWhiteMetal.name=双重白物质板
+item.itemBoltWhiteMetal.name=白物质螺栓
+item.itemRodWhiteMetal.name=白物质杆
+item.itemRodLongWhiteMetal.name=长白物质杆
+item.itemRingWhiteMetal.name=白物质环
+item.itemScrewWhiteMetal.name=白物质螺丝
+item.itemRotorWhiteMetal.name=白物质转子
+item.itemGearWhiteMetal.name=白物质齿轮
+item.itemCellWhiteMetal.name=白物质单元
+tile.Block of White Metal.name=白物质块
+tile.White Metal Frame Box.name=白物质框架
+
+//Added 29/04/2019
+tile.OreRunite.name=虚恩矿
+item.crushedRunite.name=粉碎的虚恩矿
+item.crushedCentrifugedRunite.name=离心的粉碎虚恩矿
+item.crushedPurifiedRunite.name=洗净的的粉碎虚恩矿
+item.dustImpureRunite.name=含杂虚恩粉
+item.dustPureRunite.name=洗净虚恩粉
+
+tile.OreAncientGranite.name=古花岗岩矿
+item.crushedAncientGranite.name=粉碎的古花岗岩矿
+item.crushedCentrifugedAncientGranite.name=离心的粉碎古花岗岩矿
+item.crushedPurifiedAncientGranite.name=洗净的粉碎古花岗岩矿
+item.dustImpureAncientGranite.name=含杂古花岗岩粉
+item.dustPureAncientGranite.name=洗净古花岗岩粉
+
+item.itemIngotRhugnor.name=鲁格诺锭
+item.itemDustRhugnor.name=鲁格诺粉
+item.itemDustTinyRhugnor.name=小撮鲁格诺粉
+item.itemDustSmallRhugnor.name=小堆鲁格诺粉
+item.itemNuggetRhugnor.name=鲁格诺粒
+item.itemPlateRhugnor.name=鲁格诺板
+item.itemPlateDoubleRhugnor.name=双重鲁格诺板
+item.itemCellRhugnor.name=鲁格诺单元
+tile.Block of Rhugnor.name=鲁格诺块
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=充电工具包[LV]
+item.GTPP.BattPack.02.name=充电工具包[MV]
+item.GTPP.BattPack.03.name=充电工具包[HV]
+item.GTPP.BattPack.04.name=充电工具包[EV]
+item.GTPP.BattPack.05.name=充电工具包[IV]
+item.IndustrialDiamondExquisite.name=精致的工业钻石
+
+item.itemSpringCelestialTungsten.name=天体钨弹簧
+item.itemSpringWhiteMetal.name=白物质弹簧
+item.itemSpringNitinol60.name=镍钛诺60弹簧
+item.itemSpringWatertightSteel.name=防水钢弹簧
+item.itemSpringEglinSteel.name=埃格林钢弹簧
+
+item.itemSmallSpringMaragingSteel250.name=小型马氏体时效钢250弹簧
+item.itemSmallSpringNichrome.name=小型镍铬合金弹簧
+item.itemSmallSpringStaballoy.name=小型贫铀合金弹簧
+item.itemSmallSpringBlackSteel.name=小型黑钢弹簧
+item.itemSmallSpringBlackTitanium.name=小型黑钛弹簧
+
+item.itemFineWireWhiteMetal.name=精致白物质导线
+item.itemFineWirePalladium.name=精致钯导线
+item.itemFineWireZirconium.name=精致锆导线
+item.itemFineWireGrisium.name=精致灰钛合金导线
+item.itemFineWireBabbitAlloy.name=精致巴氏合金导线
+item.itemFineWireKoboldite.name=精致妖金导线
+item.itemFineWireHG1223.name=精致HG-1223导线
+item.itemFineWireQuantum.name=精致量子导线
+
+item.itemHeavyPlatePotin.name=重型粗青铜板
+item.itemHeavyPlateWatertightSteel.name=重型防水钢板
+item.itemHeavyPlateBronze.name=重型青铜板
+item.itemHeavyPlateOsmiridium.name=重型铱锇合金板
+item.itemHeavyPlateQuantum.name=重型量子板
+item.itemHeavyPlateBlackSteel.name=重型黑钢板
+item.itemHeavyPlateStainlessSteel.name=重型不锈钢板
+item.itemHeavyPlateEglinSteel.name=重型埃格林钢板
+item.itemHeavyPlateMaragingSteel300.name=重型马氏体时效钢300板
+item.itemHeavyPlateTalonite.name=铬钴磷酸盐合金板
+item.itemHeavyPlateHypogen.name=重型海珀珍板
+item.itemHeavyPlateRhugnor.name=重型鲁格诺板
+item.itemHeavyPlateAdvancedNitinol.name=重型高级镍钛诺板
+item.itemHeavyPlateAstralTitanium.name=重型星体钛板
+item.itemHeavyPlateCelestialTungsten.name=重型天体钨板
+item.itemHeavyPlateWhiteMetal.name=重型白物质板
+item.itemHeavyPlateBlackMetal.name=重型黑物质板
+item.itemHeavyPlateAncientGranite.name=重型古花岗岩板
+
+item.GTPP.bauble.fireprotection.0.name=超级披萨手套
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=二氧化硒单元
+item.itemCellSeleniousAcid.name=亚硒酸单元
+
+//Added 25/7/19
+container.pestkiller=害虫杀手
+
+//Added 15/8/19
+gtpp.nei.decayables=可衰变箱子(铅封盒)
+entity.batKing.name=蝙蝠之王
+item.itemCellCarbyne.name=直链乙炔碳单元
+item.itemCellHydrogenCyanide.name=氢氰酸单元
+item.itemCactusCharcoal.name=仙人掌炭
+item.itemCactusCoke.name=仙人掌焦炭
+item.itemSugarCharcoal.name=糖炭
+item.itemSugarCoke.name=糖焦炭
+item.LiquidHydrogen.name=液氢单元[LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=防爆门
+tile.blockInhibitorObelisk.name=传送抑制方尖碑
+tile.Battlesign.name=战斗牌子
+tile.blockMagicBox.name=奥法之盒
+tile.blockManaPod.name=法力荚茎
+tile.buildToolBlock.name=工具方块
+tile.blockRedPlasma.name=红色等离子体方块
+tile.pipeBlock.name=管道
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=硫镉矿石
+item.crushedGreenockite.name=粉碎的硫镉矿石
+item.crushedCentrifugedGreenockite.name=离心硫镉矿石
+item.crushedPurifiedGreenockite.name=洗净的硫镉矿石
+item.dustImpureGreenockite.name=含杂硫镉矿粉
+item.dustPureGreenockite.name=洁净硫镉矿粉
+item.itemDustGreenockite.name=硫镉矿粉
+item.itemDustTinyGreenockite.name=小撮硫镉矿粉
+item.itemDustSmallGreenockite.name=小堆硫镉矿粉
+
+tile.OreRareEarthI.name=稀土(I)矿石
+item.crushedRareEarthI.name=粉碎的稀土(I)矿石
+item.crushedCentrifugedRareEarthI.name=离心稀土(I)矿石
+item.crushedPurifiedRareEarthI.name=洗净的稀土(I)矿石
+item.dustImpureRareEarthI.name=含杂稀土(I)粉
+item.dustPureRareEarthI.name=洁净稀土(I)粉
+item.itemDustRareEarthI.name=稀土(I)粉
+item.itemDustTinyRareEarthI.name=小撮稀土(I)粉
+item.itemDustSmallRareEarthI.name=小堆稀土(I)粉
+
+tile.OreRareEarthII.name=稀土(II)矿石
+item.crushedRareEarthII.name=粉碎的稀土(II)矿石
+item.crushedCentrifugedRareEarthII.name=离心稀土(II)矿石
+item.crushedPurifiedRareEarthII.name=洗净的稀土(II)矿石
+item.dustImpureRareEarthII.name=含杂稀土(II)粉
+item.dustPureRareEarthII.name=洁净稀土(II)粉
+item.itemDustRareEarthII.name=稀土(II)粉
+item.itemDustTinyRareEarthII.name=小撮稀土(II)粉
+item.itemDustSmallRareEarthII.name=小堆稀土(II)粉
+
+tile.OreRareEarthIII.name=稀土(III)矿石
+item.crushedRareEarthIII.name=粉碎的稀土(III)矿石
+item.crushedCentrifugedRareEarthIII.name=离心稀土(III)矿石
+item.crushedPurifiedRareEarthIII.name=洗净的稀土(III)矿石
+item.dustImpureRareEarthIII.name=含杂稀土(III)粉
+item.dustPureRareEarthIII.name=洁净稀土(III)粉
+item.itemDustRareEarthIII.name=稀土(III)粉
+item.itemDustTinyRareEarthIII.name=小撮稀土(III)粉
+item.itemDustSmallRareEarthIII.name=小堆稀土(III)粉
+
+//Added 16/10/19
+item.BioRecipeSelector.name=编程生物电路
+item.FermentationBase.name=发酵基单元
+item.ureamix.name=尿素混合物单元
+item.liquidresin.name=液态树脂单元
+item.propionicacid.name=丙酸单元
+item.aceticacid.name=乙酸单元
+item.BasicAgrichemItem.0.name=藻类生物质
+item.BasicAgrichemItem.1.name=绿藻生物质
+item.BasicAgrichemItem.2.name=褐藻生物质
+item.BasicAgrichemItem.3.name=金褐藻生物质
+item.BasicAgrichemItem.4.name=红藻生物质
+item.BasicAgrichemItem.5.name=纤维素纤维
+item.BasicAgrichemItem.6.name=金褐纤维素纤维
+item.BasicAgrichemItem.7.name=红色纤维素纤维
+item.BasicAgrichemItem.8.name=堆肥
+item.BasicAgrichemItem.9.name=木颗粒
+item.BasicAgrichemItem.10.name=木砖
+item.BasicAgrichemItem.11.name=纤维素浆
+item.BasicAgrichemItem.12.name=粗制生物树脂
+item.BasicAgrichemItem.13.name=催化剂载体
+item.BasicAgrichemItem.14.name=绿色金属催化剂
+item.BasicAgrichemItem.15.name=藻酸
+item.BasicAgrichemItem.16.name=氧化铝
+item.BasicAgrichemItem.17.name=铝颗粒
+item.BasicAgrichemItem.18.name=铝酸钠
+item.BasicAgrichemItem.19.name=氢氧化钠
+item.BasicAgrichemItem.20.name=碳酸钠
+item.BasicAgrichemItem.21.name=氯化锂
+
+//Added 24/10/19
+item.butanol.name=丁醇单元
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=热水
+fluidHotWater.name=热水
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=热钛锭
+item.OilHeavy.name=重油单元
+item.UnsymmetricalDimethylhydrazine.name=偏二甲肼单元
+item.benzene.name=苯单元
+item.Benzene.name=苯单元
+item.phenol.name=苯酚单元
+item.CarbonDioxide.name=二氧化碳单元
+item.itemCellCarbonDioxide.name=二氧化碳单元
+item.CarbonMonoxide.name=一氧化碳单元
+item.itemCellCarbonMonoxide.name=一氧化碳单元
+item.acetone.name=丙酮单元
+item.saltwater.name=盐水单元
+item.BasicAgrichemItem.22.name=模具(颗粒)
+item.BasicAgrichemItem.23.name=洁净铝混合物
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=红色金属催化剂
+item.BasicGenericChemItem.1.name=黄色金属催化剂
+item.BasicGenericChemItem.2.name=蓝色金属催化剂
+item.BasicGenericChemItem.3.name=橙色金属催化剂
+item.BasicGenericChemItem.4.name=紫色金属催化剂
+item.BasicGenericChemItem.5.name=棕色金属催化剂
+item.MudRedSlurry.name=红色泥浆单元
+item.liquid_toluene.name=甲苯单元
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=粉色金属催化剂
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=生人肉
+item.BasicMetaFood.1.name=熟人肉
+item.BasicMetaFood.2.name=生马肉
+item.BasicMetaFood.3.name=熟马肉
+item.BasicMetaFood.4.name=生狼肉
+item.BasicMetaFood.5.name=熟狼肉
+item.BasicMetaFood.6.name=生猫肉
+item.BasicMetaFood.7.name=熟猫肉
+item.BasicMetaFood.8.name=烈焰人肉
+
+item.itemCellNaquadahFuel.name=硅岩燃料单元
+item.itemCellEnrichedNaquadahFuel.name=富集硅岩燃料单元
+item.itemCellNaquadriaFuel.name=超能硅岩燃料单元
+item.boricacid.name=硼酸单元
+item.hydrochloricacid.name=盐酸单元
+
+item.BasicAlgaeItem.name=可培植藻类
+item.BasicAlgaeItem.0.name=可培植藻类(I)
+item.BasicAlgaeItem.1.name=可培植藻类(II)
+item.BasicAlgaeItem.2.name=可培植藻类(III)
+item.BasicAlgaeItem.3.name=可培植藻类(IV)
+item.BasicAlgaeItem.4.name=可培植藻类(V)
+item.BasicAlgaeItem.5.name=可培植藻类(VI)
+item.BasicAlgaeItem.6.name=可培植藻类(VII)
+
+//Added 30/03/20
+item.milledChalcopyrite.name=研磨黄铜矿
+item.milledSphalerite.name=研磨闪锌矿
+item.milledNickel.name=研磨镍矿
+item.milledPlatinum.name=研磨铂矿
+item.milledPentlandite.name=研磨镍黄铁矿
+item.FrothZincflotation.name=闪锌矿浮选泡沫单元
+item.FrothCopperflotation.name=黄铜矿浮选泡沫单元
+item.FrothNickelflotation.name=镍矿浮选泡沫单元
+item.FrothPlatinumflotation.name=铂矿浮选泡沫单元
+item.FrothPentlanditeflotation.name=镍黄铁矿浮选泡沫单元
+item.BasicGenericChemItem.7.name=铝研磨球
+item.BasicGenericChemItem.8.name=皂石研磨球
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=乙醇钠粉
+item.BasicGenericChemItem.10.name=乙基黄原酸钠粉
+item.BasicGenericChemItem.11.name=乙基黄原酸钾粉
+item.BasicGenericChemItem.12.name=氢氧化钾粉
+item.CarbonDisulfide.name=二硫化碳单元
+item.HydrogenSulfide.name=硫化氢单元
+item.BasicAgrichemItem.24.name=松果
+item.BasicAgrichemItem.25.name=松树碎料
+item.pineoil.name=松油单元
+
+//Added 11/4/20
+item.milledRedstone.name=研磨红石矿
+item.milledSpessartine.name=研磨锰铝榴石
+item.milledGrossular.name=研磨钙铝榴石
+item.milledAlmandine.name=研磨铁铝榴石
+item.milledPyrope.name=研磨镁铝榴石
+item.FrothRedstoneflotation.name=红石矿浮选泡沫单元
+item.FrothSpessartineflotation.name=锰铝榴石浮选泡沫单元
+item.FrothGrossularflotation.name=钙铝榴石浮选泡沫单元
+item.FrothAlmandineflotation.name=铁铝榴石浮选泡沫单元
+item.FrothPyropeflotation.name=镁铝榴石浮选泡沫单元
+
+//Added 13/04/20
+item.T3RecipeSelector.name=突破编程电路
+
+//Added 03/05/20
+entity.miscutils.batKing.name=幽灵蝙蝠
+entity.miscutils.bigChickenFriendly.name=巨大的鸡
+entity.miscutils.AusDingo.name=澳洲野狗
+entity.miscutils.AusBoar.name=澳洲野猪
+entity.miscutils.AusSpider.name=森林蜘蛛
+entity.miscutils.AusOctopus.name=澳洲章鱼
+container.EggBox=鸡蛋孵化盒
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=容量瓶配置器
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=劳伦姆合金锭
+item.itemHotIngotLaurenium.name=热劳伦姆合金锭
+item.itemDustLaurenium.name=劳伦姆合金粉
+item.itemDustTinyLaurenium.name=小撮劳伦姆合金粉
+item.itemDustSmallLaurenium.name=小堆劳伦姆合金粉
+item.itemNuggetLaurenium.name=劳伦姆合金粒
+item.itemPlateLaurenium.name=劳伦姆合金板
+item.itemPlateDoubleLaurenium.name=双重劳伦姆合金板
+item.itemBoltLaurenium.name=劳伦姆合金螺栓
+item.itemRodLaurenium.name=劳伦姆合金杆
+item.itemRodLongLaurenium.name=长劳伦姆合金杆
+item.itemRingLaurenium.name=劳伦姆合金环
+item.itemScrewLaurenium.name=劳伦姆合金螺丝
+item.itemRotorLaurenium.name=劳伦姆合金转子
+item.itemGearLaurenium.name=劳伦姆合金齿轮
+item.itemCellLaurenium.name=劳伦姆合金单元
+tile.Block of Laurenium.name=劳伦姆合金块
+tile.Laurenium Frame Box.name=劳伦姆合金框架
+item.itemIngotBotmium.name=博特姆合金锭
+item.itemHotIngotBotmium.name=热博特姆合金锭
+item.itemDustBotmium.name=博特姆合金粉
+item.itemDustTinyBotmium.name=小撮博特姆合金粉
+item.itemDustSmallBotmium.name=小堆博特姆合金粉
+item.itemNuggetBotmium.name=博特姆合金粒
+item.itemPlateBotmium.name=博特姆合金板
+item.itemPlateDoubleBotmium.name=双重博特姆合金板
+item.itemBoltBotmium.name=博特姆合金螺栓
+item.itemRodBotmium.name=博特姆合金杆
+item.itemRodLongBotmium.name=长博特姆合金杆
+item.itemRingBotmium.name=博特姆合金环
+item.itemScrewBotmium.name=博特姆合金螺丝
+item.itemRotorBotmium.name=博特姆合金转子
+item.itemGearBotmium.name=博特姆合金齿轮
+item.itemCellBotmium.name=博特姆合金单元
+tile.Block of Botmium.name=博特姆合金块
+tile.Botmium Frame Box.name=博特姆合金框架
+
+//Added 29/05/20
+item.itemBasicTurbine.name=基础涡轮
+item.itemBasicTurbine_0.name=基础铁涡轮
+item.itemBasicTurbine_1.name=基础青铜涡轮
+item.itemBasicTurbine_2.name=基础钢涡轮
+
+interaction.voidexcess.enabled=启用过量销毁
+interaction.voidexcess.disabled=禁用过量销毁
+
+interaction.separateBusses.enabled=独立输入总线
+interaction.separateBusses.disabled=联合输入总线
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=铀渣混合物
+item.BasicNuclearChemItem.1.name=钚渣混合物
+item.BasicNuclearChemItem.2.name=氟盐渣混合物
+item.BasicNuclearChemItem.3.name=稀有渣混合物
+item.BasicNuclearChemItem.4.name=红藻生物质
+item.BasicNuclearChemItem.5.name=纤维素纤维
+item.BasicNuclearChemItem.6.name=金褐纤维素纤维
+item.BasicNuclearChemItem.7.name=红色纤维素纤维
+
+item.itemCellLiFBeF2ZrF4U235.name=熔盐单元[铀235复合氟化物]
+item.itemCellLiFBeF2ZrF4UF4.name=熔盐单元[铀锆复合氟化物]
+item.itemCellLiFBeF2ThF4UF4.name=熔盐单元[铀钍复合氟化物]
+item.Li2BeF2UF4.name=枯竭熔盐单元[Li2BeF2UF4]
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP单元
+item.itemCellUF6F2.name=UF6F2单元
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4单元
+item.itemCellUF6F2FP.name=UF6F2FP单元
+item.dustProtactinium233.name=镤-233粉
+item.itemCellLiFThF4.name=LiFThF4单元
+item.NuclearWaste.name=核废水单元
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4单元
+item.itemCellSodiumFluoride.name=氟化钠单元
+item.itemCellLiFBeF2.name=LiFBeF2单元
+
+//Added 7/12/21
+item.itemCellDysprosium.name=镝单元
+item.itemCellThorium.name=钍单元
+item.itemCellTellurium.name=碲单元
+item.itemCellThorium232.name=钍-232单元
+item.itemCellLithiumTetrafluoroberyllate.name=四氟铍酸锂单元
+item.itemCellBurntReactorFuelI.name=枯竭熔盐单元[铀235复合氟化物]
+item.itemCellBurntReactorFuelII.name=枯竭熔盐单元[铀锆复合氟化物]
+item.itemDustTinyIndium.name=小撮铟粉
+item.itemDustSmallIndium.name=小堆铟粉
+item.itemDustIndium.name=铟粉
+item.itemDustTinyBerylliumHydroxide.name=小撮氢氧化铍粉
+item.itemDustSmallBerylliumHydroxide.name=小堆氢氧化铍粉
+item.itemDustBerylliumHydroxide.name=氢氧化铍粉
+item.itemDustTinyAmmoniumBifluoride.name=小撮氟化氢铵粉
+item.itemDustSmallAmmoniumBifluoride.name=小堆氟化氢铵粉
+item.itemDustAmmoniumBifluoride.name=氟化氢铵粉
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=小撮氟铍酸铵粉
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=小堆氟铍酸铵粉
+item.itemDustAmmoniumTetrafluoroberyllate.name=氟铍酸铵粉
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=含杂LiFBeF2单元
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=氦涤LiFBeF2UF4FP单元
+item.itemCellFluorineSpargedLiFThF4.name=氟涤LiFThF4单元
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=氟涤LiFBeF2ThF4单元
+item.itemIngotHS188A.name=HS-188A锭
+item.itemHotIngotHS188A.name=热HS-188A锭
+item.itemDustHS188A.name=HS-188A粉
+item.itemDustTinyHS188A.name=小撮HS-188A粉
+item.itemDustSmallHS188A.name=小堆HS-188A粉
+item.itemNuggetHS188A.name=HS-188A粒
+item.itemPlateHS188A.name=HS-188A板
+item.itemPlateDoubleHS188A.name=双重HS-188A板
+item.itemBoltHS188A.name=HS-188A螺栓
+item.itemRodHS188A.name=HS-188A杆
+item.itemRodLongHS188A.name=长HS-188A杆
+item.itemRingHS188A.name=HS-188A环
+item.itemScrewHS188A.name=HS-188A螺丝
+item.itemRotorHS188A.name=HS-188A转子
+item.itemGearHS188A.name=HS-188A齿轮
+item.itemCellHS188A.name=HS-188A单元
+
+//Added 12/12/21
+item.itemIngotErbium.name=铒锭
+item.itemHotIngotErbium.name=热铒锭
+item.itemDustErbium.name=铒粉
+item.itemDustTinyErbium.name=小撮铒粉
+item.itemDustSmallErbium.name=小堆铒粉
+item.itemNuggetErbium.name=铒粒
+item.itemPlateErbium.name=铒板
+item.itemPlateDoubleErbium.name=双重铒板
+item.itemBoltErbium.name=铒螺栓
+item.itemRodErbium.name=铒杆
+item.itemRodLongErbium.name=长铒杆
+item.itemRingErbium.name=铒环
+item.itemScrewErbium.name=铒螺丝
+item.itemRotorErbium.name=铒转子
+item.itemGearErbium.name=铒齿轮
+item.itemCellErbium.name=铒单元
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr锭
+item.itemHotIngotHeLiCoPtEr.name=热HeLiCoPtEr锭
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr粉
+item.itemDustTinyHeLiCoPtEr.name=小撮HeLiCoPtEr粉
+item.itemDustSmallHeLiCoPtEr.name=小堆HeLiCoPtEr粉
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr粒
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr板
+item.itemPlateDoubleHeLiCoPtEr.name=双重HeLiCoPtEr板
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr螺栓
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr杆
+item.itemRodLongHeLiCoPtEr.name=长HeLiCoPtEr杆
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr环
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr螺丝
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr转子
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr齿轮
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr单元
+item.itemIngotPraseodymium.name=镨锭
+item.itemHotIngotPraseodymium.name=热镨锭
+item.itemDustPraseodymium.name=镨粉
+item.itemDustTinyPraseodymium.name=小撮镨粉
+item.itemDustSmallPraseodymium.name=小堆镨粉
+item.itemNuggetPraseodymium.name=镨粒
+item.itemPlatePraseodymium.name=镨板
+item.itemPlateDoublePraseodymium.name=双重镨板
+item.itemBoltPraseodymium.name=镨螺栓
+item.itemRodPraseodymium.name=镨杆
+item.itemRodLongPraseodymium.name=长镨杆
+item.itemRingPraseodymium.name=镨环
+item.itemScrewPraseodymium.name=镨螺丝
+item.itemRotorPraseodymium.name=镨转子
+item.itemGearPraseodymium.name=镨齿轮
+item.itemCellPraseodymium.name=镨单元
+item.milledMonazite.name=研磨独居石
+item.FrothMonaziteflotation.name=独居石浮选泡沫单元
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=甲醛催化剂
+item.hydrogenchloridemix.name=氢氯混合物
+
+//Added 19/01/22
+item.SunnariumBit.name=阳光化合物粒
+
+//Added 29/01/22
+sleep.event.okay=你睡得很香,现在感觉不错.
+sleep.event.good=你睡得很香,现在感觉好极了.
+sleep.event.wellrested=你得到了充分的休息.
+sleep.event.downsides=debuff不再困扰着你.
+item.miscutils:magicfeather.name=魔法羽毛
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=固体酸催化剂
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=无尽突变催化剂 \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/DevCapeHD.png b/src/main/resources/assets/miscutils/textures/DevCapeHD.png
new file mode 100644
index 0000000000..f74bd8c9e3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/DevCapeHD.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/FancyCapeHD.png b/src/main/resources/assets/miscutils/textures/FancyCapeHD.png
new file mode 100644
index 0000000000..d8da3ba76d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/FancyCapeHD.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/Orange.png b/src/main/resources/assets/miscutils/textures/Orange.png
new file mode 100644
index 0000000000..9de164d437
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/Orange.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/OrangeHD.png b/src/main/resources/assets/miscutils/textures/OrangeHD.png
new file mode 100644
index 0000000000..ea5e8af8cf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/OrangeHD.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png b/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png
new file mode 100644
index 0000000000..c4ebef82b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/TesterCapeHD.png b/src/main/resources/assets/miscutils/textures/TesterCapeHD.png
new file mode 100644
index 0000000000..da3ee2e50f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/TesterCapeHD.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/Blank.png b/src/main/resources/assets/miscutils/textures/blocks/Blank.png
new file mode 100644
index 0000000000..4d7beb8065
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/Blank.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png
new file mode 100644
index 0000000000..6514089c64
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta
new file mode 100644
index 0000000000..cba1c43271
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0,1,2,3,4,5,6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png
new file mode 100644
index 0000000000..29b3a74f34
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png
new file mode 100644
index 0000000000..14b5e673d0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..10cf8c6afd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png
new file mode 100644
index 0000000000..53e0e51c06
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn b/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn
new file mode 100644
index 0000000000..453b7325c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png b/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png
new file mode 100644
index 0000000000..ad6502026e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png
new file mode 100644
index 0000000000..c5d7fe80b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta
new file mode 100644
index 0000000000..b0c531fa79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png
new file mode 100644
index 0000000000..40d9b8f31b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png
new file mode 100644
index 0000000000..4e2e761fa8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..9720a23866
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png
new file mode 100644
index 0000000000..c822112126
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png b/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png
new file mode 100644
index 0000000000..2a5b8aec95
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png
new file mode 100644
index 0000000000..97c32e5988
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta
new file mode 100644
index 0000000000..cba1c43271
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0,1,2,3,4,5,6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png
new file mode 100644
index 0000000000..29b3a74f34
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png
new file mode 100644
index 0000000000..9c14ae0abf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..163c81b6a1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png
new file mode 100644
index 0000000000..d4cd1c1dee
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png
new file mode 100644
index 0000000000..bb8bee0ce7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta
new file mode 100644
index 0000000000..163c81b6a1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png
new file mode 100644
index 0000000000..ca38aad14f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png
new file mode 100644
index 0000000000..bb21d8af98
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta
new file mode 100644
index 0000000000..c8988534a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0,1,2,3,4,5,6,7]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png
new file mode 100644
index 0000000000..c54c56daaf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png b/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png
new file mode 100644
index 0000000000..42202d8fae
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png
new file mode 100644
index 0000000000..88d5cb9c72
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png
new file mode 100644
index 0000000000..d1a5b4f1b0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png
new file mode 100644
index 0000000000..b0c62a7b3d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png
new file mode 100644
index 0000000000..b61a42b935
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png
new file mode 100644
index 0000000000..0647c2105f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png
new file mode 100644
index 0000000000..a9bed9ce0c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png
new file mode 100644
index 0000000000..7222ca77d7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png
new file mode 100644
index 0000000000..eb7affaa01
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png
new file mode 100644
index 0000000000..a650d73983
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png
new file mode 100644
index 0000000000..8a0391538b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png
new file mode 100644
index 0000000000..22c7cd7978
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png
new file mode 100644
index 0000000000..5965bfce89
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png
new file mode 100644
index 0000000000..eb8020f1c9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png
new file mode 100644
index 0000000000..df4e3a1a41
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png
new file mode 100644
index 0000000000..b807fc0465
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png
new file mode 100644
index 0000000000..02bd653538
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png
new file mode 100644
index 0000000000..1b942edfc9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png
new file mode 100644
index 0000000000..bb27184e51
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta
new file mode 100644
index 0000000000..699d8280c3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta
@@ -0,0 +1,39 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31
+ ]
+ }
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png
new file mode 100644
index 0000000000..89fed025b4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png
new file mode 100644
index 0000000000..4a8cbd634c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png
new file mode 100644
index 0000000000..fc2b8c5c89
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png
new file mode 100644
index 0000000000..7753c1920a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png
new file mode 100644
index 0000000000..75f21218d9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png
new file mode 100644
index 0000000000..05f1cc1d42
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png
new file mode 100644
index 0000000000..066a926278
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png
new file mode 100644
index 0000000000..9ba5c0e255
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png
new file mode 100644
index 0000000000..4b707d2ca2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png
new file mode 100644
index 0000000000..64b28d0233
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png
new file mode 100644
index 0000000000..6a5dba4448
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png
new file mode 100644
index 0000000000..651c539c5b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png
new file mode 100644
index 0000000000..1d71c95ea4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png
new file mode 100644
index 0000000000..d6cb89d67d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png
new file mode 100644
index 0000000000..6c45ff313f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png
new file mode 100644
index 0000000000..2602f44af3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png
new file mode 100644
index 0000000000..9dc63e146e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png
new file mode 100644
index 0000000000..d391da4eaf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png
new file mode 100644
index 0000000000..9d454b17d4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png
new file mode 100644
index 0000000000..d5f23d447f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png
new file mode 100644
index 0000000000..5a4f23d3ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png
new file mode 100644
index 0000000000..d40c95f3aa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png
new file mode 100644
index 0000000000..69330145ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta
new file mode 100644
index 0000000000..49e988e8bb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png
new file mode 100644
index 0000000000..2af5057b3d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta
new file mode 100644
index 0000000000..49e988e8bb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png
new file mode 100644
index 0000000000..fc9c6e5d8a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png
new file mode 100644
index 0000000000..695451fafc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta
new file mode 100644
index 0000000000..19b79a1e22
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames":[{"index":0,"time":100},{"index":1,"time":3},{"index":2,"time":2},{"index":3,"time":3},0,1,2,3]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png
new file mode 100644
index 0000000000..6a1894756d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png
new file mode 100644
index 0000000000..c9663bf711
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png
new file mode 100644
index 0000000000..3351f5d0a6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png
new file mode 100644
index 0000000000..386f3c8e67
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png
new file mode 100644
index 0000000000..a61413240b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png
new file mode 100644
index 0000000000..26b3b1e4c1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png
new file mode 100644
index 0000000000..72e8c12c07
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png
new file mode 100644
index 0000000000..148d5e4955
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png
new file mode 100644
index 0000000000..ebeda86aa0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png
new file mode 100644
index 0000000000..a0767f7836
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png
new file mode 100644
index 0000000000..553c674b58
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png
new file mode 100644
index 0000000000..f6dec1fccf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png
new file mode 100644
index 0000000000..815ad92daf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png
new file mode 100644
index 0000000000..a8b157975c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png
new file mode 100644
index 0000000000..10d882e13f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png
new file mode 100644
index 0000000000..b4cf1ad1c5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png
new file mode 100644
index 0000000000..5be386c991
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png
new file mode 100644
index 0000000000..4d2770d6ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png
new file mode 100644
index 0000000000..dda5b9f70c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png
new file mode 100644
index 0000000000..08083ce68d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png
new file mode 100644
index 0000000000..d368a109ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png
new file mode 100644
index 0000000000..974026d8c1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png
new file mode 100644
index 0000000000..64797504ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png
new file mode 100644
index 0000000000..ed3ba22f03
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png
new file mode 100644
index 0000000000..0822a9ff9e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png
new file mode 100644
index 0000000000..d17c80290e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png
new file mode 100644
index 0000000000..02b703dd72
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png
new file mode 100644
index 0000000000..4d789dcd34
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png
new file mode 100644
index 0000000000..1a86034ee6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png
new file mode 100644
index 0000000000..5b614c2b75
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png
new file mode 100644
index 0000000000..e5c64819ce
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png
new file mode 100644
index 0000000000..9cd772a7bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png
new file mode 100644
index 0000000000..758f3a5925
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png
new file mode 100644
index 0000000000..582a7226ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png
new file mode 100644
index 0000000000..bf8bee95fd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png
new file mode 100644
index 0000000000..59ec6fc494
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png
new file mode 100644
index 0000000000..0ebf3022a1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png
new file mode 100644
index 0000000000..726b97e140
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png
new file mode 100644
index 0000000000..a5b703fcd6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png
new file mode 100644
index 0000000000..49b84b97a4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png
new file mode 100644
index 0000000000..c6fd476b1a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png
new file mode 100644
index 0000000000..0300e86059
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png
new file mode 100644
index 0000000000..5ef3e61175
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png
new file mode 100644
index 0000000000..8e077d1d7d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png
new file mode 100644
index 0000000000..5aff3c93de
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png
new file mode 100644
index 0000000000..c3cad83294
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png
new file mode 100644
index 0000000000..87b3fb5225
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png
new file mode 100644
index 0000000000..10798b86d8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png
new file mode 100644
index 0000000000..ad834b3576
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png
new file mode 100644
index 0000000000..ce6321458d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png
new file mode 100644
index 0000000000..d5a2428eb1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png
new file mode 100644
index 0000000000..70317dd7a7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png
new file mode 100644
index 0000000000..3c61345b63
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png
new file mode 100644
index 0000000000..764853abfa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png
new file mode 100644
index 0000000000..7c7c30d998
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png
new file mode 100644
index 0000000000..367a85067b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png
new file mode 100644
index 0000000000..52de50d2b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png
new file mode 100644
index 0000000000..f283ec79b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png
new file mode 100644
index 0000000000..426c42b558
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png
new file mode 100644
index 0000000000..011bee76c3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png
new file mode 100644
index 0000000000..7b23d35271
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png
new file mode 100644
index 0000000000..b930b49af3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png
new file mode 100644
index 0000000000..6e73111695
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png
new file mode 100644
index 0000000000..98d2cdb4c5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png
new file mode 100644
index 0000000000..5db3a982ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png
new file mode 100644
index 0000000000..00b697cdf7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png
new file mode 100644
index 0000000000..0464a70a58
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png
new file mode 100644
index 0000000000..e70c013912
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png
new file mode 100644
index 0000000000..e9938feff2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png
new file mode 100644
index 0000000000..890f09f231
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png
new file mode 100644
index 0000000000..42eeda7b4e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png
new file mode 100644
index 0000000000..94db5b9946
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png
new file mode 100644
index 0000000000..6efa02daf2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png
new file mode 100644
index 0000000000..3983966fda
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png
new file mode 100644
index 0000000000..7f14006fe7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png
new file mode 100644
index 0000000000..edd4a94aee
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png
new file mode 100644
index 0000000000..1a63ac762c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png
new file mode 100644
index 0000000000..9964ac7486
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png
new file mode 100644
index 0000000000..aac94f4d6c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png
new file mode 100644
index 0000000000..4571bca877
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png
new file mode 100644
index 0000000000..2391919c11
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png
new file mode 100644
index 0000000000..644ed36a90
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png
new file mode 100644
index 0000000000..b67da08aed
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png
new file mode 100644
index 0000000000..1d8c4e2490
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png
new file mode 100644
index 0000000000..eace1e1e7e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png
new file mode 100644
index 0000000000..e63d77edad
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png
new file mode 100644
index 0000000000..63f45d2287
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png
new file mode 100644
index 0000000000..6c571f8e58
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png
new file mode 100644
index 0000000000..204a0aa231
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png
new file mode 100644
index 0000000000..4c927a85f2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png
new file mode 100644
index 0000000000..9fa6010d04
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png
new file mode 100644
index 0000000000..ee82155436
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png
new file mode 100644
index 0000000000..7bd92aaa6e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png
new file mode 100644
index 0000000000..70a75f9600
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png
new file mode 100644
index 0000000000..22220a9ba6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png
new file mode 100644
index 0000000000..0d40f42170
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png
new file mode 100644
index 0000000000..e4ea8065da
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png
new file mode 100644
index 0000000000..43541eeeb2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png
new file mode 100644
index 0000000000..c8d30df85a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png
new file mode 100644
index 0000000000..349f3114af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png
new file mode 100644
index 0000000000..8f07eb15cc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png
new file mode 100644
index 0000000000..bb75cda218
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png
new file mode 100644
index 0000000000..907c77700e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png
new file mode 100644
index 0000000000..7ca146e829
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png
new file mode 100644
index 0000000000..52019a127f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png
new file mode 100644
index 0000000000..0021064944
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png
new file mode 100644
index 0000000000..16a2322abb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png
new file mode 100644
index 0000000000..3728d698e5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png
new file mode 100644
index 0000000000..338086ea34
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png
new file mode 100644
index 0000000000..cf92e50fe1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png
new file mode 100644
index 0000000000..44f46489f4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png
new file mode 100644
index 0000000000..cd3d00ed5d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png
new file mode 100644
index 0000000000..e15af0cd81
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png
new file mode 100644
index 0000000000..16a9298fa0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png
new file mode 100644
index 0000000000..236b4b80b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png
new file mode 100644
index 0000000000..2146a21dcb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png
new file mode 100644
index 0000000000..8e6c4b7fab
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png
new file mode 100644
index 0000000000..968baf1add
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png
new file mode 100644
index 0000000000..5a9274232f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png
new file mode 100644
index 0000000000..0fd7625761
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png
new file mode 100644
index 0000000000..9f16c39367
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png
new file mode 100644
index 0000000000..15eb15c7e0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png
new file mode 100644
index 0000000000..4e86dfaf93
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png
new file mode 100644
index 0000000000..790c0d4a74
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png
new file mode 100644
index 0000000000..5c2827b117
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png
new file mode 100644
index 0000000000..0a2f07d9fe
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png
new file mode 100644
index 0000000000..6ad3543609
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png
new file mode 100644
index 0000000000..65942b572f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png
new file mode 100644
index 0000000000..7ee3b4c91d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png
new file mode 100644
index 0000000000..8291c9a39c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png
new file mode 100644
index 0000000000..2a8779fb61
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png
new file mode 100644
index 0000000000..1ddd1f6ad5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png
new file mode 100644
index 0000000000..ac0dcc3f76
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png
new file mode 100644
index 0000000000..1d2101a43a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png
new file mode 100644
index 0000000000..e412953793
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png
new file mode 100644
index 0000000000..e5d71c3965
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png
new file mode 100644
index 0000000000..ad8cb864ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png
new file mode 100644
index 0000000000..751662e049
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png
new file mode 100644
index 0000000000..142c713efe
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png
new file mode 100644
index 0000000000..5e1097bf80
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png
new file mode 100644
index 0000000000..391d12d2cd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png
new file mode 100644
index 0000000000..5dc9635b3a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png
new file mode 100644
index 0000000000..03fcb8285b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png
new file mode 100644
index 0000000000..01d8912612
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png
new file mode 100644
index 0000000000..7755b75e4a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png
new file mode 100644
index 0000000000..cf3107aecd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png
new file mode 100644
index 0000000000..fb1e7714cf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png
new file mode 100644
index 0000000000..38e66ff784
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png
new file mode 100644
index 0000000000..20083e41ae
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png
new file mode 100644
index 0000000000..bbcd289595
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png
new file mode 100644
index 0000000000..cb5c142713
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png
new file mode 100644
index 0000000000..50e459ac1e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png
new file mode 100644
index 0000000000..741ca3ac20
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png
new file mode 100644
index 0000000000..64af38a224
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png
new file mode 100644
index 0000000000..de2abc3646
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png
new file mode 100644
index 0000000000..ff782c55c4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png
new file mode 100644
index 0000000000..10de7d0317
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png
new file mode 100644
index 0000000000..b35c8b37e3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png
new file mode 100644
index 0000000000..1da7e74566
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png
new file mode 100644
index 0000000000..aaab388552
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png
new file mode 100644
index 0000000000..3581670fb5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png
new file mode 100644
index 0000000000..d4422e227b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png
new file mode 100644
index 0000000000..f24d8c84e3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png
new file mode 100644
index 0000000000..7a32bac3cb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png
new file mode 100644
index 0000000000..19667bb6be
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png
new file mode 100644
index 0000000000..13d8bd9307
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png
new file mode 100644
index 0000000000..5874834cf1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png
new file mode 100644
index 0000000000..0a1c52ad33
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png
new file mode 100644
index 0000000000..7d30aba7b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png
new file mode 100644
index 0000000000..63991ec562
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png
new file mode 100644
index 0000000000..07824b69dc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png
new file mode 100644
index 0000000000..e01ce3cb2e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png
new file mode 100644
index 0000000000..0cc8baaf9a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png
new file mode 100644
index 0000000000..dd20f55350
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png
new file mode 100644
index 0000000000..8e5d6fc552
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png
new file mode 100644
index 0000000000..cf867dbb2f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png
new file mode 100644
index 0000000000..2986bea8f6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png
new file mode 100644
index 0000000000..52f08e5a5b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png
new file mode 100644
index 0000000000..2768d1935f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png
new file mode 100644
index 0000000000..d27ed3ed00
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png
new file mode 100644
index 0000000000..55f19a1f1b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png
new file mode 100644
index 0000000000..588c573775
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png
new file mode 100644
index 0000000000..761953786f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png
new file mode 100644
index 0000000000..f863c2635e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png
new file mode 100644
index 0000000000..a9052658b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png
new file mode 100644
index 0000000000..4b7af976a5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png
new file mode 100644
index 0000000000..ac293cd370
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png
new file mode 100644
index 0000000000..5ead585025
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png
new file mode 100644
index 0000000000..74e2a6b31b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png
new file mode 100644
index 0000000000..5fd2f744a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png
new file mode 100644
index 0000000000..b571a65158
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png
new file mode 100644
index 0000000000..88a39782ac
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png
new file mode 100644
index 0000000000..23752aea81
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png
new file mode 100644
index 0000000000..8d74fb171f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png
new file mode 100644
index 0000000000..946544c42d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png
new file mode 100644
index 0000000000..f457d249da
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png
new file mode 100644
index 0000000000..5fd30ed50f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png
new file mode 100644
index 0000000000..c846c18e86
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png
new file mode 100644
index 0000000000..91d8c1e291
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png
new file mode 100644
index 0000000000..7f3bb56a09
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png
new file mode 100644
index 0000000000..9f408b7dbf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png
new file mode 100644
index 0000000000..60c0c9041e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png
new file mode 100644
index 0000000000..62fde6b46c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png
new file mode 100644
index 0000000000..b4885d28ed
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png
new file mode 100644
index 0000000000..3e00f22271
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png
new file mode 100644
index 0000000000..5350e00ac0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png
new file mode 100644
index 0000000000..aab39c408c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png
new file mode 100644
index 0000000000..6150482d1f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png
new file mode 100644
index 0000000000..8f9a554135
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png
new file mode 100644
index 0000000000..e8ef3944be
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png
new file mode 100644
index 0000000000..0129fd6b32
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png
new file mode 100644
index 0000000000..166abf574e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png
new file mode 100644
index 0000000000..b7146ab582
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png
new file mode 100644
index 0000000000..fd663e0718
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png
new file mode 100644
index 0000000000..ff071f2eaa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png
new file mode 100644
index 0000000000..bed5021da3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png
new file mode 100644
index 0000000000..997fc2835f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png
new file mode 100644
index 0000000000..78900cf455
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png
new file mode 100644
index 0000000000..82cf7f8776
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png
new file mode 100644
index 0000000000..8e1754bea8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png
new file mode 100644
index 0000000000..e88435698c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png
new file mode 100644
index 0000000000..77314ce820
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png
new file mode 100644
index 0000000000..e24f9ff199
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png
new file mode 100644
index 0000000000..6f4745f516
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png
new file mode 100644
index 0000000000..99e41e3fbf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png
new file mode 100644
index 0000000000..c1bf500e05
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png
new file mode 100644
index 0000000000..5a196e3a1f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png
new file mode 100644
index 0000000000..974338f8b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png
new file mode 100644
index 0000000000..ffb2619f16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png
new file mode 100644
index 0000000000..18889c5d4f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png
new file mode 100644
index 0000000000..f2babfe8ef
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png
new file mode 100644
index 0000000000..b6a47cab6c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png
new file mode 100644
index 0000000000..fb19d35e39
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png
new file mode 100644
index 0000000000..1f26a011ff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png
new file mode 100644
index 0000000000..38c8494bcb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png
new file mode 100644
index 0000000000..f0a57c9542
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png
new file mode 100644
index 0000000000..af2372797c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png
new file mode 100644
index 0000000000..99bb2485b5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png
new file mode 100644
index 0000000000..90c66a8a1e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png
new file mode 100644
index 0000000000..43236b0090
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png
new file mode 100644
index 0000000000..e7a9e84fc0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png
new file mode 100644
index 0000000000..f15026ec0f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png
new file mode 100644
index 0000000000..a1fd4d6c12
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png
new file mode 100644
index 0000000000..650e2a28ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png
new file mode 100644
index 0000000000..a9a833c72a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png
new file mode 100644
index 0000000000..297c509211
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png
new file mode 100644
index 0000000000..bfa0569cb0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png
new file mode 100644
index 0000000000..9238c4d418
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png
new file mode 100644
index 0000000000..dac28502eb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png
new file mode 100644
index 0000000000..c92456a0b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png
new file mode 100644
index 0000000000..4483223ff3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png
new file mode 100644
index 0000000000..4bd0c30028
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png
new file mode 100644
index 0000000000..af066c32cf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png
new file mode 100644
index 0000000000..06742246f9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png
new file mode 100644
index 0000000000..793f5b8b82
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png
new file mode 100644
index 0000000000..53a53221cd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png
new file mode 100644
index 0000000000..c594b58add
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png
new file mode 100644
index 0000000000..68b4e3e9c2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png
new file mode 100644
index 0000000000..bf6624a0b1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png
new file mode 100644
index 0000000000..3bd3092cc0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png
new file mode 100644
index 0000000000..e402d9b6d0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png
new file mode 100644
index 0000000000..975f4aed86
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png
new file mode 100644
index 0000000000..bf1cb0e6a5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png
new file mode 100644
index 0000000000..3256b41734
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png
new file mode 100644
index 0000000000..3256b41734
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png
new file mode 100644
index 0000000000..4878de8680
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png
new file mode 100644
index 0000000000..a8e497ec01
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png
new file mode 100644
index 0000000000..34d35b44e3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png
new file mode 100644
index 0000000000..1754172689
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png
new file mode 100644
index 0000000000..4835240aee
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png b/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png
new file mode 100644
index 0000000000..1276f5fa24
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png b/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png
new file mode 100644
index 0000000000..56a56cf752
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png b/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png
new file mode 100644
index 0000000000..8e48e12070
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png b/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png
new file mode 100644
index 0000000000..84a6b68e0e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/blockStone.png b/src/main/resources/assets/miscutils/textures/blocks/blockStone.png
new file mode 100644
index 0000000000..87e19ff46b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/blockStone.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png
new file mode 100644
index 0000000000..6761aa4773
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png
new file mode 100644
index 0000000000..e52a1b11dc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png
new file mode 100644
index 0000000000..b24e8657f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png
new file mode 100644
index 0000000000..2c56924c8b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png
new file mode 100644
index 0000000000..223ae1cad3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png
new file mode 100644
index 0000000000..951871ce12
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png
new file mode 100644
index 0000000000..5307adb9f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png
new file mode 100644
index 0000000000..4862094cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png
new file mode 100644
index 0000000000..17010ff1a3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png
new file mode 100644
index 0000000000..72befd9bfd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png
new file mode 100644
index 0000000000..8af7fb854c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png
new file mode 100644
index 0000000000..3def965ce9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png
new file mode 100644
index 0000000000..b97c9add06
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png
new file mode 100644
index 0000000000..0970b27745
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png
new file mode 100644
index 0000000000..6cf79c75c4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png
new file mode 100644
index 0000000000..0cf85541e4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png
new file mode 100644
index 0000000000..4d9c3d2f67
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png
new file mode 100644
index 0000000000..149ae598d0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png
new file mode 100644
index 0000000000..8c55fdddd3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png
new file mode 100644
index 0000000000..8c5f1ec338
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png
new file mode 100644
index 0000000000..75ff7b2558
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png
new file mode 100644
index 0000000000..edcfc53edd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png
new file mode 100644
index 0000000000..8176e98807
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png
new file mode 100644
index 0000000000..0737748bb9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png
new file mode 100644
index 0000000000..6ea5b4c515
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png
new file mode 100644
index 0000000000..7f1f2aa712
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png
new file mode 100644
index 0000000000..b24939367a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png
new file mode 100644
index 0000000000..3fb18d9c00
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png
new file mode 100644
index 0000000000..fa4fa813bf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png
new file mode 100644
index 0000000000..00355135df
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png
new file mode 100644
index 0000000000..50414d57db
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png
new file mode 100644
index 0000000000..edf0166265
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png
new file mode 100644
index 0000000000..b51346219b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png
new file mode 100644
index 0000000000..3fb18d9c00
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png
new file mode 100644
index 0000000000..003d1597a6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta
new file mode 100644
index 0000000000..4f0718ac96
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png
new file mode 100644
index 0000000000..512df7ce04
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..b8533e5109
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png
new file mode 100644
index 0000000000..a752755254
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta
new file mode 100644
index 0000000000..0df7234a79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta
new file mode 100644
index 0000000000..eb608948b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 16
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png
new file mode 100644
index 0000000000..ee40545a46
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..7ceb363941
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png
new file mode 100644
index 0000000000..f0265d8ad2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..87c542d295
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta
new file mode 100644
index 0000000000..3fc1338d74
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 12
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta
new file mode 100644
index 0000000000..eb608948b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 16
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta
new file mode 100644
index 0000000000..5169aabdc2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png
new file mode 100644
index 0000000000..d4e45d6adf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta
new file mode 100644
index 0000000000..76446714d8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta
@@ -0,0 +1,38 @@
+{
+ "animation": {
+ "frames": [
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15
+ ]
+ }
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png
new file mode 100644
index 0000000000..739abd1090
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta
new file mode 100644
index 0000000000..4f0718ac96
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png
new file mode 100644
index 0000000000..9b82677382
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png
new file mode 100644
index 0000000000..bb8649fabc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png
new file mode 100644
index 0000000000..60ac4bce02
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png
new file mode 100644
index 0000000000..f7e479652f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png
new file mode 100644
index 0000000000..8d1e3f14e2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png
new file mode 100644
index 0000000000..9f997cedf8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png
new file mode 100644
index 0000000000..ff2c73964a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png
new file mode 100644
index 0000000000..107d539765
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png
new file mode 100644
index 0000000000..5dd516f5e2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png
new file mode 100644
index 0000000000..eb8cd5882d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png
new file mode 100644
index 0000000000..fa3e6027a7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png
new file mode 100644
index 0000000000..ce258e3c13
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png
new file mode 100644
index 0000000000..5102d575b8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png
new file mode 100644
index 0000000000..d65eb131f9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png
new file mode 100644
index 0000000000..675922fbdd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png
new file mode 100644
index 0000000000..e7e4a14d89
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png
new file mode 100644
index 0000000000..c561f4dafb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png
new file mode 100644
index 0000000000..4e40d05bb2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png
new file mode 100644
index 0000000000..ee33f024c5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png
new file mode 100644
index 0000000000..f7e843b7a3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png
new file mode 100644
index 0000000000..631a0c94c6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png
new file mode 100644
index 0000000000..64b1d5d8c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png
new file mode 100644
index 0000000000..f51c6422b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png
new file mode 100644
index 0000000000..7980eed80c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png
new file mode 100644
index 0000000000..ce1c2ef3d8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png
new file mode 100644
index 0000000000..84e1ac6350
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png
new file mode 100644
index 0000000000..4f716e4c61
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png
new file mode 100644
index 0000000000..fa9e98a6f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png
new file mode 100644
index 0000000000..6c05b315b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png
new file mode 100644
index 0000000000..d4a3888fe5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png
new file mode 100644
index 0000000000..8346cccf41
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png
new file mode 100644
index 0000000000..31bbffb4d4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png
new file mode 100644
index 0000000000..0858b2d399
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png
new file mode 100644
index 0000000000..1bc399315d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png
new file mode 100644
index 0000000000..32ea4edd45
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png
new file mode 100644
index 0000000000..eb530ffb75
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn
new file mode 100644
index 0000000000..3c8bbeb696
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png
new file mode 100644
index 0000000000..1050d78b01
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png
new file mode 100644
index 0000000000..b59c940f5e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png
new file mode 100644
index 0000000000..8bde3ca423
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png
new file mode 100644
index 0000000000..1b1b12db3b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png
new file mode 100644
index 0000000000..da672b0e24
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png
new file mode 100644
index 0000000000..f082c94c55
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png
new file mode 100644
index 0000000000..020ed28da8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png
new file mode 100644
index 0000000000..12e321b7e9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png
new file mode 100644
index 0000000000..c6d7715356
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png
new file mode 100644
index 0000000000..7f21c841aa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png
new file mode 100644
index 0000000000..3466822e04
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png
new file mode 100644
index 0000000000..c1ae3ca1af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png
new file mode 100644
index 0000000000..a0263e4341
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png
new file mode 100644
index 0000000000..26956df456
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png
new file mode 100644
index 0000000000..f30b34fe4a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png
new file mode 100644
index 0000000000..288df82736
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png
new file mode 100644
index 0000000000..b8c344736e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png
new file mode 100644
index 0000000000..0ef17da006
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png
new file mode 100644
index 0000000000..07dd921123
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png
new file mode 100644
index 0000000000..49e957bc1f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png
new file mode 100644
index 0000000000..2dd6ca5a8e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png
new file mode 100644
index 0000000000..16091f0e18
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png
new file mode 100644
index 0000000000..698d96bf11
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png
new file mode 100644
index 0000000000..963d8b1a22
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png
new file mode 100644
index 0000000000..b0aa8bf5e5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png
new file mode 100644
index 0000000000..148b3e32c1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png
new file mode 100644
index 0000000000..6322205460
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png
new file mode 100644
index 0000000000..722c9cbe39
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png
new file mode 100644
index 0000000000..cac33bb1f0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png
new file mode 100644
index 0000000000..0c9e529514
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png
new file mode 100644
index 0000000000..8b3142daf4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png
new file mode 100644
index 0000000000..6d8c956606
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png
new file mode 100644
index 0000000000..110e9ee38f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png
new file mode 100644
index 0000000000..f2bdf0ad4a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png
new file mode 100644
index 0000000000..56b02d1914
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png
new file mode 100644
index 0000000000..1fd61ede58
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png
new file mode 100644
index 0000000000..5433ee1ff2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png
new file mode 100644
index 0000000000..b7b2bed6de
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png
new file mode 100644
index 0000000000..8c93e83d2d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png
new file mode 100644
index 0000000000..c7b22a7ef8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png
new file mode 100644
index 0000000000..ce88198867
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png
new file mode 100644
index 0000000000..edd4efbba9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta
new file mode 100644
index 0000000000..330653c04d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png
new file mode 100644
index 0000000000..c654bbe779
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png
new file mode 100644
index 0000000000..e9b05f8181
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png
new file mode 100644
index 0000000000..07b795be97
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png
new file mode 100644
index 0000000000..e1ad601839
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png
new file mode 100644
index 0000000000..f69d8cb0ec
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png
new file mode 100644
index 0000000000..f863ec49e6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png
new file mode 100644
index 0000000000..a61511d4c2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png
new file mode 100644
index 0000000000..73a0abe065
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png
new file mode 100644
index 0000000000..269ab80e3b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png
new file mode 100644
index 0000000000..54ac28edc8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png
new file mode 100644
index 0000000000..34991094fd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png
new file mode 100644
index 0000000000..50ce1abd9c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png
new file mode 100644
index 0000000000..c4a02dcd25
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png
new file mode 100644
index 0000000000..5955b40f1e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png
new file mode 100644
index 0000000000..7fee9a77ad
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png
new file mode 100644
index 0000000000..ff418776b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png
new file mode 100644
index 0000000000..59217da11f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png
new file mode 100644
index 0000000000..3af9794005
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png
new file mode 100644
index 0000000000..d121090176
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png
new file mode 100644
index 0000000000..d70927f140
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png
new file mode 100644
index 0000000000..13310d6f57
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png
new file mode 100644
index 0000000000..7ef41870d4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png
new file mode 100644
index 0000000000..e42acc5c01
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png
new file mode 100644
index 0000000000..440c987d6e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png
new file mode 100644
index 0000000000..453cc94662
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png
new file mode 100644
index 0000000000..b1f29058ec
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png
new file mode 100644
index 0000000000..747adeb2e5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png
new file mode 100644
index 0000000000..23cc2c60c2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png
new file mode 100644
index 0000000000..230e78fe96
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png
new file mode 100644
index 0000000000..1f53895490
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta
new file mode 100644
index 0000000000..0285ac2f3b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png
new file mode 100644
index 0000000000..265d18b0f7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta
new file mode 100644
index 0000000000..d0b9e70fe5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":4,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png
new file mode 100644
index 0000000000..8eeb0179d7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png
new file mode 100644
index 0000000000..ffac706bbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png
new file mode 100644
index 0000000000..87c6017569
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png
new file mode 100644
index 0000000000..61d1f49a12
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png
new file mode 100644
index 0000000000..548c0ec283
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png
new file mode 100644
index 0000000000..172fab4657
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png
new file mode 100644
index 0000000000..68ab46a03d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png
new file mode 100644
index 0000000000..4443dc8024
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png
new file mode 100644
index 0000000000..ed8ad55ba2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta
new file mode 100644
index 0000000000..ba9119c7ad
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png
new file mode 100644
index 0000000000..eb3257c754
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png
new file mode 100644
index 0000000000..3a1b683837
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png
new file mode 100644
index 0000000000..5bc352238f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png
new file mode 100644
index 0000000000..32b6735a0d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png
new file mode 100644
index 0000000000..946559cf4e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png
new file mode 100644
index 0000000000..196600afdb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png
new file mode 100644
index 0000000000..1bcd1ec78f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png
new file mode 100644
index 0000000000..54381fcf21
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png
new file mode 100644
index 0000000000..0cf3f40762
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png
new file mode 100644
index 0000000000..b4bc37fbda
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png
new file mode 100644
index 0000000000..05b752e0e7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png
new file mode 100644
index 0000000000..231b6b17af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png
new file mode 100644
index 0000000000..88cb664c41
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png
new file mode 100644
index 0000000000..a627b64eef
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png
new file mode 100644
index 0000000000..9564596329
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png b/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png
new file mode 100644
index 0000000000..1023b718cc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png b/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png b/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png
new file mode 100644
index 0000000000..32254623d1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png
new file mode 100644
index 0000000000..2d497c1f81
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png
new file mode 100644
index 0000000000..efec483a20
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png
new file mode 100644
index 0000000000..c6376014e2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png
new file mode 100644
index 0000000000..55c42584ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png
new file mode 100644
index 0000000000..6b2c6a77b1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png
new file mode 100644
index 0000000000..446478f1de
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png
new file mode 100644
index 0000000000..a8f51c0b68
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png b/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png
new file mode 100644
index 0000000000..08afad396a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png
new file mode 100644
index 0000000000..68949e5f47
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png
new file mode 100644
index 0000000000..c7c0d6492f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png
new file mode 100644
index 0000000000..ddccb0e4fa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png
new file mode 100644
index 0000000000..96e756c22c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png
new file mode 100644
index 0000000000..ae77894258
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png
new file mode 100644
index 0000000000..146b0a99b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png
new file mode 100644
index 0000000000..3ff2ee2021
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png
new file mode 100644
index 0000000000..99137b6f26
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png b/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png
new file mode 100644
index 0000000000..f4c3ca84ac
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png b/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png
new file mode 100644
index 0000000000..93d414d695
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/blocks/workbench.png b/src/main/resources/assets/miscutils/textures/blocks/workbench.png
new file mode 100644
index 0000000000..b40ad65c71
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/blocks/workbench.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png b/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png
new file mode 100644
index 0000000000..307a25bd3f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png b/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png
new file mode 100644
index 0000000000..d2b36d633d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/enviroment/snow.png b/src/main/resources/assets/miscutils/textures/enviroment/snow.png
new file mode 100644
index 0000000000..a91935ee0e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/enviroment/snow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png b/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png
new file mode 100644
index 0000000000..8f77124bbb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/FishTrap.png b/src/main/resources/assets/miscutils/textures/gui/FishTrap.png
new file mode 100644
index 0000000000..35423fffb9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/FishTrap.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/PestKiller.png b/src/main/resources/assets/miscutils/textures/gui/PestKiller.png
new file mode 100644
index 0000000000..d1978ae04a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/PestKiller.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png b/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png
new file mode 100644
index 0000000000..e8f65a6752
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png b/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png
new file mode 100644
index 0000000000..c50c0da4a5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png b/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png
new file mode 100644
index 0000000000..08f9761233
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/background/yellow.png b/src/main/resources/assets/miscutils/textures/gui/background/yellow.png
new file mode 100644
index 0000000000..a8139371ef
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/background/yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png b/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png
new file mode 100644
index 0000000000..588f192622
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png b/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png
new file mode 100644
index 0000000000..d1827433a0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png b/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png
new file mode 100644
index 0000000000..0dc26c43e4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png
new file mode 100644
index 0000000000..c6d124f31d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png
new file mode 100644
index 0000000000..409f62e59d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png
new file mode 100644
index 0000000000..c3e0407f36
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png
new file mode 100644
index 0000000000..67bfa33912
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png
new file mode 100644
index 0000000000..b3bd898ed6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png
new file mode 100644
index 0000000000..30beb06808
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png
new file mode 100644
index 0000000000..7b59b1be61
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png
new file mode 100644
index 0000000000..31b610f3b0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png
new file mode 100644
index 0000000000..60c44a3257
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png
new file mode 100644
index 0000000000..d50a5d1ea6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png
new file mode 100644
index 0000000000..d69ecd279d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png
new file mode 100644
index 0000000000..06bada79fb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png
new file mode 100644
index 0000000000..9fd2931c21
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png
new file mode 100644
index 0000000000..70e87d7982
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png
new file mode 100644
index 0000000000..5b30875a90
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png
new file mode 100644
index 0000000000..f8987686fa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png
new file mode 100644
index 0000000000..923877cccb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png
new file mode 100644
index 0000000000..8b40306e54
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png
new file mode 100644
index 0000000000..64779478ce
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png
new file mode 100644
index 0000000000..15fb9996ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png
new file mode 100644
index 0000000000..c33ee088e0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png
new file mode 100644
index 0000000000..882c2452b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png b/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png
new file mode 100644
index 0000000000..5c2f9c4e1b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png
new file mode 100644
index 0000000000..3e07d39df6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png
new file mode 100644
index 0000000000..713dc41d35
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png
new file mode 100644
index 0000000000..f6a005c782
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png
new file mode 100644
index 0000000000..77be0116af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png
new file mode 100644
index 0000000000..c896015c52
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png
new file mode 100644
index 0000000000..c7ea4a206f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png
new file mode 100644
index 0000000000..f83ff85b9e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png
new file mode 100644
index 0000000000..f36fa57f59
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png
new file mode 100644
index 0000000000..e12646f993
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png
new file mode 100644
index 0000000000..5074a409b9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png
new file mode 100644
index 0000000000..427e2983a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png
new file mode 100644
index 0000000000..021cb84f7a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png
new file mode 100644
index 0000000000..7beff5733a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png
new file mode 100644
index 0000000000..c1b5418bf0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png
new file mode 100644
index 0000000000..bb54e31684
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png
new file mode 100644
index 0000000000..6209845602
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png
new file mode 100644
index 0000000000..b635a5439c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png
new file mode 100644
index 0000000000..dcaa33eea6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png
new file mode 100644
index 0000000000..b7f053ab7e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png
new file mode 100644
index 0000000000..12b52fd10c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png
new file mode 100644
index 0000000000..92dde402e7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png
new file mode 100644
index 0000000000..1fae314bd6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png
new file mode 100644
index 0000000000..3485956d7d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png
new file mode 100644
index 0000000000..cea3edeb4f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png
new file mode 100644
index 0000000000..eee95dd0da
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png
new file mode 100644
index 0000000000..e19f99076e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png
new file mode 100644
index 0000000000..29cb47974f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png
new file mode 100644
index 0000000000..f240ceac4f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png b/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png
new file mode 100644
index 0000000000..74065e8cbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png b/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png
new file mode 100644
index 0000000000..68e6ea72b7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png b/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png
new file mode 100644
index 0000000000..78a1a26bba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png b/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png
new file mode 100644
index 0000000000..786a49f565
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png b/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png
new file mode 100644
index 0000000000..2e52af075c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png b/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png
new file mode 100644
index 0000000000..cde8dce299
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png b/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png
new file mode 100644
index 0000000000..cca05c1e75
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png b/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png
new file mode 100644
index 0000000000..5dab4e96a7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png b/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png
new file mode 100644
index 0000000000..6d7ef52c9a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png b/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png
new file mode 100644
index 0000000000..0db40a1fd1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png b/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png
new file mode 100644
index 0000000000..247db50690
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png b/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png
new file mode 100644
index 0000000000..0e6fbe1722
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/blue.png b/src/main/resources/assets/miscutils/textures/gui/slot/blue.png
new file mode 100644
index 0000000000..74ef43ecf0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/blue.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png b/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png
new file mode 100644
index 0000000000..35c18aefff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/green.png b/src/main/resources/assets/miscutils/textures/gui/slot/green.png
new file mode 100644
index 0000000000..051dda9b2b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/green.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png b/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png
new file mode 100644
index 0000000000..319c925232
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png b/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png
new file mode 100644
index 0000000000..91da1181fb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/red.png b/src/main/resources/assets/miscutils/textures/gui/slot/red.png
new file mode 100644
index 0000000000..82c4511c43
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/red.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png b/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png
new file mode 100644
index 0000000000..b77f186c5b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png b/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png
new file mode 100644
index 0000000000..fd373e2c85
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png b/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png
new file mode 100644
index 0000000000..08c27f65e4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png b/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png
new file mode 100644
index 0000000000..e0c53c75ae
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png
new file mode 100644
index 0000000000..cedee004e4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png
new file mode 100644
index 0000000000..c23772f461
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png
new file mode 100644
index 0000000000..b3b257e59c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png
new file mode 100644
index 0000000000..3d47ce434c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png
new file mode 100644
index 0000000000..2b99670ea1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png
new file mode 100644
index 0000000000..e516903d26
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png
new file mode 100644
index 0000000000..97767a73c6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png
new file mode 100644
index 0000000000..3147037815
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png
new file mode 100644
index 0000000000..dce530370f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png
new file mode 100644
index 0000000000..0c85939327
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png
new file mode 100644
index 0000000000..b3c3716abb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png
new file mode 100644
index 0000000000..a9a9c6fcee
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png
new file mode 100644
index 0000000000..8b38dcd9ce
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png
new file mode 100644
index 0000000000..53682976a8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png
new file mode 100644
index 0000000000..8a21902982
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png
new file mode 100644
index 0000000000..81f418e1a8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png
new file mode 100644
index 0000000000..2e66f92a2c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png
new file mode 100644
index 0000000000..61a783176e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png
new file mode 100644
index 0000000000..16a79d6896
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png
new file mode 100644
index 0000000000..4b39623750
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png
new file mode 100644
index 0000000000..fbe1b9ac82
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png
new file mode 100644
index 0000000000..5979772ace
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png
new file mode 100644
index 0000000000..254680aff4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png
new file mode 100644
index 0000000000..29ba464570
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png
new file mode 100644
index 0000000000..f26db362f0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png
new file mode 100644
index 0000000000..fa7f814d3a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png
new file mode 100644
index 0000000000..673c6e011b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png
new file mode 100644
index 0000000000..e10815677a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png
new file mode 100644
index 0000000000..661cd14817
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png
new file mode 100644
index 0000000000..6c64b90877
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png
new file mode 100644
index 0000000000..ec3c0358a1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png
new file mode 100644
index 0000000000..daace0f92a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png
new file mode 100644
index 0000000000..f5d5a1bc39
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png
new file mode 100644
index 0000000000..d6ff394c66
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png
new file mode 100644
index 0000000000..9f03d572b7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png
new file mode 100644
index 0000000000..548784db2a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png
new file mode 100644
index 0000000000..6f403c14f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png
new file mode 100644
index 0000000000..6614c152a6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png
new file mode 100644
index 0000000000..7da7ab1e69
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png
new file mode 100644
index 0000000000..56da7e8d0d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png
new file mode 100644
index 0000000000..cffad53f13
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png
new file mode 100644
index 0000000000..6c9c006044
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png
new file mode 100644
index 0000000000..ee1c87e1b1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png
new file mode 100644
index 0000000000..5d6a74cd72
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png
new file mode 100644
index 0000000000..881bdaa78a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png
new file mode 100644
index 0000000000..00900203dc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png
new file mode 100644
index 0000000000..ccf9edc4a4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png
new file mode 100644
index 0000000000..a1b063620a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png
new file mode 100644
index 0000000000..9b9c314475
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png
new file mode 100644
index 0000000000..b3f174ebd4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png
new file mode 100644
index 0000000000..0939c7eb87
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png
new file mode 100644
index 0000000000..23cc1deb66
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png
new file mode 100644
index 0000000000..23e0a10e06
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png
new file mode 100644
index 0000000000..f1756e78ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png
new file mode 100644
index 0000000000..9190330469
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png
new file mode 100644
index 0000000000..f1756e78ba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png
new file mode 100644
index 0000000000..032a256989
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png
new file mode 100644
index 0000000000..d96558c8f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png
new file mode 100644
index 0000000000..4d8f366b9c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png
new file mode 100644
index 0000000000..e914a7c788
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png
new file mode 100644
index 0000000000..af05b249b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png
new file mode 100644
index 0000000000..bd629f0ee4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png
new file mode 100644
index 0000000000..e1ea94bac6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png
new file mode 100644
index 0000000000..6b6d885084
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png
new file mode 100644
index 0000000000..68de2aba73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png
new file mode 100644
index 0000000000..c0d974240c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png
new file mode 100644
index 0000000000..e1f8be799b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png
new file mode 100644
index 0000000000..ee106b029f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png
new file mode 100644
index 0000000000..3aed0ef200
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png
new file mode 100644
index 0000000000..03d271872e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png
new file mode 100644
index 0000000000..dd87199ae2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png
new file mode 100644
index 0000000000..5b9053e1f4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png
new file mode 100644
index 0000000000..23c87b8a2d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png
new file mode 100644
index 0000000000..d8d2012c51
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png
new file mode 100644
index 0000000000..1e538bce45
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png
new file mode 100644
index 0000000000..ed806126fb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png
new file mode 100644
index 0000000000..a7452f94ee
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png
new file mode 100644
index 0000000000..e371af02f9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png
new file mode 100644
index 0000000000..e911b80d03
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png
new file mode 100644
index 0000000000..3bcbace856
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png
new file mode 100644
index 0000000000..eb6baf34ae
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png
new file mode 100644
index 0000000000..3b72cb69b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png
new file mode 100644
index 0000000000..ca0ad43c3b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png b/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png
new file mode 100644
index 0000000000..8576ae1b7a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png
new file mode 100644
index 0000000000..efa1a6e0ca
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png
new file mode 100644
index 0000000000..aaea7803b5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png
new file mode 100644
index 0000000000..4143a1eb39
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png
new file mode 100644
index 0000000000..f39df3b01d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png
new file mode 100644
index 0000000000..10af629bb7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png
new file mode 100644
index 0000000000..b674e687f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png
new file mode 100644
index 0000000000..a9040b5f80
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png
new file mode 100644
index 0000000000..4be42c2631
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png
new file mode 100644
index 0000000000..5ce86b105c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png
new file mode 100644
index 0000000000..ac7e30177f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png
new file mode 100644
index 0000000000..37867c28e4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png
new file mode 100644
index 0000000000..f1b2d9578c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png
new file mode 100644
index 0000000000..89b5cf0d67
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png
new file mode 100644
index 0000000000..e0d4ecdd46
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png
new file mode 100644
index 0000000000..b49d729143
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png
new file mode 100644
index 0000000000..9147fb942b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png
new file mode 100644
index 0000000000..43a02b8eaf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png
new file mode 100644
index 0000000000..b58efee183
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png
new file mode 100644
index 0000000000..7f6067e83e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png
new file mode 100644
index 0000000000..a0590c188c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png
new file mode 100644
index 0000000000..9439d51b25
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png
new file mode 100644
index 0000000000..fe06094f2d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png
new file mode 100644
index 0000000000..f4bd2f6df2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png
new file mode 100644
index 0000000000..abf0b77778
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png
new file mode 100644
index 0000000000..338a39d5f6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png
new file mode 100644
index 0000000000..73c2408ce8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png
new file mode 100644
index 0000000000..b5ab13cb1f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png
new file mode 100644
index 0000000000..57d77be16a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png
new file mode 100644
index 0000000000..51bb4587d9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png
new file mode 100644
index 0000000000..e81bae4aae
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png
new file mode 100644
index 0000000000..0cc273996e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png
new file mode 100644
index 0000000000..dca743acd3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png
new file mode 100644
index 0000000000..15257d9efd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png
new file mode 100644
index 0000000000..f81fc43aff
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png
new file mode 100644
index 0000000000..31951671cd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png
new file mode 100644
index 0000000000..2c6e0b8cb6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png
new file mode 100644
index 0000000000..4309f3a975
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png
new file mode 100644
index 0000000000..e82660e9f8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png
new file mode 100644
index 0000000000..dc2070e635
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png
new file mode 100644
index 0000000000..2cdf37adad
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png
new file mode 100644
index 0000000000..9b536f84d0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png
new file mode 100644
index 0000000000..1a04c2415c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png
new file mode 100644
index 0000000000..77be3ef6a8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png
new file mode 100644
index 0000000000..110cd7f8e8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png
new file mode 100644
index 0000000000..0c065db4ce
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png
new file mode 100644
index 0000000000..168b15adb3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png
new file mode 100644
index 0000000000..c98e2d6319
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png
new file mode 100644
index 0000000000..af0bcc7064
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png
new file mode 100644
index 0000000000..1b60b7f555
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png
new file mode 100644
index 0000000000..7f6f045430
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png
new file mode 100644
index 0000000000..8a2cd2891b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png
new file mode 100644
index 0000000000..c8c6299d7b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png
new file mode 100644
index 0000000000..df99f3f5e8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png b/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png
new file mode 100644
index 0000000000..f6c9a9f131
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png b/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png
new file mode 100644
index 0000000000..6a00cf1509
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png b/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png
new file mode 100644
index 0000000000..82f1bb4b84
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta
new file mode 100644
index 0000000000..ddc2f9fb7a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta
@@ -0,0 +1,23 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1,
+ 0
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png b/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png
new file mode 100644
index 0000000000..3cb0ac7097
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png b/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png
new file mode 100644
index 0000000000..9dc98ba18d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png b/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png
new file mode 100644
index 0000000000..4f8fd406d4
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png b/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png
new file mode 100644
index 0000000000..f66a217c78
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png b/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png
new file mode 100644
index 0000000000..055655ebe1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/1.png b/src/main/resources/assets/miscutils/textures/items/chargepack/1.png
new file mode 100644
index 0000000000..9039d443c3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/2.png b/src/main/resources/assets/miscutils/textures/items/chargepack/2.png
new file mode 100644
index 0000000000..7023e7ce82
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/3.png b/src/main/resources/assets/miscutils/textures/items/chargepack/3.png
new file mode 100644
index 0000000000..4d787e7aa8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/4.png b/src/main/resources/assets/miscutils/textures/items/chargepack/4.png
new file mode 100644
index 0000000000..9320de0611
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/5.png b/src/main/resources/assets/miscutils/textures/items/chargepack/5.png
new file mode 100644
index 0000000000..ab8771c89c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/6.png b/src/main/resources/assets/miscutils/textures/items/chargepack/6.png
new file mode 100644
index 0000000000..a01f435e72
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/7.png b/src/main/resources/assets/miscutils/textures/items/chargepack/7.png
new file mode 100644
index 0000000000..fb5a5fba43
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/8.png b/src/main/resources/assets/miscutils/textures/items/chargepack/8.png
new file mode 100644
index 0000000000..aff1ec693f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/chargepack/9.png b/src/main/resources/assets/miscutils/textures/items/chargepack/9.png
new file mode 100644
index 0000000000..0b9cf4d18e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/chargepack/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/0.png b/src/main/resources/assets/miscutils/textures/items/covers/0.png
new file mode 100644
index 0000000000..1938287f27
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/1.png b/src/main/resources/assets/miscutils/textures/items/covers/1.png
new file mode 100644
index 0000000000..327e530f1b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/10.png b/src/main/resources/assets/miscutils/textures/items/covers/10.png
new file mode 100644
index 0000000000..9e48f50335
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/11.png b/src/main/resources/assets/miscutils/textures/items/covers/11.png
new file mode 100644
index 0000000000..32ffcb8008
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/12.png b/src/main/resources/assets/miscutils/textures/items/covers/12.png
new file mode 100644
index 0000000000..48b1eadf93
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/13.png b/src/main/resources/assets/miscutils/textures/items/covers/13.png
new file mode 100644
index 0000000000..7f6a13cb82
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/14.png b/src/main/resources/assets/miscutils/textures/items/covers/14.png
new file mode 100644
index 0000000000..9f59404337
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/15.png b/src/main/resources/assets/miscutils/textures/items/covers/15.png
new file mode 100644
index 0000000000..ed0f49bd0f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/2.png b/src/main/resources/assets/miscutils/textures/items/covers/2.png
new file mode 100644
index 0000000000..635be463af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/3.png b/src/main/resources/assets/miscutils/textures/items/covers/3.png
new file mode 100644
index 0000000000..24afa30c17
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/4.png b/src/main/resources/assets/miscutils/textures/items/covers/4.png
new file mode 100644
index 0000000000..847e54ef60
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/5.png b/src/main/resources/assets/miscutils/textures/items/covers/5.png
new file mode 100644
index 0000000000..ddd9cb7a2f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/6.png b/src/main/resources/assets/miscutils/textures/items/covers/6.png
new file mode 100644
index 0000000000..e21c4fb78c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/7.png b/src/main/resources/assets/miscutils/textures/items/covers/7.png
new file mode 100644
index 0000000000..29e270f862
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/8.png b/src/main/resources/assets/miscutils/textures/items/covers/8.png
new file mode 100644
index 0000000000..87a48050fd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/covers/9.png b/src/main/resources/assets/miscutils/textures/items/covers/9.png
new file mode 100644
index 0000000000..3836414587
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/covers/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png
new file mode 100644
index 0000000000..652f68aeb7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png
new file mode 100644
index 0000000000..7a14abccbd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png
new file mode 100644
index 0000000000..cc0a5fe94d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png
new file mode 100644
index 0000000000..ce0dbab306
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png
new file mode 100644
index 0000000000..2b2f615676
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png
new file mode 100644
index 0000000000..f01ba96be9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png
new file mode 100644
index 0000000000..f57bb1308b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png
new file mode 100644
index 0000000000..77a416a3a6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dust.png b/src/main/resources/assets/miscutils/textures/items/dust.png
new file mode 100644
index 0000000000..4c8e6485ec
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dust.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dustSmall.png b/src/main/resources/assets/miscutils/textures/items/dustSmall.png
new file mode 100644
index 0000000000..c432a032c2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/dustTiny.png b/src/main/resources/assets/miscutils/textures/items/dustTiny.png
new file mode 100644
index 0000000000..8f597c61e0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png
new file mode 100644
index 0000000000..944ab47126
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png
new file mode 100644
index 0000000000..2d235ca65d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png
new file mode 100644
index 0000000000..ec81acba2c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png
new file mode 100644
index 0000000000..1fc103297a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png
new file mode 100644
index 0000000000..db5ddf0063
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png
new file mode 100644
index 0000000000..2497c88e2d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png
new file mode 100644
index 0000000000..083db84ef1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png
new file mode 100644
index 0000000000..27927d0db6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png
new file mode 100644
index 0000000000..7013c41d6b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png b/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png
new file mode 100644
index 0000000000..e02bd78586
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameArborists.png b/src/main/resources/assets/miscutils/textures/items/frameArborists.png
new file mode 100644
index 0000000000..b55d3a92e6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameArborists.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameBusy.png b/src/main/resources/assets/miscutils/textures/items/frameBusy.png
new file mode 100644
index 0000000000..ea20d3d046
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameBusy.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameDecaying.png b/src/main/resources/assets/miscutils/textures/items/frameDecaying.png
new file mode 100644
index 0000000000..3e6feb1a3c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameDecaying.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png b/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png
new file mode 100644
index 0000000000..0a24289776
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameSlowing.png b/src/main/resources/assets/miscutils/textures/items/frameSlowing.png
new file mode 100644
index 0000000000..8d07fdd47b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameSlowing.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png b/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png
new file mode 100644
index 0000000000..1fed360bf7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/frameUseless.png b/src/main/resources/assets/miscutils/textures/items/frameUseless.png
new file mode 100644
index 0000000000..e316e0a5d6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/frameUseless.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png
new file mode 100644
index 0000000000..3030cbe6aa
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png
new file mode 100644
index 0000000000..5114f2c9a8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png
new file mode 100644
index 0000000000..1c6257f336
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png
new file mode 100644
index 0000000000..8ccd7f3c1a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png b/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png
new file mode 100644
index 0000000000..ae13305b96
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png b/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png
new file mode 100644
index 0000000000..db16e741fe
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/ion/0.png b/src/main/resources/assets/miscutils/textures/items/ion/0.png
new file mode 100644
index 0000000000..c56a04238f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/ion/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/ion/1.png b/src/main/resources/assets/miscutils/textures/items/ion/1.png
new file mode 100644
index 0000000000..174d2ad950
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/ion/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png b/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png
new file mode 100644
index 0000000000..fd342f7db2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/item.empty.png b/src/main/resources/assets/miscutils/textures/items/item.empty.png
new file mode 100644
index 0000000000..c054d35cce
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/item.empty.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png b/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png
new file mode 100644
index 0000000000..da4b975517
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png b/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png
new file mode 100644
index 0000000000..8553a13cfb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png b/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png
new file mode 100644
index 0000000000..62de905fb9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png b/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png
new file mode 100644
index 0000000000..593ba0ac17
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png b/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png
new file mode 100644
index 0000000000..1ac3bff818
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemBook.png b/src/main/resources/assets/miscutils/textures/items/itemBook.png
new file mode 100644
index 0000000000..f6cdf72bda
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemBook.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png b/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png
new file mode 100644
index 0000000000..3e41cfaa1c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemCell.png b/src/main/resources/assets/miscutils/textures/items/itemCell.png
new file mode 100644
index 0000000000..023291b957
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemCell.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png b/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png b/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png b/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png
new file mode 100644
index 0000000000..35c124ab0c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png b/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png
new file mode 100644
index 0000000000..723f62e278
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png b/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png
new file mode 100644
index 0000000000..c7a849556f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png b/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png
new file mode 100644
index 0000000000..8687d1c8ca
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png
new file mode 100644
index 0000000000..7c03ca0ada
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png b/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png
new file mode 100644
index 0000000000..bf9ab22ce2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemGear.png b/src/main/resources/assets/miscutils/textures/items/itemGear.png
new file mode 100644
index 0000000000..6d0cf3be50
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemGear.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png b/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png
new file mode 100644
index 0000000000..91f1cad62e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemIngot.png b/src/main/resources/assets/miscutils/textures/items/itemIngot.png
new file mode 100644
index 0000000000..a904365fba
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemIngot.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png b/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png
new file mode 100644
index 0000000000..edaac2807f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png b/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png
new file mode 100644
index 0000000000..d0f73e2868
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png
new file mode 100644
index 0000000000..73c2cbe026
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png b/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png
new file mode 100644
index 0000000000..585b862d12
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png b/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png
new file mode 100644
index 0000000000..92a06a3a9a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png
new file mode 100644
index 0000000000..d10128babd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png b/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png
new file mode 100644
index 0000000000..b93430f732
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemPlate.png b/src/main/resources/assets/miscutils/textures/items/itemPlate.png
new file mode 100644
index 0000000000..b5a9ab5214
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemPlate.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemShard.png b/src/main/resources/assets/miscutils/textures/items/itemShard.png
new file mode 100644
index 0000000000..104a59d2b3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemShard.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemShovel.png b/src/main/resources/assets/miscutils/textures/items/itemShovel.png
new file mode 100644
index 0000000000..8e1c0c2826
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemShovel.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png
new file mode 100644
index 0000000000..cd376cb5cb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png b/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png
new file mode 100644
index 0000000000..f08ba26585
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png
new file mode 100644
index 0000000000..89f7b9474a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png b/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png
new file mode 100644
index 0000000000..df6c9b9c49
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png b/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png
new file mode 100644
index 0000000000..5dea2ec1e5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png b/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png
new file mode 100644
index 0000000000..3a1fe64176
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/magicfeather.png b/src/main/resources/assets/miscutils/textures/items/magicfeather.png
new file mode 100644
index 0000000000..634529b925
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/magicfeather.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png b/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png
new file mode 100644
index 0000000000..e253eea6de
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png b/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png
new file mode 100644
index 0000000000..960b304439
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png b/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png
new file mode 100644
index 0000000000..eaf605e762
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta b/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png b/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png
new file mode 100644
index 0000000000..d813e6b746
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/0.png b/src/main/resources/assets/miscutils/textures/items/particle/0.png
new file mode 100644
index 0000000000..a0a32d4508
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/1.png b/src/main/resources/assets/miscutils/textures/items/particle/1.png
new file mode 100644
index 0000000000..4eddfa1727
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/10.png b/src/main/resources/assets/miscutils/textures/items/particle/10.png
new file mode 100644
index 0000000000..09eee049a9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/11.png b/src/main/resources/assets/miscutils/textures/items/particle/11.png
new file mode 100644
index 0000000000..7f636919b6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/12.png b/src/main/resources/assets/miscutils/textures/items/particle/12.png
new file mode 100644
index 0000000000..4e9504b03f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/13.png b/src/main/resources/assets/miscutils/textures/items/particle/13.png
new file mode 100644
index 0000000000..d929480c16
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/14.png b/src/main/resources/assets/miscutils/textures/items/particle/14.png
new file mode 100644
index 0000000000..7338066c1a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/15.png b/src/main/resources/assets/miscutils/textures/items/particle/15.png
new file mode 100644
index 0000000000..189a3127d9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/16.png b/src/main/resources/assets/miscutils/textures/items/particle/16.png
new file mode 100644
index 0000000000..8824201ff3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/17.png b/src/main/resources/assets/miscutils/textures/items/particle/17.png
new file mode 100644
index 0000000000..edea5115c0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/18.png b/src/main/resources/assets/miscutils/textures/items/particle/18.png
new file mode 100644
index 0000000000..d3e63562d7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/19.png b/src/main/resources/assets/miscutils/textures/items/particle/19.png
new file mode 100644
index 0000000000..43f9278b2c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/2.png b/src/main/resources/assets/miscutils/textures/items/particle/2.png
new file mode 100644
index 0000000000..292207ae7e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/20.png b/src/main/resources/assets/miscutils/textures/items/particle/20.png
new file mode 100644
index 0000000000..0e2ce23565
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/21.png b/src/main/resources/assets/miscutils/textures/items/particle/21.png
new file mode 100644
index 0000000000..758fa46941
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/22.png b/src/main/resources/assets/miscutils/textures/items/particle/22.png
new file mode 100644
index 0000000000..08bda97b66
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/23.png b/src/main/resources/assets/miscutils/textures/items/particle/23.png
new file mode 100644
index 0000000000..9ba21b22eb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/24.png b/src/main/resources/assets/miscutils/textures/items/particle/24.png
new file mode 100644
index 0000000000..bc6aec8854
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/3.png b/src/main/resources/assets/miscutils/textures/items/particle/3.png
new file mode 100644
index 0000000000..d085b86507
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/4.png b/src/main/resources/assets/miscutils/textures/items/particle/4.png
new file mode 100644
index 0000000000..faf8db0576
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/5.png b/src/main/resources/assets/miscutils/textures/items/particle/5.png
new file mode 100644
index 0000000000..3a30274238
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/6.png b/src/main/resources/assets/miscutils/textures/items/particle/6.png
new file mode 100644
index 0000000000..8930ce52ef
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/7.png b/src/main/resources/assets/miscutils/textures/items/particle/7.png
new file mode 100644
index 0000000000..0581d47446
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/8.png b/src/main/resources/assets/miscutils/textures/items/particle/8.png
new file mode 100644
index 0000000000..6bd3c2c682
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/9.png b/src/main/resources/assets/miscutils/textures/items/particle/9.png
new file mode 100644
index 0000000000..430f1aed3d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/0.png b/src/main/resources/assets/miscutils/textures/items/particle/new/0.png
new file mode 100644
index 0000000000..3fe49c3a57
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/1.png b/src/main/resources/assets/miscutils/textures/items/particle/new/1.png
new file mode 100644
index 0000000000..39ffa85711
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/10.png b/src/main/resources/assets/miscutils/textures/items/particle/new/10.png
new file mode 100644
index 0000000000..18ded814cf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/11.png b/src/main/resources/assets/miscutils/textures/items/particle/new/11.png
new file mode 100644
index 0000000000..b7e191c79f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/12.png b/src/main/resources/assets/miscutils/textures/items/particle/new/12.png
new file mode 100644
index 0000000000..49feb199e0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/13.png b/src/main/resources/assets/miscutils/textures/items/particle/new/13.png
new file mode 100644
index 0000000000..b70178d315
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/14.png b/src/main/resources/assets/miscutils/textures/items/particle/new/14.png
new file mode 100644
index 0000000000..77741644ed
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/15.png b/src/main/resources/assets/miscutils/textures/items/particle/new/15.png
new file mode 100644
index 0000000000..d48096c85c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/16.png b/src/main/resources/assets/miscutils/textures/items/particle/new/16.png
new file mode 100644
index 0000000000..cef33d17fd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/17.png b/src/main/resources/assets/miscutils/textures/items/particle/new/17.png
new file mode 100644
index 0000000000..4b752e7a9a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/18.png b/src/main/resources/assets/miscutils/textures/items/particle/new/18.png
new file mode 100644
index 0000000000..23fdb190c7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/19.png b/src/main/resources/assets/miscutils/textures/items/particle/new/19.png
new file mode 100644
index 0000000000..94e2a856c9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/2.png b/src/main/resources/assets/miscutils/textures/items/particle/new/2.png
new file mode 100644
index 0000000000..d86b5b357d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/20.png b/src/main/resources/assets/miscutils/textures/items/particle/new/20.png
new file mode 100644
index 0000000000..d7cbdb8f45
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/21.png b/src/main/resources/assets/miscutils/textures/items/particle/new/21.png
new file mode 100644
index 0000000000..2531eaff52
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/22.png b/src/main/resources/assets/miscutils/textures/items/particle/new/22.png
new file mode 100644
index 0000000000..d594dc4be8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/23.png b/src/main/resources/assets/miscutils/textures/items/particle/new/23.png
new file mode 100644
index 0000000000..d96dd2b000
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/24.png b/src/main/resources/assets/miscutils/textures/items/particle/new/24.png
new file mode 100644
index 0000000000..56067466ad
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/3.png b/src/main/resources/assets/miscutils/textures/items/particle/new/3.png
new file mode 100644
index 0000000000..43438c4ce5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/4.png b/src/main/resources/assets/miscutils/textures/items/particle/new/4.png
new file mode 100644
index 0000000000..8f0db073cd
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/5.png b/src/main/resources/assets/miscutils/textures/items/particle/new/5.png
new file mode 100644
index 0000000000..40ec84db70
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/6.png b/src/main/resources/assets/miscutils/textures/items/particle/new/6.png
new file mode 100644
index 0000000000..c63ad0ba19
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/7.png b/src/main/resources/assets/miscutils/textures/items/particle/new/7.png
new file mode 100644
index 0000000000..aad8c7ca62
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/8.png b/src/main/resources/assets/miscutils/textures/items/particle/new/8.png
new file mode 100644
index 0000000000..c9b908ec61
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/particle/new/9.png b/src/main/resources/assets/miscutils/textures/items/particle/new/9.png
new file mode 100644
index 0000000000..b8e02c82ea
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/particle/new/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png b/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png
new file mode 100644
index 0000000000..2d196cb9ed
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png b/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png
new file mode 100644
index 0000000000..2c56204a7e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png b/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png
new file mode 100644
index 0000000000..cfec0f5d8e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/research/note.png b/src/main/resources/assets/miscutils/textures/items/research/note.png
new file mode 100644
index 0000000000..795eaeb193
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/research/note.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png
new file mode 100644
index 0000000000..0ae88d993d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png
new file mode 100644
index 0000000000..fdc81d8566
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png
new file mode 100644
index 0000000000..2a8e28155c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png
new file mode 100644
index 0000000000..fc33c3a20e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png
new file mode 100644
index 0000000000..d79ccb6457
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png
new file mode 100644
index 0000000000..0b1a12cf05
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png
new file mode 100644
index 0000000000..3182d9cb04
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png
new file mode 100644
index 0000000000..eeecdbd59a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png
new file mode 100644
index 0000000000..3d5f296660
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png
new file mode 100644
index 0000000000..440fd477d9
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png
new file mode 100644
index 0000000000..463c0ccce0
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png
new file mode 100644
index 0000000000..982eca6df8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png
new file mode 100644
index 0000000000..36afb07e7b
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png
new file mode 100644
index 0000000000..bba4b04331
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png
new file mode 100644
index 0000000000..d391055ad7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png
new file mode 100644
index 0000000000..acbf53c53c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png
new file mode 100644
index 0000000000..4e01f007da
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png
new file mode 100644
index 0000000000..b80dca122e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png
new file mode 100644
index 0000000000..370e0f84d2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png
new file mode 100644
index 0000000000..3f1cfe4081
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png
new file mode 100644
index 0000000000..d789444710
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png
new file mode 100644
index 0000000000..40ab646c04
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png
new file mode 100644
index 0000000000..091f63b0c1
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png
new file mode 100644
index 0000000000..3262bf8f9f
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png
new file mode 100644
index 0000000000..ce8104263e
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png
new file mode 100644
index 0000000000..f4ba0a2f0a
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png
new file mode 100644
index 0000000000..db59db96e3
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png
new file mode 100644
index 0000000000..0656c10957
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png
new file mode 100644
index 0000000000..3a32ed06fc
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png
new file mode 100644
index 0000000000..475f8dadfb
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png
new file mode 100644
index 0000000000..568414660d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png
new file mode 100644
index 0000000000..4649393bb2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png
new file mode 100644
index 0000000000..5b47d172be
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png
new file mode 100644
index 0000000000..995b19953c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png
new file mode 100644
index 0000000000..3ec2502da2
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png
new file mode 100644
index 0000000000..aa65838418
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png
new file mode 100644
index 0000000000..985954250c
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png
new file mode 100644
index 0000000000..9b857a9277
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png
new file mode 100644
index 0000000000..0c165f3e59
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png
new file mode 100644
index 0000000000..7adcc6adcf
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png
new file mode 100644
index 0000000000..2064052fa5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png
new file mode 100644
index 0000000000..a974943866
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png
new file mode 100644
index 0000000000..97a796c871
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/spawn_egg.png b/src/main/resources/assets/miscutils/textures/items/spawn_egg.png
new file mode 100644
index 0000000000..23259c71f5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/spawn_egg.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png b/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png
new file mode 100644
index 0000000000..83ec78f172
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/token/0.png b/src/main/resources/assets/miscutils/textures/items/token/0.png
new file mode 100644
index 0000000000..7947f30bb6
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/token/0.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/token/1.png b/src/main/resources/assets/miscutils/textures/items/token/1.png
new file mode 100644
index 0000000000..850acc3e71
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/token/1.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/token/2.png b/src/main/resources/assets/miscutils/textures/items/token/2.png
new file mode 100644
index 0000000000..fa619dd1ed
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/token/2.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/token/3.png b/src/main/resources/assets/miscutils/textures/items/token/3.png
new file mode 100644
index 0000000000..3ba45ed7af
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/token/3.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/items/token/4.png b/src/main/resources/assets/miscutils/textures/items/token/4.png
new file mode 100644
index 0000000000..81af6a91c8
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/items/token/4.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/models/TinFoil.png b/src/main/resources/assets/miscutils/textures/models/TinFoil.png
new file mode 100644
index 0000000000..6c8e967db5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/models/TinFoil.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/space/hd10180/A.png b/src/main/resources/assets/miscutils/textures/space/hd10180/A.png
new file mode 100644
index 0000000000..b3499184b5
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/space/hd10180/A.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/space/hd10180/B.png b/src/main/resources/assets/miscutils/textures/space/hd10180/B.png
new file mode 100644
index 0000000000..659aacbba7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/space/hd10180/B.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/space/hd10180/C.png b/src/main/resources/assets/miscutils/textures/space/hd10180/C.png
new file mode 100644
index 0000000000..659aacbba7
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/space/hd10180/C.png
Binary files differ
diff --git a/src/main/resources/assets/miscutils/textures/space/hd10180/D.png b/src/main/resources/assets/miscutils/textures/space/hd10180/D.png
new file mode 100644
index 0000000000..61e5d6b520
--- /dev/null
+++ b/src/main/resources/assets/miscutils/textures/space/hd10180/D.png
Binary files differ
diff --git a/src/main/resources/assets/spiceoflife/lang/de_DE.lang b/src/main/resources/assets/spiceoflife/lang/de_DE.lang
new file mode 100644
index 0000000000..63ad1e2a98
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/de_DE.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Voedselkrat \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/en_US.lang b/src/main/resources/assets/spiceoflife/lang/en_US.lang
new file mode 100644
index 0000000000..bf16f4dc93
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/en_US.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Food Crate \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/es_ES.lang b/src/main/resources/assets/spiceoflife/lang/es_ES.lang
new file mode 100644
index 0000000000..02fe4c8806
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/es_ES.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Caja de comida \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/fr_FR.lang b/src/main/resources/assets/spiceoflife/lang/fr_FR.lang
new file mode 100644
index 0000000000..418c2b7053
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/fr_FR.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Caisse alimentaire \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/it_IT.lang b/src/main/resources/assets/spiceoflife/lang/it_IT.lang
new file mode 100644
index 0000000000..841b97c63f
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/it_IT.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Cassa Alimentare \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/ko_KR.lang b/src/main/resources/assets/spiceoflife/lang/ko_KR.lang
new file mode 100644
index 0000000000..7e9973e936
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/ko_KR.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=음식 상자 \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/ru_RU.lang b/src/main/resources/assets/spiceoflife/lang/ru_RU.lang
new file mode 100644
index 0000000000..e167a0ae03
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/ru_RU.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Продовольственный ящик \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/lang/zh_CN.lang b/src/main/resources/assets/spiceoflife/lang/zh_CN.lang
new file mode 100644
index 0000000000..76ba9db55b
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/lang/zh_CN.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=装箱食物 \ No newline at end of file
diff --git a/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png b/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png
new file mode 100644
index 0000000000..b717dd0318
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png
Binary files differ
diff --git a/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png b/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png
new file mode 100644
index 0000000000..4dbfd54ea7
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png
Binary files differ
diff --git a/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png b/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png
new file mode 100644
index 0000000000..0284bd29ad
--- /dev/null
+++ b/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png
Binary files differ
diff --git a/src/main/resources/assets/stevescarts/lang/en_US.lang b/src/main/resources/assets/stevescarts/lang/en_US.lang
new file mode 100644
index 0000000000..56dc8390a6
--- /dev/null
+++ b/src/main/resources/assets/stevescarts/lang/en_US.lang
@@ -0,0 +1 @@
+item.SC2:crop_exotic_seeds.name=Exotic Seed Module [GT++] \ No newline at end of file
diff --git a/src/main/resources/assets/stevescarts/lang/zh_CN.lang b/src/main/resources/assets/stevescarts/lang/zh_CN.lang
new file mode 100644
index 0000000000..0b35e447e2
--- /dev/null
+++ b/src/main/resources/assets/stevescarts/lang/zh_CN.lang
@@ -0,0 +1 @@
+item.SC2:crop_exotic_seeds.name=异域种子模块[GT++] \ No newline at end of file
diff --git a/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png b/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png
new file mode 100644
index 0000000000..63e0593119
--- /dev/null
+++ b/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang
new file mode 100644
index 0000000000..511def2331
--- /dev/null
+++ b/src/main/resources/assets/tectech/lang/en_US.lang
@@ -0,0 +1,1675 @@
+#Creative Tab Name
+itemGroup.TecTech=TecTech Interdimensional
+itemGroup.EM=TecTech Elemental Matter
+
+#Blocks
+tile.quantumStuff.name=Quantum Stuff
+tile.Eye of Harmony Renderer.name=Eye of Harmony Renderer
+
+tile.quantumGlass.name=Quantum Glass
+tile.quantumGlass.desc.0=Dense yet transparent
+tile.quantumGlass.desc.1=Glassy & Classy
+
+tile.spatiallyTranscendentGravitationalLens.name=Spatially Transcendent Gravitational Lens Block
+tile.godforgeGlass.desc.0=Gravitational lensing taken literal
+tile.godforgeGlass.desc.1=GraviLens 9000!
+
+tile.reactorSim.name=Reactor Simulator
+tile.reactorSim.desc.0=Fission Reaction Uncertainty Resolver 9001
+tile.reactorSim.desc.1=Explodes, but not as much...
+
+#Items
+item.em.programmer.name=AVR programmer
+item.em.programmer.desc.0=Current PC
+item.em.programmer.desc.1=Awoken
+item.em.programmer.desc.2=Active
+item.em.programmer.desc.3=Debug
+item.em.programmer.desc.4=Delay
+
+item.em.debugContainer.name=Debug EM Container
+item.em.debugContainer.desc.0=Contains
+item.em.debugContainer.desc.1=Container for elemental matter
+item.em.debugContainer.desc.2=Right click on elemental hatches
+item.em.debugContainer.desc.3=---Unexpected Termination---
+
+item.em.definitionContainer.name=EM Recipe Hint
+item.em.definitionContainer.desc.0=Should Contain
+item.em.definitionContainer.desc.1=Recipe Hint
+item.em.definitionContainer.desc.2=---Unexpected Termination---
+
+item.em.definitionScanStorage.name=EM Scan Storage
+item.em.definitionScanStorage.desc.0=Contains scan result
+item.em.definitionScanStorage.desc.1=Use to read
+item.em.definitionScanStorage.desc.2=Storage for matter scan data
+item.em.definitionScanStorage.desc.3=---Unexpected Termination---
+
+item.em.constructable.name=Multiblock Machine Blueprint
+item.em.constructable.desc.0=Triggers Constructable Interface
+item.em.constructable.desc.1=Shows multiblock construction details,
+item.em.constructable.desc.2=just Use on a multiblock controller.
+item.em.constructable.desc.3=(Sneak Use in creative to build)
+item.em.constructable.desc.4=Quantity affects tier/mode/type
+
+item.em.EuMeterGT.name=GT EU meter
+item.em.EuMeterGT.desc.0=Measures basic EU related stuff
+item.em.EuMeterGT.desc.1=Just right click on blocks.
+
+item.em.frontRotate.name=Front Rotation Scrench
+item.em.frontRotate.desc.0=Triggers Front Rotation Interface
+item.em.frontRotate.desc.1=Rotates only the front panel,
+item.em.frontRotate.desc.2=which allows structure rotation.
+
+item.em.parametrizerMemoryCard.name=Parametrizer Memory Card
+item.em.parametrizerMemoryCard.name.paste=Parametrizer Memory Card (Paste Mode)
+item.em.parametrizerMemoryCard.name.copy=Parametrizer Memory Card (Copy Mode)
+item.em.parametrizerMemoryCard.desc.0=Stores Parameters
+item.em.parametrizerMemoryCard.desc.1=Use on Multiblock Controller to configure it
+item.em.parametrizerMemoryCard.desc.2=Use on Multiblock Controller to store parameters
+item.em.parametrizerMemoryCard.desc.3=Sneak right click to lock/unlock
+
+item.tm.teslaCoilCapacitor.0.name=LV Tesla Capacitor
+item.tm.teslaCoilCapacitor.1.name=MV Tesla Capacitor
+item.tm.teslaCoilCapacitor.2.name=HV Tesla Capacitor
+item.tm.teslaCoilCapacitor.3.name=EV Tesla Capacitor
+item.tm.teslaCoilCapacitor.4.name=IV Tesla Capacitor
+item.tm.teslaCoilCapacitor.5.name=LuV Tesla Capacitor
+item.tm.teslaCoilCapacitor.6.name=ZPM Tesla Capacitor
+item.tm.teslaCoilCapacitor.desc.0=Stores
+item.tm.teslaCoilCapacitor.desc.1=EU in a tesla tower at
+item.tm.teslaCoilCapacitor.desc.2=Yeet this broken item into some spicy water!
+item.tm.teslaCoilCapacitor.desc.3=Insert into a Capacitor hatch of a Tesla Tower
+item.tm.teslaCoilCapacitor.desc.4=Capacitors are the same thing as batteries, right?
+
+item.tm.itemTeslaComponent.0.name=Electrum Tesla Windings
+item.tm.itemTeslaComponent.1.name=Superconductive Tesla Windings
+item.tm.itemTeslaComponent.desc=Tesla bois need these!
+
+item.tm.teslaCover.0.name=Tesla Coil Cover
+item.tm.teslaCover.1.name=Tesla Coil Cover Rich Edition
+item.tm.teslaCover.desc.0=Tesla-Enables Machines!
+item.tm.teslaCover.desc.1=Tesla-Enables Machines! (BUT LOUDER!!)
+item.tm.teslaCover.desc.2=Yeet this broken item into some spicy water!
+item.tm.teslaCover.desc.3=Use on top of a machine to enable Tesla capabilities
+item.tm.teslaCover.desc.4=Who the hell uses cables anyway?
+
+item.tm.teslaStaff.name=Tesla Staff
+item.tm.teslaStaff.desc=Power of the gods, at the whim of a mortal!
+
+item.tm.enderfluidlinkcover.name=Ender Fluid Link Cover
+item.tm.enderfluidlinkcover.desc.0=Ender-Fluid-Enables Machines!
+item.tm.enderfluidlinkcover.desc.1=Use on any side of a fluid tank to link it to the Ender
+item.tm.enderfluidlinkcover.desc.2=Ender Tanks so are laggy -Bot from the Chads of NH
+
+item.tm.powerpassupgradecover.name=Power Pass Upgrade Cover
+item.tm.powerpassupgradecover.desc.0=Add power pass functionality to TecTech Multiblocks
+item.tm.powerpassupgradecover.desc.1=Active transformer in a can??
+item.tm.powerpassupgradecover.desc.2=Chain them up like Christmas lights!
+
+item.tm.itemAstralArrayFabricator.name=Astral Array Fabricator
+item.tm.itemAstralArrayFabricator.desc0=Parallel dimensions?!
+item.tm.itemAstralArrayFabricator.desc1=Device capable of enhancing the Eye of Harmony's spatial compression,
+item.tm.itemAstralArrayFabricator.desc2=reaching into the space beyond.
+item.tm.itemAstralArrayFabricator.desc3=Allows for recipe parallelism.
+
+#Death Messages
+death.attack.microwaving=%1$s was dehydrated by radiation.
+death.attack.microwaving.player=%1$s was dehydrated by radiation while fighting %2$s.
+death.attack.elementalPollution=%1$s was vaping from the wrong hole.
+death.attack.elementalPollution.player=%1$s was vaping from the wrong hole while fighting %2$s.
+death.attack.subspace=%1$s was N-th dimensionally displeased.
+death.attack.subspace.player=%1$s N-th dimensionally displeased while fighting %2$s.
+
+#Machine hulls
+gt.blockmachines.hull.tier.10.name=UEV Machine Hull
+gt.blockmachines.hull.tier.11.name=UIV Machine Hull
+gt.blockmachines.hull.tier.12.name=UMV Machine Hull
+gt.blockmachines.hull.tier.13.name=UXV Machine Hull
+gt.blockmachines.hull.tier.14.name=MAX Machine Hull
+
+#Transformers
+gt.blockmachines.wetransformer.tier.00.name=Ultra Low Voltage Power Transformer
+gt.blockmachines.wetransformer.tier.00.desc=LV -> ULV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.01.name=Low Voltage Power Transformer
+gt.blockmachines.wetransformer.tier.01.desc=MV -> LV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.02.name=Medium Voltage Power Transformer
+gt.blockmachines.wetransformer.tier.02.desc=HV -> MV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.03.name=High Voltage Power Transformer
+gt.blockmachines.wetransformer.tier.03.desc=EV -> HV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.04.name=Extreme Power Transformer
+gt.blockmachines.wetransformer.tier.04.desc=IV -> EV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.05.name=Insane Power Transformer
+gt.blockmachines.wetransformer.tier.05.desc=LuV -> IV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.06.name=Ludicrous Power Transformer
+gt.blockmachines.wetransformer.tier.06.desc=ZPM -> LuV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.07.name=ZPM Voltage Power Transformer
+gt.blockmachines.wetransformer.tier.07.desc=UV -> ZPM (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.08.name=Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.08.desc=UHV -> UV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.09.name=Highly Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.10.name=Extremely Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.11.name=Insanely Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.12.name=Mega Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert)
+gt.blockmachines.wetransformer.tier.13.name=Extended Mega Ultimate Power Transformer
+gt.blockmachines.wetransformer.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert)
+
+gt.blockmachines.tt.transformer.tier.09.name=Highly Ultimate Transformer
+gt.blockmachines.tt.transformer.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert)
+gt.blockmachines.tt.transformer.tier.10.name=Extremely Ultimate Transformer
+gt.blockmachines.tt.transformer.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert)
+gt.blockmachines.tt.transformer.tier.11.name=Insanely Ultimate Transformer
+gt.blockmachines.tt.transformer.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert)
+gt.blockmachines.tt.transformer.tier.12.name=Mega Ultimate Transformer
+gt.blockmachines.tt.transformer.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert)
+gt.blockmachines.tt.transformer.tier.13.name=Extended Mega Ultimate Transformer
+gt.blockmachines.tt.transformer.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert)
+
+gt.blockmachines.transformer.ha.tier.09.name=Highly Ultimate Hi-Amp Transformer
+gt.blockmachines.transformer.ha.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert
+gt.blockmachines.transformer.ha.tier.10.name=Extremely Ultimate Hi-Amp Transformer
+gt.blockmachines.transformer.ha.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert)
+gt.blockmachines.transformer.ha.tier.11.name=Insanely Ultimate Hi-Amp Transformer
+gt.blockmachines.transformer.ha.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert)
+gt.blockmachines.transformer.ha.tier.12.name=Mega Ultimate Hi-Amp Transformer
+gt.blockmachines.transformer.ha.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert)
+gt.blockmachines.transformer.ha.tier.13.name=Extended Mega Ultimate Hi-Amp Transformer
+gt.blockmachines.transformer.ha.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert)
+
+#Hatches
+tt.base.emhatch.desc.0=Max stacks amount:
+tt.base.emhatch.desc.1=Stack capacity:
+tt.base.emhatch.desc.2=Place Overflow Hatch behind,on top or below
+tt.base.emhatch.desc.3=to provide overflow protection while this block
+tt.base.emhatch.desc.4=is not attached to multi block.
+tt.base.emhatch.desc.5=Transport range can be extended in straight
+tt.base.emhatch.desc.6=line up to 15 blocks with quantum tunnels.
+tt.base.emhatch.desc.7=Must be painted to work
+
+gt.blockmachines.hatch.emmuffler.tier.08.name=UV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.tier.09.name=UHV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.tier.10.name=UEV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.tier.11.name=UIV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.tier.12.name=UMV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.tier.13.name=UXV Overflow Output Hatch
+gt.blockmachines.hatch.emmuffler.desc.0=Disposes excess elemental Matter
+gt.blockmachines.hatch.emmuffler.desc.1=Mass capacity
+gt.blockmachines.hatch.emmuffler.desc.2=Disposal Speed
+gt.blockmachines.hatch.emmuffler.desc.3=DO NOT OBSTRUCT THE OUTPUT!
+
+gt.blockmachines.hatch.energymulti04.tier.05.name=IV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.05.name=IV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.05.name=IV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.06.name=LuV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.06.name=LuV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.06.name=LuV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.07.name=ZPM 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.07.name=ZPM 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.07.name=ZPM 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.08.name=UV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.08.name=UV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.08.name=UV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.09.name=UHV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.09.name=UHV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.09.name=UHV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.10.name=UEV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.10.name=UEV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.10.name=UEV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.11.name=UIV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.11.name=UIV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.11.name=UIV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.12.name=UMV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.12.name=UMV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.12.name=UMV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti04.tier.13.name=UXV 4A Energy Hatch
+gt.blockmachines.hatch.energymulti16.tier.13.name=UXV 16A Energy Hatch
+gt.blockmachines.hatch.energymulti64.tier.13.name=UXV 64A Energy Hatch
+gt.blockmachines.hatch.energymulti.desc.0=Multiple Ampere Energy Injector for Multiblocks
+gt.blockmachines.hatch.energymulti.desc.1=Amperes In
+gt.blockmachines.hatch.energymulti.desc.2=Accepts up to %d Amps from energy network
+gt.blockmachines.hatch.energymulti.desc.3=Provides up to %d Amps to the multiblock
+
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.04=EV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.04=EV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.04=EV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.05=IV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.05=IV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.05=IV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.06=LuV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.06=LuV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.06=LuV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.07=ZPM 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.07=ZPM 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.07=ZPM 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.08=UV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.08=UV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.08=UV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.09=UHV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.09=UHV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.09=UHV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.10=UEV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.10=UEV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.10=UEV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.11=UIV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.11=UIV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.11=UIV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.12=UMV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.12=UMV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.12=UMV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.13=UXV 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.13=UXV 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.13=UXV 64A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.14=MAX 4A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.14=MAX 16A Wireless Energy Hatch
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.14=MAX 64A Wireless Energy Hatch
+
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.04.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.04.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.04.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.05.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.05.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.05.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.06.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.06.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.06.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.07.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.07.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.07.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.08.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.08.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.08.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.09.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.09.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.09.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.10.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.10.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.10.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.11.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.11.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.11.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.12.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.12.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.12.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.13.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.13.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.13.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.14.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.14.desc=Multi Amp Wireless Energy!
+achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.14.desc=Multi Amp Wireless Energy!
+
+gt.blockmachines.hatch.energywirelesstunnel1.tier.13.name=UXV 256A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel2.tier.13.name=UXV 1,024A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel3.tier.13.name=UXV 4,096A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel4.tier.13.name=UXV 16,384A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel5.tier.13.name=UXV 65,536A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel6.tier.13.name=UXV 262,144A Wireless Energy Hatch
+gt.blockmachines.hatch.energywirelesstunnel7.tier.13.name=UXV 1,048,576A Wireless Energy Hatch
+
+achievement.gt.blockmachines.hatch.energywirelesstunnel1.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel2.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel3.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel4.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel5.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel6.tier.13.desc=High Amp Wireless Energy at last!
+achievement.gt.blockmachines.hatch.energywirelesstunnel7.tier.13.desc=High Amp Wireless Energy at last!
+
+gt.blockmachines.hatch.energytunnel1.tier.05.name=IV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.05.name=IV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.05.name=IV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.05.name=IV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.05.name=IV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.05.name=IV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.05.name=IV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.06.name=LuV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.06.name=LuV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.06.name=LuV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.06.name=LuV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.06.name=LuV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.06.name=LuV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.06.name=LuV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.07.name=ZPM 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.07.name=ZPM 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.07.name=ZPM 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.07.name=ZPM 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.07.name=ZPM 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.07.name=ZPM 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.07.name=ZPM 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.08.name=UV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.08.name=UV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.08.name=UV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.08.name=UV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.08.name=UV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.08.name=UV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.08.name=UV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.09.name=UHV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.09.name=UHV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.09.name=UHV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.09.name=UHV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.09.name=UHV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.09.name=UHV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.09.name=UHV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.10.name=UEV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.10.name=UEV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.10.name=UEV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.10.name=UEV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.10.name=UEV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.10.name=UEV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.10.name=UEV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.11.name=UIV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.11.name=UIV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.11.name=UIV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.11.name=UIV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.11.name=UIV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.11.name=UIV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.11.name=UIV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.12.name=UMV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.12.name=UMV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.12.name=UMV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.12.name=UMV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.12.name=UMV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.12.name=UMV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.12.name=UMV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel1.tier.13.name=UXV 256A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel2.tier.13.name=UXV 1,024A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel3.tier.13.name=UXV 4,096A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel4.tier.13.name=UXV 16,384A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel5.tier.13.name=UXV 65,536A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel6.tier.13.name=UXV 262,144A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel7.tier.13.name=UXV 1,048,576A/t Laser Target Hatch
+gt.blockmachines.hatch.energytunnel.tier.14.name=Legendary Laser Target Hatch
+gt.blockmachines.hatch.energytunnel.desc.0=Energy injecting terminal for Multiblocks
+gt.blockmachines.hatch.energytunnel.desc.1=Throughput
+
+gt.blockmachines.hatch.dynamomulti04.tier.05.name=IV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.05.name=IV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.05.name=IV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.06.name=LuV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.06.name=LuV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.06.name=LuV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.07.name=ZPM 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.07.name=ZPM 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.07.name=ZPM 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.08.name=UV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.08.name=UV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.08.name=UV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.09.name=UHV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.09.name=UHV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.09.name=UHV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.10.name=UEV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.10.name=UEV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.10.name=UEV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.11.name=UIV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.11.name=UIV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.11.name=UIV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.12.name=UMV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.12.name=UMV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.12.name=UMV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti04.tier.13.name=UXV 4A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti16.tier.13.name=UXV 16A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti64.tier.13.name=UXV 64A Dynamo Hatch
+gt.blockmachines.hatch.dynamomulti.desc.0=Multiple Ampere Energy Extractor for Multiblocks
+gt.blockmachines.hatch.dynamomulti.desc.1=Amperes Out
+
+gt.blockmachines.hatch.dynamotunnel1.tier.05.name=IV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.05.name=IV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.05.name=IV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.05.name=IV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.05.name=IV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.05.name=IV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.05.name=IV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.06.name=LuV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.06.name=LuV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.06.name=LuV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.06.name=LuV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.06.name=LuV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.06.name=LuV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.06.name=LuV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.07.name=ZPM 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.07.name=ZPM 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.07.name=ZPM 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.07.name=ZPM 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.07.name=ZPM 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.07.name=ZPM 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.07.name=ZPM 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.08.name=UV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.08.name=UV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.08.name=UV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.08.name=UV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.08.name=UV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.08.name=UV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.08.name=UV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.09.name=UHV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.09.name=UHV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.09.name=UHV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.09.name=UHV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.09.name=UHV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.09.name=UHV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.09.name=UHV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.10.name=UEV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.10.name=UEV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.10.name=UEV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.10.name=UEV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.10.name=UEV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.10.name=UEV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.10.name=UEV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.11.name=UIV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.11.name=UIV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.11.name=UIV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.11.name=UIV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.11.name=UIV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.11.name=UIV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.11.name=UIV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.12.name=UMV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.12.name=UMV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.12.name=UMV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.12.name=UMV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.12.name=UMV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.12.name=UMV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.12.name=UMV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel1.tier.13.name=UXV 256A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel2.tier.13.name=UXV 1,024A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel3.tier.13.name=UXV 4,096A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel4.tier.13.name=UXV 16,384A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel5.tier.13.name=UXV 65,536A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel6.tier.13.name=UXV 262,144A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel7.tier.13.name=UXV 1,048,576A/t Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel.tier.14.name=Legendary Laser Source Hatch
+gt.blockmachines.hatch.dynamotunnel.desc.0=Energy extracting terminal for Multiblocks
+gt.blockmachines.hatch.dynamotunnel.desc.1=Throughput
+
+gt.blockmachines.emin.tier.08.name=UV Elemental Input Hatch
+gt.blockmachines.emin.tier.09.name=UHV Elemental Input Hatch
+gt.blockmachines.emin.tier.10.name=UEV Elemental Input Hatch
+gt.blockmachines.emin.tier.11.name=UIV Elemental Input Hatch
+gt.blockmachines.emin.tier.12.name=UMV Elemental Input Hatch
+gt.blockmachines.emin.tier.13.name=UXV Elemental Input Hatch
+gt.blockmachines.emin.desc=Elemental Input for Multiblocks
+
+gt.blockmachines.emout.tier.08.name=UV Elemental Output Hatch
+gt.blockmachines.emout.tier.09.name=UHV Elemental Output Hatch
+gt.blockmachines.emout.tier.10.name=UEV Elemental Output Hatch
+gt.blockmachines.emout.tier.11.name=UIV Elemental Output Hatch
+gt.blockmachines.emout.tier.12.name=UMV Elemental Output Hatch
+gt.blockmachines.emout.tier.13.name=UXV Elemental Output Hatch
+gt.blockmachines.emout.desc=Elemental Output for Multiblocks
+
+#TODO change tier.05 to tier.04
+gt.blockmachines.hatch.param.tier.05.name=Parametrizer
+gt.blockmachines.hatch.param.tier.07.name=Parametrizer X
+gt.blockmachines.hatch.param.tier.10.name=Parametrizer tXt
+gt.blockmachines.hatch.param.desc.0=For parametrization of Multiblocks
+gt.blockmachines.hatch.param.desc.1=E=mine*craft
+
+gt.blockmachines.hatch.certain.tier.07.name=Uncertainty Resolver
+gt.blockmachines.hatch.certain.tier.10.name=Uncertainty Resolver X
+gt.blockmachines.hatch.certain.desc.0=Feeling certain, or not?
+gt.blockmachines.hatch.certain.desc.1=Schrödinger equation in a box
+
+gt.blockmachines.hatch.datain.tier.07.name=Optical Slave Connector
+gt.blockmachines.hatch.datain.desc.0=Quantum Data Input for Multiblocks
+gt.blockmachines.hatch.datain.desc.1=High speed fibre optics connector.
+gt.blockmachines.hatch.datain.desc.2=Must be painted to work
+
+gt.blockmachines.hatch.dataout.tier.07.name=Optical Master Connector
+gt.blockmachines.hatch.dataout.desc.0=Quantum Data Output for Multiblocks
+gt.blockmachines.hatch.dataout.desc.1=High speed fibre optics connector.
+gt.blockmachines.hatch.dataout.desc.2=Must be painted to work
+
+gt.blockmachines.hatch.datainass.tier.07.name=Assembly line Slave Connector
+gt.blockmachines.hatch.datainass.desc.0=ItemStack Data Input for Multiblocks
+gt.blockmachines.hatch.datainass.desc.1=High speed fibre optics connector.
+gt.blockmachines.hatch.datainass.desc.2=Must be painted to work
+
+gt.blockmachines.hatch.dataoutass.tier.07.name=Data Bank Master Connector
+gt.blockmachines.hatch.dataoutass.desc.0=ItemStack Data Output for Multiblocks
+gt.blockmachines.hatch.dataoutass.desc.1=High speed fibre optics connector.
+gt.blockmachines.hatch.dataoutass.desc.2=Must be painted to work
+
+gt.blockmachines.hatch.rack.tier.08.name=Computer Rack
+gt.blockmachines.hatch.rack.desc.0=4 Slot Rack
+gt.blockmachines.hatch.rack.desc.1=Holds Computer Components
+gt.blockmachines.hatch.holder.tier.09.name=Object Holder
+gt.blockmachines.hatch.holder.desc.0=For Research Station
+gt.blockmachines.hatch.holder.desc.1=Advanced Holding Mechanism!
+gt.blockmachines.hatch.capacitor.tier.03.name=Capacitor Hatch
+gt.blockmachines.hatch.capacitor.desc.0=For Tesla Tower
+gt.blockmachines.hatch.capacitor.desc.1=Stores 'nergy! (for a while)
+
+#Casings
+gt.blockcasingsNH.10.name=UEV Machine Casing
+gt.blockcasingsNH.11.name=UIV Machine Casing
+gt.blockcasingsNH.12.name=UMV Machine Casing
+gt.blockcasingsNH.13.name=UXV Machine Casing
+gt.blockcasingsNH.14.name=MAX Machine Casing
+
+gt.blockhintTT.desc.0=Helps while building
+gt.blockhintTT.0.name=Hint 1 dot
+gt.blockhintTT.1.name=Hint 2 dot
+gt.blockhintTT.2.name=Hint 3 dot
+gt.blockhintTT.3.name=Hint 4 dot
+gt.blockhintTT.4.name=Hint 5 dot
+gt.blockhintTT.5.name=Hint 6 dot
+gt.blockhintTT.6.name=Hint 7 dot
+gt.blockhintTT.7.name=Hint 8 dot
+gt.blockhintTT.8.name=Hint 9 dot
+gt.blockhintTT.9.name=Hint 10 dot
+gt.blockhintTT.10.name=Hint 11 dot
+gt.blockhintTT.11.name=Hint 12 dot
+gt.blockhintTT.desc.1=Placeholder for a certain group.
+gt.blockhintTT.12.name=Hint general
+gt.blockhintTT.desc.2=General placeholder.
+gt.blockhintTT.13.name=Hint air
+gt.blockhintTT.desc.3=Make sure it contains Air material.
+gt.blockhintTT.14.name=Hint no air
+gt.blockhintTT.desc.4=Make sure it does not contain Air material.
+gt.blockhintTT.15.name=Hint error
+gt.blockhintTT.desc.5=ERROR, what did u expect?
+
+gt.blockcasingsTT.0.name=High Power Casing
+gt.blockcasingsTT.0.desc.0=Well suited for high power applications.
+gt.blockcasingsTT.0.desc.1=The power levels are rising!
+gt.blockcasingsTT.1.name=Computer Casing
+gt.blockcasingsTT.1.desc.0=Nice and clean casing.
+gt.blockcasingsTT.1.desc.1=Dust can break it!?
+gt.3blockcasingsTT.2.name=Computer Heat Vent
+gt.blockcasingsTT.2.desc.0=Air vent with a filter.
+gt.blockcasingsTT.2.desc.1=Perfectly muffled sound!
+gt.blockcasingsTT.3.name=Advanced Computer Casing
+gt.blockcasingsTT.3.desc.0=Contains high bandwidth bus
+gt.blockcasingsTT.3.desc.1=couple thousand qubits wide.
+gt.blockcasingsTT.4.name=Molecular Casing
+gt.blockcasingsTT.4.desc.0=Stops elemental things.
+gt.blockcasingsTT.4.desc.1=Radiation and emotions too...
+gt.blockcasingsTT.5.name=Advanced Molecular Casing
+gt.blockcasingsTT.5.desc.0=Cooling and stabilization.
+gt.blockcasingsTT.5.desc.1=A comfortable machine bed.
+gt.blockcasingsTT.6.name=Containment Field Generator
+gt.blockcasingsTT.6.desc.0=Creates a field that...
+gt.blockcasingsTT.6.desc.1=can stop even force carriers.
+gt.blockcasingsTT.7.name=Molecular Coil
+gt.blockcasingsTT.7.desc.0=Well it does things too...
+gt.blockcasingsTT.7.desc.1=[Use this coil!]
+gt.blockcasingsTT.8.name=Hollow Casing
+gt.blockcasingsTT.8.desc.0=Reinforced accelerator tunnel.
+gt.blockcasingsTT.8.desc.1=Most advanced pipe ever.
+gt.blockcasingsTT.9.name=Spacetime Altering Casing
+gt.blockcasingsTT.9.desc.0=c is no longer the limit.
+gt.blockcasingsTT.9.desc.1=Wibbly wobbly timey wimey stuff.
+gt.blockcasingsTT.10.name=Teleportation Casing
+gt.blockcasingsTT.10.desc.0=Remote connection.
+gt.blockcasingsTT.10.desc.1=Better touch with a stick.
+gt.blockcasingsTT.11.name=Dimensional Bridge Generator
+gt.blockcasingsTT.11.desc.0=Interdimensional Operations.
+gt.blockcasingsTT.11.desc.1=Around the universe and other places too.
+gt.blockcasingsTT.12.name=Ultimate Molecular Casing
+gt.blockcasingsTT.12.desc.0=Ultimate in every way.
+gt.blockcasingsTT.12.desc.1=I don't know what it can't do.
+gt.blockcasingsTT.13.name=Ultimate Advanced Molecular Casing
+gt.blockcasingsTT.13.desc.0=More Ultimate in every way.
+gt.blockcasingsTT.13.desc.1=I don't know what I am doing!
+gt.blockcasingsTT.14.name=Ultimate Containment Field Generator
+gt.blockcasingsTT.14.desc.0=Black Hole...
+gt.blockcasingsTT.14.desc.1=Meh...
+gt.blockcasingsTT.15.name=Debug Sides
+gt.blockcasingsTT.15.desc.0=Lazy man way of determining sides.
+gt.blockcasingsTT.15.desc.1=0, 1, 2, 3, 4, 5, 6?!
+
+gt.blockcasingsBA0.0.name=Redstone Alloy Primary Tesla Windings
+gt.blockcasingsBA0.1.name=MV Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.2.name=HV Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.3.name=EV Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.4.name=IV Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.5.name=LuV Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.9.name=ZPM Superconductor Primary Tesla Windings
+gt.blockcasingsBA0.0.desc.0=Handles up to
+gt.blockcasingsBA0.0.desc.1=What one man calls God, another calls the laws of physics.
+gt.blockcasingsBA0.6.name=Tesla Base Casing
+gt.blockcasingsBA0.6.desc.0=The base of a wondrous contraption
+gt.blockcasingsBA0.6.desc.1=it's alive, IT'S ALIVE!
+gt.blockcasingsBA0.7.name=Tesla Toroid Casing
+gt.blockcasingsBA0.7.desc.0=Made out of the finest tin foil!
+gt.blockcasingsBA0.7.desc.1=Faraday suits might come later
+gt.blockcasingsBA0.8.name=Tesla Secondary Windings
+gt.blockcasingsBA0.8.desc.0=Picks up power from a primary coil
+gt.blockcasingsBA0.8.desc.1=Who wouldn't want a 32k epoxy multi?
+
+#Multiblocks
+gt.blockmachines.multimachine.em.transformer.name=Active Transformer
+gt.blockmachines.multimachine.em.transformer.hint=1 - Energy IO Hatches or High Power Casing
+gt.blockmachines.multimachine.em.transformer.desc.0=Controller block of the Active Transformer
+gt.blockmachines.multimachine.em.transformer.desc.1=Can transform to and from any voltage
+gt.blockmachines.multimachine.em.transformer.desc.2=Only 0.004% power loss, HAYO!
+gt.blockmachines.multimachine.em.transformer.desc.3=Will explode if broken while running
+
+gt.blockmachines.multimachine.tm.microwave.name=Microwave Grinder
+gt.blockmachines.multimachine.tm.microwave.hint.0=1 - Classic Hatches or Clean Stainless Steel Casing
+gt.blockmachines.multimachine.tm.microwave.hint.1=Also acts like a hopper so give it an Output Bus
+gt.blockmachines.multimachine.tm.microwave.desc.0=Controller block of the Microwave Grinder
+gt.blockmachines.multimachine.tm.microwave.desc.1=Starts a timer when enabled
+gt.blockmachines.multimachine.tm.microwave.desc.2=While the timer is running anything inside the machine will take damage
+gt.blockmachines.multimachine.tm.microwave.desc.3=The machine will also collect any items inside of it
+gt.blockmachines.multimachine.tm.microwave.desc.4=Can be configured with a Parametrizer
+gt.blockmachines.multimachine.tm.microwave.desc.5=(Do not insert a Wither)
+gt.blockmachines.multimachine.tm.microwave.cfgi.0=Power setting
+gt.blockmachines.multimachine.tm.microwave.cfgi.1=Timer setting
+gt.blockmachines.multimachine.tm.microwave.cfgo.0=Timer value
+gt.blockmachines.multimachine.tm.microwave.cfgo.1=Timer remaining
+
+gt.blockmachines.multimachine.tm.teslaCoil.name=Tesla Tower
+gt.blockmachines.multimachine.tm.teslaCoil.hint.0=1 - Classic Hatches, Capacitor Hatches or Tesla Base Casing
+gt.blockmachines.multimachine.tm.teslaCoil.hint.1=2 - Titanium Frames
+gt.blockmachines.multimachine.tm.teslaCoil.desc.0=Controller block of the Tesla Tower
+gt.blockmachines.multimachine.tm.teslaCoil.desc.1=Used to transmit power to Tesla Coil Covers and Tesla Transceivers
+gt.blockmachines.multimachine.tm.teslaCoil.desc.2=Can be fed with Helium/Nitrogen/Radon Plasma to increase the range
+gt.blockmachines.multimachine.tm.teslaCoil.desc.3=Transmitted voltage depends on the used Tesla Capacitor tier
+gt.blockmachines.multimachine.tm.teslaCoil.desc.4=Primary Tesla Windings need to be at least the same tier as the Tesla Capacitor
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0=Hysteresis low setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1=Hysteresis high setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2=Tesla Towers transfer radius setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3=Tesla Transceiver transfer radius setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4=Tesla Ultimate Cover transfer radius setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5=Output voltage setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6=Output current setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7=Scan time Min setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8=Overdrive setting
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9=Unused
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0=Tesla Towers transfer radius display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1=Tesla Transceiver transfer radius display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2=Tesla Ultimate Cover transfer radius display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3=Output voltage display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4=Output current display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5=Energy Capacity display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6=Energy Stored display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7=Energy Fraction display
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8=Scan time display
+
+gt.blockmachines.multimachine.em.switch.name=Network Switch With QoS
+gt.blockmachines.multimachine.em.switch.hint=1 - Classic/Data Hatches or Computer casing
+gt.blockmachines.multimachine.em.switch.desc.0=Controller block of the Network Switch With QoS
+gt.blockmachines.multimachine.em.switch.desc.1=Used to route and distribute computation
+gt.blockmachines.multimachine.em.switch.desc.2=Needs a Parametrizer to be configured
+
+
+gt.blockmachines.multimachine.em.computer.name=Quantum Computer
+gt.blockmachines.multimachine.em.computer.hint.0=1 - Classic/Data Hatches or Computer casing
+gt.blockmachines.multimachine.em.computer.hint.1=2 - Rack Hatches or Advanced computer casing
+gt.blockmachines.multimachine.em.computer.desc=You need it to process the number above
+gt.blockmachines.multimachine.em.computer.cfgi.0=Overclock ratio
+gt.blockmachines.multimachine.em.computer.cfgi.1=Overvoltage ratio
+gt.blockmachines.multimachine.em.computer.cfgo.0=Current max. heat
+gt.blockmachines.multimachine.em.computer.cfgo.1=Produced computation
+gt.blockmachines.multimachine.em.computer.desc.0=Controller block of the Quantum Computer
+gt.blockmachines.multimachine.em.computer.desc.1=Used to generate computation (and heat)
+
+gt.blockmachines.multimachine.em.databank.name=Data Bank
+gt.blockmachines.multimachine.em.databank.hint.0=1 - Classic Hatches or high power casing
+gt.blockmachines.multimachine.em.databank.hint.1=2 - Data Access/Data Bank Master Hatches or computer casing
+gt.blockmachines.multimachine.em.databank.desc.0=Controller block of the Data Bank
+gt.blockmachines.multimachine.em.databank.desc.1=Used to supply Assembling Lines with more Data Sticks
+gt.blockmachines.multimachine.em.databank.desc.2=and give multiple Assembling Lines access to the same Data Stick
+
+gt.blockmachines.multimachine.em.junction.name=Matter Junction
+gt.blockmachines.multimachine.em.junction.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.junction.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.junction.desc.0=Controller block of the Matter Junction
+gt.blockmachines.multimachine.em.junction.desc.1=Used to route and distribute elemental matter
+gt.blockmachines.multimachine.em.junction.desc.2=Needs a Parametrizer to be configured
+
+gt.blockmachines.multimachine.em.mattertoem.name=Matter Quantizer
+gt.blockmachines.multimachine.em.mattertoem.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.mattertoem.hint.1=2 - Elemental Output Hatch
+gt.blockmachines.multimachine.em.mattertoem.hint.2=3 - Elemental Overflow Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.mattertoem.desc.0=Controller block of the Matter Quantizer
+gt.blockmachines.multimachine.em.mattertoem.desc.1=Transforms items into their elemental form
+
+gt.blockmachines.multimachine.em.emtomatter.name=Matter Dequantizer
+gt.blockmachines.multimachine.em.emtomatter.hint.0=1 - Classic Hatches or High Power Casing"
+gt.blockmachines.multimachine.em.emtomatter.hint.1=2 - Elemental Input Hatch
+gt.blockmachines.multimachine.em.emtomatter.hint.2=3 - Elemental Overflow Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.emtomatter.desc.0=Controller block of the Matter Dequantizer
+gt.blockmachines.multimachine.em.emtomatter.desc.1=Transforms elemental matter back into items
+
+gt.blockmachines.multimachine.em.emtoessentia.name=Essentia Dequantizer
+gt.blockmachines.multimachine.em.emtoessentia.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.emtoessentia.hint.1=2 - Elemental Input Hatch
+gt.blockmachines.multimachine.em.emtoessentia.hint.2=3 - Elemental Overflow Hatches or Elemental Casing
+gt.blockmachines.multimachine.em.emtoessentia.hint.3=General - Some sort of Essentia Storage
+gt.blockmachines.multimachine.em.emtoessentia.desc.0=Controller block of the Essentia Dequantizer
+gt.blockmachines.multimachine.em.emtoessentia.desc.1=Transforms elemental matter back into essentia
+
+gt.blockmachines.multimachine.em.essentiatoem.name=Essentia Quantizer
+gt.blockmachines.multimachine.em.essentiatoem.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.essentiatoem.hint.1=2 - Elemental Output Hatch
+gt.blockmachines.multimachine.em.essentiatoem.hint.2=3 - Elemental Overflow Hatches or Elemental Casing
+gt.blockmachines.multimachine.em.essentiatoem.hint.3=General - Some sort of Essentia Storage
+gt.blockmachines.multimachine.em.essentiatoem.desc.0=Controller block of the Essentia Quantizer
+gt.blockmachines.multimachine.em.essentiatoem.desc.1=Transforms essentia into their elemental form
+
+gt.blockmachines.multimachine.em.scanner.name=Elemental Scanner
+gt.blockmachines.multimachine.em.scanner.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.scanner.hint.1=2 - Elemental Input Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.scanner.hint.2=3 - Elemental Output Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.scanner.hint.3=4 - Elemental Overflow Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.scanner.desc.0=Controller block of the Elemental Scanner
+
+gt.blockmachines.multimachine.em.research.name=Research Station
+gt.blockmachines.multimachine.em.research.hint.0=1 - Classic/Data Hatches or Computer casing
+gt.blockmachines.multimachine.em.research.hint.1=2 - Holder Hatch
+gt.blockmachines.multimachine.em.research.desc.0=Controller block of the Research Station
+gt.blockmachines.multimachine.em.research.desc.1=Used to scan Data Sticks for Assembling Line Recipes
+gt.blockmachines.multimachine.em.research.desc.2=Needs to be fed with computation to work
+gt.blockmachines.multimachine.em.research.desc.3=Does not consume the item until the Data Stick is written
+gt.blockmachines.multimachine.em.research.mode.Assembly_line=Mode: Research Station
+gt.blockmachines.multimachine.em.research.mode.Scanner=Mode: Scanner
+
+gt.blockmachines.multimachine.em.collider.name=Matter Collider
+gt.blockmachines.multimachine.em.collider.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.collider.hint.1=2 - Elemental Input Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.collider.hint.2=3 - Elemental Output Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.collider.hint.3=4 - Elemental Overflow Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.collider.hint.4=General - Another Controller facing opposite direction
+gt.blockmachines.multimachine.em.collider.desc.0=Controller block of the Matter Collider
+gt.blockmachines.multimachine.em.collider.desc.1=This machine needs a mirrored copy of it to work
+gt.blockmachines.multimachine.em.collider.desc.2=One needs to be set to 'Fuse Mode' and the other to 'Collide Mode'
+gt.blockmachines.multimachine.em.collider.desc.3=Fuses two elemental matter to create another (and power)
+gt.blockmachines.multimachine.em.collider.mode.0=Mode: Fuse
+gt.blockmachines.multimachine.em.collider.mode.1=Mode: Collide
+gt.blockmachines.multimachine.em.collider.mode.2=Mode: Undefined
+gt.blockmachines.multimachine.em.collider.mode.3=Currently Slaves...
+gt.blockmachines.multimachine.em.collider.Structure.AdditionalCollider=Needs another Matter Collider that is mirrored to this one
+
+gt.blockmachines.multimachine.em.infuser.name=Energy Infuser
+gt.blockmachines.multimachine.em.infuser.hint=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.infuser.desc.0=Controller block of the Energy Infuser
+gt.blockmachines.multimachine.em.infuser.desc.1=Can be used to charge items (lossless)
+gt.blockmachines.multimachine.em.infuser.desc.2=Can be fed with UU-Matter to repair items
+gt.blockmachines.multimachine.em.infuser.desc.3=Stocking Bus is not supported
+gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing=Layer 1 and 5
+gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil=Layer 2 and 4
+gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing=Layer 3
+
+
+gt.blockmachines.multimachine.em.processing.name=Quantum Processing Machine
+gt.blockmachines.multimachine.em.processing.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.processing.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.processing.desc.0=Controller block of the Quantum Processing machine
+
+gt.blockmachines.multimachine.em.crafter.name=Matter Assembler
+gt.blockmachines.multimachine.em.crafter.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.crafter.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.crafter.desc.0=Controller block of the Matter Assembler
+
+gt.blockmachines.multimachine.em.stabilizer.name=Elemental Stabilizer
+gt.blockmachines.multimachine.em.stabilizer.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.stabilizer.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.stabilizer.desc.0=Controller block of the Elemental Stabilizer
+
+gt.blockmachines.multimachine.em.wormhole.name=Wormhole
+gt.blockmachines.multimachine.em.wormhole.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.wormhole.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.wormhole.desc.0=Controller block of the Wormhole
+
+gt.blockmachines.multimachine.em.decay.name=Decay Generator
+gt.blockmachines.multimachine.em.decay.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.decay.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.decay.desc.0=Controller block of the Decay Generator
+gt.blockmachines.multimachine.em.decay.desc.1=Decays elemental matter to generate power
+
+gt.blockmachines.multimachine.em.decay.conf=Ampere divider
+
+gt.blockmachines.multimachine.em.annihilation.name=Annihilation Generator
+gt.blockmachines.multimachine.em.annihilation.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.annihilation.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.annihilation.desc.0=Controller block of the Annihilation Generator
+
+gt.blockmachines.multimachine.em.blackholegenerator.name=Black Hole Generator
+gt.blockmachines.multimachine.em.blackholegenerator.hint.0=1 - Classic Hatches or High Power Casing
+gt.blockmachines.multimachine.em.blackholegenerator.hint.1=2 - Elemental Hatches or Molecular Casing
+gt.blockmachines.multimachine.em.blackholegenerator.desc.0=Controller block of the Black Hole Generator
+gt.blockmachines.multimachine.em.blackholegenerator.desc.1=Uses a black hole to generate power
+
+# Eye of Harmony
+achievement.gt.blockmachines.multimachine.em.eye_of_harmony=Eye of Harmony Controller
+achievement.gt.blockcasingsBA0.12=Infinite Spacetime Energy Boundary Casing
+gt.blockcasingsBA0.12.desc.0=Provides a stable bridge between spacetime regions.
+achievement.gt.blockcasingsBA0.11=Reinforced Spatial Structure Casing
+gt.blockcasingsBA0.11.desc.0=Designed to resist spatial shearing from internal volume expansion.
+gt.blockcasingsBA0.11.desc.1=Can survive at least one big bang, maybe two...
+achievement.gt.blockcasingsBA0.10=Reinforced Temporal Structure Casing
+gt.blockcasingsBA0.10.desc.0=Resistant to temporal shearing from time dilation differences.
+gt.blockcasingsBA0.10.desc.1=This block can last an eternity without any decay.
+
+
+achievement.gt.spacetime_compression_field_generator.0=Crude Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.1=Primitive Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.2=Stable Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.3=Advanced Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.4=Superb Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.5=Exotic Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.6=Perfect Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.7=Tipler Spacetime Compression Field Generator
+achievement.gt.spacetime_compression_field_generator.8=Gallifreyan Spacetime Compression Field Generator
+
+achievement.gt.time_acceleration_field_generator.0=Crude Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.1=Primitive Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.2=Stable Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.3=Advanced Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.4=Superb Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.5=Exotic Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.6=Perfect Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.7=Tipler Time Dilation Field Generator
+achievement.gt.time_acceleration_field_generator.8=Gallifreyan Time Dilation Field Generator
+
+achievement.gt.stabilisation_field_generator.0=Crude Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.1=Primitive Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.2=Stable Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.3=Advanced Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.4=Superb Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.5=Exotic Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.6=Perfect Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.7=Tipler Stabilisation Field Generator
+achievement.gt.stabilisation_field_generator.8=Gallifreyan Stabilisation Field Generator
+
+# Forge of the Gods / Godforge
+fog.upgrade.confirm=Construct
+
+fog.upgrade.tt.0=upgrade start
+fog.upgrade.tt.1=upgrade 11
+fog.upgrade.tt.2=upgrade 21
+fog.upgrade.tt.3=upgrade 22
+fog.upgrade.tt.4=upgrade 31
+fog.upgrade.tt.5=upgrade 32
+fog.upgrade.tt.6=upgrade 33
+fog.upgrade.tt.7=upgrade 41
+fog.upgrade.tt.8=upgrade 51
+fog.upgrade.tt.9=upgrade 52
+fog.upgrade.tt.10=upgrade 53
+fog.upgrade.tt.11=upgrade 61
+fog.upgrade.tt.12=upgrade 71
+fog.upgrade.tt.13=upgrade 72
+fog.upgrade.tt.14=upgrade 73
+fog.upgrade.tt.15=upgrade 74
+fog.upgrade.tt.16=upgrade 80
+fog.upgrade.tt.17=upgrade 81
+fog.upgrade.tt.18=upgrade 82
+fog.upgrade.tt.19=upgrade 83
+fog.upgrade.tt.20=upgrade 91
+fog.upgrade.tt.21=upgrade 92
+fog.upgrade.tt.22=upgrade 93
+fog.upgrade.tt.23=upgrade 101
+fog.upgrade.tt.24=upgrade 111
+fog.upgrade.tt.25=upgrade 121
+fog.upgrade.tt.26=upgrade 131
+fog.upgrade.tt.27=upgrade 141
+fog.upgrade.tt.28=upgrade 151
+fog.upgrade.tt.29=upgrade 161
+fog.upgrade.tt.30=upgrade end
+
+fog.upgrade.lore.0=The Forge of the Gods is an immensely powerful structure constructed around a stabilized neutron star – it is so advanced that its full capabilities are not yet understood. However, through continued use one can slowly upgrade and expand the range of abilities of the Forge, and learn the power hidden in the most extreme parts of the universe: graviton shards. This esoteric material can only be found where conventional matter and degenerate neutronium crust matter on the surface of a neutron star meet. At this point in space, gravitons are far more common and irradiate this material mixture to create highly unstable graviton shards, which can be used to internally upgrade the Forge. While these shards cannot yet exist outside the extreme conditions of the Forge, with continued research and utilization it may be possible to eventually isolate and extract them outside the Forge – but for what purpose?
+fog.upgrade.lore.1=The first major upgrade of the Forge of the Gods has allowed for greater processing speeds as the heat increases, thanks to the space warping effects of graviton shards. This is the first of many applications of the shards, which will be discovered through continuous use of the Forge.
+fog.upgrade.lore.2=Graviton shards warp the surface area of fuels used in the Forge, increasing efficiency as more material can be processed per unit of fuel. Graviton shards will prove crucial for further efficiency increases to offset the ever-increasing demands of the Forge.
+fog.upgrade.lore.3=Through use of graviton shards, the space within the Forge’s fuel chambers can be increased, allowing for greater quantities of fuel to be burned, thus reaching higher temperatures. Don’t forget to reserve fuel to keep the star at the centre of the Forge alive.
+fog.upgrade.lore.4=Graviton shards not only affect matter, but also energy: depending on the fuel burn rate, the Forge may now accept more energy input, allowing for greater processing capacity. What other properties do these Graviton shards hold?
+fog.upgrade.lore.5=As usage of the Forge continues, more data on graviton shards is gathered. It has been found that they can stabilize the outputs of the Forge, allowing for the direct extraction of molten material while it is still close to the heart of the star.
+fog.upgrade.lore.6=As stellar fuel consumption continues to increase the size and energy of the star, the amount of material that can be processed at once also increases. Graviton shards facilitate the manipulation of increased quantities of materials near the star in the core of the Forge.
+fog.upgrade.lore.7=As understanding of graviton shards continues to improve, better control over the materials they manipulate can be achieved. Graviton shards provide an alternative to electromagnetic containment of plasma using spacetime manipulation instead, allowing the Forge to directly output processed materials as plasma.
+fog.upgrade.lore.8=Adding graviton shards to the Forge’s internal energy storage allows for greater quantities of energy stored in a smaller area. By increasing energy density to relativistic levels, the Forge can be run more efficiently and store essentially infinite energy.
+fog.upgrade.lore.9=Simply adding more graviton shards to the fuel chamber continues to amplify the ability for the Forge to consume increased quantities of stellar fuel. It even benefits from graviton shards invested in different parts of the Forge entirely – it seems shards exhibit quantum entanglement-like properties.
+fog.upgrade.lore.10=Increasing the concentration of graviton shards near the material processing regions of the Forge warps spacetime so significantly that it doubles the material input and processing possible. As the Forge’s capabilities increase, the amount of graviton shard data collected increases too, allowing for further expansion.
+fog.upgrade.lore.11=Using large quantities of graviton shards creates regions of space so extreme that exotic forms of matter can exist with far greater stability than usual. Unfortunately, this region is so extreme that it is essentially spatially disconnected from the rest of the Forge, unable to utilize existing upgrades to the structure and its other modules.
+fog.upgrade.lore.12=Graviton shards can further compress stellar fuel, increasing its ability to fuel the star at the centre of the Forge through higher energy fusion reactions than usually possible in a natural star. As a result, greater heat is produced, increasing processing efficiency of the Forge.
+fog.upgrade.lore.13=Increasing the concentration of graviton shards in the fuel chamber allows for a further increase in material processing capacity, so long as the Forge receives enough stellar fuel to maintain the unnaturally powerful state of the star.
+fog.upgrade.lore.14=Utilising the unique energy-manipulating properties of graviton shards, electricity can be more efficiently utilised within the Forge. This sort of improvement is not possible with conventional matter, but also would not be possible outside the extreme environments near the star in the Forge.
+fog.upgrade.lore.15=Similar to the Quantum Force Transformer, the quantum-mechanical properties of graviton shards facilitate the ability for the Forge to complete a complex series of nuclear fusion processes in a single event by directly manipulating the subatomic particles of the materials themselves.
+fog.upgrade.lore.16=Another instance of the entanglement-like effects of graviton shards, the simple Power Forge module now also exhibits the improvements made to the Melting Core module of the Forge. This allows for greater efficiency in both processing and allocation of the precious few graviton shards that can be obtained.
+fog.upgrade.lore.17=Typical smelting techniques become too inefficient at extreme temperatures. Graviton shards allow for new methods of processing that can better take advantage of the abundant heat available within the Forge, such as manipulating spacetime to better transfer heat to the processed materials than regular matter ever could.
+fog.upgrade.lore.18=As the heat available within the Forge continues to increase, it becomes possible for more material to be processed as it requires less proximity to the star’s surface. Graviton shards facilitate the manipulation of increased material quantities across larger regions of space within the Forge.
+fog.upgrade.lore.19=Continual improvements to energy storage density using graviton shards improves both the efficiency of the Forge and improvements to heat utilisation for processing. Reaching this threshold of energy density allows the extreme spacetime bending to transfer the heat of the star more directly to the processed materials, increasing the effectiveness of heat in the smelting process.
+fog.upgrade.lore.20=Normally increasing heat indefinitely has extreme diminishing returns when processing materials, but graviton shards allow for heat to more acutely affect input materials by manipulating them ever closer to the star at the centre of the Forge. At such levels of heat, the bonds between atoms are broken, allowing for the most quick and pure processing possible.
+fog.upgrade.lore.21=Using the entanglement-like properties of graviton shards, it is possible to utilize the increasingly extreme differences in spacetime between regions of the Forge to improve the processing capacity of the molten module. As space becomes more warped, more material can be moved closer to the star, increasing production capacity.
+fog.upgrade.lore.22=Returning to the first upgrade of the Forge with the myriad discoveries about the graviton shards allows it to run much faster than previously possible. As a result of excessive spacetime manipulation, greater heat and larger quantities of material paradoxically result in faster processing times as larger surface areas of the processed material are available to the Forge.
+fog.upgrade.lore.23=The stress of maintaining such a large structure around such a gravitationally dense object as a neutron star is alleviated through graviton shards. A larger Forge allows for more machinery and better electricity utilisation, effectively increasing processing capabilities.
+fog.upgrade.lore.24=Improvements in understanding of the gravitational containment effects of graviton shards allow the Forge to process and handle more exotic and unstable plasma. With this, a new age of fusion processing and power is possible.
+fog.upgrade.lore.25=Further utilisation of the quantum entanglement-like properties of graviton shards allows the effects of other module upgrades to also apply to the exotic module. However, because of the extreme nature of spacetime within this module and the materials it handles, these benefits are reduced as per the inverse square law.
+fog.upgrade.lore.26=As additional rings are placed closer to the star at the centre of the Forge, the gravitational stress drastically increases on the structure. Graviton shards alleviate these stresses and also allow for upgrades made in other similar modules to apply to the new ring’s modules through the use of localized spacetime bridges.
+fog.upgrade.lore.27=A huge development in the capabilities of the Forge has been achieved with the use of large quantities of graviton shards – the ability to indefinitely feed the star with stellar fuel. Obviously, this has diminishing returns but the processing potential is immense thanks to extreme gravitational distortion containing the star regardless of its energy level.
+fog.upgrade.lore.28=The usage of graviton shards in electrical systems to create localised miniature energy wormholes has allowed for such efficient power transfer that effectively unlimited electricity may be utilized by the Forge. More power means faster processing, quicker material movement, and better utilization of graviton shard related upgrades.
+fog.upgrade.lore.29=The final structural upgrade to the Forge required the most advanced understanding of graviton shards and their applications in extreme environments. With this, the last 4 module slots of the Forge of the Gods are available to construct, completing the single greatest structure in human history. The power of the sun in the palm of your hand.
+fog.upgrade.lore.30=*insert lore here* upgrade end
+
+fog.upgrade.text.0=Unlocks the base functionality of the Forge of the Gods, meaning 8 module slots, 1 ring and the Helioflare Power Forge module.
+fog.upgrade.text.1=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1 / (Heat^0.01)
+fog.upgrade.text.2=Increases fuel efficiency by multiplying the actual fuel consumption by 0.8
+fog.upgrade.text.3=Multiplies the maximum fuel consumption by 1.2
+fog.upgrade.text.4=Increases the base processing voltage of the multi by: Stellar Fuel Units/sec * 10^8 EU/t
+fog.upgrade.text.5=Unlocks the Helioflux Melting Core module.
+fog.upgrade.text.6=Unlocks a multiplier to maximum parallel based on fuel consumption rate. This bonus is calculated via this formula: Multiplier = 1 + (Stellar Fuel Units/sec) / 15
+fog.upgrade.text.7=Unlocks the Heliothermal Plasma Fabricator module and basic element -> plasma processing (1 step plasmas, T3 fusion maximum).
+fog.upgrade.text.8=Unlocks a configuration window for maximum battery size and increases the limit to max int. Furthermore, an energy discount multiplier is unlocked that scales with battery size (capped to 0.05, or 5%). The discount is calculated as follows: Discount = (1 - 1.05^(-0.05 * Max Battery Capacity)) / 20
+fog.upgrade.text.9=Increases maximum fuel consumption by 1 Stellar Fuel Unit/sec for every purchased upgrade.
+fog.upgrade.text.10=Adds a x2 multiplier to maximum parallel.
+fog.upgrade.text.11=Unlocks the Heliofusion Exoticizer module and quark gluon plasma creation. At this point this module is not affected by any other multipliers or bonuses from other upgrades.
+fog.upgrade.text.12=Improves the fuel consumption -> heat conversion formula. Improved formula: Heat = log1.2(Stellar Fuel Units/sec) * 1000 + 12601
+fog.upgrade.text.13=Improves the formula of N33 to: Multiplier = 1 + (Stellar Fuel Units/sec) / 5
+fog.upgrade.text.14=Improves the OC formula from 4/2 OCs to 4/2.3 OCs.
+fog.upgrade.text.15=Allows the Heliothermal Plasma Fabricator to process multi step plasmas. Tier restriction still applies.
+fog.upgrade.text.16=Allows the Helioflare Power Forge to receive the full benefits of the Helioflux Melting Core upgrade path.
+fog.upgrade.text.17=Increases the cap of EBF heat bonuses to 30,000K.
+fog.upgrade.text.18=Unlocks a multiplier to maximum parallel based on current heat. This bonus is calculated via this formula: Multiplier = 1 + Heat / 15000
+fog.upgrade.text.19=Improves the EBF energy reduction heat bonus from 5% to 8% and adds an energy discount based on the fill level of the internal battery. This bonus is calculated via this formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0,6) + 0,15
+fog.upgrade.text.20=EBF heat bonuses are granted above 30,000K, but the heat value used in heat bonus calculations is determined by this formula: Actual Heat = 30000 + (Current Heat - 30000)^0.85
+fog.upgrade.text.21=Unlocks a multiplier to maximum parallel based on total amount of purchased upgrades. This bonus is calculated via this formula: Multiplier = 1 + Upgrade Amount / 5
+fog.upgrade.text.22=Improves N11 based on current maximum parallel. Improved Formula: Multiplier = (1 / Heat^0.01) / (Parallel^0.02)
+fog.upgrade.text.23=Increases maximum processing voltage by 1 per active ring.
+fog.upgrade.text.24=Allows the Heliothermal Plasma Fabricator to process up to T5 plasmas.
+fog.upgrade.text.25=Allows the Heliofusion Exoticizer to be affected by other upgrade benefits, but those benefits are square rooted first. The overclock bonus is adjusted via the following formula: OC Factor = 2 + (Base OC Factor - 2)^2
+fog.upgrade.text.26=Allows construction of the second ring and adds 4 module slots.
+fog.upgrade.text.27=Uncaps maximum fuel consumption, but fuel consumption used in bonus calculations scales according to this formula: Actual FC = Current Max FC + (Current FC - Current Max FC)^0.75, where FC refers to fuel consumption and max FC refers to the max fuel consumption without this upgrade.
+fog.upgrade.text.28=Uncaps maximum processing voltage. Voltage can be set in each module's GUI.
+fog.upgrade.text.29=Allows construction of the third ring and adds 4 module slots.
+fog.upgrade.text.30=*insert text here* upgrade end
+
+fog.debug.resetbutton.text=Reset
+fog.debug.resetbutton.tooltip=Resets all upgrades to zero
+fog.debug.unlockall.text=Unlock all upgrades
+fog.debug.gravitonshardsetter.tooltip=Set the amount of availabe graviton shards
+
+fog.button.fuelconfig.tooltip=Fuel Configuration Menu
+fog.button.furnacemode.tooltip=Toggle Furnace Mode
+fog.button.magmattermode.tooltip.01=Toggle Magmatter Mode
+fog.button.magmattermode.tooltip.02=Magmatter Mode locked, missing upgrade
+fog.button.battery.tooltip.01=Toggle Battery Charging
+fog.button.battery.tooltip.02=Right click to open configuration menu (if unlocked)
+fog.button.voltageconfig.tooltip.01=Open voltage config
+fog.button.voltageconfig.tooltip.02=Voltage config locked, missing upgrade
+fog.button.structurecheck.tooltip=Refresh module connection status
+fog.button.milestones.tooltip=Milestone Overview
+
+
+achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods
+achievement.gt.godforgecasing.0=Singularity Reinforced Stellar Shielding Casing
+achievement.gt.godforgecasing.1=Celestial Matter Guidance Casing
+achievement.gt.godforgecasing.2=Boundless Gravitationally Severed Structure Casing
+achievement.gt.godforgecasing.3=Transcendentally Amplified Magnetic Confinement Casing
+achievement.gt.godforgecasing.4=Stellar Energy Siphon Casing
+achievement.gt.godforgecasing.5=Remote Graviton Flow Modulator
+achievement.gt.godforgecasing.6=Medial Graviton Flow Modulator
+achievement.gt.godforgecasing.7=Central Graviton Flow Modulator
+
+gt.blockmachines.multimachine.FOG.parallel=Parallel
+gt.blockmachines.multimachine.FOG.batch=Batch Size
+gt.blockmachines.multimachine.FOG.fuelconsumption=Stellar Fuel Consumption Factor
+gt.blockmachines.multimachine.FOG.fuelinfo.0=The Stellar Fuel Consumption Factor is the main determining factor in calculating the total stellar fuel consumption per second. Each fuel type has different scaling, which is as follows:
+gt.blockmachines.multimachine.FOG.fuelinfo.1=Dimensionally Transcendent Residue: factor*300*1.15^factor
+gt.blockmachines.multimachine.FOG.fuelinfo.2=Condensed Raw Stellar Plasma Mixture: factor*2*1.08^factor
+gt.blockmachines.multimachine.FOG.fuelinfo.3=Magnetohydrodynamically Constrained Star Matter: factor/25
+gt.blockmachines.multimachine.FOG.fuelinfo.4=Upgrades can influence these formulas, the changes are listed in the respective upgrades' descriptions.
+gt.blockmachines.multimachine.FOG.fueltype=Click to Select Fuel Type
+gt.blockmachines.multimachine.FOG.fuelusage=Fuel Usage
+gt.blockmachines.multimachine.FOG.plasmamultistep=Multi-Step plasma
+gt.blockmachines.multimachine.FOG.plasmarecipetier=Fusion Tier
+gt.blockmachines.multimachine.FOG.storedfuel=Stored fuel amount:
+gt.blockmachines.multimachine.FOG.storedstartupfuel=Star Fuel amount:
+gt.blockmachines.multimachine.FOG.batteryinfo=Set battery size
+gt.blockmachines.multimachine.FOG.shardcost=Graviton Shard cost:
+gt.blockmachines.multimachine.FOG.availableshards=Available Graviton Shards:
+gt.blockmachines.multimachine.FOG.modulestatus=Status:
+gt.blockmachines.multimachine.FOG.modulestatus.true=Connected
+gt.blockmachines.multimachine.FOG.modulestatus.false=Disconnected
+gt.blockmachines.multimachine.FOG.voltageinfo=Set processing voltage
+gt.blockmachines.multimachine.FOG.totalprogress=Total Progress
+gt.blockmachines.multimachine.FOG.milestoneprogress=Current Milestone Level
+gt.blockmachines.multimachine.FOG.progress=Next Milestone at
+gt.blockmachines.multimachine.FOG.milestonecomplete=Milestone Complete
+gt.blockmachines.multimachine.FOG.milestoneinfo=View Milestone Progress
+gt.blockmachines.multimachine.FOG.inversion=Inversion Active
+gt.blockmachines.multimachine.FOG.powermilestone=Charge
+gt.blockmachines.multimachine.FOG.recipemilestone=Conversion
+gt.blockmachines.multimachine.FOG.fuelmilestone=Catalyst
+gt.blockmachines.multimachine.FOG.purchasablemilestone=Composition
+gt.blockmachines.multimachine.FOG.power=EU Consumed
+gt.blockmachines.multimachine.FOG.recipes=Recipes Processed
+gt.blockmachines.multimachine.FOG.fuel=Fuel Units Consumed
+gt.blockmachines.multimachine.FOG.extensions=Extensions Built
+gt.blockmachines.multimachine.FOG.shardgain=Graviton Shards gained
+
+# Optical Circuits
+achievement.gt.metaitem.03.32155=Optical Assembly
+achievement.gt.metaitem.03.32156=Optical Computer
+achievement.gt.metaitem.03.32157=Optical Mainframe
+
+# Parts
+achievement.gt.metaitem.01.32017=Electric Motor UIV
+achievement.gt.metaitem.01.32021=Electric Piston UIV
+achievement.gt.metaitem.01.32025=Electric Pump UIV
+achievement.gt.metaitem.01.32029=Conveyor Module UIV
+achievement.gt.metaitem.01.32033=Robot Arm UIV
+achievement.gt.metaitem.01.32037=Emitter UIV
+achievement.gt.metaitem.01.32041=Sensor UIV
+achievement.gt.metaitem.01.32045=Field Generator UIV
+
+achievement.gt.metaitem.01.32018=Electric Motor UMV
+achievement.gt.metaitem.01.32022=Electric Piston UMV
+achievement.gt.metaitem.01.32026=Electric Pump UMV
+achievement.gt.metaitem.01.32030=Conveyor Module UMV
+achievement.gt.metaitem.01.32034=Robot Arm UMV
+achievement.gt.metaitem.01.32038=Emitter UMV
+achievement.gt.metaitem.01.32042=Sensor UMV
+achievement.gt.metaitem.01.32046=Field Generator UMV
+
+#Pipes
+gt.blockmachines.pipe.elementalmatter.name=Quantum "Tunnel"
+gt.blockmachines.pipe.elementalmatter.desc.0=Quantum tunneling device.
+gt.blockmachines.pipe.elementalmatter.desc.1=Not a portal!!!
+gt.blockmachines.pipe.elementalmatter.desc.2=Must be painted to work
+gt.blockmachines.pipe.elementalmatter.desc.3=Do not cross, split or turn
+
+gt.blockmachines.pipe.energystream.name=Laser Vacuum Pipe
+gt.blockmachines.pipe.energystream.desc.0=Laser tunneling device.
+gt.blockmachines.pipe.energystream.desc.1=Bright Vacuum!!!
+gt.blockmachines.pipe.energystream.desc.2=Must be painted to work
+gt.blockmachines.pipe.energystream.desc.3=Do not split or turn
+
+gt.blockmachines.pipe.datastream.name=Optical Fiber Cable
+gt.blockmachines.pipe.datastream.desc.0=Advanced data transmission
+gt.blockmachines.pipe.datastream.desc.1=Don't stare at the beam!
+gt.blockmachines.pipe.datastream.desc.2=Must be painted to work
+gt.blockmachines.pipe.datastream.desc.3=Do not cross or split
+
+gt.blockmachines.pipe.desc.4=Explosion proof
+
+#Single blocks
+gt.blockmachines.machine.tt.ownerdetector.name=Owner detector
+gt.blockmachines.machine.tt.ownerdetector.desc.0=Screwdrive to change mode
+gt.blockmachines.machine.tt.ownerdetector.desc.1=Looks for his pa
+gt.blockmachines.machine.tt.ownerdetector.desc.2=Emits signal when happy
+
+gt.blockmachines.machine.tt.datareader.name=Data Reader
+gt.blockmachines.machine.tt.datareader.desc.0=Reads Data Sticks and Orbs
+gt.blockmachines.machine.tt.datareader.desc.1=Power it up and
+gt.blockmachines.machine.tt.datareader.desc.2=Put the data storage in
+
+gt.blockmachines.machine.tt.buck.05.name=Insane Buck Converter
+gt.blockmachines.machine.tt.buck.06.name=Ludicrous Buck Converter
+gt.blockmachines.machine.tt.buck.07.name=ZPM Voltage Buck Converter
+gt.blockmachines.machine.tt.buck.08.name=Ultimate Power Buck Converter
+gt.blockmachines.machine.tt.buck.09.name=Highly Ultimate Buck Converter
+gt.blockmachines.machine.tt.buck.10.name=Extremely Ultimate Buck Converter
+gt.blockmachines.machine.tt.buck.11.name=Insanely Ultimate Buck Converter
+gt.blockmachines.machine.tt.buck.12.name=Mega Ultimate Buck Converter
+gt.blockmachines.machine.tt.buck.13.name=Extended Mega Ultimate Buck Converter
+gt.blockmachines.machine.tt.buck.desc.0=Electronic voltage regulator
+gt.blockmachines.machine.tt.buck.desc.1=Adjustable step down transformer
+gt.blockmachines.machine.tt.buck.desc.2=Switching power supply...
+
+gt.blockmachines.machine.tt.tesla.01.name=Basic Tesla Transceiver
+gt.blockmachines.machine.tt.tesla.02.name=Advanced Tesla Transceiver
+gt.blockmachines.machine.tt.tesla.03.name=Epyc Tesla Transceiver
+gt.blockmachines.machine.tt.tesla.04.name=Ultimate Power Tesla Transceiver
+gt.blockmachines.machine.tt.tesla.05.name=Insane Tesla Transceiver
+gt.blockmachines.machine.tt.tesla.desc.0=Your Tesla I/O machine of choice
+gt.blockmachines.machine.tt.tesla.desc.1=Lightning stoves for the rich
+
+#Debug blocks
+gt.blockmachines.debug.tt.pollutor.name=Debug Pollution Generator
+gt.blockmachines.debug.tt.pollutor.desc.0=Shit genny broke!
+gt.blockmachines.debug.tt.pollutor.desc.1=Infinite Producer/Consumer
+gt.blockmachines.debug.tt.pollutor.desc.2=Since i wanted one?
+gt.blockmachines.debug.tt.data.name=Debug Data Hatch
+gt.blockmachines.debug.tt.data.desc.0=Quantum Data Output
+gt.blockmachines.debug.tt.data.desc.1=High speed fibre optics connector.
+gt.blockmachines.debug.tt.data.desc.2=Must be painted to work
+gt.blockmachines.debug.tt.maintenance.name=Auto-Taping Maintenance Hatch
+gt.blockmachines.debug.tt.maintenance.desc.0=For automatically maintaining Multiblocks
+gt.blockmachines.debug.tt.maintenance.desc.1=Does fix everything but itself.
+gt.blockmachines.debug.tt.maintenance.desc.2=Fixing is for plebs!
+gt.blockmachines.debug.tt.genny.name=Debug Power Generator
+gt.blockmachines.debug.tt.genny.desc.0=Power from nothing
+gt.blockmachines.debug.tt.genny.desc.1=Infinite Producer/Consumer
+gt.blockmachines.debug.tt.genny.desc.2=Since i wanted one...
+gt.blockmachines.debug.tt.genny.desc.3=Change it to Laser mode with a screwdriver.
+gt.blockmachines.debug.tt.writer.name=Debug Structure Writer
+gt.blockmachines.debug.tt.writer.desc.0=Scans Blocks Around
+gt.blockmachines.debug.tt.writer.desc.1=Prints Multiblock NonTE structure check code
+gt.blockmachines.debug.tt.writer.desc.2=ABC axises aligned to machine front
+gt.blockmachines.debug.tt.certain.desc.0=Feeling certain, for sure
+gt.blockmachines.debug.tt.certain.desc.1=Schrödinger's cat escaped the box
+
+GT5U.gui.text.computing=§aComputing
+GT5U.gui.text.providing_data=§aProviding Data
+GT5U.gui.text.routing=§aRouting
+GT5U.gui.text.researching=§aResearching
+GT5U.gui.text.wrongRequirements=§7Incorrect scanning item
+GT5U.gui.text.scanning=§aScanning
+GT5U.gui.text.charging=§aCharging
+GT5U.gui.text.microwaving=§aMicrowaving
+GT5U.gui.text.no_routing=§7Can't route
+GT5U.gui.text.invalid_timer=§7Invalid timer
+GT5U.gui.text.no_research_item=§7No valid item to research
+GT5U.gui.text.no_chargeable_item=§7No chargeable item
+GT5U.gui.text.no_computing=§7Can't compute
+GT5U.gui.text.no_data=§7Can't output data
+GT5U.gui.text.no_planet_block=§7Missing planet block
+GT5U.gui.text.no_helium=§7Not enough Helium
+GT5U.gui.text.no_hydrogen=§7Not enough Hydrogen
+GT5U.gui.text.no_stellar_plasma=§7Not enough Stellar Plasma
+GT5U.gui.text.invalid_hysteresis=§7Invalid hysteresis settings
+GT5U.gui.text.invalid_transfer_radius=§7Invalid transfer radius settings
+GT5U.gui.text.invalid_voltage_setting=§7Invalid voltage setting
+GT5U.gui.text.invalid_current_setting=§7Invalid current setting
+GT5U.gui.text.invalid_time_setting=§7Invalid time setting
+GT5U.gui.text.invalid_overdrive_setting=§7Invalid overdrive setting
+GT5U.gui.text.insufficient_power_no_val=§7Insufficient power
+GT5U.gui.text.missing_upgrades=§7Missing upgrades
+GT5U.gui.text.waiting_for_inputs=§7Waiting for inputs
+GT5U.gui.text.computation_loss=§4Shut down due to computation loss.
+
+# RecipeMaps
+gt.recipe.eyeofharmony=Eye of Harmony
+gt.recipe.researchStation=Research Station
+gt.recipe.fog_plasma=Heliothermal Plasma Fabricator
+gt.recipe.fog_exotic=Heliofusion Exoticizer
+
+
+# NEI
+tt.nei.eoh.total_items=Total Items: %s
+tt.nei.eoh.solid_mass=Percentage of Solid Mass: %s%%
+tt.nei.eoh.item_count=Item Count: %s
+tt.nei.research.max_eu=Max EU: %s EU
+tt.nei.research.computation=Computation: %s
+tt.nei.research.min_computation=Min Computation: %s /s
+
+#Keywords and phrases
+#Example: ID:3
+tt.keyword.ID=ID
+#Example: 32EU at 1A
+tt.keyword.at=at
+# Structure is too complex
+tt.keyword.Structure.StructureTooComplex=The structure is too complex!
+# Any X
+tt.keyword.Structure.AnyComputerCasing=Any Computer Casing
+tt.keyword.Structure.AnyHighPowerCasing=Any High Power Casing
+tt.keyword.Structure.AnyHighPowerCasing1D=Any High Power Casing with 1 dot
+tt.keyword.Structure.AnyHighPowerCasing2D=Any High Power Casing with 2 dots
+tt.keyword.Structure.AnyHighPowerCasingFront=Any High Power Casing on the front side
+tt.keyword.Structure.AnyTeslaBaseCasingOuter=Any outer Tesla Base Casing
+tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice=Any Computer Casing on the first or last slice
+tt.keyword.Structure.AnyComputerCasingBackMain=Any Computer Casing on the backside of the main body
+tt.keyword.Structure.AnyAdvComputerCasingExceptOuter=Any Advanced Computer Casing, except the outer ones
+tt.keyword.Structure.AnyMolecularCasing=Any Molecular Casing
+tt.keyword.Structure.AnyMolecularCasing2D=Any Molecular Casing with 2 dots
+tt.keyword.Structure.AnyMolecularCasing3D=Any Molecular Casing with 3 dots
+tt.keyword.Structure.AnyMolecularCasing4D=Any Molecular Casing with 4 dots
+tt.keyword.Structure.AnyOuterMolecularCasing3rd=Any outer Molecular Casing on the 3rd slice
+tt.keyword.Structure.AnyOuterMolecularCasing4th=Any outer Molecular Casing on the 4th slice
+tt.keyword.Structure.AnyOuterMolecularCasing3rd4th=Any outer Molecular Casing on the 3rd or 4th slice
+tt.keyword.Structure.AnyOuterCasingOnBottom=Any outer casing on the bottom layer
+# Optional
+tt.keyword.Structure.Optional=(optional)
+# Placement specification
+tt.keyword.Structure.FrontCenter=Front center
+tt.keyword.Structure.BackCenter=Back center
+tt.keyword.Structure.SideCenter=Side center
+tt.keyword.Structure.FrontCenter3rd=Front 3rd layer center
+tt.keyword.Structure.CenterPillar=Center of the front pillar
+tt.keyword.Structure.Center=Center
+# Additional structure components
+tt.keyword.Structure.DataAccessHatch=Data Access Hatch
+tt.keyword.Structure.ElementalOutput=Elemental Output Hatch
+tt.keyword.Structure.Elemental=Elemental Hatch
+tt.keyword.Structure.ElementalOverflow=Elemental Overflow Hatch
+tt.keyword.Structure.ElementalInput=Elemental Input Hatch
+tt.keyword.Structure.EssentiaStorage=Essentia Storage
+tt.keyword.Structure.DataConnector=Data Connector
+tt.keyword.Structure.SuperconductingCoilBlock=Superconducting Coil Block
+tt.keyword.Structure.StainlessSteelCasing=Stainless Steel Casing
+
+
+tt.keyphrase.Hint_Details=Hint Details
+
+#debug boom
+tt.keyword.BOOM=BOOM!
+tt.keyword.Destination=Destination
+tt.keyword.Weight=Weight
+tt.keyword.Source=Source
+tt.keyword.Progress=Progress
+tt.keyword.Computation=Computation
+#Problemns as in maintanance issues
+tt.keyword.Problems=Problems
+tt.keyword.Efficiency=Efficiency
+#Button that allows to pass power to other machines
+tt.keyword.PowerPass=PowerPass
+#Button that vents EM
+tt.keyword.SafeVoid=SafeVoid
+tt.keyword.Parametrizer=Parametrizer
+tt.keyword.Value=Value
+tt.keyword.Input=Input
+tt.keyword.input=input
+tt.keyword.output=output
+tt.keyword.Status=Status
+tt.keyword.Content=Content
+tt.keyword.PacketHistory=PacketHistory
+
+#Used when 0 Elemental Matter Stacks
+tt.keyphrase.No_Stacks=No Stacks
+tt.keyphrase.Contains_EM=Contains EM
+tt.keyphrase.Contained_mass=Contained mass
+tt.keyphrase.Mass_Disposal_speed=Mass Disposal speed
+tt.keyphrase.Muffler_BOOM=Muffler BOOM!
+tt.keyphrase.Energy_Hatches=Energy Hatches
+tt.keyphrase.Probably_uses=Probably uses
+tt.keyphrase.Probably_makes=Probably makes
+tt.keyphrase.Tier_Rating=Tier Rating
+tt.keyphrase.Amp_Rating=Amp Rating
+tt.keyphrase.Computation_Available=Computation Available
+tt.keyphrase.Computation_Remaining=Computation Remaining
+tt.keyphrase.Content_Stack_Count=Content: Stack Count
+tt.keyphrase.Base_computation=Base computation
+tt.keyphrase.After_overclocking=After overclocking
+tt.keyphrase.Heat_Accumulated=Heat Accumulated
+tt.keyphrase.Running_interdimensional_scan=Running interdimensional scan
+tt.keyphrase.Running_local_dimension_scan=Running local dimension scan
+tt.keyphrase.Overdrive_disengaged=Overdrive disengaged
+tt.keyphrase.Overdrive_engaged=Overdrive engaged
+tt.keyphrase.Hysteresis_high_set_to=Hysteresis high set to
+tt.keyphrase.Hysteresis_low_set_to=Hysteresis low set to
+tt.keyphrase.Tesla_radius_set_to=Tesla radius set to
+tt.keyphrase.Sending_power=Sending power
+tt.keyphrase.Receiving_power=Receiving power
+tt.keyphrase.Stored_energy=Stored energy
+tt.keyphrase.Stored_EU=Stored EU
+tt.keyphrase.Average_IO=Average I/O
+tt.keyphrase.Average_IO_(max)=Voltage I/O (max)
+tt.keyphrase.Average_IO_max=Voltage I/O max
+tt.keyphrase.Amperage_IO_(max)=Amperage I/O (max)
+tt.keyphrase.Side_capabilities=Side capabilities
+tt.keyphrase.Ass_line_recipe=Assembly Line Recipe
+
+#OpenTurrets compatibility
+tile.turretHeadEM.name=Elemental Matter Turret
+tile.turretBaseEM.name=Elemental Turret Base
+
+#EM scan result
+tt.keyword.scan.depth=Depth
+tt.keyword.scan.class=Class
+tt.keyword.scan.name=Name
+tt.keyword.scan.symbol=Symbol
+
+tt.keyword.scan.mass=Mass
+tt.keyword.scan.count=Count
+tt.keyword.scan.amount=Amount
+tt.keyword.scan.energy=Energy
+tt.keyword.scan.energyLevel=Energy Level
+tt.keyword.scan.charge=Charge
+tt.keyword.scan.life_mult=Life multiplier
+tt.keyword.scan.half_life=Half life
+tt.keyword.scan.life_time=Life time
+tt.keyword.scan.age=Age
+tt.keyphrase.scan.at_current_energy_level=At current energy level
+tt.keyword.scan.color=Colorless
+tt.keyword.scan.colorless=Colorless
+tt.keyword.scan.colored=Colored
+
+tt.keyword.short.mass=M
+tt.keyword.short.count=Qty
+tt.keyword.short.amount=Qty
+tt.keyword.short.energy=E
+tt.keyword.short.energyLevel=EL
+tt.keyword.short.charge=C
+tt.keyword.short.time=T
+
+tt.keyword.unit.mass=eV/c²
+tt.keyword.unit.massFlux=eV/c²s
+tt.keyword.unit.count=
+tt.keyword.unit.mol=mol
+tt.keyword.unit.itemMols=item(s)
+tt.keyword.unit.mbMols=mb
+tt.keyword.unit.energy=eV
+tt.keyword.unit.charge=e
+tt.keyword.unit.time=s
+tt.keyword.unit.tick=t
+#that the thing wont decay
+tt.keyword.stable=STABLE
+
+#EM types
+tt.keyword.Primitive=Primitive
+tt.keyword.Element=Element
+tt.keyword.Atom=Atom
+tt.keyword.Isotope=Isotope
+tt.keyword.Boson=Boson
+tt.keyword.Fermion=Fermion
+tt.keyword.GaugeBoson=Gauge boson
+tt.keyword.Meson=Meson
+tt.keyword.Baryon=Baryon
+tt.keyword.Tetraquark=Tetraquark
+tt.keyword.Pentaquark=Pentaquark
+tt.keyword.Hexaquark=Hexaquark
+tt.keyword.Hadron=Hadron
+tt.keyword.Neutrino=Neutrino
+tt.keyword.Quark=Quark
+tt.keyword.ScalarBoson=Scalar boson
+#em definitions
+tt.keyword.PrimitiveNBTERROR=NBT ERROR
+tt.keyword.PrimitiveNULLPOINTER=NULL POINTER
+tt.keyword.PrimitiveSpace=Space
+tt.keyword.PrimitivePresence=Presence
+tt.keyword.PrimitiveMass=Mass
+tt.keyword.PrimitiveDarkMass=DarkMass
+tt.keyword.PrimitiveEnergy=Energy
+tt.keyword.PrimitiveDarkEnergy=DarkEnergy
+tt.keyword.PrimitiveMagic=Magic
+tt.keyword.PrimitiveAntimagic=Antimagic
+tt.keyword.Gluon=Gluon
+tt.keyword.Photon=Photon
+tt.keyword.Weak0=Weak
+tt.keyword.WeakPlus=Weak+
+tt.keyword.WeakMinus=Weak-
+tt.keyword.Proton=Proton
+tt.keyword.AntiProton=Antiproton
+tt.keyword.Neutron=Neutron
+tt.keyword.AntiNeutron=Antineutron
+tt.keyword.Lepton=Lepton
+tt.keyword.Electron=Electron
+tt.keyword.Muon=Muon
+tt.keyword.Tauon=Tauon
+tt.keyword.Positron=Positron
+tt.keyword.Antimuon=Antimuon
+tt.keyword.Antitauon=Antitauon
+tt.keyword.ElectronNeutrino=Electron neutrino
+tt.keyword.MuonNeutrino=Muon neutrino
+tt.keyword.TauonNeutrino=Tauon neutrino
+tt.keyword.PositronNeutrino=Positron neutrino
+tt.keyword.AntimuonNeutrino=Antimuon neutrino
+tt.keyword.AntitauonNeutrino=Antitauon neutrino
+tt.keyword.QuarkUp=Up
+tt.keyword.QuarkCharm=Charm
+tt.keyword.QuarkTop=Top
+tt.keyword.QuarkDown=Down
+tt.keyword.QuarkStrange=Strange
+tt.keyword.QuarkBottom=Bottom
+tt.keyword.QuarkAntiUp=Antiup
+tt.keyword.QuarkAntiCharm=Anticharm
+tt.keyword.QuarkAntiTop=Antitop
+tt.keyword.QuarkAntiDown=Antidown
+tt.keyword.QuarkAntiStrange=Antistrange
+tt.keyword.QuarkAntiBottom=Antibottom
+tt.keyword.Higgs=Higgs
+#These are Thaumcraft aspects
+tt.keyword.Air=Air
+tt.keyword.Earth=Earth
+tt.keyword.Fire=Fire
+tt.keyword.Water=Water
+tt.keyword.Order=Order
+tt.keyword.Entropy=Entropy
+tt.keyword.Chaos=Chaos
+
+tt.keyword.Primal=Primal
+tt.keyword.Aspect=Aspect
+
+tt.element.Neutronium=Neutronium
+tt.element.Hydrogen=Hydrogen
+tt.element.Helium=Helium
+tt.element.Lithium=Lithium
+tt.element.Beryllium=Beryllium
+tt.element.Boron=Boron
+tt.element.Carbon=Carbon
+tt.element.Nitrogen=Nitrogen
+tt.element.Oxygen=Oxygen
+tt.element.Fluorine=Fluorine
+tt.element.Neon=Neon
+tt.element.Sodium=Sodium
+tt.element.Magnesium=Magnesium
+tt.element.Aluminium=Aluminium
+tt.element.Silicon=Silicon
+tt.element.Phosphorus=Phosphorus
+tt.element.Sulfur=Sulfur
+tt.element.Chlorine=Chlorine
+tt.element.Argon=Argon
+tt.element.Potassium=Potassium
+tt.element.Calcium=Calcium
+tt.element.Scandium=Scandium
+tt.element.Titanium=Titanium
+tt.element.Vanadium=Vanadium
+tt.element.Chromium=Chromium
+tt.element.Manganese=Manganese
+tt.element.Iron=Iron
+tt.element.Cobalt=Cobalt
+tt.element.Nickel=Nickel
+tt.element.Copper=Copper
+tt.element.Zinc=Zinc
+tt.element.Gallium=Gallium
+tt.element.Germanium=Germanium
+tt.element.Arsenic=Arsenic
+tt.element.Selenium=Selenium
+tt.element.Bromine=Bromine
+tt.element.Krypton=Krypton
+tt.element.Rubidium=Rubidium
+tt.element.Strontium=Strontium
+tt.element.Yttrium=Yttrium
+tt.element.Zirconium=Zirconium
+tt.element.Niobium=Niobium
+tt.element.Molybdenum=Molybdenum
+tt.element.Technetium=Technetium
+tt.element.Ruthenium=Ruthenium
+tt.element.Rhodium=Rhodium
+tt.element.Palladium=Palladium
+tt.element.Silver=Silver
+tt.element.Cadmium=Cadmium
+tt.element.Indium=Indium
+tt.element.Tin=Tin
+tt.element.Antimony=Antimony
+tt.element.Tellurium=Tellurium
+tt.element.Iodine=Iodine
+tt.element.Xenon=Xenon
+tt.element.Caesium=Caesium
+tt.element.Barium=Barium
+tt.element.Lanthanum=Lanthanum
+tt.element.Cerium=Cerium
+tt.element.Praseodymium=Praseodymium
+tt.element.Neodymium=Neodymium
+tt.element.Promethium=Promethium
+tt.element.Samarium=Samarium
+tt.element.Europium=Europium
+tt.element.Gadolinium=Gadolinium
+tt.element.Terbium=Terbium
+tt.element.Dysprosium=Dysprosium
+tt.element.Holmium=Holmium
+tt.element.Erbium=Erbium
+tt.element.Thulium=Thulium
+tt.element.Ytterbium=Ytterbium
+tt.element.Lutetium=Lutetium
+tt.element.Hafnium=Hafnium
+tt.element.Tantalum=Tantalum
+tt.element.Tungsten=Tungsten
+tt.element.Rhenium=Rhenium
+tt.element.Osmium=Osmium
+tt.element.Iridium=Iridium
+tt.element.Platinum=Platinum
+tt.element.Gold=Gold
+tt.element.Mercury=Mercury
+tt.element.Thallium=Thallium
+tt.element.Lead=Lead
+tt.element.Bismuth=Bismuth
+tt.element.Polonium=Polonium
+tt.element.Astatine=Astatine
+tt.element.Radon=Radon
+tt.element.Francium=Francium
+tt.element.Radium=Radium
+tt.element.Actinium=Actinium
+tt.element.Thorium=Thorium
+tt.element.Protactinium=Protactinium
+tt.element.Uranium=Uranium
+tt.element.Neptunium=Neptunium
+tt.element.Plutonium=Plutonium
+tt.element.Americium=Americium
+tt.element.Curium=Curium
+tt.element.Berkelium=Berkelium
+tt.element.Californium=Californium
+tt.element.Einsteinium=Einsteinium
+tt.element.Fermium=Fermium
+tt.element.Mendelevium=Mendelevium
+tt.element.Nobelium=Nobelium
+tt.element.Lawrencium=Lawrencium
+tt.element.Rutherfordium=Rutherfordium
+tt.element.Dubnium=Dubnium
+tt.element.Seaborgium=Seaborgium
+tt.element.Bohrium=Bohrium
+tt.element.Hassium=Hassium
+tt.element.Meitnerium=Meitnerium
+tt.element.Darmstadtium=Darmstadtium
+tt.element.Roentgenium=Roentgenium
+tt.element.Copernicium=Copernicium
+tt.element.Nihonium=Nihonium
+tt.element.Flerovium=Flerovium
+tt.element.Moscovium=Moscovium
+tt.element.Livermorium=Livermorium
+tt.element.Tennessine=Tennessine
+tt.element.Oganesson=Oganesson
+
+tt.element.AntiNeutronium=Antineutronium
+tt.element.AntiHydrogen=Antihydrogen
+tt.element.AntiHelium=Antihelium
+tt.element.AntiLithium=Antilithium
+tt.element.AntiBeryllium=Antiberyllium
+tt.element.AntiBoron=Antiboron
+tt.element.AntiCarbon=Anticarbon
+tt.element.AntiNitrogen=Antinitrogen
+tt.element.AntiOxygen=Antioxygen
+tt.element.AntiFluorine=Antifluorine
+tt.element.AntiNeon=Antineon
+tt.element.AntiSodium=Antisodium
+tt.element.AntiMagnesium=Antimagnesium
+tt.element.AntiAluminium=Antialuminium
+tt.element.AntiSilicon=Antisilicon
+tt.element.AntiPhosphorus=Antiphosphorus
+tt.element.AntiSulfur=Antisulfur
+tt.element.AntiChlorine=Antichlorine
+tt.element.AntiArgon=Antiargon
+tt.element.AntiPotassium=Antipotassium
+tt.element.AntiCalcium=Anticalcium
+tt.element.AntiScandium=Antiscandium
+tt.element.AntiTitanium=Antititanium
+tt.element.AntiVanadium=Antivanadium
+tt.element.AntiChromium=Antichromium
+tt.element.AntiManganese=Antimanganese
+tt.element.AntiIron=Antiiron
+tt.element.AntiCobalt=Anticobalt
+tt.element.AntiNickel=Antinickel
+tt.element.AntiCopper=Anticopper
+tt.element.AntiZinc=Antizinc
+tt.element.AntiGallium=Antigallium
+tt.element.AntiGermanium=Antigermanium
+tt.element.AntiArsenic=Antiarsenic
+tt.element.AntiSelenium=Antiselenium
+tt.element.AntiBromine=Antibromine
+tt.element.AntiKrypton=Antikrypton
+tt.element.AntiRubidium=Antirubidium
+tt.element.AntiStrontium=Antistrontium
+tt.element.AntiYttrium=Antiyttrium
+tt.element.AntiZirconium=Antizirconium
+tt.element.AntiNiobium=Antiniobium
+tt.element.AntiMolybdenum=Antimolybdenum
+tt.element.AntiTechnetium=Antitechnetium
+tt.element.AntiRuthenium=Antiruthenium
+tt.element.AntiRhodium=Antirhodium
+tt.element.AntiPalladium=Antipalladium
+tt.element.AntiSilver=Antisilver
+tt.element.AntiCadmium=Anticadmium
+tt.element.AntiIndium=Antiindium
+tt.element.AntiTin=Antitin
+tt.element.AntiAntimony=Antiantimony
+tt.element.AntiTellurium=Antitellurium
+tt.element.AntiIodine=Antiiodine
+tt.element.AntiXenon=Antixenon
+tt.element.AntiCaesium=Anticaesium
+tt.element.AntiBarium=Antibarium
+tt.element.AntiLanthanum=Antilanthanum
+tt.element.AntiCerium=Anticerium
+tt.element.AntiPraseodymium=Antipraseodymium
+tt.element.AntiNeodymium=Antineodymium
+tt.element.AntiPromethium=Antipromethium
+tt.element.AntiSamarium=Antisamarium
+tt.element.AntiEuropium=Antieuropium
+tt.element.AntiGadolinium=Antigadolinium
+tt.element.AntiTerbium=Antiterbium
+tt.element.AntiDysprosium=Antidysprosium
+tt.element.AntiHolmium=Antiholmium
+tt.element.AntiErbium=Antierbium
+tt.element.AntiThulium=Antithulium
+tt.element.AntiYtterbium=Antiytterbium
+tt.element.AntiLutetium=Antilutetium
+tt.element.AntiHafnium=Antihafnium
+tt.element.AntiTantalum=Antitantalum
+tt.element.AntiTungsten=Antitungsten
+tt.element.AntiRhenium=Antirhenium
+tt.element.AntiOsmium=Antiosmium
+tt.element.AntiIridium=Antiiridium
+tt.element.AntiPlatinum=Antiplatinum
+tt.element.AntiGold=Antigold
+tt.element.AntiMercury=Antimercury
+tt.element.AntiThallium=Antithallium
+tt.element.AntiLead=Antilead
+tt.element.AntiBismuth=Antibismuth
+tt.element.AntiPolonium=Antipolonium
+tt.element.AntiAstatine=Antiastatine
+tt.element.AntiRadon=Antiradon
+tt.element.AntiFrancium=Antifrancium
+tt.element.AntiRadium=Antiradium
+tt.element.AntiActinium=Antiactinium
+tt.element.AntiThorium=Antithorium
+tt.element.AntiProtactinium=Antiprotactinium
+tt.element.AntiUranium=Antiuranium
+tt.element.AntiNeptunium=Antineptunium
+tt.element.AntiPlutonium=Antiplutonium
+tt.element.AntiAmericium=Antiamericium
+tt.element.AntiCurium=Anticurium
+tt.element.AntiBerkelium=Antiberkelium
+tt.element.AntiCalifornium=Antibalifornium
+tt.element.AntiEinsteinium=Antieinsteinium
+tt.element.AntiFermium=Antifermium
+tt.element.AntiMendelevium=Antimendelevium
+tt.element.AntiNobelium=Antinobelium
+tt.element.AntiLawrencium=Antilawrencium
+tt.element.AntiRutherfordium=Antirutherfordium
+tt.element.AntiDubnium=Antidubnium
+tt.element.AntiSeaborgium=Antiseaborgium
+tt.element.AntiBohrium=Antibohrium
+tt.element.AntiHassium=Antihassium
+tt.element.AntiMeitnerium=Antimeitnerium
+tt.element.AntiDarmstadtium=Antidarmstadtium
+tt.element.AntiRoentgenium=Antiroentgenium
+tt.element.AntiCopernicium=Anticopernicium
+tt.element.AntiNihonium=Antinihonium
+tt.element.AntiFlerovium=Antiflerovium
+tt.element.AntiMoscovium=Antimoscovium
+tt.element.AntiLivermorium=Antilivermorium
+tt.element.AntiTennessine=Antitennessine
+tt.element.AntiOganesson=Antioganesson
+
+tt.IUPAC.n=nil
+tt.IUPAC.u=un
+tt.IUPAC.b=bi
+tt.IUPAC.t=tri
+tt.IUPAC.q=quad
+tt.IUPAC.p=pent
+tt.IUPAC.h=hex
+tt.IUPAC.s=sept
+tt.IUPAC.o=oct
+tt.IUPAC.e=enn
+tt.IUPAC.N=Nil
+tt.IUPAC.U=Un
+tt.IUPAC.B=Bi
+tt.IUPAC.T=Tri
+tt.IUPAC.Q=Quad
+tt.IUPAC.P=Pent
+tt.IUPAC.H=Hex
+tt.IUPAC.S=Sept
+tt.IUPAC.O=Oct
+tt.IUPAC.E=Enn
+tt.IUPAC.ium=ium
+tt.IUPAC.Anti=Anti
+tt.keyword.Weird=*
+
+tt.chat.debug.generator=Laser mode: %s
diff --git a/src/main/resources/assets/tectech/lang/zh_CN.lang b/src/main/resources/assets/tectech/lang/zh_CN.lang
new file mode 100644
index 0000000000..dd32b7a6ec
--- /dev/null
+++ b/src/main/resources/assets/tectech/lang/zh_CN.lang
@@ -0,0 +1,1296 @@
+#Creative Tab Name
+itemGroup.TecTech=TecTech
+itemGroup.EM=TecTech元物质
+
+#Blocks
+tile.quantumStuff.name=量子物质
+
+tile.quantumGlass.name=量子玻璃
+tile.quantumGlass.desc.0=致密但透明
+tile.quantumGlass.desc.1=玻璃&优雅(Glassy & Classy)
+
+tile.reactorSim.name=反应堆模拟器
+tile.reactorSim.desc.0=裂变反应不确定度解析器9001
+tile.reactorSim.desc.1=爆炸,但没有那么多...
+
+#Items
+item.em.programmer.name=AVR编程器
+item.em.programmer.desc.0=当前PC
+item.em.programmer.desc.1=唤醒
+item.em.programmer.desc.2=激活
+item.em.programmer.desc.3=Debug
+item.em.programmer.desc.4=延迟
+
+item.em.debugContainer.name=调试元物质容器
+item.em.debugContainer.desc.0=包含
+item.em.debugContainer.desc.1=元物质的容器
+item.em.debugContainer.desc.2=右键元物质仓室
+item.em.debugContainer.desc.3=---意外终止---
+
+item.em.definitionContainer.name=元物质配方提示
+item.em.definitionContainer.desc.0=需要包含
+item.em.definitionContainer.desc.1=配方提示
+item.em.definitionContainer.desc.2=---意外终止---
+
+item.em.definitionScanStorage.name=元物质容器扫描
+item.em.definitionScanStorage.desc.0=包含扫描结果
+item.em.definitionScanStorage.desc.1=用于阅读
+item.em.definitionScanStorage.desc.2=存储元物质扫描数据
+item.em.definitionScanStorage.desc.3=---意外终止---
+
+item.em.constructable.name=多方块机器蓝图
+item.em.constructable.desc.0=触发可构造界面
+item.em.constructable.desc.1=显示多方块结构全息投影,
+item.em.constructable.desc.2=请对多方块控制器使用.
+item.em.constructable.desc.3=(在创造模式下潜行右键可直接构造)
+item.em.constructable.desc.4=堆叠数量影响等级/模式/类型
+
+item.em.EuMeterGT.name=GT EU电表
+item.em.EuMeterGT.desc.0=测量EU相关的基本内容
+item.em.EuMeterGT.desc.1=只需右键方块.
+
+item.em.frontRotate.name=正面旋转扳手
+item.em.frontRotate.desc.0=触发正面旋转界面
+item.em.frontRotate.desc.1=可以旋转多方块控制器,
+item.em.frontRotate.desc.2=从而使整个结构可以旋转.
+
+item.em.parametrizerMemoryCard.name=数据化储存卡
+item.em.parametrizerMemoryCard.desc.0=存储参数
+item.em.parametrizerMemoryCard.desc.1=在参数仪/控制器上使用以对其进行配置
+item.em.parametrizerMemoryCard.desc.2=在参数仪上使用以存储参数
+item.em.parametrizerMemoryCard.desc.3=潜行右键以锁定/解锁
+
+item.tm.teslaCoilCapacitor.0.name=LV特斯拉电容
+item.tm.teslaCoilCapacitor.1.name=MV特斯拉电容
+item.tm.teslaCoilCapacitor.2.name=HV特斯拉电容
+item.tm.teslaCoilCapacitor.3.name=EV特斯拉电容
+item.tm.teslaCoilCapacitor.4.name=IV特斯拉电容
+item.tm.teslaCoilCapacitor.5.name=LuV特斯拉电容
+item.tm.teslaCoilCapacitor.6.name=ZPM特斯拉电容
+item.tm.teslaCoilCapacitor.desc.0=存储量:
+item.tm.teslaCoilCapacitor.desc.1=EU;充能速度:
+item.tm.teslaCoilCapacitor.desc.2=把这个破碎的东西浸入某种辛辣的水中!
+item.tm.teslaCoilCapacitor.desc.3=插入特斯拉电塔的电容仓中
+item.tm.teslaCoilCapacitor.desc.4=电容器就像电池一样,对吗?
+
+item.tm.itemTeslaComponent.0.name=琥珀金特斯拉绕组
+item.tm.itemTeslaComponent.1.name=超导特斯拉绕组
+item.tm.itemTeslaComponent.desc=特斯拉需要这些!
+
+item.tm.teslaCover.0.name=特斯拉线圈帽
+item.tm.teslaCover.1.name=豪华特斯拉线圈帽
+item.tm.teslaCover.desc.0=特斯拉使能机器!
+item.tm.teslaCover.desc.1=特斯拉使能机器! (但非常吵!!)
+item.tm.teslaCover.desc.2=把这个破碎的东西浸入某种辛辣的水中!
+item.tm.teslaCover.desc.3=对机器顶部右键使用,启用机器的特斯拉供电功能
+item.tm.teslaCover.desc.4=到底谁在用电缆?
+
+item.tm.teslaStaff.name=特斯拉权杖
+item.tm.teslaStaff.desc=狂妄之人窃取了众神的权柄!
+
+item.tm.enderfluidlinkcover.name=末影流体覆盖板
+item.tm.enderfluidlinkcover.desc.0=在机器间无线传输流体!
+item.tm.enderfluidlinkcover.desc.1=可贴在储罐/机器/管道的任意面以将其与末影相连
+item.tm.enderfluidlinkcover.desc.2=末影储罐太逊了! -来自Chads-of-NH的Bot
+
+item.tm.powerpassupgradecover.name=导能升级覆盖板
+item.tm.powerpassupgradecover.desc.0=为TecTech多方块机器添加导能功能
+item.tm.powerpassupgradecover.desc.1=罐中的有源变压器??
+item.tm.powerpassupgradecover.desc.2=将它们像圣诞彩灯一样串起来!
+
+#Death Messages
+death.attack.microwaving=%1$s被辐射脱水。
+death.attack.microwaving.player=%1$s在与%2$s的战斗中被辐射脱水。
+death.attack.elementalPollution=%1$s在错误的空洞中被汽化。
+death.attack.elementalPollution.player=%1$s在与%2$s的战斗中被错误的空洞汽化。
+death.attack.subspace=%1$s受到了降维打击。
+death.attack.subspace.player=%1$s在与%2$s的战斗中受到了降维打击。
+
+#Machine hulls
+gt.blockmachines.hull.tier.10.name=UEV机器外壳
+gt.blockmachines.hull.tier.11.name=UIV机器外壳
+gt.blockmachines.hull.tier.12.name=UMV机器外壳
+gt.blockmachines.hull.tier.13.name=UXV机器外壳
+gt.blockmachines.hull.tier.14.name=MAX机器外壳
+
+#Transformers
+gt.blockmachines.wetransformer.tier.00.name=ULV高能变压器
+gt.blockmachines.wetransformer.tier.00.desc=LV -> ULV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.01.name=LV高能变压器
+gt.blockmachines.wetransformer.tier.01.desc=MV -> LV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.02.name=MV高能变压器
+gt.blockmachines.wetransformer.tier.02.desc=HV -> MV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.03.name=HV高能变压器
+gt.blockmachines.wetransformer.tier.03.desc=EV -> HV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.04.name=EV高能变压器
+gt.blockmachines.wetransformer.tier.04.desc=IV -> EV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.05.name=IV高能变压器
+gt.blockmachines.wetransformer.tier.05.desc=LuV -> IV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.06.name=LuV高能变压器
+gt.blockmachines.wetransformer.tier.06.desc=ZPM -> LuV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.07.name=ZPM高能变压器
+gt.blockmachines.wetransformer.tier.07.desc=UV -> ZPM (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.08.name=UV高能变压器
+gt.blockmachines.wetransformer.tier.08.desc=UHV -> UV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.09.name=UHV高能变压器
+gt.blockmachines.wetransformer.tier.09.desc=UEV -> UHV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.10.name=UEV高能变压器
+gt.blockmachines.wetransformer.tier.10.desc=UIV -> UEV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.11.name=UIV高能变压器
+gt.blockmachines.wetransformer.tier.11.desc=UMV -> UIV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.12.name=UMV高能变压器
+gt.blockmachines.wetransformer.tier.12.desc=UXV -> UMV (用软锤右击以反转)
+gt.blockmachines.wetransformer.tier.13.name=UXV高能变压器
+gt.blockmachines.wetransformer.tier.13.desc=MAX -> UXV (用软锤右击以反转)
+
+gt.blockmachines.tt.transformer.tier.09.name=UHV变压器
+gt.blockmachines.tt.transformer.tier.09.desc=UEV -> UHV (用软锤右击以反转)
+gt.blockmachines.tt.transformer.tier.10.name=UEV变压器
+gt.blockmachines.tt.transformer.tier.10.desc=UIV -> UEV (用软锤右击以反转)
+gt.blockmachines.tt.transformer.tier.11.name=UIV变压器
+gt.blockmachines.tt.transformer.tier.11.desc=UMV -> UIV (用软锤右击以反转)
+gt.blockmachines.tt.transformer.tier.12.name=UMV变压器
+gt.blockmachines.tt.transformer.tier.12.desc=UXV -> UMV (用软锤右击以反转)
+gt.blockmachines.tt.transformer.tier.13.name=UXV变压器
+gt.blockmachines.tt.transformer.tier.13.desc=MAX -> UXV (用软锤右击以反转)
+
+gt.blockmachines.transformer.ha.tier.09.name=UHV高电流变压器
+gt.blockmachines.transformer.ha.tier.09.desc=UEV -> UHV (用软锤右击以反转
+gt.blockmachines.transformer.ha.tier.10.name=UEV高电流变压器
+gt.blockmachines.transformer.ha.tier.10.desc=UIV -> UEV (用软锤右击以反转)
+gt.blockmachines.transformer.ha.tier.11.name=UIV高电流变压器
+gt.blockmachines.transformer.ha.tier.11.desc=UMV -> UIV (用软锤右击以反转)
+gt.blockmachines.transformer.ha.tier.12.name=UMV高电流变压器
+gt.blockmachines.transformer.ha.tier.12.desc=UXV -> UMV (用软锤右击以反转)
+gt.blockmachines.transformer.ha.tier.13.name=UXV高电流变压器
+gt.blockmachines.transformer.ha.tier.13.desc=MAX -> UXV (用软锤右击以反转)
+
+#Hatches
+tt.base.emhatch.desc.0=最大元物质组数:
+tt.base.emhatch.desc.1=最大容量:
+tt.base.emhatch.desc.2=在这个仓室不处于多方块结构
+tt.base.emhatch.desc.3=中时,在后侧、上侧或下侧放
+tt.base.emhatch.desc.4=置溢流仓以提供过载保护。
+tt.base.emhatch.desc.5=使用量子隧道时,传输距离
+tt.base.emhatch.desc.6=可以沿直线拓展至最多15格
+tt.base.emhatch.desc.7=启用前必须涂色
+
+gt.blockmachines.hatch.emmuffler.tier.08.name=UV溢流仓
+gt.blockmachines.hatch.emmuffler.tier.09.name=UHV溢流仓
+gt.blockmachines.hatch.emmuffler.tier.10.name=UEV溢流仓
+gt.blockmachines.hatch.emmuffler.tier.11.name=UIV溢流仓
+gt.blockmachines.hatch.emmuffler.tier.12.name=UMV溢流仓
+gt.blockmachines.hatch.emmuffler.tier.13.name=UXV溢流仓
+gt.blockmachines.hatch.emmuffler.desc.0=清理过剩的元物质
+gt.blockmachines.hatch.emmuffler.desc.1=物质缓存
+gt.blockmachines.hatch.emmuffler.desc.2=清理速度
+gt.blockmachines.hatch.emmuffler.desc.3=请勿阻塞输出!
+
+gt.blockmachines.hatch.energymulti04.tier.05.name=4安IV能源仓
+gt.blockmachines.hatch.energymulti16.tier.05.name=16安IV能源仓
+gt.blockmachines.hatch.energymulti64.tier.05.name=64安IV能源仓
+gt.blockmachines.hatch.energymulti04.tier.06.name=4安LuV能源仓
+gt.blockmachines.hatch.energymulti16.tier.06.name=16安LuV能源仓
+gt.blockmachines.hatch.energymulti64.tier.06.name=64安LuV能源仓
+gt.blockmachines.hatch.energymulti04.tier.07.name=4安ZPM能源仓
+gt.blockmachines.hatch.energymulti16.tier.07.name=16安ZPM能源仓
+gt.blockmachines.hatch.energymulti64.tier.07.name=64安ZPM能源仓
+gt.blockmachines.hatch.energymulti04.tier.08.name=4安UV能源仓
+gt.blockmachines.hatch.energymulti16.tier.08.name=16安UV能源仓
+gt.blockmachines.hatch.energymulti64.tier.08.name=64安UV能源仓
+gt.blockmachines.hatch.energymulti04.tier.09.name=4安UHV能源仓
+gt.blockmachines.hatch.energymulti16.tier.09.name=16安UHV能源仓
+gt.blockmachines.hatch.energymulti64.tier.09.name=64安UHV能源仓
+gt.blockmachines.hatch.energymulti04.tier.10.name=4安UEV能源仓
+gt.blockmachines.hatch.energymulti16.tier.10.name=16安UEV能源仓
+gt.blockmachines.hatch.energymulti64.tier.10.name=64安UEV能源仓
+gt.blockmachines.hatch.energymulti04.tier.11.name=4安UIV能源仓
+gt.blockmachines.hatch.energymulti16.tier.11.name=16安UIV能源仓
+gt.blockmachines.hatch.energymulti64.tier.11.name=64安UIV能源仓
+gt.blockmachines.hatch.energymulti04.tier.12.name=4安UMV能源仓
+gt.blockmachines.hatch.energymulti16.tier.12.name=16安UMV能源仓
+gt.blockmachines.hatch.energymulti64.tier.12.name=64安UMV能源仓
+gt.blockmachines.hatch.energymulti04.tier.13.name=4安UXV能源仓
+gt.blockmachines.hatch.energymulti16.tier.13.name=16安UXV能源仓
+gt.blockmachines.hatch.energymulti64.tier.13.name=64安UXV能源仓
+gt.blockmachines.hatch.energymulti.desc.0=为多方块机器以高电流输入能源
+gt.blockmachines.hatch.energymulti.desc.1=输入电流
+
+gt.blockmachines.hatch.energytunnel1.tier.05.name=IV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.05.name=IV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.05.name=IV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.05.name=IV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.05.name=IV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.05.name=IV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.05.name=IV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.06.name=LuV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.06.name=LuV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.06.name=LuV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.06.name=LuV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.06.name=LuV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.06.name=LuV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.06.name=LuV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.07.name=ZPM 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.07.name=ZPM 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.07.name=ZPM 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.07.name=ZPM 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.07.name=ZPM 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.07.name=ZPM 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.07.name=ZPM 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.08.name=UV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.08.name=UV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.08.name=UV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.08.name=UV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.08.name=UV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.08.name=UV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.08.name=UV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.09.name=UHV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.09.name=UHV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.09.name=UHV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.09.name=UHV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.09.name=UHV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.09.name=UHV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.09.name=UHV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.10.name=UEV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.10.name=UEV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.10.name=UEV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.10.name=UEV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.10.name=UEV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.10.name=UEV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.10.name=UEV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.11.name=UIV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.11.name=UIV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.11.name=UIV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.11.name=UIV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.11.name=UIV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.11.name=UIV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.11.name=UIV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.12.name=UMV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.12.name=UMV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.12.name=UMV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.12.name=UMV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.12.name=UMV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.12.name=UMV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.12.name=UMV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel1.tier.13.name=UXV 256A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel2.tier.13.name=UXV 1024A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel3.tier.13.name=UXV 4096A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel4.tier.13.name=UXV 16384A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel5.tier.13.name=UXV 65536A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel6.tier.13.name=UXV 262144A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel7.tier.13.name=UXV 1048576A/t 激光靶仓
+gt.blockmachines.hatch.energytunnel.tier.14.name=传奇激光靶仓
+gt.blockmachines.hatch.energytunnel.desc.0=多方块机器的能量输入端
+gt.blockmachines.hatch.energytunnel.desc.1=通量
+
+gt.blockmachines.hatch.dynamomulti04.tier.05.name=4安IV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.05.name=16安IV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.05.name=64安IV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.06.name=4安LuV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.06.name=16安LuV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.06.name=64安LuV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.07.name=4安ZPM动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.07.name=16安ZPM动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.07.name=64安ZPM动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.08.name=4安UV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.08.name=16安UV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.08.name=64安UV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.09.name=4安UHV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.09.name=16安UHV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.09.name=64安UHV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.10.name=4安UEV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.10.name=16安UEV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.10.name=64安UEV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.11.name=4安UIV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.11.name=16安UIV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.11.name=64安UIV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.12.name=4安UMV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.12.name=16安UMV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.12.name=64安UMV动力仓
+gt.blockmachines.hatch.dynamomulti04.tier.13.name=4安UXV动力仓
+gt.blockmachines.hatch.dynamomulti16.tier.13.name=16安UXV动力仓
+gt.blockmachines.hatch.dynamomulti64.tier.13.name=64安UXV动力仓
+gt.blockmachines.hatch.dynamomulti.desc.0=从多方块机器以高电流输出能源
+gt.blockmachines.hatch.dynamomulti.desc.1=输出电流
+
+gt.blockmachines.hatch.dynamotunnel1.tier.05.name=IV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.05.name=IV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.05.name=IV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.05.name=IV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.05.name=IV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.05.name=IV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.05.name=IV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.06.name=LuV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.06.name=LuV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.06.name=LuV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.06.name=LuV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.06.name=LuV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.06.name=LuV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.06.name=LuV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.07.name=ZPM 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.07.name=ZPM 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.07.name=ZPM 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.07.name=ZPM 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.07.name=ZPM 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.07.name=ZPM 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.07.name=ZPM 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.08.name=UV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.08.name=UV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.08.name=UV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.08.name=UV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.08.name=UV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.08.name=UV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.08.name=UV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.09.name=UHV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.09.name=UHV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.09.name=UHV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.09.name=UHV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.09.name=UHV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.09.name=UHV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.09.name=UHV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.10.name=UEV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.10.name=UEV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.10.name=UEV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.10.name=UEV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.10.name=UEV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.10.name=UEV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.10.name=UEV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.11.name=UIV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.11.name=UIV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.11.name=UIV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.11.name=UIV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.11.name=UIV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.11.name=UIV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.11.name=UIV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.12.name=UMV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.12.name=UMV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.12.name=UMV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.12.name=UMV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.12.name=UMV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.12.name=UMV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.12.name=UMV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel1.tier.13.name=UXV 256A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel2.tier.13.name=UXV 1024A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel3.tier.13.name=UXV 4096A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel4.tier.13.name=UXV 16384A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel5.tier.13.name=UXV 65536A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel6.tier.13.name=UXV 262144A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel7.tier.13.name=UXV 1048576A/t 激光源仓
+gt.blockmachines.hatch.dynamotunnel.tier.14.name=传奇激光源仓
+gt.blockmachines.hatch.dynamotunnel.desc.0=多方块机器的能量输出端
+gt.blockmachines.hatch.dynamotunnel.desc.1=通量
+
+gt.blockmachines.emin.tier.08.name=UV元物质输入仓
+gt.blockmachines.emin.tier.09.name=UHV元物质输入仓
+gt.blockmachines.emin.tier.10.name=UEV元物质输入仓
+gt.blockmachines.emin.tier.11.name=UIV元物质输入仓
+gt.blockmachines.emin.tier.12.name=UMV元物质输入仓
+gt.blockmachines.emin.tier.13.name=UXV元物质输入仓
+gt.blockmachines.emin.desc=多方块机器的元物质输入
+
+gt.blockmachines.emout.tier.08.name=UV元物质输出仓
+gt.blockmachines.emout.tier.09.name=UHV元物质输出仓
+gt.blockmachines.emout.tier.10.name=UEV元物质输出仓
+gt.blockmachines.emout.tier.11.name=UIV元物质输出仓
+gt.blockmachines.emout.tier.12.name=UMV元物质输出仓
+gt.blockmachines.emout.tier.13.name=UXV元物质输出仓
+gt.blockmachines.emout.desc=多方块机器的元物质输出
+
+#TODO change tier.05 to tier.04
+gt.blockmachines.hatch.param.tier.05.name=参数仪
+gt.blockmachines.hatch.param.tier.07.name=参数仪 X
+gt.blockmachines.hatch.param.tier.10.name=参数仪 tXt
+gt.blockmachines.hatch.param.desc.0=多方块机器的参数化
+gt.blockmachines.hatch.param.desc.1=E=mine*craft²
+
+gt.blockmachines.hatch.certain.tier.07.name=未定元解析器
+gt.blockmachines.hatch.certain.tier.10.name=未定元解析器 X
+gt.blockmachines.hatch.certain.desc.0=你真的很确定吗?
+gt.blockmachines.hatch.certain.desc.1=盒子里的薛定谔方程
+
+gt.blockmachines.hatch.datain.tier.07.name=副光学接口
+gt.blockmachines.hatch.datain.desc.0=多方块机器的数据输入
+gt.blockmachines.hatch.datain.desc.1=高速光纤接口
+gt.blockmachines.hatch.datain.desc.2=启用前必须涂色
+
+gt.blockmachines.hatch.dataout.tier.07.name=主光学接口
+gt.blockmachines.hatch.dataout.desc.0=多方块机器的数据输出
+gt.blockmachines.hatch.dataout.desc.1=高速光纤接口
+gt.blockmachines.hatch.dataout.desc.2=启用前必须涂色
+
+gt.blockmachines.hatch.datainass.tier.07.name=装配线数据库接口
+gt.blockmachines.hatch.datainass.desc.0=多方块机器的数据输入
+gt.blockmachines.hatch.datainass.desc.1=高速光纤接口
+gt.blockmachines.hatch.datainass.desc.2=启用前必须涂色
+
+gt.blockmachines.hatch.dataoutass.tier.07.name=数据库主接口
+gt.blockmachines.hatch.dataoutass.desc.0=多方块机器的数据输出
+gt.blockmachines.hatch.dataoutass.desc.1=高速光纤接口
+gt.blockmachines.hatch.dataoutass.desc.2=启用前必须涂色
+
+gt.blockmachines.hatch.rack.tier.08.name=计算机箱
+gt.blockmachines.hatch.rack.desc.0=4插槽机箱
+gt.blockmachines.hatch.rack.desc.1=容纳计算机组件
+gt.blockmachines.hatch.holder.tier.09.name=物品固定容器
+gt.blockmachines.hatch.holder.desc.0=用于研究站
+gt.blockmachines.hatch.holder.desc.1=先进的固定机制!
+gt.blockmachines.hatch.capacitor.tier.03.name=电容仓
+gt.blockmachines.hatch.capacitor.desc.0=用于特斯拉电塔
+gt.blockmachines.hatch.capacitor.desc.1=存储'䏍量! (就一会儿) 原文:store 'nergy'(for a while)
+
+#Casings
+gt.blockcasingsNH.10.name=UEV机械方块
+gt.blockcasingsNH.11.name=UIV机械方块
+gt.blockcasingsNH.12.name=UMV机械方块
+gt.blockcasingsNH.13.name=UXV机械方块
+gt.blockcasingsNH.14.name=MAX机械方块
+
+gt.blockhintTT.desc.0=构造时的帮助
+gt.blockhintTT.0.name=提示方块:1号
+gt.blockhintTT.1.name=提示方块:2号
+gt.blockhintTT.2.name=提示方块:3号
+gt.blockhintTT.3.name=提示方块:4号
+gt.blockhintTT.4.name=提示方块:5号
+gt.blockhintTT.5.name=提示方块:6号
+gt.blockhintTT.6.name=提示方块:7号
+gt.blockhintTT.7.name=提示方块:8号
+gt.blockhintTT.8.name=提示方块:9号
+gt.blockhintTT.9.name=提示方块:10号
+gt.blockhintTT.10.name=提示方块:11号
+gt.blockhintTT.11.name=提示方块:12号
+gt.blockhintTT.desc.1=特定组的占位符.
+gt.blockhintTT.12.name=提示方块:一般
+gt.blockhintTT.desc.2=一般占位符.
+gt.blockhintTT.13.name=提示方块:空气
+gt.blockhintTT.desc.3=确保其中包含空气方块.
+gt.blockhintTT.14.name=提示方块:非空气
+gt.blockhintTT.desc.4=确保其中不含空气方块.
+gt.blockhintTT.15.name=提示方块:错误
+gt.blockhintTT.desc.5=错误,你希望做什么?
+
+gt.blockcasingsTT.0.name=超能机械方块
+gt.blockcasingsTT.0.desc.0=非常适合高能应用.
+gt.blockcasingsTT.0.desc.1=能量等级正在上升!
+gt.blockcasingsTT.1.name=电子计算机械方块
+gt.blockcasingsTT.1.desc.0=又好又干净的外壳.
+gt.blockcasingsTT.1.desc.1=灰尘会破坏它!?
+gt.3blockcasingsTT.2.name=计算机散热风扇
+gt.blockcasingsTT.2.desc.0=带过滤器的散热风扇.
+gt.blockcasingsTT.2.desc.1=完美静音!
+gt.blockcasingsTT.3.name=进阶电子计算机械方块
+gt.blockcasingsTT.3.desc.0=包含高带宽总线
+gt.blockcasingsTT.3.desc.1=带宽数千量子比特.
+gt.blockcasingsTT.4.name=分子机械方块
+gt.blockcasingsTT.4.desc.0=阻止元物质.
+gt.blockcasingsTT.4.desc.1=也阻止了辐射和情绪...
+gt.blockcasingsTT.5.name=进阶分子机械方块
+gt.blockcasingsTT.5.desc.0=冷却并稳定.
+gt.blockcasingsTT.5.desc.1=舒适的机器基础.
+gt.blockcasingsTT.6.name=遏制场发生器
+gt.blockcasingsTT.6.desc.0=产生一个场...
+gt.blockcasingsTT.6.desc.1=甚至可以阻止高能粒子.
+gt.blockcasingsTT.7.name=分子线圈
+gt.blockcasingsTT.7.desc.0=好吧,它太...
+gt.blockcasingsTT.7.desc.1=[用这个线圈!]
+gt.blockcasingsTT.8.name=中空机械方块
+gt.blockcasingsTT.8.desc.0=强化加速器通道.
+gt.blockcasingsTT.8.desc.1=有史以来最先进的管道.
+gt.blockcasingsTT.9.name=时空扭曲机械方块
+gt.blockcasingsTT.9.desc.0=光速不再是限制.
+gt.blockcasingsTT.9.desc.1=Wibbly wobbly timey wimey stuff.(欣赏原文吧,表示给跪了,大意是时空摇摆不定)
+gt.blockcasingsTT.10.name=传输机械方块
+gt.blockcasingsTT.10.desc.0=远程连接.
+gt.blockcasingsTT.10.desc.1=最好别用手碰它.
+gt.blockcasingsTT.11.name=维度联络机械方块
+gt.blockcasingsTT.11.desc.0=多维运算.
+gt.blockcasingsTT.11.desc.1=宇宙或别的地方.
+gt.blockcasingsTT.12.name=终极分子机械方块
+gt.blockcasingsTT.12.desc.0=各方面的终极.
+gt.blockcasingsTT.12.desc.1=我不知道它不能做什么.
+gt.blockcasingsTT.13.name=究极分子机械方块
+gt.blockcasingsTT.13.desc.0=各方面的究极.
+gt.blockcasingsTT.13.desc.1=我不知道自己在做什么!
+gt.blockcasingsTT.14.name=终极遏制场发生器
+gt.blockcasingsTT.14.desc.0=黑洞...
+gt.blockcasingsTT.14.desc.1=嗯...
+gt.blockcasingsTT.15.name=[调试方块]
+gt.blockcasingsTT.15.desc.0=懒人确定边的方式.
+gt.blockcasingsTT.15.desc.1=0, 1, 2, 3, 4, 5, 6?!
+
+gt.blockcasingsBA0.0.name=红石合金初级特斯拉绕组
+gt.blockcasingsBA0.1.name=MV超导初级特斯拉绕组
+gt.blockcasingsBA0.2.name=HV超导初级特斯拉绕组
+gt.blockcasingsBA0.3.name=EV超导初级特斯拉绕组
+gt.blockcasingsBA0.4.name=IV超导初级特斯拉绕组
+gt.blockcasingsBA0.5.name=LuV超导初级特斯拉绕组
+gt.blockcasingsBA0.9.name=ZPM超导初级特斯拉绕组
+gt.blockcasingsBA0.0.desc.0=最高电圧
+gt.blockcasingsBA0.0.desc.1=有的人称这为神迹,另一些人把这叫做物理.
+gt.blockcasingsBA0.6.name=特斯拉基座机械方块
+gt.blockcasingsBA0.6.desc.0=一种奇妙机器的基础
+gt.blockcasingsBA0.6.desc.1=它是活的,它是活的!
+gt.blockcasingsBA0.7.name=特斯拉线圈机械方块
+gt.blockcasingsBA0.7.desc.0=用最好的铝箔制成!
+gt.blockcasingsBA0.7.desc.1=法拉第套装稍晚到来
+gt.blockcasingsBA0.8.name=特斯拉次级绕组
+gt.blockcasingsBA0.8.desc.0=从初级绕组获取能量
+gt.blockcasingsBA0.8.desc.1=谁不想要32k的环氧树脂?
+
+#Multiblocks
+gt.blockmachines.multimachine.em.transformer.name=有源变压器
+gt.blockmachines.multimachine.em.transformer.hint=1 - 能源仓、动力仓或超能机械方块
+gt.blockmachines.multimachine.em.transformer.desc.0=有源变压器的控制器方块
+gt.blockmachines.multimachine.em.transformer.desc.1=任意电压间的相互转换!
+gt.blockmachines.multimachine.em.transformer.desc.2=只有0.004%的能量损失, HAYO!
+gt.blockmachines.multimachine.em.transformer.desc.3=运行时被破坏会发生爆炸
+
+gt.blockmachines.multimachine.tm.microwave.name=微波发生仪
+gt.blockmachines.multimachine.tm.microwave.hint.0=1 - 基础仓室或洁净不锈钢机械方块
+gt.blockmachines.multimachine.tm.microwave.hint.1=也像个漏斗,所以给它个输出总线吧
+gt.blockmachines.multimachine.tm.microwave.desc.0=微波发生仪的控制器方块
+gt.blockmachines.multimachine.tm.microwave.desc.1=机器启动时开启一个计时器
+gt.blockmachines.multimachine.tm.microwave.desc.2=计时器运行时, 机器中的一切都会受到伤害
+gt.blockmachines.multimachine.tm.microwave.desc.3=机器也会自动收集内部掉落物
+gt.blockmachines.multimachine.tm.microwave.desc.4=可通过参数仪进行配置
+gt.blockmachines.multimachine.tm.microwave.desc.5=(别塞只凋灵进去)
+gt.blockmachines.multimachine.tm.microwave.cfgi.0=功率设置
+gt.blockmachines.multimachine.tm.microwave.cfgi.1=时间设置
+gt.blockmachines.multimachine.tm.microwave.cfgo.0=时间
+gt.blockmachines.multimachine.tm.microwave.cfgo.1=剩余时间
+
+gt.blockmachines.multimachine.tm.teslaCoil.name=特斯拉电塔
+gt.blockmachines.multimachine.tm.teslaCoil.hint.0=1 - 基础仓室, 电容仓或特斯拉基座机械方块
+gt.blockmachines.multimachine.tm.teslaCoil.hint.1=2 - 钛框架
+gt.blockmachines.multimachine.tm.teslaCoil.desc.0=特斯拉电塔的控制器方块
+gt.blockmachines.multimachine.tm.teslaCoil.desc.1=用于向特斯拉线圈帽和特斯拉收发器传输电力
+gt.blockmachines.multimachine.tm.teslaCoil.desc.2=可加入氦/氮/氡等离子体增大范围
+gt.blockmachines.multimachine.tm.teslaCoil.desc.3=传输电压取决于使用的特斯拉电容等级
+gt.blockmachines.multimachine.tm.teslaCoil.desc.4=需要至少与特斯拉电容相同等级的初级特斯拉绕组
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0=迟滞低设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1=迟滞高设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2=特斯拉电塔传输半径设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3=特斯拉收发器传输半径设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4=加强特斯拉线圈帽传输半径设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5=输出电压设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6=输出电流设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7=最小扫描时间设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8=过载设置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9=闲置
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0=特斯拉电塔传输半径显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1=特斯拉收发器传输半径显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2=加强特斯拉线圈帽传输半径显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3=输出电压显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4=输出电流显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5=能量容量显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6=已存储能量显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7=充能进度显示
+gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8=扫描时间显示
+
+gt.blockmachines.multimachine.em.switch.name=QoS网络交换机
+gt.blockmachines.multimachine.em.switch.hint=1 - 基础仓室、光学接口或电子计算机机械方块
+gt.blockmachines.multimachine.em.switch.desc.0=QoS网络交换机的控制器方块
+gt.blockmachines.multimachine.em.switch.desc.1=用于路由和分发算力
+gt.blockmachines.multimachine.em.switch.desc.2=需要通过参数仪进行配置
+
+
+gt.blockmachines.multimachine.em.computer.name=量子计算机
+gt.blockmachines.multimachine.em.computer.hint.0=1 - 基础仓室、光学接口或电子计算机机械方块
+gt.blockmachines.multimachine.em.computer.hint.1=2 - 计算机箱或进阶电子计算机械方块
+gt.blockmachines.multimachine.em.computer.desc=你需要它来处理上面的这串数字
+gt.blockmachines.multimachine.em.computer.cfgi.0=超频比
+gt.blockmachines.multimachine.em.computer.cfgi.1=过压比
+gt.blockmachines.multimachine.em.computer.cfgo.0=当前最大热量
+gt.blockmachines.multimachine.em.computer.cfgo.1=生成算力
+gt.blockmachines.multimachine.em.computer.desc.0=量子计算机的控制器方块
+gt.blockmachines.multimachine.em.computer.desc.1=用于生成算力(以及热量)
+
+gt.blockmachines.multimachine.em.databank.name=数据库
+gt.blockmachines.multimachine.em.databank.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.databank.hint.1=2 - 数据访问仓、数据库主接口或电子计算机械方块
+gt.blockmachines.multimachine.em.databank.desc.0=数据库的控制器方块
+gt.blockmachines.multimachine.em.databank.desc.1=为装配线提供更多闪存
+gt.blockmachines.multimachine.em.databank.desc.2=还可使多条装配线访问同一闪存
+
+gt.blockmachines.multimachine.em.junction.name=物质流枢纽
+gt.blockmachines.multimachine.em.junction.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.junction.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.junction.desc.0=物质流枢纽的控制器方块
+gt.blockmachines.multimachine.em.junction.desc.1=用于路由和分配元物质
+gt.blockmachines.multimachine.em.junction.desc.2=需要通过参数仪进行配置
+
+gt.blockmachines.multimachine.em.mattertoem.name=物质量子化仪
+gt.blockmachines.multimachine.em.mattertoem.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.mattertoem.hint.1=2 - 元物质输出仓
+gt.blockmachines.multimachine.em.mattertoem.hint.2=3 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.mattertoem.desc.0=物质量子化仪的控制器方块
+gt.blockmachines.multimachine.em.mattertoem.desc.1=将物品转化为它们的元素形态
+
+gt.blockmachines.multimachine.em.emtomatter.name=物质反量子化仪
+gt.blockmachines.multimachine.em.emtomatter.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.emtomatter.hint.1=2 - 元物质输入仓
+gt.blockmachines.multimachine.em.emtomatter.hint.2=3 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.emtomatter.desc.0=物质反量子化仪的控制器方块
+gt.blockmachines.multimachine.em.emtomatter.desc.1=将元物质还原为常规物品形态
+
+gt.blockmachines.multimachine.em.emtoessentia.name=源质反量子化仪
+gt.blockmachines.multimachine.em.emtoessentia.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.emtoessentia.hint.1=2 - 元物质输入仓
+gt.blockmachines.multimachine.em.emtoessentia.hint.2=3 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.emtoessentia.hint.3=通用 - 某种源质的储存方块
+gt.blockmachines.multimachine.em.emtoessentia.desc.0=源质反量子化仪的控制器方块
+gt.blockmachines.multimachine.em.emtoessentia.desc.1=将元物质还原为源质形态
+
+gt.blockmachines.multimachine.em.essentiatoem.name=源质量子化仪
+gt.blockmachines.multimachine.em.essentiatoem.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.essentiatoem.hint.1=2 - 元物质输出仓
+gt.blockmachines.multimachine.em.essentiatoem.hint.2=3 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.essentiatoem.hint.3=通用 - 某种源质的储存方块
+gt.blockmachines.multimachine.em.essentiatoem.desc.0=源质量子化仪的控制器方块
+gt.blockmachines.multimachine.em.essentiatoem.desc.1=将源质转化为它们的元素形态
+
+gt.blockmachines.multimachine.em.scanner.name=元物质扫描仪
+gt.blockmachines.multimachine.em.scanner.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.scanner.hint.1=2 - 元物质输入仓或分子机械方块
+gt.blockmachines.multimachine.em.scanner.hint.2=3 - 元物质输出仓或分子机械方块
+gt.blockmachines.multimachine.em.scanner.hint.3=4 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.scanner.desc.0=元物质扫描仪的控制器方块
+
+gt.blockmachines.multimachine.em.research.name=研究站
+gt.blockmachines.multimachine.em.research.hint.0=1 - 基础仓室、光学接口或电子计算机械方块
+gt.blockmachines.multimachine.em.research.hint.1=2 - 物品固定容器
+gt.blockmachines.multimachine.em.research.desc.0=研究站的控制器方块
+gt.blockmachines.multimachine.em.research.desc.1=用于扫描物品, 生成装配线配方闪存
+gt.blockmachines.multimachine.em.research.desc.2=需要为其提供算力
+gt.blockmachines.multimachine.em.research.desc.3=在完成闪存写入之前不会消耗物品
+
+gt.blockmachines.multimachine.em.collider.name=物质对撞机
+gt.blockmachines.multimachine.em.collider.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.collider.hint.1=2 - 元物质输入仓或分子机械方块
+gt.blockmachines.multimachine.em.collider.hint.2=3 - 元物质输出仓或分子机械方块
+gt.blockmachines.multimachine.em.collider.hint.3=4 - 元物质溢流仓或分子机械方块
+gt.blockmachines.multimachine.em.collider.hint.4=通用 - 另一个控制器面向相反的方向
+gt.blockmachines.multimachine.em.collider.desc.0=物质对撞机的控制器方块
+gt.blockmachines.multimachine.em.collider.desc.1=需要一台镜像机器方可正常工作
+gt.blockmachines.multimachine.em.collider.desc.2=一台设为 '聚变模式', 另一台设为 '对撞模式'
+gt.blockmachines.multimachine.em.collider.desc.3=将两种元物质聚变, 产生另一种元物质(以及能量)
+gt.blockmachines.multimachine.em.collider.mode.0=模式:聚变
+gt.blockmachines.multimachine.em.collider.mode.1=模式:对撞
+gt.blockmachines.multimachine.em.collider.mode.2=模式:未定义
+gt.blockmachines.multimachine.em.collider.mode.3=从属于其他控制器
+gt.blockmachines.multimachine.em.collider.Structure.AdditionalCollider=需要与之镜像的另一台物质对撞机
+
+gt.blockmachines.multimachine.em.infuser.name=能量注入仪
+gt.blockmachines.multimachine.em.infuser.hint=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.infuser.desc.0=能量注入仪的控制器方块
+gt.blockmachines.multimachine.em.infuser.desc.1=可用于为物品充电(无损)
+gt.blockmachines.multimachine.em.infuser.desc.2=提供UU物质可修复物品
+gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing=第1、5层
+gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil=第2、4层
+gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing=第3层(中空)
+
+
+gt.blockmachines.multimachine.em.processing.name=量子加工机
+gt.blockmachines.multimachine.em.processing.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.processing.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.processing.desc.0=量子加工机的控制器方块
+
+gt.blockmachines.multimachine.em.crafter.name=物质组装机
+gt.blockmachines.multimachine.em.crafter.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.crafter.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.crafter.desc.0=物质组装机的控制器方块
+
+gt.blockmachines.multimachine.em.stabilizer.name=元物质稳定器
+gt.blockmachines.multimachine.em.stabilizer.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.stabilizer.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.stabilizer.desc.0=元物质稳定器的控制器方块
+
+gt.blockmachines.multimachine.em.wormhole.name=虫洞
+gt.blockmachines.multimachine.em.wormhole.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.wormhole.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.wormhole.desc.0=虫洞的控制器方块
+
+gt.blockmachines.multimachine.em.decay.name=衰变发电机
+gt.blockmachines.multimachine.em.decay.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.decay.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.decay.desc.0=衰变发电机的控制器方块
+gt.blockmachines.multimachine.em.decay.desc.1=通过元物质衰变产生能量
+
+gt.blockmachines.multimachine.em.decay.conf=分流器
+
+gt.blockmachines.multimachine.em.annihilation.name=湮灭发电机
+gt.blockmachines.multimachine.em.annihilation.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.annihilation.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.annihilation.desc.0=湮灭发电机的控制器方块
+
+gt.blockmachines.multimachine.em.blackholegenerator.name=黑洞发生器
+gt.blockmachines.multimachine.em.blackholegenerator.hint.0=1 - 基础仓室或超能机械方块
+gt.blockmachines.multimachine.em.blackholegenerator.hint.1=2 - 元物质输入/出仓或分子机械方块
+gt.blockmachines.multimachine.em.blackholegenerator.desc.0=黑洞发生器的控制器方块
+gt.blockmachines.multimachine.em.blackholegenerator.desc.1=使用一颗黑洞产生能量
+
+#Pipes
+gt.blockmachines.pipe.elementalmatter.name=量子隧道
+gt.blockmachines.pipe.elementalmatter.desc.0=量子隧道设备.
+gt.blockmachines.pipe.elementalmatter.desc.1=不是传送门!!!
+gt.blockmachines.pipe.elementalmatter.desc.2=启用前必须涂色
+gt.blockmachines.pipe.elementalmatter.desc.3=请勿交叉、分流或转弯
+
+gt.blockmachines.pipe.energystream.name=激光真空管
+gt.blockmachines.pipe.energystream.desc.0=激光隧道设备.
+gt.blockmachines.pipe.energystream.desc.1=要有光!!!
+gt.blockmachines.pipe.energystream.desc.2=启用前必须涂色
+gt.blockmachines.pipe.energystream.desc.3=请勿分流或转弯
+
+gt.blockmachines.pipe.datastream.name=光缆
+gt.blockmachines.pipe.datastream.desc.0=高级数据传输设备
+gt.blockmachines.pipe.datastream.desc.1=请勿直视激光!
+gt.blockmachines.pipe.datastream.desc.2=启用前必须涂色
+gt.blockmachines.pipe.datastream.desc.3=请勿交叉或分流
+
+#Single blocks
+gt.blockmachines.machine.tt.ownerdetector.name=所有者检测机
+gt.blockmachines.machine.tt.ownerdetector.desc.0=使用螺丝刀以变更模式
+gt.blockmachines.machine.tt.ownerdetector.desc.1=寻找他的PaPa
+gt.blockmachines.machine.tt.ownerdetector.desc.2=高兴时发出信号
+
+gt.blockmachines.machine.tt.datareader.name=数据读取机
+gt.blockmachines.machine.tt.datareader.desc.0=读取闪存和数据球
+gt.blockmachines.machine.tt.datareader.desc.1=给它通电,然后
+gt.blockmachines.machine.tt.datareader.desc.2=将数据存储物放进去
+
+gt.blockmachines.machine.tt.buck.05.name=IV降压变压器
+gt.blockmachines.machine.tt.buck.06.name=LuV降压变压器
+gt.blockmachines.machine.tt.buck.07.name=ZPM降压变压器
+gt.blockmachines.machine.tt.buck.08.name=UV降压变压器
+gt.blockmachines.machine.tt.buck.09.name=UHV降压变压器
+gt.blockmachines.machine.tt.buck.10.name=UEV降压变压器
+gt.blockmachines.machine.tt.buck.11.name=UIV降压变压器
+gt.blockmachines.machine.tt.buck.12.name=UMV降压变压器
+gt.blockmachines.machine.tt.buck.13.name=UXV降压变压器
+gt.blockmachines.machine.tt.buck.desc.0=电压调节器
+gt.blockmachines.machine.tt.buck.desc.1=可调降压变压器
+gt.blockmachines.machine.tt.buck.desc.2=开关电源...
+
+gt.blockmachines.machine.tt.tesla.01.name=基础特斯拉收发器
+gt.blockmachines.machine.tt.tesla.02.name=进阶特斯拉收发器
+gt.blockmachines.machine.tt.tesla.03.name=霄龙特斯拉收发器
+gt.blockmachines.machine.tt.tesla.04.name=极限特斯拉收发器
+gt.blockmachines.machine.tt.tesla.05.name=疯狂特斯拉收发器
+gt.blockmachines.machine.tt.tesla.desc.0=你选择的特斯拉I/O机器
+gt.blockmachines.machine.tt.tesla.desc.1=富人的闪电洪炉
+
+#Debug blocks
+gt.blockmachines.debug.tt.pollutor.name=Debug污染生成机
+gt.blockmachines.debug.tt.pollutor.desc.0=该死的genny破产了!
+gt.blockmachines.debug.tt.pollutor.desc.1=无限的生产者/消费者
+gt.blockmachines.debug.tt.pollutor.desc.2=因为我需要一个?
+gt.blockmachines.debug.tt.data.name=Debug数据仓
+gt.blockmachines.debug.tt.data.desc.0=量子数据输出
+gt.blockmachines.debug.tt.data.desc.1=高速光纤接口
+gt.blockmachines.debug.tt.data.desc.2=启用前必须涂色
+gt.blockmachines.debug.tt.maintenance.name=Debug维护仓
+gt.blockmachines.debug.tt.maintenance.desc.0=自动维护多方块机器
+gt.blockmachines.debug.tt.maintenance.desc.1=它能修好一切,除了自己.
+gt.blockmachines.debug.tt.maintenance.desc.2=为人民服务!
+gt.blockmachines.debug.tt.genny.name=Debug发电机
+gt.blockmachines.debug.tt.genny.desc.0=凭空而生的能量
+gt.blockmachines.debug.tt.genny.desc.1=一个无限的能源生产/消耗设备
+gt.blockmachines.debug.tt.genny.desc.2=我只是想要一个...
+gt.blockmachines.debug.tt.genny.desc.3=使用螺丝刀将其切换为激光模式.
+gt.blockmachines.debug.tt.writer.name=Debug结构打印机
+gt.blockmachines.debug.tt.writer.desc.0=扫描周围的方块
+gt.blockmachines.debug.tt.writer.desc.1=打印多方块非实体的结构样式编码
+gt.blockmachines.debug.tt.writer.desc.2=ABC轴沿机器正面确定
+
+#Keywords and phrases
+#Example: ID:3
+tt.keyword.ID=ID
+#Example: 32EU at 1A
+tt.keyword.at=
+# Structure is too complex
+tt.keyword.Structure.StructureTooComplex=结构太复杂了!
+# Any X
+tt.keyword.Structure.AnyComputerCasing=任意电子计算机械方块
+tt.keyword.Structure.AnyHighPowerCasing=任意超能机械方块
+tt.keyword.Structure.AnyHighPowerCasing1D=任意提示方块:1号的超能机械方块
+tt.keyword.Structure.AnyHighPowerCasing2D=任意提示方块:2号的超能机械方块
+tt.keyword.Structure.AnyHighPowerCasingFront=任意正面超能机械方块
+tt.keyword.Structure.AnyTeslaBaseCasingOuter=任意外侧特斯拉基座机械方块
+tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice=任意最前或最后一片电子计算机械方块
+tt.keyword.Structure.AnyComputerCasingBackMain=任意主体背面电子计算机械方块
+tt.keyword.Structure.AnyAdvComputerCasingExceptOuter=除外部的任意进阶电子计算机械方块
+tt.keyword.Structure.AnyMolecularCasing=任意分子机械方块
+tt.keyword.Structure.AnyMolecularCasing2D=任意提示方块:2号分子机械方块
+tt.keyword.Structure.AnyMolecularCasing3D=任意提示方块:3号分子机械方块
+tt.keyword.Structure.AnyMolecularCasing4D=任意提示方块:4号分子机械方块
+tt.keyword.Structure.AnyOuterMolecularCasing3rd=任意第3片外侧分子机械方块
+tt.keyword.Structure.AnyOuterMolecularCasing4th=任意第4片外侧分子机械方块
+tt.keyword.Structure.AnyOuterMolecularCasing3rd4th=任意第3/4片外侧分子机械方块
+tt.keyword.Structure.AnyOuterCasingOnBottom=任意底层外侧机械方块
+# Optional
+tt.keyword.Structure.Optional=(可选)
+# Placement specification
+tt.keyword.Structure.FrontCenter=正面中央
+tt.keyword.Structure.BackCenter=背面中央
+tt.keyword.Structure.SideCenter=侧面中央
+tt.keyword.Structure.FrontCenter3rd=正面第三层中央
+tt.keyword.Structure.CenterPillar=正面立柱中央
+tt.keyword.Structure.Center=中央
+# Additional structure components
+tt.keyword.Structure.DataAccessHatch=数据访问仓
+tt.keyword.Structure.ElementalOutput=元物质输出仓
+tt.keyword.Structure.Elemental=元物质仓
+tt.keyword.Structure.ElementalOverflow=元物质溢流仓
+tt.keyword.Structure.ElementalInput=元物质输入仓
+tt.keyword.Structure.EssentiaStorage=源质存储装置
+tt.keyword.Structure.DataConnector=光学接口
+tt.keyword.Structure.SuperconductingCoilBlock=超导线圈方块
+tt.keyword.Structure.StainlessSteelCasing=不锈钢机械方块
+
+
+tt.keyphrase.Hint_Details=提示细节
+
+#debug boom
+tt.keyword.BOOM=BOOM!
+tt.keyword.Destination=目标
+tt.keyword.Weight=质量
+tt.keyword.Source=来源
+tt.keyword.Progress=过程
+tt.keyword.Computation=算力
+#Problemns as in maintanance issues
+tt.keyword.Problems=故障
+tt.keyword.Efficiency=效率
+#Button that allows to pass power to other machines
+tt.keyword.PowerPass=导能
+#Button that vents EM
+tt.keyword.SafeVoid=安全销毁
+tt.keyword.Parametrizer=参数仪
+tt.keyword.Value=值
+tt.keyword.Input=输入
+tt.keyword.input=输入
+tt.keyword.output=输出
+tt.keyword.Status=状态
+tt.keyword.Content=内含
+tt.keyword.PacketHistory=封包记录
+
+#Used when 0 Elemental Matter Stacks
+tt.keyphrase.No_Stacks=空
+tt.keyphrase.Contains_EM=存储元物质
+tt.keyphrase.Contained_mass=存储物质
+tt.keyphrase.Mass_Disposal_speed=清理速度
+tt.keyphrase.Muffler_BOOM=溢流BOOM!
+tt.keyphrase.Energy_Hatches=能源仓
+tt.keyphrase.Probably_uses=可能用到
+tt.keyphrase.Probably_makes=可能制作
+tt.keyphrase.Tier_Rating=等级
+tt.keyphrase.Amp_Rating=电流
+tt.keyphrase.Computation_Available=可用算力
+tt.keyphrase.Computation_Remaining=剩余算力
+tt.keyphrase.Content_Stack_Count=内含:堆数
+tt.keyphrase.Base_computation=基础算力
+tt.keyphrase.After_overclocking=超频后
+tt.keyphrase.Heat_Accumulated=热量累积
+tt.keyphrase.Running_interdimensional_scan=多维度扫描进行中
+tt.keyphrase.Running_local_dimension_scan=本维度扫描进行中
+tt.keyphrase.Overdrive_disengaged=过载未占用
+tt.keyphrase.Overdrive_engaged=过载已占用
+tt.keyphrase.Hysteresis_high_set_to=滞后高通设置为
+tt.keyphrase.Hysteresis_low_set_to=滞后低通设置为
+tt.keyphrase.Tesla_radius_set_to=特斯拉半径设置为
+tt.keyphrase.Sending_power=发送功率
+tt.keyphrase.Receiving_power=接收功率
+tt.keyphrase.Stored_energy=已存储能量
+tt.keyphrase.Stored_EU=已存储EU
+tt.keyphrase.Average_IO=平均I/O
+tt.keyphrase.Average_IO_(max)=电压I/O(最大)
+tt.keyphrase.Average_IO_max=电压I/O 最大
+tt.keyphrase.Amperage_IO_(max)=电流I/O(最大)
+tt.keyphrase.Side_capabilities=辅助功能
+tt.keyphrase.Ass_line_recipe=装配线合成表
+
+#OpenTurrets compatibility
+tile.turretHeadEM.name=元物质炮塔
+tile.turretBaseEM.name=元物质炮塔基座
+
+#EM scan result
+tt.keyword.scan.depth=深度
+tt.keyword.scan.class=种类
+tt.keyword.scan.name=名称
+tt.keyword.scan.symbol=符号
+
+tt.keyword.scan.mass=质量
+tt.keyword.scan.count=粒子数
+tt.keyword.scan.amount=物质的量
+tt.keyword.scan.energy=能量
+tt.keyword.scan.energyLevel=能级
+tt.keyword.scan.charge=电荷
+tt.keyword.scan.life_mult=寿命系数
+tt.keyword.scan.half_life=半衰期
+tt.keyword.scan.life_time=寿命
+tt.keyword.scan.age=元物质衰变期
+tt.keyphrase.scan.at_current_energy_level=在当前能级
+tt.keyword.scan.color=色荷
+tt.keyword.scan.colorless=无色荷
+tt.keyword.scan.colored=有色荷
+
+tt.keyword.short.mass=M
+tt.keyword.short.count=Qty
+tt.keyword.short.amount=Qty
+tt.keyword.short.energy=E
+tt.keyword.short.energyLevel=EL
+tt.keyword.short.charge=C
+tt.keyword.short.time=T
+
+tt.keyword.unit.mass=eV/c²
+tt.keyword.unit.massFlux=eV/c²s
+tt.keyword.unit.count=
+tt.keyword.unit.mol=mol
+tt.keyword.unit.itemMols=item(s)
+tt.keyword.unit.mbMols=mb
+tt.keyword.unit.energy=eV
+tt.keyword.unit.charge=e
+tt.keyword.unit.time=s
+tt.keyword.unit.tick=t
+#that the thing wont decay
+tt.keyword.stable=不衰变
+
+#EM types
+tt.keyword.Primitive=原始
+tt.keyword.Element=元素
+tt.keyword.Atom=原子
+tt.keyword.Isotope=同位素
+tt.keyword.Boson=玻色子
+tt.keyword.Fermion=费米子
+tt.keyword.GaugeBoson=规范玻色子
+tt.keyword.Meson=介子
+tt.keyword.Baryon=重子
+tt.keyword.Tetraquark=四夸克粒子
+tt.keyword.Pentaquark=五夸克粒子
+tt.keyword.Hexaquark=六夸克粒子
+tt.keyword.Hadron=强子
+tt.keyword.Neutrino=中微子
+tt.keyword.Quark=夸克
+tt.keyword.ScalarBoson=标量玻色子
+#em definitions
+tt.keyword.PrimitiveNBTERROR=NBT错误
+tt.keyword.PrimitiveNULLPOINTER=空指针
+tt.keyword.PrimitiveSpace=空间
+tt.keyword.PrimitivePresence=存在
+tt.keyword.PrimitiveMass=物质
+tt.keyword.PrimitiveDarkMass=暗物质
+tt.keyword.PrimitiveEnergy=能量
+tt.keyword.PrimitiveDarkEnergy=暗能量
+tt.keyword.PrimitiveMagic=魔法
+tt.keyword.PrimitiveAntimagic=反魔法
+tt.keyword.Gluon=胶子
+tt.keyword.Photon=光子
+tt.keyword.Weak0=Z玻色子
+tt.keyword.WeakPlus=W+玻色子
+tt.keyword.WeakMinus=W-玻色子
+tt.keyword.Proton=质子
+tt.keyword.AntiProton=反质子
+tt.keyword.Neutron=中子
+tt.keyword.AntiNeutron=反中子
+tt.keyword.Lepton=轻子
+tt.keyword.Electron=电子
+tt.keyword.Muon=μ子
+tt.keyword.Tauon=τ子
+tt.keyword.Positron=正电子
+tt.keyword.Antimuon=反μ子
+tt.keyword.Antitauon=反τ子
+tt.keyword.ElectronNeutrino=电子中微子
+tt.keyword.MuonNeutrino=μ子中微子
+tt.keyword.TauonNeutrino=τ子中微子
+tt.keyword.PositronNeutrino=正电子中微子
+tt.keyword.AntimuonNeutrino=反μ子中微子
+tt.keyword.AntitauonNeutrino=反τ子中微子
+tt.keyword.QuarkUp=上夸克
+tt.keyword.QuarkCharm=粲夸克
+tt.keyword.QuarkTop=顶夸克
+tt.keyword.QuarkDown=下夸克
+tt.keyword.QuarkStrange=奇夸克
+tt.keyword.QuarkBottom=底夸克
+tt.keyword.QuarkAntiUp=反上夸克
+tt.keyword.QuarkAntiCharm=反粲夸克
+tt.keyword.QuarkAntiTop=反顶夸克
+tt.keyword.QuarkAntiDown=反下夸克
+tt.keyword.QuarkAntiStrange=反奇夸克
+tt.keyword.QuarkAntiBottom=反底夸克
+tt.keyword.Higgs=希格斯玻色子
+#These are Thaumcraft aspects
+tt.keyword.Air=风
+tt.keyword.Earth=地
+tt.keyword.Fire=火
+tt.keyword.Water=水
+tt.keyword.Order=秩序
+tt.keyword.Entropy=混沌
+tt.keyword.Chaos=Chaos
+
+tt.keyword.Primal=元始
+tt.keyword.Aspect=要素
+
+tt.element.Neutronium=中子
+tt.element.Hydrogen=氢
+tt.element.Helium=氦
+tt.element.Lithium=锂
+tt.element.Beryllium=铍
+tt.element.Boron=硼
+tt.element.Carbon=碳
+tt.element.Nitrogen=氮
+tt.element.Oxygen=氧
+tt.element.Fluorine=氟
+tt.element.Neon=氖
+tt.element.Sodium=钠
+tt.element.Magnesium=镁
+tt.element.Aluminium=铝
+tt.element.Silicon=硅
+tt.element.Phosphorus=磷
+tt.element.Sulfur=硫
+tt.element.Chlorine=氯
+tt.element.Argon=氩
+tt.element.Potassium=钾
+tt.element.Calcium=钙
+tt.element.Scandium=钪
+tt.element.Titanium=钛
+tt.element.Vanadium=钒
+tt.element.Chromium=铬
+tt.element.Manganese=锰
+tt.element.Iron=铁
+tt.element.Cobalt=钴
+tt.element.Nickel=镍
+tt.element.Copper=铜
+tt.element.Zinc=锌
+tt.element.Gallium=镓
+tt.element.Germanium=锗
+tt.element.Arsenic=砷
+tt.element.Selenium=硒
+tt.element.Bromine=溴
+tt.element.Krypton=氪
+tt.element.Rubidium=铷
+tt.element.Strontium=锶
+tt.element.Yttrium=钇
+tt.element.Zirconium=锆
+tt.element.Niobium=铌
+tt.element.Molybdenum=钼
+tt.element.Technetium=锝
+tt.element.Ruthenium=钌
+tt.element.Rhodium=铑
+tt.element.Palladium=钯
+tt.element.Silver=银
+tt.element.Cadmium=镉
+tt.element.Indium=铟
+tt.element.Tin=锡
+tt.element.Antimony=锑
+tt.element.Tellurium=碲
+tt.element.Iodine=碘
+tt.element.Xenon=氙
+tt.element.Caesium=铯
+tt.element.Barium=钡
+tt.element.Lanthanum=镧
+tt.element.Cerium=铈
+tt.element.Praseodymium=镨
+tt.element.Neodymium=钕
+tt.element.Promethium=钷
+tt.element.Samarium=钐
+tt.element.Europium=铕
+tt.element.Gadolinium=钆
+tt.element.Terbium=铽
+tt.element.Dysprosium=镝
+tt.element.Holmium=钬
+tt.element.Erbium=铒
+tt.element.Thulium=铥
+tt.element.Ytterbium=镱
+tt.element.Lutetium=镥
+tt.element.Hafnium=铪
+tt.element.Tantalum=钽
+tt.element.Tungsten=钨
+tt.element.Rhenium=铼
+tt.element.Osmium=锇
+tt.element.Iridium=铱
+tt.element.Platinum=铂
+tt.element.Gold=金
+tt.element.Mercury=汞
+tt.element.Thallium=铊
+tt.element.Lead=铅
+tt.element.Bismuth=铋
+tt.element.Polonium=钋
+tt.element.Astatine=砹
+tt.element.Radon=氡
+tt.element.Francium=钫
+tt.element.Radium=镭
+tt.element.Actinium=锕
+tt.element.Thorium=钍
+tt.element.Protactinium=镤
+tt.element.Uranium=铀
+tt.element.Neptunium=镎
+tt.element.Plutonium=钚
+tt.element.Americium=镅
+tt.element.Curium=锔
+tt.element.Berkelium=锫
+tt.element.Californium=锎
+tt.element.Einsteinium=锿
+tt.element.Fermium=镄
+tt.element.Mendelevium=钔
+tt.element.Nobelium=锘
+tt.element.Lawrencium=铹
+tt.element.Rutherfordium=
+tt.element.Dubnium=
+tt.element.Seaborgium=
+tt.element.Bohrium=
+tt.element.Hassium=
+tt.element.Meitnerium=鿏
+tt.element.Darmstadtium=
+tt.element.Roentgenium=
+tt.element.Copernicium=鿔
+tt.element.Nihonium=鿭
+tt.element.Flerovium=
+tt.element.Moscovium=镆
+tt.element.Livermorium=
+tt.element.Tennessine=鿬
+tt.element.Oganesson=鿫
+
+tt.element.AntiNeutronium=反中子
+tt.element.AntiHydrogen=反氢
+tt.element.AntiHelium=反氦
+tt.element.AntiLithium=反锂
+tt.element.AntiBeryllium=反铍
+tt.element.AntiBoron=反硼
+tt.element.AntiCarbon=反碳
+tt.element.AntiNitrogen=反氮
+tt.element.AntiOxygen=反氧
+tt.element.AntiFluorine=反氟
+tt.element.AntiNeon=反氖
+tt.element.AntiSodium=反钠
+tt.element.AntiMagnesium=反镁
+tt.element.AntiAluminium=反铝
+tt.element.AntiSilicon=反硅
+tt.element.AntiPhosphorus=反磷
+tt.element.AntiSulfur=反硫
+tt.element.AntiChlorine=反氯
+tt.element.AntiArgon=反氩
+tt.element.AntiPotassium=反钾
+tt.element.AntiCalcium=反钙
+tt.element.AntiScandium=反钪
+tt.element.AntiTitanium=反钛
+tt.element.AntiVanadium=反钒
+tt.element.AntiChromium=反铬
+tt.element.AntiManganese=反锰
+tt.element.AntiIron=反铁
+tt.element.AntiCobalt=反钴
+tt.element.AntiNickel=反镍
+tt.element.AntiCopper=反铜
+tt.element.AntiZinc=反锌
+tt.element.AntiGallium=反镓
+tt.element.AntiGermanium=反锗
+tt.element.AntiArsenic=反砷
+tt.element.AntiSelenium=反硒
+tt.element.AntiBromine=反溴
+tt.element.AntiKrypton=反氪
+tt.element.AntiRubidium=反铷
+tt.element.AntiStrontium=反锶
+tt.element.AntiYttrium=反钇
+tt.element.AntiZirconium=反锆
+tt.element.AntiNiobium=反铌
+tt.element.AntiMolybdenum=反钼
+tt.element.AntiTechnetium=反锝
+tt.element.AntiRuthenium=反钌
+tt.element.AntiRhodium=反铑
+tt.element.AntiPalladium=反钯
+tt.element.AntiSilver=反银
+tt.element.AntiCadmium=反镉
+tt.element.AntiIndium=反铟
+tt.element.AntiTin=反锡
+tt.element.AntiAntimony=反锑
+tt.element.AntiTellurium=反碲
+tt.element.AntiIodine=反碘
+tt.element.AntiXenon=反氙
+tt.element.AntiCaesium=反铯
+tt.element.AntiBarium=反钡
+tt.element.AntiLanthanum=反镧
+tt.element.AntiCerium=反铈
+tt.element.AntiPraseodymium=反镨
+tt.element.AntiNeodymium=反钕
+tt.element.AntiPromethium=反钷
+tt.element.AntiSamarium=反钐
+tt.element.AntiEuropium=反铕
+tt.element.AntiGadolinium=反钆
+tt.element.AntiTerbium=反铽
+tt.element.AntiDysprosium=反镝
+tt.element.AntiHolmium=反钬
+tt.element.AntiErbium=反铒
+tt.element.AntiThulium=反铥
+tt.element.AntiYtterbium=反镱
+tt.element.AntiLutetium=反镥
+tt.element.AntiHafnium=反铪
+tt.element.AntiTantalum=反钽
+tt.element.AntiTungsten=反钨
+tt.element.AntiRhenium=反铼
+tt.element.AntiOsmium=反锇
+tt.element.AntiIridium=反铱
+tt.element.AntiPlatinum=反铂
+tt.element.AntiGold=反金
+tt.element.AntiMercury=反汞
+tt.element.AntiThallium=反铊
+tt.element.AntiLead=反铅
+tt.element.AntiBismuth=反铋
+tt.element.AntiPolonium=反钋
+tt.element.AntiAstatine=反砹
+tt.element.AntiRadon=反氡
+tt.element.AntiFrancium=反钫
+tt.element.AntiRadium=反镭
+tt.element.AntiActinium=反锕
+tt.element.AntiThorium=反钍
+tt.element.AntiProtactinium=反镤
+tt.element.AntiUranium=反铀
+tt.element.AntiNeptunium=反镎
+tt.element.AntiPlutonium=反钚
+tt.element.AntiAmericium=反镅
+tt.element.AntiCurium=反锔
+tt.element.AntiBerkelium=反锫
+tt.element.AntiCalifornium=反锎
+tt.element.AntiEinsteinium=反锿
+tt.element.AntiFermium=反镄
+tt.element.AntiMendelevium=反钔
+tt.element.AntiNobelium=反锘
+tt.element.AntiLawrencium=反铹
+tt.element.AntiRutherfordium=反
+tt.element.AntiDubnium=反
+tt.element.AntiSeaborgium=反
+tt.element.AntiBohrium=反
+tt.element.AntiHassium=反
+tt.element.AntiMeitnerium=反鿏
+tt.element.AntiDarmstadtium=反
+tt.element.AntiRoentgenium=反
+tt.element.AntiCopernicium=反鿔
+tt.element.AntiNihonium=反鿭
+tt.element.AntiFlerovium=反
+tt.element.AntiMoscovium=反镆
+tt.element.AntiLivermorium=反
+tt.element.AntiTennessine=反鿬
+tt.element.AntiOganesson=反鿫
+
+tt.IUPAC.n=0
+tt.IUPAC.u=1
+tt.IUPAC.b=2
+tt.IUPAC.t=3
+tt.IUPAC.q=4
+tt.IUPAC.p=5
+tt.IUPAC.h=6
+tt.IUPAC.s=7
+tt.IUPAC.o=8
+tt.IUPAC.e=9
+tt.IUPAC.N=〇
+tt.IUPAC.U=一
+tt.IUPAC.B=二
+tt.IUPAC.T=三
+tt.IUPAC.Q=四
+tt.IUPAC.P=五
+tt.IUPAC.H=六
+tt.IUPAC.S=七
+tt.IUPAC.O=八
+tt.IUPAC.E=九
+tt.IUPAC.ium=元素
+tt.IUPAC.Anti=反
+tt.keyword.Weird=*
+
+tt.chat.debug.generator=激光模式:%s \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/models/Space.obj b/src/main/resources/assets/tectech/models/Space.obj
new file mode 100644
index 0000000000..083beee1f6
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/Space.obj
@@ -0,0 +1,8442 @@
+# Blender 3.4.1
+# www.blender.org
+mtllib Space.mtl
+o Sphere
+v 0.000000 61.528759 -41.112186
+v 0.000000 41.112209 -61.528744
+v 0.000000 14.436695 -72.578110
+v 0.000000 0.000012 -74.000000
+v 0.000000 -14.436672 -72.578110
+v 0.000000 -41.112186 -61.528759
+v 2.816457 72.578110 -14.159274
+v 5.524680 68.367088 -27.774431
+v 8.020593 61.528759 -40.322227
+v 10.208277 52.325909 -51.320465
+v 12.003664 41.112209 -60.346481
+v 13.337756 28.318586 -67.053421
+v 14.159286 14.436695 -71.183540
+v 14.436684 0.000012 -72.578110
+v 14.159286 -14.436672 -71.183540
+v 13.337756 -28.318563 -67.053436
+v 12.003664 -41.112186 -60.346497
+v 10.208277 -52.325893 -51.320480
+v 8.020593 -61.528744 -40.322250
+v 5.524680 -68.367073 -27.774454
+v 2.816457 -72.578110 -14.159297
+v 5.524679 72.578110 -13.337745
+v 10.837049 68.367088 -26.162941
+v 15.732958 61.528759 -37.982700
+v 20.024256 52.325909 -48.342819
+v 23.546032 41.112206 -56.845139
+v 26.162949 28.318584 -63.162945
+v 27.774441 14.436694 -67.053429
+v 28.318573 0.000011 -68.367081
+v 27.774441 -14.436673 -67.053429
+v 26.162949 -28.318565 -63.162952
+v 23.546032 -41.112190 -56.845154
+v 20.024256 -52.325893 -48.342834
+v 15.732958 -61.528744 -37.982723
+v 10.837049 -68.367073 -26.162964
+v 5.524679 -72.578110 -13.337768
+v 8.020591 72.578110 -12.003651
+v 15.732958 68.367088 -23.546022
+v 22.840712 61.528755 -34.183525
+v 29.070713 52.325909 -43.507389
+v 34.183537 41.112206 -51.159267
+v 37.982712 28.318584 -56.845146
+v 40.322239 14.436693 -60.346485
+v 41.112198 0.000010 -61.528740
+v 40.322239 -14.436674 -60.346493
+v 37.982712 -28.318565 -56.845154
+v 34.183537 -41.112190 -51.159283
+v 29.070713 -52.325893 -43.507404
+v 22.840712 -61.528748 -34.183548
+v 15.732958 -68.367073 -23.546045
+v 8.020591 -72.578110 -12.003674
+v 10.208276 72.578110 -10.208263
+v 20.024256 68.367081 -20.024242
+v 29.070711 61.528755 -29.070698
+v 37.000000 52.325909 -36.999992
+v 43.507389 41.112206 -43.507378
+v 48.342823 28.318583 -48.342823
+v 51.320473 14.436692 -51.320465
+v 52.325901 0.000009 -52.325890
+v 51.320473 -14.436675 -51.320473
+v 48.342823 -28.318567 -48.342831
+v 43.507389 -41.112190 -43.507393
+v 37.000000 -52.325893 -37.000008
+v 29.070711 -61.528748 -29.070717
+v 20.024256 -68.367081 -20.024265
+v 10.208276 -72.578110 -10.208286
+v 12.003662 72.578110 -8.020578
+v 23.546034 68.367081 -15.732944
+v 34.183540 61.528755 -22.840698
+v 43.507397 52.325905 -29.070705
+v 51.159283 41.112202 -34.183525
+v 56.845146 28.318581 -37.982716
+v 60.346489 14.436690 -40.322227
+v 61.528748 0.000007 -41.112179
+v 60.346489 -14.436677 -40.322235
+v 56.845146 -28.318569 -37.982723
+v 51.159283 -41.112194 -34.183540
+v 43.507397 -52.325897 -29.070721
+v 34.183540 -61.528748 -22.840717
+v 23.546034 -68.367081 -15.732966
+v 12.003662 -72.578110 -8.020601
+v 0.000000 74.000000 0.000012
+v 13.337753 72.578110 -5.524666
+v 26.162949 68.367081 -10.837036
+v 37.982712 61.528755 -15.732942
+v 48.342827 52.325905 -20.024248
+v 56.845146 41.112202 -23.546015
+v 63.162945 28.318579 -26.162949
+v 67.053421 14.436688 -27.774429
+v 68.367073 0.000005 -28.318558
+v 67.053421 -14.436679 -27.774433
+v 63.162945 -28.318571 -26.162956
+v 56.845146 -41.112194 -23.546030
+v 48.342827 -52.325897 -20.024263
+v 37.982712 -61.528748 -15.732963
+v 26.162949 -68.367081 -10.837059
+v 13.337753 -72.578110 -5.524690
+v 14.159284 72.578110 -2.816444
+v 27.774437 68.367081 -5.524667
+v 40.322235 61.528751 -8.020576
+v 51.320473 52.325901 -10.208270
+v 60.346481 41.112202 -12.003650
+v 67.053421 28.318577 -13.337754
+v 71.183533 14.436686 -14.159277
+v 72.578094 0.000002 -14.436669
+v 71.183533 -14.436682 -14.159281
+v 67.053421 -28.318573 -13.337764
+v 60.346481 -41.112194 -12.003663
+v 51.320473 -52.325901 -10.208287
+v 40.322235 -61.528751 -8.020597
+v 27.774437 -68.367081 -5.524689
+v 14.159284 -72.578110 -2.816468
+v 14.436680 72.578110 0.000013
+v 28.318571 68.367081 0.000013
+v 41.112190 61.528751 0.000014
+v 52.325897 52.325901 0.000008
+v 61.528736 41.112198 0.000014
+v 68.367081 28.318575 0.000002
+v 72.578102 14.436684 0.000009
+v 73.999977 -0.000000 0.000012
+v 72.578102 -14.436684 0.000005
+v 68.367081 -28.318575 -0.000008
+v 61.528736 -41.112198 0.000000
+v 52.325897 -52.325901 -0.000010
+v 41.112190 -61.528751 -0.000006
+v 28.318571 -68.367081 -0.000009
+v 14.436680 -72.578110 -0.000011
+v 14.159283 72.578110 2.816469
+v 27.774437 68.367081 5.524692
+v 40.322231 61.528751 8.020604
+v 51.320469 52.325901 10.208283
+v 60.346478 41.112194 12.003675
+v 67.053421 28.318573 13.337757
+v 71.183525 14.436682 14.159293
+v 72.578079 -0.000002 14.436691
+v 71.183525 -14.436686 14.159289
+v 67.053421 -28.318577 13.337748
+v 60.346478 -41.112202 12.003661
+v 51.320469 -52.325901 10.208266
+v 40.322231 -61.528751 8.020583
+v 27.774437 -68.367081 5.524670
+v 14.159283 -72.578110 2.816445
+v 13.337751 72.578110 5.524691
+v 26.162949 68.367081 10.837060
+v 37.982704 61.528748 15.732968
+v 48.342823 52.325897 20.024260
+v 56.845135 41.112194 23.546041
+v 63.162945 28.318571 26.162949
+v 67.053413 14.436679 27.774445
+v 68.367050 -0.000005 28.318575
+v 67.053413 -14.436688 27.774441
+v 63.162945 -28.318579 26.162941
+v 56.845135 -41.112202 23.546026
+v 48.342823 -52.325905 20.024244
+v 37.982704 -61.528755 15.732947
+v 26.162949 -68.367081 10.837037
+v 13.337751 -72.578110 5.524667
+v 12.003658 72.578110 8.020600
+v 23.546030 68.367081 15.732967
+v 34.183529 61.528748 22.840719
+v 43.507389 52.325897 29.070717
+v 51.159267 41.112194 34.183544
+v 56.845146 28.318569 37.982712
+v 60.346478 14.436677 40.322239
+v 61.528713 -0.000007 41.112194
+v 60.346478 -14.436690 40.322231
+v 56.845146 -28.318581 37.982704
+v 51.159267 -41.112202 34.183529
+v 43.507389 -52.325905 29.070702
+v 34.183529 -61.528755 22.840700
+v 23.546030 -68.367081 15.732944
+v 12.003658 -72.578110 8.020577
+v 10.208272 72.578110 10.208284
+v 20.024250 68.367081 20.024265
+v 29.070698 61.528748 29.070719
+v 36.999996 52.325893 37.000004
+v 43.507378 41.112190 43.507393
+v 48.342823 28.318567 48.342823
+v 51.320457 14.436675 51.320473
+v 52.325863 -0.000009 52.325893
+v 51.320457 -14.436692 51.320465
+v 48.342823 -28.318583 48.342815
+v 43.507378 -41.112206 43.507378
+v 36.999996 -52.325909 36.999989
+v 29.070698 -61.528755 29.070700
+v 20.024250 -68.367081 20.024242
+v 10.208272 -72.578110 10.208261
+v 8.020587 72.578110 12.003670
+v 15.732951 68.367073 23.546043
+v 22.840698 61.528748 34.183548
+v 29.070709 52.325893 43.507397
+v 34.183525 41.112190 51.159279
+v 37.982712 28.318565 56.845142
+v 40.322220 14.436674 60.346485
+v 41.112160 -0.000010 61.528732
+v 40.322220 -14.436693 60.346478
+v 37.982712 -28.318584 56.845135
+v 34.183525 -41.112206 51.159264
+v 29.070709 -52.325909 43.507381
+v 22.840698 -61.528755 34.183525
+v 15.732951 -68.367088 23.546021
+v 8.020587 -72.578110 12.003647
+v 5.524676 72.578110 13.337760
+v 10.837043 68.367073 26.162958
+v 15.732944 61.528744 37.982716
+v 20.024252 52.325893 48.342831
+v 23.546019 41.112190 56.845142
+v 26.162949 28.318565 63.162937
+v 27.774422 14.436673 67.053413
+v 28.318539 -0.000011 68.367058
+v 27.774422 -14.436694 67.053413
+v 26.162949 -28.318584 63.162930
+v 23.546019 -41.112206 56.845127
+v 20.024252 -52.325909 48.342815
+v 15.732944 -61.528759 37.982693
+v 10.837043 -68.367088 26.162935
+v 5.524676 -72.578110 13.337737
+v 2.816455 72.578110 14.159289
+v 5.524674 68.367073 27.774445
+v 8.020581 61.528744 40.322231
+v 10.208275 52.325893 51.320477
+v 12.003653 41.112186 60.346481
+v 13.337756 28.318563 67.053421
+v 14.159272 14.436672 71.183517
+v 14.436653 -0.000012 72.578072
+v 14.159272 -14.436695 71.183517
+v 13.337756 -28.318586 67.053406
+v 12.003653 -41.112209 60.346466
+v 10.208275 -52.325909 51.320461
+v 8.020581 -61.528759 40.322208
+v 5.524674 -68.367088 27.774422
+v 2.816455 -72.578110 14.159266
+v -0.000001 72.578110 14.436686
+v -0.000004 68.367073 28.318579
+v -0.000007 61.528744 41.112186
+v -0.000001 52.325893 52.325901
+v -0.000008 41.112186 61.528736
+v 0.000002 28.318563 68.367073
+v -0.000010 14.436672 72.578087
+v -0.000024 -0.000012 73.999954
+v -0.000010 -14.436695 72.578087
+v 0.000002 -28.318586 68.367058
+v -0.000008 -41.112209 61.528721
+v -0.000001 -52.325909 52.325886
+v -0.000007 -61.528759 41.112164
+v -0.000004 -68.367088 28.318556
+v -0.000001 -72.578110 14.436663
+v -2.816456 72.578110 14.159288
+v -5.524682 68.367073 27.774445
+v -8.020595 61.528744 40.322227
+v -10.208276 52.325893 51.320469
+v -12.003667 41.112186 60.346474
+v -13.337750 28.318563 67.053413
+v -14.159292 14.436672 71.183517
+v -14.436698 -0.000012 72.578056
+v -14.159292 -14.436695 71.183517
+v -13.337750 -28.318586 67.053398
+v -12.003667 -41.112209 60.346458
+v -10.208276 -52.325909 51.320454
+v -8.020595 -61.528759 40.322205
+v -5.524682 -68.367088 27.774422
+v -2.816456 -72.578110 14.159266
+v -5.524676 72.578110 13.337759
+v -10.837049 68.367073 26.162956
+v -15.732955 61.528744 37.982704
+v -20.024252 52.325893 48.342827
+v -23.546032 41.112190 56.845135
+v -26.162939 28.318565 63.162933
+v -27.774441 14.436673 67.053398
+v -28.318579 -0.000011 68.367027
+v -27.774441 -14.436694 67.053398
+v -26.162939 -28.318584 63.162926
+v -23.546032 -41.112206 56.845119
+v -20.024252 -52.325909 48.342812
+v -15.732955 -61.528759 37.982681
+v -10.837049 -68.367088 26.162933
+v -5.524676 -72.578110 13.337736
+v -8.020586 72.578110 12.003665
+v -15.732955 68.367073 23.546038
+v -22.840706 61.528748 34.183525
+v -29.070709 52.325893 43.507393
+v -34.183533 41.112190 51.159267
+v -37.982700 28.318565 56.845139
+v -40.322235 14.436674 60.346466
+v -41.112190 -0.000010 61.528687
+v -40.322235 -14.436693 60.346458
+v -37.982700 -28.318584 56.845131
+v -34.183533 -41.112206 51.159252
+v -29.070709 -52.325909 43.507378
+v -22.840706 -61.528755 34.183502
+v -15.732955 -68.367088 23.546015
+v -8.020586 -72.578110 12.003642
+v -10.208269 72.578110 10.208280
+v -20.024252 68.367081 20.024258
+v -29.070700 61.528748 29.070696
+v -36.999992 52.325893 37.000000
+v -43.507381 41.112190 43.507378
+v -48.342812 28.318567 48.342819
+v -51.320461 14.436675 51.320450
+v -52.325878 -0.000009 52.325840
+v -51.320461 -14.436692 51.320442
+v -48.342812 -28.318583 48.342812
+v -43.507381 -41.112206 43.507362
+v -36.999992 -52.325909 36.999985
+v -29.070700 -61.528755 29.070677
+v -20.024252 -68.367081 20.024235
+v -10.208269 -72.578110 10.208257
+v 0.000000 -74.000000 -0.000012
+v -12.003654 72.578110 8.020596
+v -23.546028 68.367081 15.732960
+v -34.183525 61.528748 22.840698
+v -43.507385 52.325897 29.070713
+v -51.159267 41.112194 34.183525
+v -56.845131 28.318569 37.982708
+v -60.346478 14.436677 40.322212
+v -61.528713 -0.000007 41.112137
+v -60.346478 -14.436690 40.322205
+v -56.845131 -28.318581 37.982700
+v -51.159267 -41.112202 34.183510
+v -43.507385 -52.325905 29.070698
+v -34.183525 -61.528755 22.840679
+v -23.546028 -68.367081 15.732937
+v -12.003654 -72.578110 8.020573
+v -13.337746 72.578110 5.524686
+v -26.162941 68.367081 10.837053
+v -37.982693 61.528748 15.732945
+v -48.342819 52.325897 20.024258
+v -56.845127 41.112194 23.546017
+v -63.162926 28.318571 26.162945
+v -67.053406 14.436679 27.774414
+v -68.367035 -0.000005 28.318518
+v -67.053406 -14.436688 27.774410
+v -63.162926 -28.318579 26.162937
+v -56.845127 -41.112202 23.546001
+v -48.342819 -52.325905 20.024242
+v -37.982693 -61.528755 15.732924
+v -26.162941 -68.367081 10.837030
+v -13.337746 -72.578110 5.524662
+v -14.159275 72.578110 2.816465
+v -27.774429 68.367081 5.524685
+v -40.322208 61.528751 8.020586
+v -51.320461 52.325901 10.208282
+v -60.346462 41.112194 12.003653
+v -67.053406 28.318573 13.337756
+v -71.183517 14.436682 14.159265
+v -72.578049 -0.000002 14.436638
+v -71.183517 -14.436686 14.159261
+v -67.053406 -28.318577 13.337747
+v -60.346462 -41.112202 12.003639
+v -51.320461 -52.325901 10.208264
+v -40.322208 -61.528751 8.020565
+v -27.774429 -68.367081 5.524663
+v -14.159275 -72.578110 2.816441
+v -14.436670 72.578110 0.000011
+v -28.318560 68.367081 0.000007
+v -41.112164 61.528751 -0.000001
+v -52.325890 52.325901 0.000007
+v -61.528721 41.112198 -0.000005
+v -68.367058 28.318575 0.000004
+v -72.578079 14.436684 -0.000018
+v -73.999931 0.000000 -0.000033
+v -72.578079 -14.436684 -0.000022
+v -68.367058 -28.318575 -0.000006
+v -61.528721 -41.112198 -0.000019
+v -52.325890 -52.325901 -0.000011
+v -41.112164 -61.528751 -0.000021
+v -28.318560 -68.367081 -0.000015
+v -14.436670 -72.578110 -0.000013
+v -14.159273 72.578110 -2.816444
+v -27.774427 68.367081 -5.524670
+v -40.322205 61.528751 -8.020587
+v -51.320457 52.325901 -10.208268
+v -60.346455 41.112202 -12.003664
+v -67.053398 28.318577 -13.337748
+v -71.183502 14.436686 -14.159298
+v -72.578033 0.000002 -14.436703
+v -71.183502 -14.436682 -14.159302
+v -67.053398 -28.318573 -13.337757
+v -60.346455 -41.112194 -12.003677
+v -51.320457 -52.325901 -10.208285
+v -40.322205 -61.528751 -8.020608
+v -27.774427 -68.367081 -5.524692
+v -14.159273 -72.578110 -2.816468
+v -13.337744 72.578110 -5.524664
+v -26.162937 68.367081 -10.837036
+v -37.982677 61.528755 -15.732944
+v -48.342815 52.325905 -20.024244
+v -56.845112 41.112202 -23.546024
+v -63.162922 28.318579 -26.162935
+v -67.053391 14.436688 -27.774443
+v -68.367004 0.000005 -28.318579
+v -67.053391 -14.436679 -27.774446
+v -63.162922 -28.318571 -26.162943
+v -56.845112 -41.112194 -23.546040
+v -48.342815 -52.325897 -20.024260
+v -37.982677 -61.528748 -15.732965
+v -26.162937 -68.367081 -10.837059
+v -13.337744 -72.578110 -5.524688
+v -12.003652 72.578110 -8.020575
+v -23.546019 68.367081 -15.732941
+v -34.183502 61.528755 -22.840694
+v -43.507381 52.325905 -29.070700
+v -51.159245 41.112202 -34.183525
+v -56.845127 28.318581 -37.982697
+v -60.346451 14.436690 -40.322231
+v -61.528667 0.000007 -41.112186
+v -60.346451 -14.436677 -40.322239
+v -56.845127 -28.318569 -37.982704
+v -51.159245 -41.112194 -34.183540
+v -43.507381 -52.325897 -29.070715
+v -34.183502 -61.528748 -22.840714
+v -23.546019 -68.367081 -15.732964
+v -12.003652 -72.578110 -8.020597
+v -10.208266 72.578110 -10.208257
+v -20.024242 68.367081 -20.024235
+v -29.070673 61.528755 -29.070686
+v -36.999989 52.325909 -36.999985
+v -43.507355 41.112206 -43.507370
+v -48.342804 28.318583 -48.342800
+v -51.320431 14.436692 -51.320454
+v -52.325821 0.000009 -52.325871
+v -51.320431 -14.436675 -51.320461
+v -48.342804 -28.318567 -48.342808
+v -43.507355 -41.112190 -43.507385
+v -36.999989 -52.325893 -37.000000
+v -29.070673 -61.528748 -29.070705
+v -20.024242 -68.367081 -20.024258
+v -10.208266 -72.578110 -10.208280
+v -8.020582 72.578110 -12.003641
+v -15.732945 68.367088 -23.546011
+v -22.840677 61.528755 -34.183506
+v -29.070700 52.325909 -43.507378
+v -34.183506 41.112206 -51.159252
+v -37.982697 28.318584 -56.845123
+v -40.322197 14.436693 -60.346462
+v -41.112122 0.000010 -61.528702
+v -40.322197 -14.436674 -60.346470
+v -37.982697 -28.318565 -56.845131
+v -34.183506 -41.112190 -51.159267
+v -29.070700 -52.325893 -43.507393
+v -22.840677 -61.528748 -34.183529
+v -15.732945 -68.367073 -23.546034
+v -8.020582 -72.578110 -12.003664
+v -5.524673 72.578110 -13.337731
+v -10.837040 68.367088 -26.162928
+v -15.732925 61.528759 -37.982670
+v -20.024244 52.325909 -48.342812
+v -23.546001 41.112206 -56.845112
+v -26.162935 28.318584 -63.162918
+v -27.774405 14.436694 -67.053398
+v -28.318510 0.000011 -68.367020
+v -27.774405 -14.436673 -67.053398
+v -26.162935 -28.318565 -63.162926
+v -23.546001 -41.112190 -56.845127
+v -20.024244 -52.325893 -48.342827
+v -15.732925 -61.528744 -37.982693
+v -10.837040 -68.367073 -26.162951
+v -5.524673 -72.578110 -13.337754
+v -2.816453 72.578110 -14.159260
+v -5.524672 68.367088 -27.774416
+v -8.020567 61.528759 -40.322182
+v -10.208268 52.325909 -51.320454
+v -12.003638 41.112209 -60.346443
+v -13.337746 28.318586 -67.053391
+v -14.159258 14.436695 -71.183502
+v -14.436632 0.000012 -72.578026
+v -14.159258 -14.436672 -71.183502
+v -13.337746 -28.318563 -67.053406
+v -12.003638 -41.112186 -60.346458
+v -10.208268 -52.325893 -51.320469
+v -8.020567 -61.528744 -40.322205
+v -5.524672 -68.367073 -27.774439
+v -2.816453 -72.578110 -14.159283
+v 0.000001 72.578110 -14.436656
+v 0.000005 68.367088 -28.318546
+v 0.000007 52.325909 -52.325882
+v 0.000004 28.318586 -68.367043
+v 0.000004 -28.318563 -68.367058
+v 0.000007 -52.325893 -52.325897
+v 0.000016 -61.528744 -41.112156
+v 0.000005 -68.367073 -28.318569
+v 0.000001 -72.578110 -14.436679
+v -6.668874 -28.318586 67.710228
+v -11.105971 -46.719055 55.833458
+v -7.218316 7.218354 -72.578064
+v -2.762338 73.289055 6.668886
+v 2.762340 64.947922 -34.443310
+v 4.010296 61.528759 -40.717205
+v -19.083303 -34.715397 61.754696
+v -17.774849 -41.112209 58.595787
+v 11.105970 -46.719040 -55.833488
+v -17.878603 -56.927334 43.162750
+v -4.010293 73.289055 6.001839
+v -22.401810 64.947922 -26.308348
+v -40.717159 7.218352 -60.937584
+v 17.774849 -41.112186 -58.595825
+v 16.013960 -46.719040 -54.344666
+v 17.878607 -56.927319 -43.162777
+v -19.286831 -64.947922 28.864758
+v -5.104135 73.289055 5.104146
+v 27.103897 -46.719040 -49.751060
+v 24.547485 -52.325893 -45.925117
+v -25.955704 -61.528755 31.627090
+v 19.286835 -64.947906 -28.864796
+v -15.116261 -70.472595 15.116245
+v 5.104138 -73.289055 -5.104149
+v -6.001827 73.289055 4.010304
+v -1.408226 -72.578110 -14.297981
+v 25.955711 -61.528748 -31.627131
+v 21.432484 -64.947906 -27.103907
+v 15.116266 -70.472595 -15.116276
+v -16.013952 -70.472595 14.022404
+v -6.668873 73.289055 2.762349
+v -16.877148 70.472595 12.970619
+v -5.104135 -73.289055 5.104122
+v 27.103897 -64.947914 -21.432491
+v 21.785145 -68.367081 -17.878616
+v 16.013958 -70.472595 -14.022433
+v -18.441887 -70.472595 10.628799
+v -7.079638 73.289055 1.408238
+v 19.083305 -70.472595 -9.428830
+v 12.670708 -72.578110 -6.772646
+v -7.218335 73.289055 0.000011
+v -21.377615 70.472595 0.000009
+v -34.048302 14.436694 -63.699928
+v -10.628798 -64.947906 -32.878567
+v 13.748518 -72.578110 -4.170579
+v -14.297972 72.578110 -1.408217
+v 21.377625 70.472595 0.000013
+v -34.048317 64.947914 -6.772629
+v -24.854477 -68.367081 -13.285011
+v -19.083294 -70.472595 -9.428828
+v -40.745026 34.715393 -50.176250
+v 14.297981 72.578110 1.408241
+v 21.105558 70.472595 2.762352
+v 34.048332 64.947914 6.772648
+v -43.162746 56.927330 -17.878593
+v -67.710228 28.318577 -6.668872
+v -49.831635 -52.325897 -15.116273
+v -6.001826 73.289055 -4.010281
+v 26.968693 68.367081 8.180876
+v -36.083092 61.528755 -19.286819
+v 43.162766 56.927322 17.878614
+v -47.333313 46.719051 -31.627113
+v -51.823174 52.325901 5.104144
+v -30.173233 -64.947914 16.838854
+v -5.104133 73.289055 -5.104122
+v 30.764366 64.947914 15.732967
+v 36.083115 61.528748 19.286844
+v 40.745049 56.927322 22.401842
+v 47.333328 46.719044 31.627131
+v -45.925079 34.715393 -45.925087
+v -45.821331 56.927326 -9.114428
+v -4.010291 73.289055 -6.001814
+v -40.253689 -52.325905 33.035339
+v 40.253693 52.325897 33.035362
+v -38.845428 41.112206 -47.333313
+v 45.925102 34.715378 45.925106
+v -39.152447 21.377638 -58.595791
+v 52.593987 -46.719044 -21.785147
+v -24.547482 52.325893 45.925110
+v -2.762336 73.289055 -6.668859
+v 36.289043 46.719040 43.507393
+v 38.845451 41.112190 47.333336
+v 40.745045 34.715378 50.176266
+v 39.152466 21.377619 58.595814
+v -28.046457 7.218353 -67.710205
+v 40.253693 46.719055 -40.253685
+v 17.774836 41.112186 58.595810
+v -1.408226 73.289055 -7.079624
+v -6.001819 41.112209 -60.937592
+v 32.072830 28.318565 60.004040
+v -20.966831 14.436695 -69.118454
+v 28.046480 7.218331 67.710236
+v -14.297945 -7.218330 -71.880768
+v 0.000000 73.289055 -7.218322
+v 0.000004 46.719055 -56.927315
+v 0.000002 34.715397 -64.947891
+v 5.104142 -52.325893 -51.823189
+v 20.966846 14.436672 69.118469
+v 14.297962 -7.218354 71.880798
+v 7.218322 7.218330 72.578079
+v 7.218315 -0.000012 73.289017
+v 7.218322 -7.218354 72.578079
+v -0.000004 -21.377640 70.472580
+v -7.079651 -14.436695 71.880798
+v -6.668880 -21.377640 69.815750
+v -12.670709 -34.715397 63.699932
+v 5.104138 46.719055 -56.424606
+v 6.001832 41.112209 -60.937614
+v -19.750345 -28.318586 65.108162
+v -21.785141 -46.719055 52.593964
+v 9.114435 -56.927319 -45.821365
+v -30.764366 -34.715393 56.845127
+v -28.864782 -41.112206 54.002186
+v 15.116266 -52.325893 -49.831657
+v -25.955708 -56.927334 38.845444
+v 13.285004 -64.947906 -32.072842
+v 22.401836 -56.927319 -40.745064
+v 19.286835 -61.528744 -36.083134
+v 15.732958 -64.947906 -30.764385
+v 11.876774 -70.472595 -17.774860
+v 6.001831 -73.289055 -4.010307
+v -21.238884 -7.218330 -69.775261
+v -33.035347 56.927322 33.035347
+v -36.289043 -56.927330 29.070686
+v 17.878607 -68.367081 -21.785156
+v 12.970617 -70.472595 -16.877167
+v -9.428818 70.472595 19.083311
+v -5.104131 52.325909 -51.823166
+v -32.072815 28.318584 -60.004021
+v -19.750340 -70.472595 -8.180873
+v -41.263172 -56.927330 21.432459
+v -36.083107 -61.528755 19.286802
+v 11.105968 -72.578110 -9.114444
+v -19.750343 -70.472595 8.180846
+v 6.668877 73.289055 -2.762327
+v -69.118446 14.436687 -20.966871
+v -26.968685 -68.367081 8.180846
+v -20.161108 -70.472595 6.826736
+v 7.079642 73.289055 -1.408216
+v 20.966860 70.472595 -4.170556
+v -56.424591 46.719048 -5.104136
+v -64.291061 34.715385 -6.668876
+v -14.297973 -72.578110 1.408214
+v 14.297981 72.578110 -1.408216
+v -20.966850 70.472595 -4.170557
+v 34.715382 64.947914 0.000014
+v -54.082794 21.377621 44.651577
+v -45.925102 -52.325905 24.547470
+v -55.833469 14.436676 45.821331
+v 7.079641 73.289055 1.408240
+v 28.046505 68.367081 2.762353
+v 34.320400 64.947914 4.010308
+v 45.821350 56.927326 9.114444
+v -19.083294 70.472595 -9.428805
+v -35.591763 46.719040 44.079636
+v -38.845459 41.112190 47.333321
+v 67.710251 -7.218337 -28.046495
+v 6.668876 73.289055 2.762352
+v 33.242592 64.947914 9.428832
+v 39.152466 61.528748 11.876786
+v 44.332527 56.927322 14.022432
+v 52.593979 46.719044 21.785151
+v 43.162769 -56.927322 -17.878614
+v 6.001829 73.289055 4.010306
+v -27.103872 64.947914 -21.432465
+v -31.627087 61.528755 -25.955690
+v 45.925106 52.325897 24.547489
+v -40.253670 46.719055 -40.253677
+v 54.002205 34.715378 36.083126
+v 5.104136 73.289055 5.104148
+v -10.628809 70.472595 -18.441872
+v 44.079632 46.719040 35.591774
+v 47.333321 41.112190 38.845467
+v 49.751045 34.715378 41.263180
+v 49.831642 21.377621 49.831646
+v 4.010293 73.289055 6.001841
+v -27.103874 46.719055 -49.751030
+v -28.864754 41.112206 -54.002182
+v 43.162766 28.318567 52.593983
+v -26.968670 21.377640 -65.108162
+v 40.717190 7.218332 60.937607
+v 2.762338 73.289055 6.668886
+v -4.010283 61.528759 -40.717182
+v -5.104134 56.927334 -46.216324
+v 33.242584 21.377619 61.754711
+v 34.048321 14.436673 63.699951
+v -14.297945 7.218354 -71.880768
+v 28.046480 -7.218353 67.710236
+v 1.408227 73.289055 7.079651
+v 0.000002 64.947922 -34.715366
+v 0.000004 56.927334 -46.719036
+v -7.079627 21.377640 -69.775276
+v 6.001834 -34.715374 -64.356773
+v 21.238905 7.218330 69.775284
+v 21.377596 -0.000011 70.472565
+v 0.000003 -70.472595 -21.377625
+v 13.748514 -21.377640 69.118469
+v -0.000000 73.289055 7.218349
+v 7.079631 -14.436695 71.880798
+v 7.079637 -21.377640 69.775291
+v -0.000003 -34.715397 64.947891
+v -1.408228 73.289055 7.079650
+v -60.937595 7.218335 40.717171
+v -5.104138 -52.325909 51.823170
+v 0.000000 7.218354 -73.289055
+v -6.772638 -64.947922 34.048313
+v 6.668878 21.377640 -69.815765
+v 7.079643 14.436695 -71.880829
+v 7.218342 7.218354 -72.578110
+v -14.022423 -56.927334 44.332512
+v -11.876775 -61.528759 39.152443
+v -9.428822 -64.947922 33.242569
+v -8.180862 -70.472595 19.750336
+v -6.772628 72.578110 -12.670687
+v 14.022425 -56.927319 -44.332542
+v 11.876776 -61.528744 -39.152485
+v -13.285002 -68.367088 24.854473
+v 8.180864 -70.472595 -19.750366
+v -21.785130 -68.367081 -17.878611
+v 9.114428 56.927319 45.821350
+v 13.285004 -68.367073 -24.854504
+v 9.428820 -70.472595 -19.083319
+v 2.762340 -73.289055 -6.668890
+v -65.108162 28.318579 -19.750341
+v -32.072807 64.947914 -13.284990
+v 9.114433 -72.578110 -11.105980
+v -6.001827 -73.289055 4.010280
+v 17.774849 70.472595 -11.876760
+v -19.750343 70.472595 8.180869
+v -39.152451 -61.528755 11.876744
+v -32.878563 -64.947914 10.628794
+v 6.001831 73.289055 -4.010283
+v 12.670708 72.578110 -6.772622
+v 19.083305 70.472595 -9.428807
+v -34.048317 64.947914 6.772635
+v -52.593971 28.318567 43.162762
+v -7.079638 -73.289055 1.408215
+v 13.748518 72.578110 -4.170555
+v -28.046494 68.367081 2.762346
+v 34.048336 64.947914 -6.772622
+v -46.719025 56.927326 0.000003
+v 60.004044 34.715389 -24.854483
+v -7.218335 -73.289055 -0.000012
+v 21.105558 70.472595 -2.762327
+v 28.046505 68.367081 -2.762327
+v 34.443314 64.947914 -2.762327
+v 46.719044 56.927326 0.000011
+v -55.833458 46.719048 -11.105967
+v -45.821335 56.927326 9.114433
+v -7.079637 -73.289055 -1.408240
+v 40.717209 61.528751 4.010309
+v 46.216331 56.927326 5.104148
+v 55.833473 46.719048 11.105979
+v -60.004017 34.715389 -24.854479
+v -6.668872 -73.289055 -2.762350
+v 49.831646 52.325897 15.116272
+v -54.002178 41.112202 -28.864775
+v 60.004040 34.715382 24.854494
+v -58.595787 21.377634 -39.152462
+v -6.001826 -73.289055 -4.010305
+v -36.289028 46.719055 -43.507374
+v 50.176262 46.719044 26.308380
+v 54.002201 41.112194 28.864792
+v 56.845139 34.715382 30.764376
+v 58.595810 21.377623 39.152477
+v -51.823128 7.218350 -51.823166
+v -2.762338 -73.289055 6.668862
+v -5.104133 -73.289055 -5.104146
+v -58.595787 -21.377623 -39.152470
+v 52.593987 28.318567 43.162769
+v -45.821312 14.436693 -55.833458
+v 51.823158 7.218333 51.823181
+v -40.717159 -7.218332 -60.937584
+v -4.010291 -73.289055 -6.001838
+v -7.079627 -21.377617 -69.775276
+v 44.651585 21.377619 54.082806
+v 45.821339 14.436674 55.833477
+v -34.715317 0.000011 -64.947861
+v 40.717190 -7.218352 60.937607
+v -26.968670 -21.377617 -65.108162
+v -56.424549 -7.218334 -46.216324
+v -36.289043 56.927322 29.070705
+v 34.443291 7.218331 64.291077
+v 34.715347 -0.000011 64.947891
+v 34.443291 -7.218352 64.291077
+v 26.968685 -21.377640 65.108170
+v -12.670692 -34.715374 -63.699928
+v -1.408226 -73.289055 -7.079648
+v -28.864761 -64.947914 -19.286839
+v -6.668871 -28.318563 -67.710228
+v 2.762348 -64.947906 -34.443306
+v 2.762342 -68.367073 -28.046513
+v 0.000000 -73.289055 -7.218346
+v 20.556089 -21.377640 67.053413
+v 12.670704 -34.715397 63.699940
+v -31.627102 46.719055 -47.333313
+v 6.668879 -28.318586 67.710228
+v -0.000004 -46.719055 56.927303
+v -54.344627 -21.377621 -44.332523
+v -6.668880 -34.715397 64.291061
+v -6.001838 -41.112209 60.937592
+v -5.104142 -46.719055 56.424587
+v -9.114435 -56.927334 45.821331
+v 0.000000 -7.218330 -73.289055
+v -13.748508 72.578110 -4.170554
+v -63.699921 14.436689 -34.048336
+v 7.218342 0.000012 -73.289055
+v 7.079643 -7.218330 -72.591766
+v -15.116264 -52.325909 49.831635
+v -13.285002 -64.947922 32.072807
+v 4.170568 -70.472595 -20.966875
+v -21.105549 -70.472595 2.762325
+v -22.401833 -56.927334 40.745033
+v 10.628819 -64.947906 -32.878590
+v 8.180864 -68.367073 -26.968708
+v 5.524680 -70.472595 -20.556110
+v 20.966860 -70.472595 4.170557
+v -63.699928 34.715389 -12.670706
+v -11.105961 72.578110 9.114437
+v -7.079629 14.436695 -71.880806
+v -17.878603 -68.367081 21.785126
+v 6.772635 -72.578110 -12.670721
+v 4.010295 -73.289055 -6.001843
+v 15.116266 70.472595 -15.116253
+v 32.072830 64.947914 -13.284989
+v 11.105968 72.578110 -9.114421
+v 16.877155 70.472595 -12.970604
+v 28.864788 64.947914 -19.286819
+v 5.104138 73.289055 -5.104125
+v 24.854492 68.367081 -13.284990
+v 30.764374 64.947914 -15.732944
+v 20.161116 70.472595 -6.826740
+v 26.968693 68.367081 -8.180851
+v 33.242592 64.947914 -9.428807
+v 45.821354 56.927326 -9.114424
+v -5.104131 -52.325893 -51.823181
+v -63.699936 34.715382 12.670704
+v -9.114418 56.927334 -45.821320
+v -28.046494 68.367081 -2.762331
+v 40.717213 61.528751 -4.010282
+v 46.324066 56.927326 -4.010285
+v 56.927315 46.719048 0.000011
+v -46.324009 7.218351 -56.336166
+v -33.242569 64.947914 -9.428812
+v -39.152443 61.528755 -11.876765
+v 51.823181 52.325901 5.104146
+v -52.593964 46.719051 -21.785133
+v 63.699951 34.715382 12.670715
+v 54.344650 46.719044 16.013968
+v 58.595806 41.112194 17.774858
+v 61.754711 34.715382 19.083311
+v 65.108177 21.377625 26.968697
+v -44.079617 46.719055 -35.591755
+v -47.333298 41.112206 -38.845448
+v 60.004044 28.318569 32.072830
+v -49.831619 21.377636 -49.831627
+v 60.937595 7.218335 40.717216
+v 54.344650 21.377621 44.332531
+v 55.833466 14.436676 45.821354
+v -17.774841 70.472595 11.876778
+v 51.823158 -7.218350 51.823181
+v -45.925095 34.715378 45.925098
+v -33.242565 21.377638 -61.754688
+v 46.324043 7.218333 56.336189
+v 46.719009 -0.000009 56.927315
+v 46.324043 -7.218351 56.336189
+v 39.152466 -21.377638 58.595806
+v -43.162750 -28.318567 -52.593967
+v -17.774836 70.472595 -11.876758
+v -5.524673 70.472595 -20.556074
+v -21.238884 7.218353 -69.775261
+v -21.377571 0.000011 -70.472519
+v 34.048321 -14.436694 63.699944
+v 33.242584 -21.377638 61.754704
+v 24.854485 -34.715397 60.004032
+v -56.424549 7.218349 -46.216324
+v -24.854477 68.367081 -13.284988
+v 0.000002 21.377640 -70.472580
+v -30.173220 64.947914 -16.838863
+v 4.010300 -56.927319 -46.324074
+v 4.010304 -61.528744 -40.717205
+v 19.750353 -28.318586 65.108162
+v 11.105964 -46.719055 55.833466
+v -14.297972 -72.578110 -1.408240
+v -69.775284 -21.377630 7.079628
+v 6.001827 -34.715397 64.356758
+v 6.001822 -41.112209 60.937592
+v 6.001826 -46.719055 56.336174
+v -0.000004 -56.927334 46.719025
+v -67.053406 21.377625 20.556086
+v -69.118462 14.436680 20.966839
+v -19.083298 70.472595 9.428824
+v -2.762343 -68.367088 28.046490
+v -1.408230 -70.472595 21.238911
+v -14.022419 -70.472595 16.013939
+v -9.114428 -72.578110 11.105949
+v 7.079643 -14.436672 -71.880829
+v 6.668878 -21.377617 -69.815765
+v -4.010293 -73.289055 6.001815
+v -6.668873 34.715397 -64.291069
+v -4.170566 -72.578110 13.748501
+v -11.876770 70.472595 17.774851
+v 4.170568 -72.578110 -13.748532
+v -9.114428 72.578110 11.105972
+v 11.876774 70.472595 -17.774837
+v -24.547476 64.947906 24.547478
+v 9.114433 72.578110 -11.105957
+v 14.022423 70.472595 -16.013947
+v 24.547483 64.947922 -24.547470
+v -27.103889 64.947914 21.432480
+v 21.785145 68.367081 -17.878593
+v 27.103897 64.947914 -21.432468
+v 38.845467 56.927330 -25.955702
+v -43.162758 56.927322 17.878603
+v 4.010295 73.289055 -6.001819
+v 36.083126 61.528755 -19.286821
+v 41.263184 56.927330 -21.432472
+v -55.833462 46.719048 11.105967
+v -38.845444 56.927330 -25.955696
+v 39.152473 61.528755 -11.876760
+v 44.651592 56.927330 -12.970606
+v 55.833477 46.719048 -11.105960
+v -64.947891 34.715385 -0.000001
+v 51.823185 52.325901 -5.104131
+v -60.937588 41.112198 -6.001834
+v 64.947906 34.715385 0.000008
+v -69.118454 21.377630 -13.748522
+v -56.845119 -34.715382 -30.764372
+v 56.424603 46.719048 5.104149
+v 60.937607 41.112198 6.001844
+v 64.291077 34.715385 6.668886
+v 69.118469 21.377626 13.748526
+v -67.710197 7.218347 -28.046511
+v -32.878571 -21.377638 61.949261
+v 65.108185 28.318571 19.750353
+v -36.083115 -34.715393 54.002193
+v 67.710236 7.218337 28.046511
+v -60.937561 -7.218335 -40.717209
+v -2.762334 68.367088 -28.046482
+v -27.103874 -46.719040 -49.751045
+v 61.949280 21.377623 32.878578
+v 63.699944 14.436678 34.048344
+v -56.927246 0.000008 -46.719028
+v 60.937595 -7.218349 40.717216
+v -49.831619 -21.377621 -49.831635
+v -45.821312 -14.436674 -55.833466
+v -35.591743 56.927330 -29.920340
+v -44.651566 -21.377619 -54.082798
+v 56.424583 7.218334 46.216331
+v 56.927288 -0.000008 46.719044
+v 56.424583 -7.218349 46.216331
+v 49.831642 -21.377636 49.831638
+v -36.083099 -34.715378 -54.002197
+v -2.762336 70.472595 -21.105536
+v -67.710228 -28.318573 -6.668881
+v -12.670692 34.715397 -63.699921
+v 45.821339 -14.436693 55.833469
+v 44.651585 -21.377638 54.082798
+v 36.083118 -34.715393 54.002201
+v -21.785122 -46.719040 -52.593979
+v -72.578064 7.218341 7.218310
+v -72.578064 -7.218343 7.218308
+v 32.072830 -28.318584 60.004032
+v -17.774820 -41.112186 -58.595795
+v 21.785135 -46.719055 52.593971
+v -9.114418 -56.927319 -45.821335
+v -43.162758 -28.318583 52.593971
+v 0.000002 -34.715374 -64.947906
+v 0.000004 -46.719040 -56.927330
+v 18.441887 -34.715397 61.949268
+v 17.774836 -41.112209 58.595795
+v 16.877148 -46.719055 54.082794
+v 9.114428 -56.927334 45.821335
+v -34.320408 7.218331 64.356743
+v -34.715385 -0.000011 64.947861
+v 5.104137 -52.325909 51.823174
+v -0.000006 -64.947922 34.715359
+v 20.966846 -14.436695 69.118469
+v -6.668872 73.289055 -2.762326
+v -5.104142 -56.927334 46.216309
+v -4.010301 -61.528759 40.717182
+v -2.762344 -64.947922 34.443295
+v -4.170569 -70.472595 20.966843
+v 6.001832 -41.112186 -60.937630
+v 5.104138 -46.719040 -56.424622
+v -8.180865 -68.367088 26.968678
+v -5.524679 -70.472595 20.556080
+v 8.180864 70.472595 -19.750343
+v -28.046457 -7.218331 -67.710205
+v -44.651566 21.377638 -54.082790
+v -10.628815 -70.472595 18.441875
+v -6.772631 -72.578110 12.670689
+v 6.772635 72.578110 -12.670698
+v 10.628819 70.472595 -18.441883
+v 19.286835 64.947922 -28.864773
+v -6.668873 -73.289055 2.762325
+v 1.408229 -73.289055 -7.079655
+v 17.878607 68.367081 -21.785133
+v 22.401834 64.947922 -26.308359
+v 33.035355 56.927330 -33.035347
+v -12.670700 72.578110 6.772641
+v 31.627125 61.528755 -25.955698
+v 36.289055 56.927330 -29.070700
+v 47.333340 46.719051 -31.627115
+v -38.845455 56.927322 25.955706
+v 2.762340 73.289055 -6.668866
+v -26.968685 68.367081 8.180869
+v -33.242577 64.947914 9.428819
+v 45.925110 52.325905 -24.547478
+v 52.593987 46.719051 -21.785131
+v -34.320385 64.947914 4.010296
+v -40.717186 61.528751 4.010292
+v 49.831650 52.325905 -15.116259
+v -56.927307 46.719048 0.000001
+v 63.699951 34.715389 -12.670702
+v -15.116257 -52.325893 -49.831650
+v 56.336189 46.719048 -6.001821
+v 60.937607 41.112198 -6.001818
+v 64.356781 34.715385 -6.001824
+v 70.472595 21.377628 0.000005
+v -33.035343 52.325909 -40.253681
+v -32.072815 -28.318565 -60.004028
+v -54.344635 46.719051 -16.013954
+v -58.595783 41.112202 -17.774843
+v 67.710251 28.318573 6.668880
+v -65.108154 21.377632 -26.968689
+v 71.880798 7.218339 14.297992
+v -21.785130 68.367081 -17.878588
+v -29.920349 56.927319 35.591759
+v 67.173233 21.377625 20.161121
+v 69.118469 14.436680 20.966869
+v -60.937561 7.218349 -40.717209
+v 67.710236 -7.218347 28.046507
+v -71.880791 -14.436683 -7.079662
+v -46.324051 56.927326 4.010296
+v -34.048317 -64.947914 6.772614
+v -54.344627 21.377636 -44.332516
+v 64.356766 7.218336 34.320404
+v 64.947884 -0.000006 34.715385
+v 64.356766 -7.218348 34.320404
+v 58.595810 -21.377634 39.152470
+v -13.748510 72.578110 4.170576
+v -47.333324 -41.112206 38.845436
+v -20.556087 70.472595 5.524685
+v -46.718971 0.000009 -56.927284
+v 55.833466 -14.436691 45.821346
+v 54.344650 -21.377636 44.332523
+v 45.925102 -34.715393 45.925098
+v -22.401833 56.927319 40.745049
+v -44.332523 -21.377638 54.344635
+v 43.162766 -28.318583 52.593975
+v -24.854469 -34.715374 -60.004025
+v 31.627117 -46.719055 47.333321
+v -7.218316 -7.218330 -72.578064
+v -7.079629 -14.436672 -71.880806
+v 30.173237 -34.715393 57.161098
+v 28.864773 -41.112206 54.002197
+v 27.103889 -46.719055 49.751038
+v 17.878597 -56.927334 43.162758
+v 0.000002 -21.377617 -70.472580
+v -6.001816 -46.719040 -56.336178
+v 1.408231 -70.472595 -21.238934
+v 1.408229 -72.578110 -14.297988
+v 15.116263 -52.325909 49.831638
+v 6.772628 -64.947922 34.048313
+v -6.772619 -64.947906 -34.048321
+v 4.010290 -56.927334 46.324051
+v 4.010287 -61.528759 40.717186
+v 4.010289 -64.947922 34.320381
+v -0.000002 -70.472595 21.377609
+v -20.556076 21.377640 -67.053398
+v -31.627102 -46.719040 -47.333328
+v -4.170566 72.578110 13.748524
+v 4.170568 70.472595 -20.966852
+v -13.285002 64.947906 32.072830
+v 4.170568 72.578110 -13.748509
+v 6.826753 70.472595 -20.161108
+v 13.285004 64.947922 -32.072819
+v -25.955708 56.927319 38.845459
+v 13.285004 68.367088 -24.854481
+v 16.838881 64.947922 -30.173233
+v 25.955711 56.927334 -38.845459
+v -40.253685 46.719040 40.253689
+v 1.408227 -73.289055 7.079627
+v 25.955711 61.528755 -31.627111
+v 29.920357 56.927334 -35.591759
+v -40.253689 52.325897 33.035355
+v -47.333328 46.719044 31.627119
+v -51.823170 7.218333 51.823143
+v 40.253700 52.325905 -33.035347
+v -31.627121 46.719040 47.333328
+v 54.002213 34.715393 -36.083122
+v -60.004028 34.715382 24.854481
+v -30.173222 34.715393 -57.161087
+v -16.877134 -46.719040 -54.082798
+v 1.408229 73.289055 -7.079631
+v 49.751053 46.719051 -27.103886
+v 54.002213 41.112202 -28.864769
+v 57.161114 34.715389 -30.173237
+v -69.118462 21.377626 13.748510
+v -45.925098 -52.325897 -24.547487
+v -25.955675 61.528755 -31.627096
+v -29.070686 56.927334 -36.289032
+v 54.082809 46.719051 -16.877144
+v 58.595814 41.112202 -17.774832
+v 61.949284 34.715389 -18.441885
+v 69.118477 21.377630 -13.748515
+v -73.289001 7.218342 -0.000025
+v -51.823174 52.325901 -5.104131
+v -65.108162 -28.318571 -19.750349
+v 67.710251 28.318577 -6.668876
+v -71.880791 14.436685 -7.079658
+v 73.289040 7.218342 0.000011
+v -71.880768 -7.218339 -14.298002
+v -20.161106 70.472595 -6.826740
+v -49.751045 -46.719051 27.103876
+v 69.815765 21.377626 6.668883
+v 71.880814 14.436683 7.079652
+v -70.472519 0.000003 -21.377640
+v 71.880798 -7.218344 14.297990
+v -65.108154 -21.377625 -26.968697
+v -52.593971 -28.318583 43.162754
+v 69.815750 7.218338 21.105570
+v 70.472565 -0.000003 21.377632
+v 69.815750 -7.218345 21.105566
+v 65.108177 -21.377632 26.968689
+v -54.002186 -34.715378 -36.083118
+v 65.108185 -21.377625 -26.968697
+v -13.285002 68.367073 24.854496
+v -16.838877 64.947906 30.173241
+v 63.699944 -14.436689 34.048336
+v 61.949280 -21.377634 32.878571
+v 54.002205 -34.715393 36.083118
+v -40.253670 -46.719040 -40.253693
+v 52.593987 -28.318583 43.162762
+v -38.845428 -41.112190 -47.333328
+v 40.253685 -46.719055 40.253685
+v -25.955688 -56.927319 -38.845459
+v 40.745045 -34.715393 50.176258
+v 38.845451 -41.112206 47.333321
+v 36.289043 -46.719055 43.507378
+v 25.955704 -56.927334 38.845455
+v -13.284983 -64.947906 -32.072823
+v 24.547482 -52.325909 45.925098
+v -11.876746 -61.528744 -39.152447
+v 13.284993 -64.947922 32.072815
+v -4.170563 -70.472595 -20.966862
+v 2.762342 68.367088 -28.046490
+v -2.762334 -68.367073 -28.046505
+v -2.762336 -70.472595 -21.105558
+v 12.970610 -56.927334 44.651581
+v 11.876762 -61.528759 39.152451
+v 10.628809 -64.947922 32.878559
+v 4.170565 -70.472595 20.966845
+v -15.116255 -70.472595 -15.116268
+v 2.762335 -68.367088 28.046490
+v -40.745029 -56.927322 -22.401840
+v -1.408229 -72.578110 14.297964
+v -8.180862 70.472595 19.750359
+v 6.772636 64.947922 -34.048328
+v -6.772631 72.578110 12.670712
+v 8.180864 68.367088 -26.968685
+v 10.628819 64.947922 -32.878567
+v 17.878607 56.927334 -43.162762
+v -19.750340 28.318586 -65.108154
+v -17.878603 68.367081 21.785149
+v 19.286835 61.528759 -36.083111
+v 22.401836 56.927334 -40.745049
+v 31.627125 46.719055 -47.333328
+v -24.547472 52.325909 -45.925095
+v -27.103872 -64.947914 -21.432487
+v -0.000000 -73.289055 7.218325
+v 33.035355 52.325909 -40.253693
+v 36.289051 46.719055 -43.507385
+v 45.925106 34.715393 -45.925102
+v -61.754688 34.715389 -19.083300
+v -50.176247 -46.719044 -26.308376
+v 43.507393 46.719055 -36.289040
+v 47.333336 41.112206 -38.845451
+v 50.176270 34.715393 -40.745049
+v 58.595818 21.377634 -39.152470
+v -34.443295 64.947914 -2.762336
+v -49.831642 -52.325905 15.116253
+v -40.717186 61.528751 -4.010294
+v -46.216309 56.927326 -5.104135
+v -49.831642 52.325897 15.116270
+v 60.004044 28.318581 -32.072834
+v 65.108185 21.377632 -26.968689
+v -47.333324 41.112190 38.845451
+v -56.336174 46.719048 6.001830
+v -60.937592 41.112198 6.001823
+v 65.108185 28.318579 -19.750351
+v -70.472565 21.377628 -0.000007
+v 71.880814 7.218344 -14.297973
+v -20.161116 -21.377640 67.173225
+v -25.955704 61.528748 31.627110
+v 69.775307 21.377630 -7.079638
+v 71.880814 14.436685 -7.079634
+v -71.880768 7.218344 -14.298000
+v 73.289040 -7.218342 0.000008
+v -67.173210 21.377632 -20.161116
+v 72.591751 7.218341 7.079652
+v 73.289032 -0.000001 7.218351
+v 72.591751 -7.218343 7.079650
+v 69.118469 -21.377630 13.748518
+v -64.356728 7.218348 -34.320408
+v -64.947838 0.000006 -34.715382
+v 69.118469 -14.436687 20.966866
+v 67.173233 -21.377632 20.161114
+v 60.004040 -34.715389 24.854483
+v -7.079637 73.289055 -1.408216
+v -55.833443 -14.436676 -45.821350
+v 60.004044 -28.318581 32.072823
+v -45.925079 -34.715378 -45.925095
+v 47.333328 -46.719051 31.627115
+v 49.751045 -34.715393 41.263172
+v 47.333321 -41.112206 38.845451
+v 44.079632 -46.719055 35.591759
+v 33.035347 -56.927330 33.035347
+v -30.173222 -34.715378 -57.161095
+v -28.864754 -41.112190 -54.002197
+v 33.035355 -52.325909 40.253685
+v -17.878586 -56.927319 -43.162758
+v 19.286825 -64.947922 28.864773
+v -54.002197 34.715378 36.083115
+v 21.432476 -56.927334 41.263172
+v 19.286821 -61.528759 36.083111
+v 16.838871 -64.947922 30.173229
+v 8.180860 -70.472595 19.750336
+v 1.408229 72.578110 -14.297965
+v 1.408231 70.472595 -21.238911
+v -4.010280 -56.927319 -46.324051
+v -4.010275 -61.528744 -40.717182
+v -4.010281 -64.947906 -34.320385
+v 8.180859 -68.367088 26.968678
+v 6.826749 -70.472595 20.161100
+v 1.408225 -70.472595 21.238911
+v 1.408227 -72.578110 14.297964
+v -16.877134 46.719055 -54.082783
+v -17.878593 -68.367081 -21.785145
+v -14.022412 -70.472595 -16.013962
+v -18.441874 34.715397 -61.949253
+v -11.876775 61.528744 39.152466
+v 9.114435 56.927334 -45.821350
+v -21.785141 46.719040 52.593979
+v -60.004025 28.318581 -32.072815
+v -40.253685 -52.325897 -33.035358
+v 15.116261 70.472595 15.116275
+v -41.263172 34.715378 49.751041
+v 11.876776 61.528759 -39.152462
+v 14.022425 56.927334 -44.332527
+v 21.785145 46.719055 -52.593979
+v -36.083115 34.715378 54.002201
+v -40.717186 -61.528751 4.010272
+v -49.831635 52.325905 -15.116256
+v -64.356728 -7.218336 -34.320408
+v -34.320385 -64.947914 4.010275
+v -67.710220 -7.218347 28.046463
+v -30.764360 64.947914 15.732952
+v 24.547485 52.325909 -45.925102
+v 27.103897 46.719055 -49.751045
+v 36.083122 34.715393 -54.002209
+v -49.831635 21.377621 49.831635
+v -69.118454 -21.377626 -13.748529
+v -5.524673 -70.472595 -20.556097
+v -54.002197 41.112194 28.864771
+v -58.595795 -41.112202 17.774820
+v 4.010293 -73.289055 6.001817
+v -54.082794 -46.719051 16.877132
+v 38.845463 41.112206 -47.333321
+v 41.263180 34.715393 -49.751049
+v 49.831650 21.377636 -49.831646
+v -58.595802 21.377623 39.152462
+v -19.286831 -61.528759 36.083092
+v -15.732955 -64.947922 30.764347
+v -6.668873 -34.715374 -64.291084
+v 52.593987 28.318583 -43.162769
+v -60.004028 28.318569 32.072826
+v 60.937618 7.218349 -40.717205
+v -67.710220 7.218337 28.046467
+v -6.001819 -41.112186 -60.937607
+v 43.162769 56.927330 -17.878595
+v -16.013960 -46.719055 54.344635
+v 61.754715 21.377634 -33.242588
+v 63.699955 14.436689 -34.048328
+v 67.710251 7.218347 -28.046492
+v -71.880783 -7.218344 14.297950
+v 67.053421 21.377632 -20.556091
+v 69.118477 14.436687 -20.966852
+v -73.288986 -0.000001 7.218302
+v 71.880814 -7.218339 -14.297975
+v -70.472565 -21.377628 -0.000014
+v -36.083099 34.715393 -54.002190
+v 72.578094 7.218343 -7.218330
+v 73.289032 0.000001 -7.218328
+v 72.578094 -7.218341 -7.218332
+v 70.472595 -21.377628 -0.000001
+v -63.699928 -34.715382 -12.670717
+v 71.880814 -14.436685 7.079647
+v 69.815765 -21.377630 6.668877
+v 63.699951 -34.715389 12.670704
+v -52.593964 -46.719044 -21.785149
+v 65.108185 -28.318579 19.750345
+v -54.002178 -41.112194 -28.864790
+v 52.593979 -46.719051 21.785135
+v -38.845444 -56.927322 -25.955715
+v 56.845139 -34.715389 30.764364
+v 54.002201 -41.112202 28.864777
+v 50.176262 -46.719051 26.308365
+v 38.845459 -56.927330 25.955700
+v -24.547459 -64.947906 -24.547482
+v 40.253693 -52.325905 33.035347
+v 36.289043 -56.927330 29.070700
+v 24.547474 -64.947922 24.547470
+v -11.876764 -70.472595 -17.774849
+v -49.831635 -21.377636 49.831627
+v 29.070704 -56.927334 36.289040
+v 25.955698 -61.528755 31.627113
+v 22.401825 -64.947922 26.308359
+v 11.876769 -70.472595 17.774834
+v 13.284997 -68.367088 24.854477
+v 10.628814 -70.472595 18.441879
+v -29.070686 -56.927319 -36.289047
+v 0.000003 70.472595 -21.377602
+v 5.104142 52.325909 -51.823174
+v -55.833443 14.436691 -45.821342
+v -25.955675 -61.528748 -31.627115
+v -22.401810 -64.947906 -26.308371
+v 4.170566 -72.578110 13.748502
+v -0.000002 70.472595 21.377632
+v -50.176247 46.719051 -26.308361
+v -21.238916 -70.472595 -1.408242
+v -56.845119 34.715389 -30.764360
+v -1.408229 72.578110 14.297987
+v -2.762341 70.472595 21.105564
+v -6.772638 64.947906 34.048336
+v -51.823174 -52.325901 5.104127
+v -5.524679 70.472595 20.556103
+v -8.180865 68.367073 26.968700
+v -10.628819 64.947906 32.878574
+v 6.668877 -73.289055 -2.762351
+v 11.105970 46.719055 -55.833473
+v -45.925102 52.325897 24.547485
+v -50.176254 46.719044 26.308365
+v -19.286831 61.528744 36.083115
+v 15.116266 52.325909 -49.831642
+v 16.877155 46.719055 -54.082802
+v 24.854490 34.715397 -60.004044
+v -24.547482 -52.325909 45.925095
+v -61.949265 -34.715389 18.441874
+v -33.035351 52.325893 40.253696
+v 28.864784 41.112206 -54.002205
+v 30.764372 34.715393 -56.845142
+v 39.152473 21.377638 -58.595814
+v -13.748502 -21.377617 -69.118454
+v 2.762338 -73.289055 6.668862
+v -43.507385 46.719040 36.289047
+v 43.162766 28.318583 -52.593983
+v -50.176254 34.715378 40.745041
+v 51.823189 7.218350 -51.823181
+v 54.082809 21.377636 -44.651592
+v 55.833481 14.436691 -45.821346
+v -65.108170 21.377625 26.968681
+v 60.937618 -7.218335 -40.717205
+v -57.161095 34.715382 30.173235
+v -4.170563 70.472595 -20.966839
+v -65.108170 28.318571 19.750351
+v 64.291084 7.218348 -34.443306
+v 64.947906 0.000006 -34.715370
+v 64.291084 -7.218336 -34.443306
+v -69.775284 21.377626 7.079634
+v 69.775299 7.218345 -21.238916
+v 70.472580 0.000003 -21.377613
+v 69.775299 -7.218338 -21.238920
+v 69.118477 -21.377626 -13.748523
+v -72.591721 7.218343 -7.079665
+v -73.288986 0.000001 -7.218368
+v 71.880814 -14.436683 -7.079638
+v 69.775307 -21.377626 -7.079644
+v 64.947906 -34.715385 -0.000004
+v -69.118446 -14.436680 -20.966875
+v 67.710251 -28.318577 6.668870
+v -60.004017 -34.715382 -24.854490
+v 55.833473 -46.719048 11.105964
+v 61.754711 -34.715389 19.083300
+v 58.595806 -41.112202 17.774843
+v 54.344650 -46.719051 16.013952
+v 43.162766 -56.927330 17.878595
+v -49.751022 -34.715378 -41.263172
+v -47.333298 -41.112190 -38.845463
+v 45.925106 -52.325905 24.547474
+v -33.035332 -56.927322 -33.035351
+v 28.864780 -64.947914 19.286821
+v -13.284992 -68.367073 -24.854492
+v -46.324009 -7.218333 -56.336166
+v -10.628809 -70.472595 -18.441895
+v -33.035343 -52.325893 -40.253696
+v 31.627113 -61.528755 25.955700
+v -19.286812 -64.947906 -28.864780
+v 15.116261 -70.472595 15.116252
+v 7.218340 73.289055 0.000012
+v -52.593964 28.318583 -43.162746
+v -67.710197 -7.218337 -28.046515
+v -21.432461 -56.927319 -41.263176
+v -19.286800 -61.528744 -36.083111
+v 17.878601 -68.367081 21.785131
+v 14.022419 -70.472595 16.013945
+v -46.216309 -56.927326 -5.104153
+v -71.880798 14.436683 7.079624
+v -34.443295 -64.947914 -2.762357
+v -8.180856 -68.367073 -26.968695
+v 6.772632 -72.578110 12.670692
+v 4.170565 70.472595 20.966867
+v 4.010300 56.927334 -46.324059
+v -54.082794 46.719044 16.877148
+v -58.595795 41.112194 17.774836
+v -11.105961 -72.578110 9.114414
+v -61.949265 34.715382 18.441885
+v 1.408227 72.578110 14.297987
+v 1.408225 70.472595 21.238934
+v -0.000006 64.947906 34.715382
+v -29.920349 -56.927334 35.591743
+v -21.432480 -64.947922 27.103868
+v -2.762343 68.367073 28.046513
+v -4.010299 64.947906 34.320404
+v -9.114435 56.927319 45.821346
+v -19.083303 34.715374 61.754704
+v -16.013960 46.719040 54.344650
+v -17.774849 41.112186 58.595802
+v 12.670710 34.715397 -63.699955
+v -26.968689 21.377617 65.108162
+v 17.774849 41.112209 -58.595810
+v 19.083305 34.715397 -61.754715
+v 26.968695 21.377640 -65.108185
+v -40.717213 7.218332 60.937576
+v -21.377615 -70.472595 -0.000014
+v -40.745026 -34.715378 -50.176258
+v 32.072830 28.318584 -60.004047
+v 33.242592 21.377638 -61.754715
+v 40.717216 7.218352 -60.937614
+v -51.823170 -7.218350 51.823143
+v 6.001829 -73.289055 4.010283
+v -39.152447 -21.377619 -58.595798
+v 44.332531 21.377638 -54.344654
+v 45.821358 14.436693 -55.833477
+v -56.336178 7.218334 46.324024
+v 51.823189 -7.218333 -51.823181
+v -56.336178 -7.218349 46.324024
+v 56.336197 7.218349 -46.324059
+v 56.927322 0.000008 -46.719032
+v 56.336197 -7.218334 -46.324059
+v 58.595818 -21.377623 -39.152477
+v -65.108170 -21.377632 26.968674
+v -20.966852 70.472595 4.170575
+v -73.289001 -7.218342 -0.000028
+v 63.699955 -14.436678 -34.048336
+v 61.754715 -21.377623 -33.242596
+v -63.699936 -34.715389 12.670692
+v 69.118477 -14.436680 -20.966856
+v 67.053421 -21.377625 -20.556099
+v 63.699951 -34.715382 -12.670713
+v -56.927307 -46.719048 -0.000015
+v 67.710251 -28.318573 -6.668886
+v -40.717213 -7.218352 60.937576
+v 56.927315 -46.719048 -0.000005
+v -45.821331 -56.927326 -9.114447
+v -34.048302 -14.436673 -63.699936
+v -4.170563 -72.578110 -13.748518
+v -33.242565 -21.377619 -61.754696
+v 64.291077 -34.715385 6.668874
+v 60.937607 -41.112198 6.001831
+v 56.424603 -46.719048 5.104134
+v 45.821350 -56.927326 9.114425
+v -32.072807 -64.947914 -13.285011
+v -16.013947 70.472595 -14.022405
+v 49.831646 -52.325905 15.116255
+v -36.083092 -61.528748 -19.286839
+v 32.072826 -64.947914 13.284993
+v -17.774836 -70.472595 -11.876781
+v -26.968681 -68.367081 -8.180876
+v -72.591721 -7.218341 -7.079667
+v 40.745049 -56.927330 22.401823
+v 36.083115 -61.528755 19.286825
+v 30.764366 -64.947914 15.732946
+v -16.877142 -70.472595 -12.970621
+v 17.774845 -70.472595 11.876760
+v -55.833458 -46.719048 -11.105982
+v -12.670700 -72.578110 6.772617
+v -67.710236 28.318573 6.668880
+v 26.308365 -64.947914 22.401821
+v 21.785141 -68.367081 17.878593
+v -9.114424 -72.578110 -11.105972
+v -8.180857 70.472595 -19.750330
+v -46.719032 -0.000009 56.927261
+v -46.216324 -7.218351 56.424568
+v -21.785141 -68.367081 17.878586
+v 9.114429 -72.578110 11.105954
+v -4.170563 72.578110 -13.748495
+v 8.180860 70.472595 19.750359
+v -6.772619 64.947922 -34.048298
+v 32.072830 -64.947914 -13.285010
+v -32.072819 28.318565 60.004036
+v 4.170566 72.578110 13.748525
+v 5.524675 70.472595 20.556103
+v 6.772628 64.947906 34.048336
+v 6.668880 28.318586 -67.710228
+v 20.556089 21.377617 67.053413
+v 2.762335 68.367073 28.046513
+v -0.000004 56.927319 46.719040
+v 6.772636 -64.947906 -34.048351
+v -4.010301 61.528744 40.717205
+v -5.104142 56.927319 46.216324
+v -11.105971 46.719040 55.833473
+v -15.116264 52.325893 49.831650
+v -24.854485 34.715374 60.004032
+v 13.748521 21.377640 -69.118484
+v -26.308371 46.719040 50.176262
+v -28.864782 41.112190 54.002201
+v 19.750353 28.318586 -65.108177
+v -39.152466 21.377619 58.595802
+v 28.046507 7.218353 -67.710251
+v -43.162758 28.318567 52.593979
+v 34.048340 14.436694 -63.699955
+v 34.443321 7.218352 -64.291084
+v 40.717216 -7.218332 -60.937614
+v 5.104136 -73.289055 5.104125
+v 46.216335 7.218351 -56.424606
+v 46.719048 0.000009 -56.927315
+v 46.216335 -7.218333 -56.424606
+v 49.831650 -21.377621 -49.831654
+v -61.754700 21.377623 33.242580
+v -63.699944 14.436678 34.048313
+v 55.833481 -14.436676 -45.821354
+v 54.082809 -21.377621 -44.651600
+v 54.002213 -34.715378 -36.083130
+v -17.774841 -70.472595 11.876755
+v -19.750340 -28.318563 -65.108170
+v -69.775276 7.218338 21.238892
+v -70.472542 -0.000003 21.377579
+v -69.775276 -7.218345 21.238888
+v 60.004044 -28.318569 -32.072842
+v 60.004044 -34.715382 -24.854494
+v -34.443264 -7.218331 -64.291046
+v -71.880798 -14.436685 7.079619
+v 65.108185 -28.318571 -19.750359
+v -64.947891 -34.715385 -0.000012
+v 55.833477 -46.719048 -11.105975
+v -67.173210 -21.377625 -20.161123
+v 64.356781 -34.715385 -6.001835
+v 60.937607 -41.112198 -6.001832
+v 56.336189 -46.719048 -6.001836
+v 46.719044 -56.927326 -0.000008
+v -69.815735 21.377630 -6.668883
+v -14.297973 72.578110 1.408238
+v -21.238918 70.472595 1.408236
+v -61.754688 -34.715382 -19.083311
+v -58.595783 -41.112194 -17.774858
+v 51.823181 -52.325901 5.104128
+v -43.162746 -56.927322 -17.878613
+v 34.048332 -64.947914 6.772627
+v -17.878603 56.927319 43.162766
+v -24.854485 -68.367081 13.284984
+v -55.833469 -14.436691 45.821323
+v 44.332527 -56.927330 14.022413
+v 39.152466 -61.528755 11.876765
+v 33.242592 -64.947914 9.428811
+v 19.750351 -70.472595 8.180853
+v -12.970596 -56.927319 -44.651581
+v -44.332523 21.377619 54.344643
+v -45.821350 14.436674 55.833458
+v -35.591743 -56.927322 -29.920359
+v -31.627087 -61.528748 -25.955709
+v 24.854488 -68.367081 13.284990
+v 19.083303 -70.472595 9.428807
+v 16.013954 -70.472595 14.022409
+v 11.105965 -72.578110 9.114420
+v 11.876769 70.472595 17.774857
+v -6.772628 -72.578110 -12.670710
+v 6.772632 72.578110 12.670715
+v 9.428815 70.472595 19.083313
+v 13.284993 64.947906 32.072838
+v -11.105953 -46.719040 -55.833466
+v -1.408226 72.578110 -14.297958
+v 8.180859 68.367073 26.968700
+v 9.428812 64.947906 33.242596
+v 6.001834 34.715397 -64.356758
+v 4.010289 64.947906 34.320404
+v 4.010287 61.528744 40.717209
+v 4.010290 56.927319 46.324066
+v -0.000005 46.719040 56.927319
+v -25.955688 56.927334 -38.845444
+v -5.104138 52.325893 51.823185
+v -12.670709 34.715374 63.699940
+v -20.161116 21.377617 67.173225
+v -20.966866 14.436672 69.118454
+v 14.297985 7.218354 -71.880829
+v -28.046509 -7.218353 67.710213
+v 20.161118 21.377640 -67.173248
+v 20.966864 14.436695 -69.118484
+v 21.238930 7.218353 -69.775314
+v -34.320408 -7.218352 64.356743
+v -39.152466 -21.377638 58.595795
+v -54.344635 -46.719044 -16.013969
+v 34.715385 0.000011 -64.947906
+v -45.821350 -14.436693 55.833450
+v 39.152473 -21.377619 -58.595821
+v -45.925095 -34.715393 45.925091
+v -20.966831 -14.436672 -69.118454
+v 7.079641 -73.289055 1.408217
+v -21.432461 56.927334 -41.263161
+v -11.876770 -70.472595 17.774828
+v 45.821358 -14.436674 -55.833485
+v 44.332531 -21.377619 -54.344662
+v 45.925106 -34.715378 -45.925110
+v -54.002197 -34.715393 36.083107
+v -60.004025 -28.318569 -32.072823
+v -6.668871 28.318586 -67.710213
+v 52.593987 -28.318567 -43.162777
+v -60.004028 -28.318581 32.072819
+v 47.333340 -46.719044 -31.627131
+v -52.593971 -46.719051 21.785122
+v -69.815712 -7.218338 -21.105576
+v 57.161114 -34.715382 -30.173248
+v 54.002213 -41.112194 -28.864784
+v 49.751053 -46.719044 -27.103901
+v -45.821335 -56.927326 9.114414
+v -63.699944 -14.436689 34.048306
+v -13.748510 -72.578110 4.170552
+v -61.754700 -21.377634 33.242573
+v 61.949284 -34.715382 -18.441896
+v 58.595814 -41.112194 -17.774847
+v 54.082809 -46.719044 -16.877159
+v 45.821354 -56.927326 -9.114443
+v -34.715363 -64.947914 -0.000018
+v -22.401827 64.947906 26.308369
+v -56.927296 -0.000008 46.718987
+v 51.823185 -52.325901 -5.104148
+v -40.717186 -61.528751 -4.010314
+v 34.715382 -64.947914 -0.000008
+v -20.966850 -70.472595 -4.170580
+v -69.815735 -21.377626 -6.668890
+v -32.072815 64.947914 13.284999
+v -69.118462 -21.377630 13.748503
+v 46.216331 -56.927326 5.104130
+v 40.717209 -61.528751 4.010289
+v 34.443314 -64.947914 2.762332
+v -20.556086 -70.472595 -5.524690
+v -34.715363 64.947914 0.000003
+v 26.968693 -68.367081 8.180853
+v -12.670698 -72.578110 -6.772643
+v -15.116255 70.472595 -15.116245
+v 12.670705 -72.578110 6.772622
+v -9.114424 72.578110 -11.105949
+v -12.970606 70.472595 -16.877134
+v -19.286812 64.947922 -28.864758
+v 9.114429 72.578110 11.105977
+v -13.284992 68.367088 -24.854469
+v 19.286825 64.947906 28.864796
+v -17.878586 56.927334 -43.162743
+v -47.333313 -46.719044 -31.627129
+v 13.284997 68.367073 24.854500
+v 15.732947 64.947906 30.764380
+v 17.878597 56.927319 43.162773
+v -11.105953 46.719055 -55.833450
+v -43.507385 -46.719055 36.289032
+v -58.595802 -21.377634 39.152454
+v 11.876762 61.528744 39.152473
+v 12.970610 56.927319 44.651596
+v 11.105964 46.719040 55.833481
+v -10.628798 64.947922 -32.878544
+v 5.104137 52.325893 51.823189
+v -60.004028 -34.715389 24.854469
+v -0.000003 34.715374 64.947906
+v -5.104142 46.719040 56.424603
+v -6.001838 41.112186 60.937607
+v -6.668880 34.715374 64.291077
+v -13.748522 21.377617 69.118462
+v -60.937595 -7.218349 40.717171
+v -15.116257 52.325909 -49.831635
+v -19.750345 28.318563 65.108177
+v -28.046509 7.218331 67.710213
+v 14.297985 -7.218330 -71.880829
+v -44.079617 -46.719040 -35.591770
+v -15.732935 64.947922 -30.764339
+v -32.878571 21.377619 61.949268
+v -34.048340 14.436673 63.699932
+v 21.377628 0.000011 -70.472595
+v 21.105562 -7.218330 -69.815765
+v 26.968695 -21.377617 -65.108185
+v -1.408228 -73.289055 7.079627
+v -19.286831 64.947906 28.864780
+v -63.699921 -14.436678 -34.048344
+v -51.823128 -7.218333 -51.823166
+v -44.332512 56.927330 -14.022415
+v -61.949257 -21.377623 -32.878574
+v -46.216324 7.218333 56.424568
+v 34.443321 -7.218331 -64.291084
+v 34.048340 -14.436673 -63.699963
+v 32.878578 -21.377619 -61.949291
+v 36.083122 -34.715378 -54.002216
+v -34.048317 -64.947914 -6.772650
+v -65.108170 -28.318579 19.750343
+v 6.668876 -73.289055 2.762328
+v -21.105549 70.472595 -2.762330
+v 43.162766 -28.318567 -52.593990
+v -54.082794 -21.377636 44.651569
+v 40.253693 -46.719040 -40.253700
+v -64.291061 7.218336 34.443275
+v -64.947876 -0.000006 34.715328
+v -31.627113 61.528748 25.955698
+v -64.291061 -7.218348 34.443275
+v 50.176270 -34.715378 -40.745056
+v 47.333336 -41.112190 -38.845467
+v 43.507393 -46.719040 -36.289055
+v 38.845467 -56.927322 -25.955721
+v -14.022419 70.472595 16.013962
+v 45.925110 -52.325897 -24.547493
+v 40.745056 -56.927322 -22.401842
+v -2.762336 -73.289055 -6.668883
+v -64.356758 -34.715385 6.001817
+v -60.937592 -41.112198 6.001810
+v 49.831650 -52.325897 -15.116276
+v -46.719025 -56.927326 -0.000016
+v 34.048336 -64.947914 -6.772643
+v 28.046507 -7.218331 -67.710251
+v -55.833462 -46.719048 11.105951
+v 46.324066 -56.927326 -4.010303
+v 40.717213 -61.528751 -4.010302
+v 34.320404 -64.947914 -4.010303
+v 21.377625 -70.472595 -0.000010
+v -20.556076 -21.377617 -67.053398
+v -44.332512 -56.927322 -14.022434
+v -39.152443 -61.528748 -11.876786
+v 28.046505 -68.367081 2.762330
+v 21.238926 -70.472595 1.408218
+v -30.173220 -64.947914 -16.838886
+v 20.161116 -70.472595 6.826741
+v 13.748517 -72.578110 4.170556
+v 17.774845 70.472595 11.876783
+v -11.105959 -72.578110 -9.114439
+v 11.105965 72.578110 9.114443
+v 16.013954 70.472595 14.022432
+v 24.547474 64.947906 24.547493
+v 14.022419 70.472595 16.013968
+v 17.878601 68.367081 21.785154
+v -13.284983 64.947922 -32.072800
+v 25.955704 56.927319 38.845470
+v -6.001816 46.719055 -56.336163
+v -8.180856 68.367088 -26.968672
+v 19.286821 61.528744 36.083134
+v 21.432476 56.927319 41.263187
+v 21.785135 46.719040 52.593987
+v -4.010281 64.947922 -34.320362
+v 15.116263 52.325893 49.831654
+v 12.670704 34.715374 63.699947
+v -11.876746 61.528759 -39.152424
+v -69.815712 7.218345 -21.105572
+v -12.970596 56.927334 -44.651566
+v 6.001826 46.719040 56.336189
+v 6.001822 41.112186 60.937607
+v 6.001827 34.715374 64.356773
+v -0.000004 21.377617 70.472580
+v -45.925098 52.325905 -24.547472
+v -52.593964 -28.318567 -43.162754
+v -6.668874 28.318563 67.710243
+v -14.297995 7.218330 71.880783
+v -13.748522 -21.377640 69.118462
+v -26.968681 68.367081 -8.180853
+v -56.336174 -46.719048 6.001814
+v -20.966866 -14.436695 69.118454
+v 13.748521 -21.377617 -69.118484
+v -24.854485 -34.715397 60.004025
+v -36.083107 61.528748 19.286821
+v -69.118462 -14.436687 20.966835
+v -41.263172 56.927322 21.432478
+v -67.053406 -21.377632 20.556078
+v 20.966864 -14.436672 -69.118484
+v 20.161118 -21.377617 -67.173248
+v 24.854490 -34.715374 -60.004051
+v -31.627121 -46.719055 47.333313
+v -34.443264 7.218352 -64.291046
+v -26.308371 -46.719055 50.176247
+v -21.785141 68.367081 17.878609
+v -7.218316 0.000012 -73.289017
+v 32.072830 -28.318565 -60.004055
+v -38.845459 -41.112206 47.333305
+v 31.627125 -46.719040 -47.333344
+v -33.035347 -56.927330 33.035332
+v 19.750351 70.472595 -8.180851
+v 7.079642 -73.289055 -1.408240
+v 41.263180 -34.715378 -49.751057
+v 38.845463 -41.112190 -47.333336
+v 35.591766 -46.719040 -44.079643
+v 33.035355 -56.927322 -33.035362
+v -38.845455 -56.927330 25.955687
+v 40.253700 -52.325897 -33.035362
+v 35.591770 -56.927322 -29.920362
+v 28.864788 -64.947914 -19.286842
+v -32.072815 -64.947914 13.284978
+v -44.651577 -56.927330 12.970594
+v 36.083126 -61.528748 -19.286840
+v 30.173244 -64.947914 -16.838890
+v -20.966852 -70.472595 4.170552
+v 44.651592 -56.927322 -12.970625
+v 39.152473 -61.528748 -11.876781
+v -28.046494 -68.367081 2.762324
+v 20.966860 -70.472595 -4.170578
+v -54.002186 34.715393 -36.083111
+v 28.046505 -68.367081 -2.762349
+v 21.105558 -70.472595 -2.762350
+v -19.750340 70.472595 -8.180850
+v 14.297981 -72.578110 1.408217
+v -12.670698 72.578110 -6.772619
+v 19.750351 70.472595 8.180876
+v -28.864761 64.947914 -19.286816
+v 12.670705 72.578110 6.772646
+v 18.441891 70.472595 10.628829
+v 28.864780 64.947914 19.286844
+v -33.035332 56.927330 -33.035336
+v 21.785141 68.367081 17.878616
+v 26.308365 64.947914 22.401844
+v 33.035347 56.927322 33.035362
+v -28.864777 64.947914 19.286831
+v -16.838860 -64.947906 -30.173241
+v -15.116261 70.472595 15.116268
+v 22.401825 64.947906 26.308382
+v 25.955698 61.528748 31.627132
+v 29.070704 56.927319 36.289055
+v 31.627117 46.719040 47.333336
+v -24.854469 34.715397 -60.004017
+v -49.751022 34.715393 -41.263165
+v -36.289028 -46.719040 -43.507389
+v 24.547482 52.325893 45.925114
+v -17.774820 41.112209 -58.595779
+v 24.854485 34.715374 60.004040
+v -13.748502 21.377640 -69.118454
+v -51.823174 -52.325901 -5.104148
+v -40.745029 56.927330 -22.401821
+v 16.877148 46.719040 54.082809
+v 6.668880 -28.318563 -67.710243
+v 18.441887 34.715374 61.949276
+v 13.748514 21.377617 69.118469
+v 0.000010 -64.947906 -34.715363
+v -67.710236 -28.318577 6.668870
+v 6.668879 28.318563 67.710243
+v -0.000017 7.218330 73.289017
+v -33.035351 -52.325909 40.253681
+v -24.854485 68.367081 13.285007
+v -6.668880 21.377617 69.815750
+v -7.079651 14.436672 71.880798
+v -14.297995 -7.218354 71.880783
+v -32.072819 -28.318584 60.004028
+v -28.864777 -64.947914 19.286808
+v -52.593971 46.719044 21.785137
+v -21.105570 7.218330 69.815727
+v -21.377638 -0.000011 70.472542
+v -21.105570 -7.218353 69.815727
+v -26.968689 -21.377640 65.108162
+v 12.670710 -34.715374 -63.699963
+v -18.441874 -34.715374 -61.949261
+v -34.048340 -14.436694 63.699924
+v 19.750353 -28.318563 -65.108192
+v 18.441895 -34.715374 -61.949291
+v 21.785145 -46.719040 -52.593994
+v 30.764372 -34.715378 -56.845150
+v 28.864784 -41.112190 -54.002220
+v -40.253685 -46.719055 40.253674
+v 25.955711 -56.927319 -38.845474
+v 7.218340 -73.289055 -0.000011
+v -8.180857 -70.472595 -19.750353
+v -50.176254 -34.715393 40.745033
+v 33.035355 -52.325893 -40.253708
+v 29.070713 -56.927319 -36.289059
+v 24.547483 -64.947906 -24.547493
+v -57.161095 -34.715389 30.173223
+v -54.002197 -41.112202 28.864756
+v 31.627125 -61.528748 -25.955717
+v -43.162758 -56.927330 17.878584
+v 17.774849 -70.472595 -11.876783
+v -11.876764 70.472595 -17.774826
+v -47.333328 -46.719051 31.627104
+v -26.308365 -64.947914 22.401806
+v 24.854492 -68.367081 -13.285013
+v 19.750351 -70.472595 -8.180874
+v -46.324051 -56.927326 4.010278
+v 33.242592 -64.947914 -9.428828
+v 26.968693 -68.367081 -8.180874
+v 20.161116 -70.472595 -6.826763
+v -61.949257 21.377634 -32.878567
+v -28.046494 -68.367081 -2.762354
+v 14.297981 -72.578110 -1.408239
+v -24.547476 -64.947922 24.547455
+v 20.966860 70.472595 4.170580
+v -13.748508 -72.578110 -4.170578
+v 13.748517 72.578110 4.170580
+v 20.161116 70.472595 6.826764
+v 32.072826 64.947914 13.285014
+v -43.162750 28.318583 -52.593960
+v -24.547472 -52.325893 -45.925110
+v -4.170569 70.472595 20.966866
+v -11.105959 72.578110 -9.114416
+v 24.854488 68.367081 13.285013
+v -24.547459 64.947922 -24.547459
+v 38.845459 56.927322 25.955719
+v -40.253685 52.325905 -33.035343
+v -33.242569 -64.947914 -9.428833
+v -17.878593 68.367081 -21.785122
+v 31.627113 61.528748 25.955719
+v 35.591763 56.927322 29.920362
+v 40.253685 46.719040 40.253700
+v -64.291061 -34.715385 -6.668888
+v -60.937588 -41.112198 -6.001848
+v -64.356758 34.715385 6.001828
+v -56.424591 -46.719048 -5.104152
+v -19.286800 61.528759 -36.083088
+v 33.035355 52.325893 40.253700
+v -21.785122 46.719055 -52.593964
+v 36.083118 34.715378 54.002209
+v -39.152451 61.528748 11.876765
+v -31.627113 -61.528755 25.955679
+v -44.651577 56.927322 12.970613
+v 27.103889 46.719040 49.751053
+v 28.864773 41.112190 54.002213
+v 30.173237 34.715378 57.161106
+v 26.968685 21.377617 65.108170
+v -41.263172 -34.715393 49.751034
+v -30.764366 34.715378 56.845135
+v -35.591763 -46.719055 44.079620
+v 19.750353 28.318563 65.108177
+v 0.000012 -56.927319 -46.719025
+v 14.297962 7.218330 71.880798
+v -14.022423 56.927319 44.332527
+v 7.079637 21.377617 69.775291
+v 7.079631 14.436672 71.880798
+v -0.000017 -7.218354 73.289017
+v 21.238905 -7.218353 69.775284
+v -71.880783 7.218339 14.297952
+v -7.079658 7.218330 72.591736
+v -7.218361 -0.000012 73.289001
+v -7.079658 -7.218354 72.591736
+vn -0.0097 0.9951 0.0980
+vn -0.0976 0.0975 0.9904
+vn -0.0286 -0.9565 0.2902
+vn -0.0938 0.2890 0.9527
+vn -0.0464 -0.8810 0.4709
+vn -0.0865 0.4696 0.8786
+vn -0.0624 -0.7715 0.6332
+vn -0.0759 0.6326 0.7708
+vn -0.0759 -0.6326 0.7708
+vn -0.0624 0.7715 0.6332
+vn -0.0865 -0.4696 0.8786
+vn -0.0464 0.8810 0.4709
+vn -0.0938 -0.2890 0.9527
+vn -0.0286 0.9565 0.2902
+vn -0.0975 -0.0975 0.9904
+vn -0.0097 -0.9951 0.0980
+vn -0.0846 0.9565 0.2790
+vn -0.2889 -0.0976 0.9524
+vn -0.0286 -0.9951 0.0942
+vn -0.0286 0.9951 0.0942
+vn -0.2889 0.0975 0.9524
+vn -0.0846 -0.9565 0.2790
+vn -0.2779 0.2890 0.9161
+vn -0.1374 -0.8810 0.4528
+vn -0.2563 0.4696 0.8448
+vn -0.1847 -0.7715 0.6088
+vn -0.2248 0.6326 0.7412
+vn -0.2248 -0.6326 0.7412
+vn -0.1847 0.7715 0.6088
+vn -0.2563 -0.4696 0.8448
+vn -0.1374 0.8810 0.4528
+vn -0.2779 -0.2890 0.9161
+vn -0.2999 -0.7715 0.5611
+vn -0.3651 0.6326 0.6831
+vn -0.3651 -0.6326 0.6831
+vn -0.2999 0.7715 0.5611
+vn -0.4162 -0.4696 0.7786
+vn -0.2230 0.8810 0.4173
+vn -0.4513 -0.2890 0.8443
+vn -0.1374 0.9565 0.2571
+vn -0.4691 -0.0975 0.8777
+vn -0.0464 -0.9951 0.0869
+vn -0.0464 0.9951 0.0869
+vn -0.4691 0.0975 0.8777
+vn -0.1374 -0.9565 0.2571
+vn -0.4513 0.2890 0.8443
+vn -0.2230 -0.8810 0.4173
+vn -0.4162 0.4696 0.7786
+vn -0.6314 -0.0975 0.7693
+vn -0.0625 -0.9951 0.0761
+vn -0.0625 0.9951 0.0761
+vn -0.6314 0.0975 0.7693
+vn -0.1850 -0.9565 0.2254
+vn -0.6073 0.2890 0.7400
+vn -0.3002 -0.8810 0.3658
+vn -0.5601 0.4696 0.6825
+vn -0.4036 -0.7715 0.4918
+vn -0.4913 0.6326 0.5987
+vn -0.4913 -0.6326 0.5987
+vn -0.4036 0.7715 0.4918
+vn -0.5601 -0.4696 0.6825
+vn -0.3002 0.8810 0.3658
+vn -0.6073 -0.2890 0.7400
+vn -0.1850 0.9565 0.2254
+vn -0.5987 0.6326 0.4913
+vn -0.5987 -0.6326 0.4913
+vn -0.4918 0.7715 0.4036
+vn -0.6825 -0.4696 0.5601
+vn -0.3658 0.8810 0.3002
+vn -0.7400 -0.2890 0.6073
+vn -0.2254 0.9565 0.1850
+vn -0.7693 -0.0975 0.6314
+vn -0.0761 -0.9951 0.0625
+vn -0.0761 0.9951 0.0625
+vn -0.7693 0.0975 0.6314
+vn -0.2254 -0.9565 0.1850
+vn -0.7400 0.2890 0.6073
+vn -0.3658 -0.8810 0.3002
+vn -0.6825 0.4696 0.5601
+vn -0.4918 -0.7715 0.4036
+vn -0.0869 0.9951 0.0464
+vn -0.8777 0.0975 0.4691
+vn -0.2571 -0.9565 0.1374
+vn -0.8443 0.2890 0.4513
+vn -0.4173 -0.8810 0.2231
+vn -0.7786 0.4696 0.4162
+vn -0.5611 -0.7715 0.2999
+vn -0.6831 0.6326 0.3651
+vn -0.6831 -0.6326 0.3651
+vn -0.5611 0.7715 0.2999
+vn -0.7786 -0.4696 0.4162
+vn -0.4173 0.8810 0.2231
+vn -0.8443 -0.2890 0.4513
+vn -0.2571 0.9565 0.1374
+vn -0.8777 -0.0975 0.4691
+vn -0.0869 -0.9951 0.0464
+vn -0.6088 0.7715 0.1847
+vn -0.8448 -0.4696 0.2563
+vn -0.4528 0.8810 0.1374
+vn -0.9161 -0.2890 0.2779
+vn -0.2790 0.9565 0.0846
+vn -0.9524 -0.0976 0.2889
+vn -0.0942 -0.9951 0.0286
+vn -0.0942 0.9951 0.0286
+vn -0.9524 0.0975 0.2889
+vn -0.2790 -0.9565 0.0846
+vn -0.9161 0.2890 0.2779
+vn -0.4528 -0.8810 0.1374
+vn -0.8448 0.4696 0.2563
+vn -0.6088 -0.7715 0.1847
+vn -0.7412 0.6326 0.2248
+vn -0.7412 -0.6326 0.2248
+vn -0.2902 -0.9565 0.0286
+vn -0.9527 0.2890 0.0938
+vn -0.4709 -0.8810 0.0464
+vn -0.8786 0.4696 0.0865
+vn -0.6332 -0.7715 0.0624
+vn -0.7708 0.6326 0.0759
+vn -0.7708 -0.6326 0.0759
+vn -0.6332 0.7715 0.0624
+vn -0.8786 -0.4696 0.0865
+vn -0.4709 0.8810 0.0464
+vn -0.9527 -0.2890 0.0938
+vn -0.2902 0.9565 0.0286
+vn -0.9904 -0.0976 0.0975
+vn -0.0980 -0.9951 0.0097
+vn -0.0980 0.9951 0.0097
+vn -0.9904 0.0975 0.0975
+vn -0.8786 -0.4696 -0.0865
+vn -0.4709 0.8810 -0.0464
+vn -0.9527 -0.2890 -0.0938
+vn -0.2902 0.9565 -0.0286
+vn -0.9904 -0.0975 -0.0975
+vn -0.0980 -0.9951 -0.0097
+vn -0.0980 0.9951 -0.0096
+vn -0.9904 0.0975 -0.0976
+vn -0.2902 -0.9565 -0.0286
+vn -0.9527 0.2890 -0.0938
+vn -0.4709 -0.8810 -0.0464
+vn -0.8786 0.4696 -0.0865
+vn -0.6332 -0.7715 -0.0624
+vn -0.7708 0.6326 -0.0759
+vn -0.7708 -0.6326 -0.0759
+vn -0.6332 0.7715 -0.0624
+vn -0.9161 0.2890 -0.2779
+vn -0.4528 -0.8810 -0.1374
+vn -0.8448 0.4696 -0.2563
+vn -0.6088 -0.7715 -0.1847
+vn -0.7412 0.6326 -0.2248
+vn -0.7412 -0.6326 -0.2248
+vn -0.6088 0.7715 -0.1847
+vn -0.8448 -0.4696 -0.2563
+vn -0.4528 0.8810 -0.1373
+vn -0.9161 -0.2890 -0.2779
+vn -0.2790 0.9566 -0.0846
+vn -0.9524 -0.0975 -0.2889
+vn -0.0942 -0.9951 -0.0286
+vn -0.0942 0.9951 -0.0286
+vn -0.9524 0.0975 -0.2889
+vn -0.2790 -0.9565 -0.0846
+vn -0.4173 0.8810 -0.2231
+vn -0.8443 -0.2890 -0.4513
+vn -0.2571 0.9565 -0.1374
+vn -0.8777 -0.0975 -0.4691
+vn -0.0869 -0.9951 -0.0464
+vn -0.0869 0.9951 -0.0464
+vn -0.8777 0.0975 -0.4691
+vn -0.2571 -0.9565 -0.1374
+vn -0.8443 0.2890 -0.4513
+vn -0.4173 -0.8810 -0.2231
+vn -0.7786 0.4696 -0.4162
+vn -0.5611 -0.7715 -0.2999
+vn -0.6831 0.6326 -0.3651
+vn -0.6831 -0.6326 -0.3651
+vn -0.5611 0.7715 -0.2999
+vn -0.7786 -0.4696 -0.4162
+vn -0.3658 -0.8810 -0.3002
+vn -0.6825 0.4696 -0.5601
+vn -0.4918 -0.7715 -0.4036
+vn -0.5987 0.6326 -0.4913
+vn -0.5987 -0.6326 -0.4913
+vn -0.4918 0.7715 -0.4036
+vn -0.6825 -0.4696 -0.5601
+vn -0.3658 0.8810 -0.3002
+vn -0.7400 -0.2890 -0.6073
+vn -0.2254 0.9566 -0.1850
+vn -0.7693 -0.0975 -0.6314
+vn -0.0761 -0.9951 -0.0625
+vn -0.0761 0.9951 -0.0625
+vn -0.7693 0.0975 -0.6314
+vn -0.2254 -0.9565 -0.1850
+vn -0.7400 0.2890 -0.6073
+vn -0.6073 -0.2890 -0.7400
+vn -0.1850 0.9566 -0.2254
+vn -0.6314 -0.0975 -0.7693
+vn -0.0625 -0.9951 -0.0761
+vn -0.0625 0.9951 -0.0761
+vn -0.6314 0.0975 -0.7693
+vn -0.1850 -0.9565 -0.2254
+vn -0.6073 0.2890 -0.7400
+vn -0.3002 -0.8810 -0.3658
+vn -0.5601 0.4696 -0.6825
+vn -0.4036 -0.7715 -0.4918
+vn -0.4913 0.6326 -0.5987
+vn -0.4913 -0.6326 -0.5987
+vn -0.4036 0.7715 -0.4918
+vn -0.5601 -0.4696 -0.6825
+vn -0.3002 0.8810 -0.3658
+vn -0.4162 0.4696 -0.7786
+vn -0.2999 -0.7715 -0.5611
+vn -0.3651 0.6326 -0.6831
+vn -0.3651 -0.6326 -0.6831
+vn -0.2999 0.7715 -0.5611
+vn -0.4162 -0.4696 -0.7786
+vn -0.2231 0.8810 -0.4173
+vn -0.4513 -0.2890 -0.8443
+vn -0.1374 0.9566 -0.2571
+vn -0.4691 -0.0975 -0.8777
+vn -0.0464 -0.9951 -0.0869
+vn -0.0464 0.9951 -0.0869
+vn -0.4691 0.0975 -0.8777
+vn -0.1374 -0.9565 -0.2571
+vn -0.4513 0.2890 -0.8443
+vn -0.2230 -0.8810 -0.4173
+vn -0.0846 0.9565 -0.2790
+vn -0.2889 -0.0975 -0.9524
+vn -0.0286 -0.9951 -0.0942
+vn -0.0286 0.9951 -0.0942
+vn -0.2889 0.0975 -0.9524
+vn -0.0846 -0.9565 -0.2790
+vn -0.2779 0.2890 -0.9161
+vn -0.1374 -0.8810 -0.4528
+vn -0.2563 0.4696 -0.8448
+vn -0.1847 -0.7715 -0.6088
+vn -0.2248 0.6326 -0.7412
+vn -0.2248 -0.6326 -0.7412
+vn -0.1847 0.7715 -0.6088
+vn -0.2563 -0.4696 -0.8448
+vn -0.1374 0.8810 -0.4528
+vn -0.2779 -0.2890 -0.9161
+vn -0.0759 0.6326 -0.7708
+vn -0.0759 -0.6326 -0.7708
+vn -0.0624 0.7715 -0.6332
+vn -0.0865 -0.4696 -0.8786
+vn -0.0464 0.8810 -0.4709
+vn -0.0938 -0.2890 -0.9527
+vn -0.0286 0.9565 -0.2902
+vn -0.0975 -0.0975 -0.9904
+vn -0.0097 -0.9951 -0.0980
+vn -0.0097 0.9951 -0.0980
+vn -0.0976 0.0975 -0.9904
+vn -0.0286 -0.9565 -0.2902
+vn -0.0938 0.2890 -0.9527
+vn -0.0464 -0.8810 -0.4709
+vn -0.0865 0.4696 -0.8786
+vn -0.0624 -0.7715 -0.6332
+vn 0.0097 -0.9951 -0.0980
+vn 0.0097 0.9951 -0.0980
+vn 0.0975 0.0975 -0.9904
+vn 0.0286 -0.9565 -0.2902
+vn 0.0938 0.2890 -0.9527
+vn 0.0464 -0.8810 -0.4709
+vn 0.0865 0.4696 -0.8786
+vn 0.0624 -0.7715 -0.6332
+vn 0.0759 0.6326 -0.7708
+vn 0.0759 -0.6326 -0.7708
+vn 0.0624 0.7715 -0.6332
+vn 0.0865 -0.4696 -0.8786
+vn 0.0464 0.8810 -0.4709
+vn 0.0938 -0.2890 -0.9527
+vn 0.0286 0.9565 -0.2902
+vn 0.0976 -0.0975 -0.9904
+vn 0.2248 -0.6326 -0.7412
+vn 0.1847 0.7715 -0.6088
+vn 0.2563 -0.4696 -0.8448
+vn 0.1374 0.8810 -0.4528
+vn 0.2779 -0.2890 -0.9161
+vn 0.0846 0.9565 -0.2790
+vn 0.2889 -0.0975 -0.9524
+vn 0.0286 -0.9951 -0.0942
+vn 0.0286 0.9951 -0.0942
+vn 0.2889 0.0975 -0.9524
+vn 0.0846 -0.9565 -0.2790
+vn 0.2779 0.2890 -0.9161
+vn 0.1374 -0.8810 -0.4528
+vn 0.2563 0.4696 -0.8448
+vn 0.1847 -0.7715 -0.6088
+vn 0.2248 0.6326 -0.7412
+vn 0.4691 0.0975 -0.8777
+vn 0.1374 -0.9565 -0.2571
+vn 0.4513 0.2890 -0.8443
+vn 0.2231 -0.8810 -0.4173
+vn 0.4162 0.4696 -0.7786
+vn 0.2999 -0.7715 -0.5611
+vn 0.3651 0.6326 -0.6831
+vn 0.3651 -0.6326 -0.6831
+vn 0.2999 0.7715 -0.5611
+vn 0.4162 -0.4696 -0.7786
+vn 0.2230 0.8810 -0.4173
+vn 0.4513 -0.2890 -0.8443
+vn 0.1374 0.9565 -0.2571
+vn 0.4691 -0.0975 -0.8777
+vn 0.0464 -0.9951 -0.0869
+vn 0.0464 0.9951 -0.0869
+vn 0.4036 0.7715 -0.4918
+vn 0.5601 -0.4696 -0.6825
+vn 0.3002 0.8810 -0.3658
+vn 0.6073 -0.2890 -0.7400
+vn 0.1850 0.9565 -0.2254
+vn 0.6314 -0.0975 -0.7693
+vn 0.0625 -0.9951 -0.0761
+vn 0.0625 0.9951 -0.0761
+vn 0.6314 0.0975 -0.7693
+vn 0.1850 -0.9565 -0.2254
+vn 0.6073 0.2890 -0.7400
+vn 0.3002 -0.8810 -0.3658
+vn 0.5601 0.4696 -0.6825
+vn 0.4036 -0.7715 -0.4918
+vn 0.4913 0.6326 -0.5987
+vn 0.4913 -0.6326 -0.5987
+vn 0.2254 -0.9565 -0.1850
+vn 0.7400 0.2890 -0.6073
+vn 0.3658 -0.8810 -0.3002
+vn 0.6825 0.4696 -0.5601
+vn 0.4918 -0.7715 -0.4036
+vn 0.5987 0.6326 -0.4913
+vn 0.5987 -0.6326 -0.4913
+vn 0.4918 0.7715 -0.4036
+vn 0.6825 -0.4696 -0.5601
+vn 0.3658 0.8810 -0.3002
+vn 0.7400 -0.2890 -0.6073
+vn 0.2254 0.9565 -0.1850
+vn 0.7693 -0.0975 -0.6314
+vn 0.0761 -0.9951 -0.0625
+vn 0.0761 0.9951 -0.0625
+vn 0.7693 0.0975 -0.6314
+vn 0.7786 -0.4696 -0.4162
+vn 0.4173 0.8810 -0.2230
+vn 0.8443 -0.2890 -0.4513
+vn 0.2571 0.9565 -0.1374
+vn 0.8777 -0.0975 -0.4691
+vn 0.0869 -0.9951 -0.0464
+vn 0.0869 0.9951 -0.0464
+vn 0.8777 0.0975 -0.4691
+vn 0.2571 -0.9565 -0.1374
+vn 0.8443 0.2890 -0.4513
+vn 0.4173 -0.8810 -0.2231
+vn 0.7786 0.4696 -0.4162
+vn 0.5611 -0.7715 -0.2999
+vn 0.6831 0.6326 -0.3651
+vn 0.6831 -0.6326 -0.3651
+vn 0.5611 0.7715 -0.2999
+vn 0.9161 0.2890 -0.2779
+vn 0.4528 -0.8810 -0.1374
+vn 0.8448 0.4696 -0.2563
+vn 0.6088 -0.7715 -0.1847
+vn 0.7412 0.6326 -0.2248
+vn 0.7412 -0.6326 -0.2248
+vn 0.6088 0.7715 -0.1847
+vn 0.8448 -0.4696 -0.2563
+vn 0.4528 0.8810 -0.1374
+vn 0.9161 -0.2890 -0.2779
+vn 0.2790 0.9565 -0.0846
+vn 0.9524 -0.0975 -0.2889
+vn 0.0942 -0.9951 -0.0286
+vn 0.0942 0.9951 -0.0286
+vn 0.9524 0.0975 -0.2889
+vn 0.2790 -0.9565 -0.0846
+vn 0.4709 0.8810 -0.0464
+vn 0.9527 -0.2890 -0.0938
+vn 0.2902 0.9565 -0.0286
+vn 0.9904 -0.0975 -0.0975
+vn 0.0980 -0.9951 -0.0096
+vn 0.0980 0.9951 -0.0096
+vn 0.9904 0.0975 -0.0975
+vn 0.2902 -0.9565 -0.0286
+vn 0.9527 0.2890 -0.0938
+vn 0.4709 -0.8810 -0.0464
+vn 0.8786 0.4696 -0.0865
+vn 0.6332 -0.7715 -0.0624
+vn 0.7708 0.6326 -0.0759
+vn 0.7708 -0.6326 -0.0759
+vn 0.6332 0.7715 -0.0624
+vn 0.8786 -0.4696 -0.0865
+vn 0.8786 0.4696 0.0865
+vn 0.6332 -0.7715 0.0624
+vn 0.7708 0.6326 0.0759
+vn 0.7708 -0.6326 0.0759
+vn 0.6332 0.7715 0.0624
+vn 0.8786 -0.4696 0.0865
+vn 0.4709 0.8810 0.0464
+vn 0.9527 -0.2890 0.0938
+vn 0.2902 0.9565 0.0286
+vn 0.9904 -0.0975 0.0975
+vn 0.0980 -0.9951 0.0097
+vn 0.0980 0.9951 0.0096
+vn 0.9904 0.0975 0.0975
+vn 0.2902 -0.9565 0.0286
+vn 0.9527 0.2890 0.0938
+vn 0.4709 -0.8810 0.0464
+vn 0.2790 0.9565 0.0846
+vn 0.9524 -0.0975 0.2889
+vn 0.0942 -0.9951 0.0286
+vn 0.0942 0.9951 0.0286
+vn 0.9524 0.0975 0.2889
+vn 0.2790 -0.9565 0.0846
+vn 0.9161 0.2890 0.2779
+vn 0.4528 -0.8810 0.1374
+vn 0.8448 0.4696 0.2563
+vn 0.6088 -0.7715 0.1847
+vn 0.7412 0.6326 0.2248
+vn 0.7412 -0.6326 0.2248
+vn 0.6088 0.7715 0.1847
+vn 0.8448 -0.4696 0.2563
+vn 0.4528 0.8810 0.1374
+vn 0.9161 -0.2890 0.2779
+vn 0.5611 -0.7715 0.2999
+vn 0.6831 0.6326 0.3651
+vn 0.6831 -0.6326 0.3651
+vn 0.5611 0.7715 0.2999
+vn 0.7786 -0.4696 0.4162
+vn 0.4173 0.8810 0.2230
+vn 0.8443 -0.2890 0.4513
+vn 0.2571 0.9565 0.1374
+vn 0.8777 -0.0975 0.4691
+vn 0.0869 -0.9951 0.0464
+vn 0.0869 0.9951 0.0464
+vn 0.8777 0.0975 0.4691
+vn 0.2571 -0.9565 0.1374
+vn 0.8443 0.2890 0.4513
+vn 0.4173 -0.8810 0.2231
+vn 0.7786 0.4696 0.4162
+vn 0.7693 -0.0975 0.6314
+vn 0.0761 -0.9951 0.0625
+vn 0.0761 0.9951 0.0625
+vn 0.7693 0.0975 0.6314
+vn 0.2254 -0.9565 0.1850
+vn 0.7400 0.2890 0.6073
+vn 0.3658 -0.8810 0.3002
+vn 0.6825 0.4696 0.5601
+vn 0.4918 -0.7715 0.4036
+vn 0.5987 0.6326 0.4913
+vn 0.5987 -0.6326 0.4913
+vn 0.4918 0.7715 0.4036
+vn 0.6825 -0.4696 0.5601
+vn 0.3658 0.8810 0.3002
+vn 0.7400 -0.2890 0.6073
+vn 0.2254 0.9565 0.1850
+vn 0.4913 0.6326 0.5987
+vn 0.4913 -0.6326 0.5987
+vn 0.4036 0.7715 0.4918
+vn 0.5601 -0.4696 0.6825
+vn 0.3002 0.8810 0.3658
+vn 0.6073 -0.2890 0.7400
+vn 0.1850 0.9565 0.2254
+vn 0.6314 -0.0975 0.7693
+vn 0.0625 -0.9951 0.0761
+vn 0.0625 0.9951 0.0761
+vn 0.6314 0.0975 0.7693
+vn 0.1850 -0.9565 0.2254
+vn 0.6073 0.2890 0.7400
+vn 0.3002 -0.8810 0.3658
+vn 0.5601 0.4696 0.6825
+vn 0.4036 -0.7715 0.4918
+vn 0.0464 -0.9951 0.0869
+vn 0.0464 0.9951 0.0869
+vn 0.4691 0.0975 0.8777
+vn 0.1374 -0.9565 0.2571
+vn 0.4513 0.2890 0.8443
+vn 0.2231 -0.8810 0.4173
+vn 0.4162 0.4696 0.7786
+vn 0.2999 -0.7715 0.5611
+vn 0.3651 0.6326 0.6831
+vn 0.3651 -0.6326 0.6831
+vn 0.2999 0.7715 0.5611
+vn 0.4162 -0.4696 0.7786
+vn 0.2231 0.8810 0.4173
+vn 0.4513 -0.2890 0.8443
+vn 0.1374 0.9566 0.2571
+vn 0.4691 -0.0975 0.8777
+vn 0.2248 -0.6326 0.7412
+vn 0.1847 0.7715 0.6088
+vn 0.2563 -0.4696 0.8448
+vn 0.1374 0.8810 0.4528
+vn 0.2779 -0.2890 0.9161
+vn 0.0846 0.9565 0.2790
+vn 0.2889 -0.0975 0.9524
+vn 0.0286 -0.9951 0.0942
+vn 0.0286 0.9951 0.0942
+vn 0.2889 0.0975 0.9524
+vn 0.0846 -0.9565 0.2790
+vn 0.2779 0.2890 0.9161
+vn 0.1374 -0.8810 0.4528
+vn 0.2563 0.4696 0.8448
+vn 0.1847 -0.7715 0.6088
+vn 0.2248 0.6326 0.7412
+vn 0.0976 0.0975 0.9904
+vn 0.0286 -0.9565 0.2902
+vn 0.0938 0.2890 0.9527
+vn 0.0464 -0.8810 0.4709
+vn 0.0865 0.4696 0.8786
+vn 0.0624 -0.7715 0.6332
+vn 0.0759 0.6326 0.7708
+vn 0.0759 -0.6326 0.7708
+vn 0.0624 0.7715 0.6332
+vn 0.0865 -0.4696 0.8786
+vn 0.0464 0.8810 0.4709
+vn 0.0938 -0.2890 0.9527
+vn 0.0286 0.9565 0.2902
+vn 0.0976 -0.0976 0.9904
+vn 0.0097 -0.9951 0.0980
+vn 0.0097 0.9951 0.0980
+vn -0.0975 0.0976 0.9904
+vn -0.0846 -0.9566 0.2790
+vn -0.2231 0.8810 0.4173
+vn -0.1374 -0.9566 0.2571
+vn -0.1850 0.9566 0.2254
+vn -0.2254 -0.9566 0.1850
+vn -0.2571 -0.9566 0.1374
+vn -0.4173 -0.8810 0.2230
+vn -0.4173 0.8810 0.2230
+vn -0.9524 -0.0975 0.2889
+vn -0.9524 0.0976 0.2889
+vn -0.9904 -0.0975 0.0975
+vn -0.9904 0.0976 0.0975
+vn -0.9904 -0.0975 -0.0976
+vn -0.9904 0.0975 -0.0975
+vn -0.4528 -0.8810 -0.1373
+vn -0.4528 0.8810 -0.1374
+vn -0.2790 0.9565 -0.0846
+vn -0.2254 0.9565 -0.1850
+vn -0.1850 0.9565 -0.2254
+vn -0.1850 -0.9566 -0.2254
+vn -0.2230 0.8810 -0.4173
+vn -0.1374 0.9565 -0.2571
+vn -0.0976 -0.0975 -0.9904
+vn -0.0975 0.0975 -0.9904
+vn 0.0976 0.0975 -0.9904
+vn 0.0975 -0.0975 -0.9904
+vn 0.2230 -0.8810 -0.4173
+vn 0.2231 0.8810 -0.4173
+vn 0.4173 -0.8810 -0.2230
+vn 0.4173 0.8810 0.2231
+vn 0.4173 -0.8810 0.2230
+vn 0.1374 -0.9566 0.2571
+vn 0.2230 0.8810 0.4173
+vn 0.1374 0.9565 0.2571
+vn 0.0976 0.0976 0.9904
+vn 0.0976 -0.0975 0.9904
+vn 0.2254 -0.9566 0.1850
+vn 0.9904 0.0975 0.0976
+vn 0.9904 -0.0975 0.0976
+vn 0.9524 -0.0976 -0.2889
+vn 0.2571 -0.9565 -0.1375
+vn 0.2571 -0.9566 -0.1374
+vn 0.4692 0.0975 -0.8777
+vn -0.1374 -0.9566 -0.2571
+vn -0.2254 -0.9566 -0.1850
+vn -0.4173 -0.8810 -0.2230
+vn -0.2571 -0.9566 -0.1374
+vn -0.8777 -0.0976 -0.4691
+vn -0.4173 0.8810 -0.2230
+vn -0.9524 -0.0976 -0.2889
+vn -0.9904 -0.0975 0.0976
+vn -0.8777 -0.0976 0.4691
+vn -0.2571 -0.9565 0.1375
+vn -0.7693 -0.0976 0.6314
+vn -0.1850 -0.9566 0.2254
+vn -0.2231 -0.8810 0.4173
+vn -0.2889 -0.0975 0.9524
+vn -0.0976 -0.0976 0.9904
+vn -0.0975 0.0975 0.9904
+vn 0.2230 -0.8810 0.4173
+vn 0.1850 0.9566 0.2254
+vn 0.0980 0.9951 0.0097
+vn 0.0980 -0.9951 0.0096
+vn 0.0980 0.9951 -0.0097
+vn 0.0980 -0.9951 -0.0097
+vn 0.9524 0.0976 -0.2889
+vn 0.4173 0.8810 -0.2231
+vn 0.2254 -0.9566 -0.1850
+vn 0.4692 -0.0975 -0.8777
+vn 0.1374 0.9566 -0.2571
+vn -0.0846 0.9566 -0.2790
+vn -0.8777 0.0976 -0.4691
+vn -0.2571 0.9566 -0.1374
+vn -0.9524 0.0976 -0.2889
+vn -0.0980 0.9951 -0.0097
+vn -0.0980 -0.9951 -0.0096
+vn -0.9904 0.0975 0.0976
+vn -0.0980 0.9951 0.0096
+vn -0.0980 -0.9951 0.0096
+vn -0.2571 0.9566 0.1374
+vn -0.8777 0.0976 0.4691
+vn -0.7693 0.0976 0.6314
+vn -0.6314 -0.0976 0.7693
+vn -0.2889 0.0976 0.9524
+vn -0.0976 -0.0975 0.9904
+vt 0.750000 0.812500
+vt 0.750000 0.687500
+vt 0.750000 0.562500
+vt 0.750000 0.500000
+vt 0.750000 0.437500
+vt 0.750000 0.312500
+vt 0.718750 0.937500
+vt 0.718750 0.875000
+vt 0.718750 0.812500
+vt 0.718750 0.750000
+vt 0.718750 0.687500
+vt 0.718750 0.625000
+vt 0.718750 0.562500
+vt 0.718750 0.500000
+vt 0.718750 0.437500
+vt 0.718750 0.375000
+vt 0.718750 0.312500
+vt 0.718750 0.250000
+vt 0.718750 0.187500
+vt 0.718750 0.125000
+vt 0.718750 0.062500
+vt 0.687500 0.937500
+vt 0.687500 0.875000
+vt 0.687500 0.812500
+vt 0.687500 0.750000
+vt 0.687500 0.687500
+vt 0.687500 0.625000
+vt 0.687500 0.562500
+vt 0.687500 0.500000
+vt 0.687500 0.437500
+vt 0.687500 0.375000
+vt 0.687500 0.312500
+vt 0.687500 0.250000
+vt 0.687500 0.187500
+vt 0.687500 0.125000
+vt 0.687500 0.062500
+vt 0.656250 0.937500
+vt 0.656250 0.875000
+vt 0.656250 0.812500
+vt 0.656250 0.750000
+vt 0.656250 0.687500
+vt 0.656250 0.625000
+vt 0.656250 0.562500
+vt 0.656250 0.500000
+vt 0.656250 0.437500
+vt 0.656250 0.375000
+vt 0.656250 0.312500
+vt 0.656250 0.250000
+vt 0.656250 0.187500
+vt 0.656250 0.125000
+vt 0.656250 0.062500
+vt 0.625000 0.937500
+vt 0.625000 0.875000
+vt 0.625000 0.812500
+vt 0.625000 0.750000
+vt 0.625000 0.687500
+vt 0.625000 0.625000
+vt 0.625000 0.562500
+vt 0.625000 0.500000
+vt 0.625000 0.437500
+vt 0.625000 0.375000
+vt 0.625000 0.312500
+vt 0.625000 0.250000
+vt 0.625000 0.187500
+vt 0.625000 0.125000
+vt 0.625000 0.062500
+vt 0.593750 0.937500
+vt 0.593750 0.875000
+vt 0.593750 0.812500
+vt 0.593750 0.750000
+vt 0.593750 0.687500
+vt 0.593750 0.625000
+vt 0.593750 0.562500
+vt 0.593750 0.500000
+vt 0.593750 0.437500
+vt 0.593750 0.375000
+vt 0.593750 0.312500
+vt 0.593750 0.250000
+vt 0.593750 0.187500
+vt 0.593750 0.125000
+vt 0.593750 0.062500
+vt 0.765625 1.000000
+vt 0.796875 1.000000
+vt 0.828125 1.000000
+vt 0.859375 1.000000
+vt 0.890625 1.000000
+vt 0.921875 1.000000
+vt 0.953125 1.000000
+vt 0.984375 1.000000
+vt 0.015625 1.000000
+vt 0.046875 1.000000
+vt 0.078125 1.000000
+vt 0.109375 1.000000
+vt 0.140625 1.000000
+vt 0.171875 1.000000
+vt 0.203125 1.000000
+vt 0.234375 1.000000
+vt 0.265625 1.000000
+vt 0.296875 1.000000
+vt 0.328125 1.000000
+vt 0.359375 1.000000
+vt 0.390625 1.000000
+vt 0.421875 1.000000
+vt 0.453125 1.000000
+vt 0.484375 1.000000
+vt 0.515625 1.000000
+vt 0.546875 1.000000
+vt 0.578125 1.000000
+vt 0.609375 1.000000
+vt 0.640625 1.000000
+vt 0.671875 1.000000
+vt 0.703125 1.000000
+vt 0.734375 1.000000
+vt 0.562500 0.937500
+vt 0.562500 0.875000
+vt 0.562500 0.812500
+vt 0.562500 0.750000
+vt 0.562500 0.687500
+vt 0.562500 0.625000
+vt 0.562500 0.562500
+vt 0.562500 0.500000
+vt 0.562500 0.437500
+vt 0.562500 0.375000
+vt 0.562500 0.312500
+vt 0.562500 0.250000
+vt 0.562500 0.187500
+vt 0.562500 0.125000
+vt 0.562500 0.062500
+vt 0.531250 0.937500
+vt 0.531250 0.875000
+vt 0.531250 0.812500
+vt 0.531250 0.750000
+vt 0.531250 0.687500
+vt 0.531250 0.625000
+vt 0.531250 0.562500
+vt 0.531250 0.500000
+vt 0.531250 0.437500
+vt 0.531250 0.375000
+vt 0.531250 0.312500
+vt 0.531250 0.250000
+vt 0.531250 0.187500
+vt 0.531250 0.125000
+vt 0.531250 0.062500
+vt 0.500000 0.937500
+vt 0.500000 0.875000
+vt 0.500000 0.812500
+vt 0.500000 0.750000
+vt 0.500000 0.687500
+vt 0.500000 0.625000
+vt 0.500000 0.562500
+vt 0.500000 0.500000
+vt 0.500000 0.437500
+vt 0.500000 0.375000
+vt 0.500000 0.312500
+vt 0.500000 0.250000
+vt 0.500000 0.187500
+vt 0.500000 0.125000
+vt 0.500000 0.062500
+vt 0.468750 0.937500
+vt 0.468750 0.875000
+vt 0.468750 0.812500
+vt 0.468750 0.750000
+vt 0.468750 0.687500
+vt 0.468750 0.625000
+vt 0.468750 0.562500
+vt 0.468750 0.500000
+vt 0.468750 0.437500
+vt 0.468750 0.375000
+vt 0.468750 0.312500
+vt 0.468750 0.250000
+vt 0.468750 0.187500
+vt 0.468750 0.125000
+vt 0.468750 0.062500
+vt 0.437500 0.937500
+vt 0.437500 0.875000
+vt 0.437500 0.812500
+vt 0.437500 0.750000
+vt 0.437500 0.687500
+vt 0.437500 0.625000
+vt 0.437500 0.562500
+vt 0.437500 0.500000
+vt 0.437500 0.437500
+vt 0.437500 0.375000
+vt 0.437500 0.312500
+vt 0.437500 0.250000
+vt 0.437500 0.187500
+vt 0.437500 0.125000
+vt 0.437500 0.062500
+vt 0.406250 0.937500
+vt 0.406250 0.875000
+vt 0.406250 0.812500
+vt 0.406250 0.750000
+vt 0.406250 0.687500
+vt 0.406250 0.625000
+vt 0.406250 0.562500
+vt 0.406250 0.500000
+vt 0.406250 0.437500
+vt 0.406250 0.375000
+vt 0.406250 0.312500
+vt 0.406250 0.250000
+vt 0.406250 0.187500
+vt 0.406250 0.125000
+vt 0.406250 0.062500
+vt 0.375000 0.937500
+vt 0.375000 0.875000
+vt 0.375000 0.812500
+vt 0.375000 0.750000
+vt 0.375000 0.687500
+vt 0.375000 0.625000
+vt 0.375000 0.562500
+vt 0.375000 0.500000
+vt 0.375000 0.437500
+vt 0.375000 0.375000
+vt 0.375000 0.312500
+vt 0.375000 0.250000
+vt 0.375000 0.187500
+vt 0.375000 0.125000
+vt 0.375000 0.062500
+vt 0.343750 0.937500
+vt 0.343750 0.875000
+vt 0.343750 0.812500
+vt 0.343750 0.750000
+vt 0.343750 0.687500
+vt 0.343750 0.625000
+vt 0.343750 0.562500
+vt 0.343750 0.500000
+vt 0.343750 0.437500
+vt 0.343750 0.375000
+vt 0.343750 0.312500
+vt 0.343750 0.250000
+vt 0.343750 0.187500
+vt 0.343750 0.125000
+vt 0.343750 0.062500
+vt 0.312500 0.937500
+vt 0.312500 0.875000
+vt 0.312500 0.812500
+vt 0.312500 0.750000
+vt 0.312500 0.687500
+vt 0.312500 0.625000
+vt 0.312500 0.562500
+vt 0.312500 0.500000
+vt 0.312500 0.437500
+vt 0.312500 0.375000
+vt 0.312500 0.312500
+vt 0.312500 0.250000
+vt 0.312500 0.187500
+vt 0.312500 0.125000
+vt 0.312500 0.062500
+vt 0.281250 0.937500
+vt 0.281250 0.875000
+vt 0.281250 0.812500
+vt 0.281250 0.750000
+vt 0.281250 0.687500
+vt 0.281250 0.625000
+vt 0.281250 0.562500
+vt 0.281250 0.500000
+vt 0.281250 0.437500
+vt 0.281250 0.375000
+vt 0.281250 0.312500
+vt 0.281250 0.250000
+vt 0.281250 0.187500
+vt 0.281250 0.125000
+vt 0.281250 0.062500
+vt 0.250000 0.937500
+vt 0.250000 0.875000
+vt 0.250000 0.812500
+vt 0.250000 0.750000
+vt 0.250000 0.687500
+vt 0.250000 0.625000
+vt 0.250000 0.562500
+vt 0.250000 0.500000
+vt 0.250000 0.437500
+vt 0.250000 0.375000
+vt 0.250000 0.312500
+vt 0.250000 0.250000
+vt 0.250000 0.187500
+vt 0.250000 0.125000
+vt 0.250000 0.062500
+vt 0.218750 0.937500
+vt 0.218750 0.875000
+vt 0.218750 0.812500
+vt 0.218750 0.750000
+vt 0.218750 0.687500
+vt 0.218750 0.625000
+vt 0.218750 0.562500
+vt 0.218750 0.500000
+vt 0.218750 0.437500
+vt 0.218750 0.375000
+vt 0.218750 0.312500
+vt 0.218750 0.250000
+vt 0.218750 0.187500
+vt 0.218750 0.125000
+vt 0.218750 0.062500
+vt 0.187500 0.937500
+vt 0.187500 0.875000
+vt 0.187500 0.812500
+vt 0.187500 0.750000
+vt 0.187500 0.687500
+vt 0.187500 0.625000
+vt 0.187500 0.562500
+vt 0.187500 0.500000
+vt 0.187500 0.437500
+vt 0.187500 0.375000
+vt 0.187500 0.312500
+vt 0.187500 0.250000
+vt 0.187500 0.187500
+vt 0.187500 0.125000
+vt 0.187500 0.062500
+vt 0.156250 0.937500
+vt 0.156250 0.875000
+vt 0.156250 0.812500
+vt 0.156250 0.750000
+vt 0.156250 0.687500
+vt 0.156250 0.625000
+vt 0.156250 0.562500
+vt 0.156250 0.500000
+vt 0.156250 0.437500
+vt 0.156250 0.375000
+vt 0.156250 0.312500
+vt 0.156250 0.250000
+vt 0.156250 0.187500
+vt 0.156250 0.125000
+vt 0.156250 0.062500
+vt 0.125000 0.937500
+vt 0.125000 0.875000
+vt 0.125000 0.812500
+vt 0.125000 0.750000
+vt 0.125000 0.687500
+vt 0.125000 0.625000
+vt 0.125000 0.562500
+vt 0.125000 0.500000
+vt 0.125000 0.437500
+vt 0.125000 0.375000
+vt 0.125000 0.312500
+vt 0.125000 0.250000
+vt 0.125000 0.187500
+vt 0.125000 0.125000
+vt 0.125000 0.062500
+vt 0.734375 0.000000
+vt 0.703125 0.000000
+vt 0.671875 0.000000
+vt 0.640625 0.000000
+vt 0.609375 0.000000
+vt 0.578125 0.000000
+vt 0.546875 0.000000
+vt 0.515625 0.000000
+vt 0.484375 0.000000
+vt 0.453125 0.000000
+vt 0.421875 0.000000
+vt 0.390625 0.000000
+vt 0.359375 0.000000
+vt 0.328125 0.000000
+vt 0.296875 0.000000
+vt 0.265625 0.000000
+vt 0.234375 0.000000
+vt 0.203125 0.000000
+vt 0.171875 0.000000
+vt 0.140625 0.000000
+vt 0.109375 0.000000
+vt 0.078125 0.000000
+vt 0.046875 0.000000
+vt 0.015625 0.000000
+vt 0.984375 0.000000
+vt 0.953125 0.000000
+vt 0.921875 0.000000
+vt 0.890625 0.000000
+vt 0.859375 0.000000
+vt 0.828125 0.000000
+vt 0.796875 0.000000
+vt 0.765625 0.000000
+vt 0.093750 0.937500
+vt 0.093750 0.875000
+vt 0.093750 0.812500
+vt 0.093750 0.750000
+vt 0.093750 0.687500
+vt 0.093750 0.625000
+vt 0.093750 0.562500
+vt 0.093750 0.500000
+vt 0.093750 0.437500
+vt 0.093750 0.375000
+vt 0.093750 0.312500
+vt 0.093750 0.250000
+vt 0.093750 0.187500
+vt 0.093750 0.125000
+vt 0.093750 0.062500
+vt 0.062500 0.937500
+vt 0.062500 0.875000
+vt 0.062500 0.812500
+vt 0.062500 0.750000
+vt 0.062500 0.687500
+vt 0.062500 0.625000
+vt 0.062500 0.562500
+vt 0.062500 0.500000
+vt 0.062500 0.437500
+vt 0.062500 0.375000
+vt 0.062500 0.312500
+vt 0.062500 0.250000
+vt 0.062500 0.187500
+vt 0.062500 0.125000
+vt 0.062500 0.062500
+vt 0.031250 0.937500
+vt 0.031250 0.875000
+vt 0.031250 0.812500
+vt 0.031250 0.750000
+vt 0.031250 0.687500
+vt 0.031250 0.625000
+vt 0.031250 0.562500
+vt 0.031250 0.500000
+vt 0.031250 0.437500
+vt 0.031250 0.375000
+vt 0.031250 0.312500
+vt 0.031250 0.250000
+vt 0.031250 0.187500
+vt 0.031250 0.125000
+vt 0.031250 0.062500
+vt 1.000000 0.937500
+vt 0.000000 0.937500
+vt 1.000000 0.875000
+vt 0.000000 0.875000
+vt 1.000000 0.812500
+vt 0.000000 0.812500
+vt 1.000000 0.750000
+vt 0.000000 0.750000
+vt 1.000000 0.687500
+vt 0.000000 0.687500
+vt 1.000000 0.625000
+vt 0.000000 0.625000
+vt 1.000000 0.562500
+vt 0.000000 0.562500
+vt 1.000000 0.500000
+vt 0.000000 0.500000
+vt 1.000000 0.437500
+vt 0.000000 0.437500
+vt 1.000000 0.375000
+vt 0.000000 0.375000
+vt 1.000000 0.312500
+vt 0.000000 0.312500
+vt 1.000000 0.250000
+vt 0.000000 0.250000
+vt 1.000000 0.187500
+vt 0.000000 0.187500
+vt 1.000000 0.125000
+vt 0.000000 0.125000
+vt 1.000000 0.062500
+vt 0.000000 0.062500
+vt 0.968750 0.937500
+vt 0.968750 0.875000
+vt 0.968750 0.812500
+vt 0.968750 0.750000
+vt 0.968750 0.687500
+vt 0.968750 0.625000
+vt 0.968750 0.562500
+vt 0.968750 0.500000
+vt 0.968750 0.437500
+vt 0.968750 0.375000
+vt 0.968750 0.312500
+vt 0.968750 0.250000
+vt 0.968750 0.187500
+vt 0.968750 0.125000
+vt 0.968750 0.062500
+vt 0.937500 0.937500
+vt 0.937500 0.875000
+vt 0.937500 0.812500
+vt 0.937500 0.750000
+vt 0.937500 0.687500
+vt 0.937500 0.625000
+vt 0.937500 0.562500
+vt 0.937500 0.500000
+vt 0.937500 0.437500
+vt 0.937500 0.375000
+vt 0.937500 0.312500
+vt 0.937500 0.250000
+vt 0.937500 0.187500
+vt 0.937500 0.125000
+vt 0.937500 0.062500
+vt 0.906250 0.937500
+vt 0.906250 0.875000
+vt 0.906250 0.812500
+vt 0.906250 0.750000
+vt 0.906250 0.687500
+vt 0.906250 0.625000
+vt 0.906250 0.562500
+vt 0.906250 0.500000
+vt 0.906250 0.437500
+vt 0.906250 0.375000
+vt 0.906250 0.312500
+vt 0.906250 0.250000
+vt 0.906250 0.187500
+vt 0.906250 0.125000
+vt 0.906250 0.062500
+vt 0.875000 0.937500
+vt 0.875000 0.875000
+vt 0.875000 0.812500
+vt 0.875000 0.750000
+vt 0.875000 0.687500
+vt 0.875000 0.625000
+vt 0.875000 0.562500
+vt 0.875000 0.500000
+vt 0.875000 0.437500
+vt 0.875000 0.375000
+vt 0.875000 0.312500
+vt 0.875000 0.250000
+vt 0.875000 0.187500
+vt 0.875000 0.125000
+vt 0.875000 0.062500
+vt 0.843750 0.937500
+vt 0.843750 0.875000
+vt 0.843750 0.812500
+vt 0.843750 0.750000
+vt 0.843750 0.687500
+vt 0.843750 0.625000
+vt 0.843750 0.562500
+vt 0.843750 0.500000
+vt 0.843750 0.437500
+vt 0.843750 0.375000
+vt 0.843750 0.312500
+vt 0.843750 0.250000
+vt 0.843750 0.187500
+vt 0.843750 0.125000
+vt 0.843750 0.062500
+vt 0.812500 0.937500
+vt 0.812500 0.875000
+vt 0.812500 0.812500
+vt 0.812500 0.750000
+vt 0.812500 0.687500
+vt 0.812500 0.625000
+vt 0.812500 0.562500
+vt 0.812500 0.500000
+vt 0.812500 0.437500
+vt 0.812500 0.375000
+vt 0.812500 0.312500
+vt 0.812500 0.250000
+vt 0.812500 0.187500
+vt 0.812500 0.125000
+vt 0.812500 0.062500
+vt 0.781250 0.937500
+vt 0.781250 0.875000
+vt 0.781250 0.812500
+vt 0.781250 0.750000
+vt 0.781250 0.687500
+vt 0.781250 0.625000
+vt 0.781250 0.562500
+vt 0.781250 0.500000
+vt 0.781250 0.437500
+vt 0.781250 0.375000
+vt 0.781250 0.312500
+vt 0.781250 0.250000
+vt 0.781250 0.187500
+vt 0.781250 0.125000
+vt 0.781250 0.062500
+vt 0.750000 0.937500
+vt 0.750000 0.875000
+vt 0.750000 0.750000
+vt 0.750000 0.625000
+vt 0.750000 0.375000
+vt 0.750000 0.250000
+vt 0.750000 0.187500
+vt 0.750000 0.125000
+vt 0.750000 0.062500
+vt 0.234375 0.375000
+vt 0.218750 0.281250
+vt 0.765625 0.531250
+vt 0.179688 0.968750
+vt 0.195312 0.968750
+vt 0.734375 0.843750
+vt 0.734375 0.812500
+vt 0.203125 0.343750
+vt 0.203125 0.312500
+vt 0.718750 0.281250
+vt 0.187500 0.218750
+vt 0.148438 0.968750
+vt 0.164062 0.968750
+vt 0.859375 0.843750
+vt 0.843750 0.531250
+vt 0.703125 0.312500
+vt 0.703125 0.281250
+vt 0.687500 0.218750
+vt 0.156250 0.156250
+vt 0.117188 0.968750
+vt 0.132812 0.968750
+vt 0.671875 0.281250
+vt 0.671875 0.250000
+vt 0.140625 0.187500
+vt 0.656250 0.156250
+vt 0.125000 0.093750
+vt 0.617188 0.031250
+vt 0.632812 0.031250
+vt 0.085938 0.968750
+vt 0.101562 0.968750
+vt 0.765625 0.062500
+vt 0.640625 0.187500
+vt 0.640625 0.156250
+vt 0.625000 0.093750
+vt 0.109375 0.093750
+vt 0.054688 0.968750
+vt 0.070312 0.968750
+vt 0.109375 0.906250
+vt 0.117188 0.031250
+vt 0.132812 0.031250
+vt 0.609375 0.156250
+vt 0.609375 0.125000
+vt 0.609375 0.093750
+vt 0.078125 0.093750
+vt 0.023438 0.968750
+vt 0.039062 0.968750
+vt 0.578125 0.093750
+vt 0.578125 0.062500
+vt 0.992188 0.968750
+vt 0.007812 0.968750
+vt 0.000000 0.906250
+vt 1.000000 0.906250
+vt 0.828125 0.562500
+vt 0.796875 0.156250
+vt 0.546875 0.062500
+vt 0.984375 0.937500
+vt 0.500000 0.906250
+vt 0.968750 0.843750
+vt 0.921875 0.125000
+vt 0.921875 0.093750
+vt 0.859375 0.656250
+vt 0.484375 0.937500
+vt 0.484375 0.906250
+vt 0.468750 0.843750
+vt 0.937500 0.781250
+vt 0.984375 0.625000
+vt 0.953125 0.250000
+vt 0.898438 0.968750
+vt 0.914062 0.968750
+vt 0.453125 0.875000
+vt 0.921875 0.812500
+vt 0.437500 0.781250
+vt 0.906250 0.718750
+vt 0.015625 0.750000
+vt 0.078125 0.156250
+vt 0.867188 0.968750
+vt 0.882812 0.968750
+vt 0.421875 0.843750
+vt 0.421875 0.812500
+vt 0.421875 0.781250
+vt 0.406250 0.718750
+vt 0.875000 0.656250
+vt 0.968750 0.781250
+vt 0.835938 0.968750
+vt 0.851562 0.968750
+vt 0.109375 0.250000
+vt 0.390625 0.750000
+vt 0.859375 0.687500
+vt 0.375000 0.656250
+vt 0.843750 0.593750
+vt 0.562500 0.281250
+vt 0.171875 0.750000
+vt 0.804688 0.968750
+vt 0.820312 0.968750
+vt 0.359375 0.718750
+vt 0.359375 0.687500
+vt 0.359375 0.656250
+vt 0.343750 0.593750
+vt 0.812500 0.531250
+vt 0.625000 0.718750
+vt 0.296875 0.687500
+vt 0.773438 0.968750
+vt 0.789062 0.968750
+vt 0.765625 0.687500
+vt 0.328125 0.625000
+vt 0.796875 0.562500
+vt 0.312500 0.531250
+vt 0.781250 0.468750
+vt 0.757812 0.968750
+vt 0.742188 0.968750
+vt 0.750000 0.718750
+vt 0.750000 0.656250
+vt 0.734375 0.250000
+vt 0.296875 0.562500
+vt 0.281250 0.468750
+vt 0.265625 0.531250
+vt 0.265625 0.500000
+vt 0.265625 0.468750
+vt 0.250000 0.406250
+vt 0.234375 0.437500
+vt 0.234375 0.406250
+vt 0.218750 0.343750
+vt 0.734375 0.718750
+vt 0.734375 0.687500
+vt 0.203125 0.375000
+vt 0.187500 0.281250
+vt 0.718750 0.218750
+vt 0.171875 0.343750
+vt 0.171875 0.312500
+vt 0.703125 0.250000
+vt 0.156250 0.218750
+vt 0.687500 0.156250
+vt 0.671875 0.218750
+vt 0.671875 0.187500
+vt 0.671875 0.156250
+vt 0.656250 0.093750
+vt 0.585938 0.031250
+vt 0.601562 0.031250
+vt 0.796875 0.468750
+vt 0.125000 0.781250
+vt 0.109375 0.218750
+vt 0.640625 0.125000
+vt 0.640625 0.093750
+vt 0.171875 0.906250
+vt 0.765625 0.750000
+vt 0.828125 0.625000
+vt 0.937500 0.093750
+vt 0.078125 0.218750
+vt 0.078125 0.187500
+vt 0.609375 0.062500
+vt 0.062500 0.093750
+vt 0.554688 0.968750
+vt 0.570312 0.968750
+vt 0.953125 0.562500
+vt 0.046875 0.125000
+vt 0.046875 0.093750
+vt 0.523438 0.968750
+vt 0.539062 0.968750
+vt 0.531250 0.906250
+vt 0.984375 0.718750
+vt 0.984375 0.656250
+vt 0.015625 0.062500
+vt 0.515625 0.937500
+vt 0.968750 0.906250
+vt 0.500000 0.843750
+vt 0.109375 0.593750
+vt 0.078125 0.250000
+vt 0.109375 0.562500
+vt 0.460938 0.968750
+vt 0.476562 0.968750
+vt 0.484375 0.875000
+vt 0.484375 0.843750
+vt 0.468750 0.781250
+vt 0.921875 0.906250
+vt 0.140625 0.718750
+vt 0.140625 0.687500
+vt 0.562500 0.468750
+vt 0.429688 0.968750
+vt 0.445312 0.968750
+vt 0.453125 0.843750
+vt 0.453125 0.812500
+vt 0.453125 0.781250
+vt 0.437500 0.718750
+vt 0.562500 0.218750
+vt 0.398438 0.968750
+vt 0.414062 0.968750
+vt 0.890625 0.843750
+vt 0.890625 0.812500
+vt 0.421875 0.750000
+vt 0.875000 0.718750
+vt 0.406250 0.656250
+vt 0.367188 0.968750
+vt 0.382812 0.968750
+vt 0.828125 0.906250
+vt 0.390625 0.718750
+vt 0.390625 0.687500
+vt 0.390625 0.656250
+vt 0.375000 0.593750
+vt 0.335938 0.968750
+vt 0.351562 0.968750
+vt 0.828125 0.718750
+vt 0.828125 0.687500
+vt 0.359375 0.625000
+vt 0.812500 0.593750
+vt 0.343750 0.531250
+vt 0.304688 0.968750
+vt 0.320312 0.968750
+vt 0.765625 0.812500
+vt 0.765625 0.781250
+vt 0.328125 0.593750
+vt 0.328125 0.562500
+vt 0.781250 0.531250
+vt 0.312500 0.468750
+vt 0.273438 0.968750
+vt 0.289062 0.968750
+vt 0.750000 0.843750
+vt 0.750000 0.781250
+vt 0.765625 0.593750
+vt 0.734375 0.343750
+vt 0.296875 0.531250
+vt 0.296875 0.500000
+vt 0.750000 0.093750
+vt 0.281250 0.406250
+vt 0.242188 0.968750
+vt 0.257812 0.968750
+vt 0.265625 0.437500
+vt 0.265625 0.406250
+vt 0.250000 0.343750
+vt 0.210938 0.968750
+vt 0.226562 0.968750
+vt 0.093750 0.531250
+vt 0.234375 0.250000
+vt 0.750000 0.531250
+vt 0.218750 0.156250
+vt 0.734375 0.593750
+vt 0.734375 0.562500
+vt 0.734375 0.531250
+vt 0.203125 0.218750
+vt 0.203125 0.187500
+vt 0.203125 0.156250
+vt 0.187500 0.093750
+vt 0.828125 0.937500
+vt 0.703125 0.218750
+vt 0.703125 0.187500
+vt 0.171875 0.125000
+vt 0.687500 0.093750
+vt 0.890625 0.125000
+vt 0.281250 0.781250
+vt 0.671875 0.125000
+vt 0.671875 0.093750
+vt 0.679688 0.031250
+vt 0.695312 0.031250
+vt 0.953125 0.625000
+vt 0.937500 0.843750
+vt 0.640625 0.062500
+vt 0.085938 0.031250
+vt 0.101562 0.031250
+vt 0.593750 0.906250
+vt 0.062500 0.906250
+vt 0.046875 0.187500
+vt 0.046875 0.156250
+vt 0.585938 0.968750
+vt 0.601562 0.968750
+vt 0.578125 0.937500
+vt 0.578125 0.906250
+vt 0.031250 0.843750
+vt 0.109375 0.625000
+vt 0.023438 0.031250
+vt 0.039062 0.031250
+vt 0.546875 0.937500
+vt 0.015625 0.875000
+vt 0.531250 0.843750
+vt 0.000000 0.781250
+vt 1.000000 0.781250
+vt 0.562500 0.656250
+vt 0.992188 0.031250
+vt 0.007812 0.031250
+vt 0.515625 0.906250
+vt 0.515625 0.875000
+vt 0.515625 0.843750
+vt 0.500000 0.781250
+vt 0.968750 0.718750
+vt 0.031250 0.781250
+vt 0.960938 0.031250
+vt 0.976562 0.031250
+vt 0.484375 0.812500
+vt 0.484375 0.781250
+vt 0.468750 0.718750
+vt 0.937500 0.656250
+vt 0.929688 0.031250
+vt 0.945312 0.031250
+vt 0.453125 0.750000
+vt 0.921875 0.687500
+vt 0.437500 0.656250
+vt 0.906250 0.593750
+vt 0.898438 0.031250
+vt 0.914062 0.031250
+vt 0.859375 0.718750
+vt 0.421875 0.718750
+vt 0.421875 0.687500
+vt 0.421875 0.656250
+vt 0.406250 0.593750
+vt 0.875000 0.531250
+vt 0.179688 0.031250
+vt 0.195312 0.031250
+vt 0.867188 0.031250
+vt 0.882812 0.031250
+vt 0.906250 0.406250
+vt 0.390625 0.625000
+vt 0.859375 0.562500
+vt 0.375000 0.531250
+vt 0.843750 0.468750
+vt 0.835938 0.031250
+vt 0.851562 0.031250
+vt 0.765625 0.406250
+vt 0.359375 0.593750
+vt 0.359375 0.562500
+vt 0.828125 0.500000
+vt 0.343750 0.468750
+vt 0.812500 0.406250
+vt 0.890625 0.468750
+vt 0.109375 0.781250
+vt 0.328125 0.531250
+vt 0.328125 0.500000
+vt 0.328125 0.468750
+vt 0.312500 0.406250
+vt 0.781250 0.343750
+vt 0.773438 0.031250
+vt 0.789062 0.031250
+vt 0.906250 0.156250
+vt 0.765625 0.375000
+vt 0.734375 0.156250
+vt 0.734375 0.125000
+vt 0.757812 0.031250
+vt 0.742188 0.031250
+vt 0.296875 0.406250
+vt 0.281250 0.343750
+vt 0.843750 0.718750
+vt 0.265625 0.375000
+vt 0.250000 0.281250
+vt 0.890625 0.406250
+vt 0.234375 0.343750
+vt 0.234375 0.312500
+vt 0.234375 0.281250
+vt 0.218750 0.218750
+vt 0.750000 0.468750
+vt 0.953125 0.937500
+vt 0.921875 0.562500
+vt 0.734375 0.500000
+vt 0.734375 0.468750
+vt 0.203125 0.250000
+vt 0.187500 0.156250
+vt 0.718750 0.093750
+vt 0.015625 0.093750
+vt 0.171875 0.218750
+vt 0.703125 0.156250
+vt 0.703125 0.125000
+vt 0.703125 0.093750
+vt 0.468750 0.093750
+vt 0.968750 0.656250
+vt 0.109375 0.937500
+vt 0.765625 0.562500
+vt 0.140625 0.125000
+vt 0.671875 0.062500
+vt 0.648438 0.031250
+vt 0.664062 0.031250
+vt 0.625000 0.906250
+vt 0.562500 0.843750
+vt 0.609375 0.937500
+vt 0.609375 0.906250
+vt 0.593750 0.843750
+vt 0.617188 0.968750
+vt 0.632812 0.968750
+vt 0.578125 0.875000
+vt 0.578125 0.843750
+vt 0.546875 0.906250
+vt 0.546875 0.875000
+vt 0.546875 0.843750
+vt 0.531250 0.781250
+vt 0.765625 0.250000
+vt 0.031250 0.656250
+vt 0.781250 0.781250
+vt 0.984375 0.875000
+vt 0.515625 0.812500
+vt 0.515625 0.781250
+vt 0.500000 0.718750
+vt 0.859375 0.531250
+vt 0.953125 0.843750
+vt 0.953125 0.812500
+vt 0.484375 0.750000
+vt 0.937500 0.718750
+vt 0.468750 0.656250
+vt 0.453125 0.718750
+vt 0.453125 0.687500
+vt 0.453125 0.656250
+vt 0.437500 0.593750
+vt 0.890625 0.718750
+vt 0.890625 0.687500
+vt 0.421875 0.625000
+vt 0.875000 0.593750
+vt 0.406250 0.531250
+vt 0.390625 0.593750
+vt 0.390625 0.562500
+vt 0.093750 0.906250
+vt 0.375000 0.468750
+vt 0.125000 0.656250
+vt 0.828125 0.593750
+vt 0.359375 0.531250
+vt 0.359375 0.500000
+vt 0.359375 0.468750
+vt 0.343750 0.406250
+vt 0.859375 0.375000
+vt 0.906250 0.906250
+vt 0.796875 0.906250
+vt 0.796875 0.531250
+vt 0.796875 0.500000
+vt 0.328125 0.437500
+vt 0.328125 0.406250
+vt 0.312500 0.343750
+vt 0.890625 0.531250
+vt 0.921875 0.875000
+vt 0.750000 0.593750
+vt 0.921875 0.843750
+vt 0.734375 0.218750
+vt 0.734375 0.187500
+vt 0.296875 0.375000
+vt 0.281250 0.281250
+vt 0.984375 0.062500
+vt 0.015625 0.406250
+vt 0.265625 0.343750
+vt 0.265625 0.312500
+vt 0.265625 0.281250
+vt 0.250000 0.218750
+vt 0.046875 0.593750
+vt 0.046875 0.562500
+vt 0.078125 0.906250
+vt 0.234375 0.125000
+vt 0.234375 0.093750
+vt 0.140625 0.093750
+vt 0.140625 0.062500
+vt 0.734375 0.437500
+vt 0.734375 0.406250
+vt 0.148438 0.031250
+vt 0.164062 0.031250
+vt 0.765625 0.656250
+vt 0.203125 0.062500
+vt 0.156250 0.906250
+vt 0.703125 0.062500
+vt 0.140625 0.937500
+vt 0.656250 0.906250
+vt 0.125000 0.843750
+vt 0.640625 0.937500
+vt 0.640625 0.906250
+vt 0.625000 0.843750
+vt 0.109375 0.843750
+vt 0.609375 0.875000
+vt 0.609375 0.843750
+vt 0.593750 0.781250
+vt 0.062500 0.781250
+vt 0.648438 0.968750
+vt 0.664062 0.968750
+vt 0.578125 0.812500
+vt 0.578125 0.781250
+vt 0.031250 0.718750
+vt 0.906250 0.781250
+vt 0.546875 0.812500
+vt 0.546875 0.781250
+vt 0.531250 0.718750
+vt 0.000000 0.656250
+vt 1.000000 0.656250
+vt 0.515625 0.750000
+vt 0.984375 0.687500
+vt 0.500000 0.656250
+vt 0.968750 0.593750
+vt 0.921875 0.343750
+vt 0.484375 0.718750
+vt 0.484375 0.687500
+vt 0.484375 0.656250
+vt 0.468750 0.593750
+vt 0.937500 0.531250
+vt 0.171875 0.406250
+vt 0.453125 0.625000
+vt 0.156250 0.343750
+vt 0.437500 0.531250
+vt 0.906250 0.468750
+vt 0.765625 0.875000
+vt 0.828125 0.281250
+vt 0.421875 0.593750
+vt 0.421875 0.562500
+vt 0.890625 0.500000
+vt 0.406250 0.468750
+vt 0.875000 0.406250
+vt 0.859375 0.437500
+vt 0.890625 0.781250
+vt 0.859375 0.406250
+vt 0.390625 0.531250
+vt 0.390625 0.500000
+vt 0.390625 0.468750
+vt 0.375000 0.406250
+vt 0.843750 0.343750
+vt 0.765625 0.906250
+vt 0.984375 0.375000
+vt 0.781250 0.656250
+vt 0.359375 0.437500
+vt 0.359375 0.406250
+vt 0.343750 0.343750
+vt 0.812500 0.281250
+vt 0.015625 0.531250
+vt 0.015625 0.468750
+vt 0.328125 0.375000
+vt 0.796875 0.312500
+vt 0.312500 0.281250
+vt 0.781250 0.218750
+vt 0.140625 0.375000
+vt 0.750000 0.343750
+vt 0.750000 0.281250
+vt 0.296875 0.343750
+vt 0.296875 0.312500
+vt 0.296875 0.281250
+vt 0.281250 0.218750
+vt 0.171875 0.531250
+vt 0.171875 0.500000
+vt 0.265625 0.250000
+vt 0.250000 0.156250
+vt 0.296875 0.437500
+vt 0.929688 0.968750
+vt 0.945312 0.968750
+vt 0.234375 0.218750
+vt 0.234375 0.187500
+vt 0.234375 0.156250
+vt 0.218750 0.093750
+vt 0.734375 0.312500
+vt 0.734375 0.281250
+vt 0.203125 0.125000
+vt 0.203125 0.093750
+vt 0.687500 0.906250
+vt 0.812500 0.468750
+vt 0.859375 0.593750
+vt 0.171875 0.093750
+vt 0.171875 0.062500
+vt 0.671875 0.937500
+vt 0.671875 0.906250
+vt 0.656250 0.843750
+vt 0.054688 0.031250
+vt 0.070312 0.031250
+vt 0.710938 0.031250
+vt 0.726562 0.031250
+vt 0.640625 0.875000
+vt 0.640625 0.843750
+vt 0.625000 0.781250
+vt 0.078125 0.937500
+vt 0.609375 0.812500
+vt 0.609375 0.781250
+vt 0.593750 0.718750
+vt 0.093750 0.781250
+vt 0.679688 0.968750
+vt 0.695312 0.968750
+vt 0.046875 0.875000
+vt 0.046875 0.843750
+vt 0.578125 0.750000
+vt 0.562500 0.718750
+vt 0.015625 0.843750
+vt 0.015625 0.812500
+vt 0.546875 0.750000
+vt 1.000000 0.718750
+vt 0.000000 0.718750
+vt 0.531250 0.656250
+vt 0.796875 0.250000
+vt 0.515625 0.718750
+vt 0.515625 0.687500
+vt 0.515625 0.656250
+vt 0.500000 0.593750
+vt 0.859375 0.750000
+vt 0.828125 0.375000
+vt 0.953125 0.718750
+vt 0.953125 0.687500
+vt 0.484375 0.625000
+vt 0.937500 0.593750
+vt 0.468750 0.531250
+vt 0.890625 0.875000
+vt 0.140625 0.781250
+vt 0.453125 0.593750
+vt 0.453125 0.562500
+vt 0.906250 0.531250
+vt 0.437500 0.468750
+vt 0.984375 0.437500
+vt 0.015625 0.781250
+vt 0.031250 0.156250
+vt 0.890625 0.593750
+vt 0.421875 0.531250
+vt 0.421875 0.500000
+vt 0.421875 0.468750
+vt 0.406250 0.406250
+vt 0.046875 0.937500
+vt 0.109375 0.312500
+vt 0.046875 0.906250
+vt 0.859375 0.500000
+vt 0.390625 0.437500
+vt 0.390625 0.406250
+vt 0.375000 0.343750
+vt 0.171875 0.781250
+vt 0.140625 0.406250
+vt 0.359375 0.375000
+vt 0.812500 0.343750
+vt 0.343750 0.281250
+vt 0.765625 0.468750
+vt 0.765625 0.437500
+vt 0.328125 0.343750
+vt 0.328125 0.312500
+vt 0.328125 0.281250
+vt 0.312500 0.218750
+vt 0.750000 0.406250
+vt 0.765625 0.281250
+vt 0.734375 0.093750
+vt 0.734375 0.062500
+vt 0.296875 0.250000
+vt 0.281250 0.156250
+vt 0.781250 0.156250
+vt 0.265625 0.218750
+vt 0.265625 0.187500
+vt 0.265625 0.156250
+vt 0.250000 0.093750
+vt 0.796875 0.593750
+vt 0.843750 0.281250
+vt 0.203125 0.937500
+vt 0.718750 0.906250
+vt 0.187500 0.843750
+vt 0.703125 0.937500
+vt 0.703125 0.906250
+vt 0.687500 0.843750
+vt 0.156250 0.781250
+vt 0.671875 0.875000
+vt 0.671875 0.843750
+vt 0.656250 0.781250
+vt 0.125000 0.718750
+vt 0.273438 0.031250
+vt 0.289062 0.031250
+vt 0.640625 0.812500
+vt 0.640625 0.781250
+vt 0.109375 0.750000
+vt 0.093750 0.718750
+vt 0.125000 0.531250
+vt 0.609375 0.750000
+vt 0.156250 0.718750
+vt 0.593750 0.656250
+vt 0.062500 0.656250
+vt 0.828125 0.656250
+vt 0.796875 0.281250
+vt 0.710938 0.968750
+vt 0.726562 0.968750
+vt 0.578125 0.718750
+vt 0.578125 0.687500
+vt 0.578125 0.656250
+vt 0.031250 0.593750
+vt 0.921875 0.250000
+vt 0.859375 0.812500
+vt 0.859375 0.781250
+vt 0.546875 0.718750
+vt 0.546875 0.687500
+vt 0.546875 0.656250
+vt 0.531250 0.593750
+vt 1.000000 0.531250
+vt 0.000000 0.531250
+vt 0.984375 0.750000
+vt 0.953125 0.375000
+vt 0.515625 0.625000
+vt 0.984375 0.562500
+vt 0.500000 0.531250
+vt 0.968750 0.468750
+vt 0.953125 0.906250
+vt 0.078125 0.281250
+vt 0.484375 0.593750
+vt 0.484375 0.562500
+vt 0.953125 0.500000
+vt 0.468750 0.468750
+vt 0.937500 0.406250
+vt 0.109375 0.375000
+vt 0.453125 0.531250
+vt 0.453125 0.500000
+vt 0.453125 0.468750
+vt 0.437500 0.406250
+vt 0.906250 0.343750
+vt 0.562500 0.406250
+vt 0.171875 0.875000
+vt 0.171875 0.843750
+vt 0.421875 0.437500
+vt 0.421875 0.406250
+vt 0.406250 0.343750
+vt 0.875000 0.281250
+vt 0.390625 0.375000
+vt 0.859375 0.312500
+vt 0.375000 0.281250
+vt 0.843750 0.218750
+vt 0.359375 0.343750
+vt 0.359375 0.312500
+vt 0.359375 0.281250
+vt 0.343750 0.218750
+vt 0.812500 0.156250
+vt 0.328125 0.250000
+vt 0.796875 0.187500
+vt 0.312500 0.156250
+vt 0.781250 0.093750
+vt 0.734375 0.875000
+vt 0.765625 0.125000
+vt 0.765625 0.093750
+vt 0.296875 0.218750
+vt 0.296875 0.187500
+vt 0.296875 0.156250
+vt 0.281250 0.093750
+vt 0.875000 0.093750
+vt 0.265625 0.125000
+vt 0.921875 0.218750
+vt 0.234375 0.062500
+vt 0.187500 0.906250
+vt 0.718750 0.843750
+vt 0.171875 0.937500
+vt 0.703125 0.875000
+vt 0.703125 0.843750
+vt 0.687500 0.781250
+vt 0.796875 0.625000
+vt 0.140625 0.875000
+vt 0.671875 0.812500
+vt 0.671875 0.781250
+vt 0.656250 0.718750
+vt 0.828125 0.750000
+vt 0.890625 0.156250
+vt 0.242188 0.031250
+vt 0.257812 0.031250
+vt 0.640625 0.750000
+vt 0.640625 0.718750
+vt 0.625000 0.656250
+vt 0.953125 0.656250
+vt 0.921875 0.281250
+vt 0.609375 0.718750
+vt 0.609375 0.687500
+vt 0.609375 0.656250
+vt 0.593750 0.593750
+vt 0.984375 0.843750
+vt 0.046875 0.250000
+vt 0.984375 0.812500
+vt 0.984375 0.781250
+vt 0.046875 0.750000
+vt 0.578125 0.625000
+vt 0.562500 0.593750
+vt 0.109375 0.687500
+vt 0.015625 0.718750
+vt 0.015625 0.687500
+vt 0.546875 0.625000
+vt 1.000000 0.593750
+vt 0.000000 0.593750
+vt 0.531250 0.531250
+vt 0.203125 0.406250
+vt 0.140625 0.812500
+vt 0.515625 0.593750
+vt 0.515625 0.562500
+vt 0.968750 0.531250
+vt 0.500000 0.468750
+vt 0.953125 0.593750
+vt 0.484375 0.531250
+vt 0.484375 0.500000
+vt 0.484375 0.468750
+vt 0.468750 0.406250
+vt 0.921875 0.531250
+vt 0.921875 0.500000
+vt 0.453125 0.437500
+vt 0.453125 0.406250
+vt 0.437500 0.343750
+vt 0.960938 0.968750
+vt 0.976562 0.968750
+vt 0.890625 0.437500
+vt 0.421875 0.375000
+vt 0.875000 0.343750
+vt 0.406250 0.281250
+vt 0.390625 0.343750
+vt 0.390625 0.312500
+vt 0.390625 0.281250
+vt 0.375000 0.218750
+vt 0.828125 0.343750
+vt 0.828125 0.312500
+vt 0.359375 0.250000
+vt 0.812500 0.218750
+vt 0.343750 0.156250
+vt 0.093750 0.656250
+vt 0.328125 0.218750
+vt 0.328125 0.187500
+vt 0.328125 0.156250
+vt 0.312500 0.093750
+vt 0.734375 0.937500
+vt 0.734375 0.906250
+vt 0.765625 0.218750
+vt 0.765625 0.187500
+vt 0.765625 0.156250
+vt 0.296875 0.125000
+vt 0.296875 0.093750
+vt 0.265625 0.093750
+vt 0.265625 0.062500
+vt 0.796875 0.718750
+vt 0.859375 0.125000
+vt 0.859375 0.093750
+vt 0.796875 0.656250
+vt 0.203125 0.812500
+vt 0.718750 0.781250
+vt 0.187500 0.718750
+vt 0.921875 0.625000
+vt 0.890625 0.250000
+vt 0.375000 0.906250
+vt 0.140625 0.656250
+vt 0.703125 0.812500
+vt 0.703125 0.781250
+vt 0.687500 0.718750
+vt 0.156250 0.656250
+vt 0.015625 0.187500
+vt 0.953125 0.750000
+vt 0.921875 0.468750
+vt 0.015625 0.156250
+vt 0.062500 0.468750
+vt 0.078125 0.843750
+vt 0.671875 0.750000
+vt 0.671875 0.718750
+vt 0.656250 0.656250
+vt 0.125000 0.593750
+vt 0.968750 0.406250
+vt 0.796875 0.093750
+vt 0.078125 0.687500
+vt 0.046875 0.312500
+vt 0.335938 0.031250
+vt 0.351562 0.031250
+vt 0.046875 0.281250
+vt 0.640625 0.687500
+vt 0.640625 0.656250
+vt 0.625000 0.593750
+vt 0.093750 0.593750
+vt 0.171875 0.187500
+vt 0.171875 0.156250
+vt 0.765625 0.343750
+vt 0.609375 0.625000
+vt 0.078125 0.625000
+vt 0.593750 0.531250
+vt 0.062500 0.531250
+vt 0.765625 0.312500
+vt 0.562500 0.781250
+vt 0.203125 0.281250
+vt 0.578125 0.593750
+vt 0.578125 0.562500
+vt 0.562500 0.531250
+vt 0.031250 0.468750
+vt 0.546875 0.593750
+vt 0.546875 0.562500
+vt 0.015625 0.500000
+vt 0.531250 0.468750
+vt 0.000000 0.406250
+vt 1.000000 0.406250
+vt 0.843750 0.656250
+vt 0.515625 0.531250
+vt 0.515625 0.500000
+vt 0.515625 0.468750
+vt 0.500000 0.406250
+vt 0.968750 0.343750
+vt 0.484375 0.437500
+vt 0.484375 0.406250
+vt 0.468750 0.343750
+vt 0.937500 0.281250
+vt 0.453125 0.375000
+vt 0.921875 0.312500
+vt 0.437500 0.281250
+vt 0.906250 0.218750
+vt 0.421875 0.343750
+vt 0.421875 0.312500
+vt 0.421875 0.281250
+vt 0.406250 0.218750
+vt 0.875000 0.156250
+vt 0.390625 0.250000
+vt 0.390625 0.218750
+vt 0.375000 0.156250
+vt 0.843750 0.093750
+vt 0.125000 0.406250
+vt 0.359375 0.218750
+vt 0.359375 0.187500
+vt 0.359375 0.156250
+vt 0.343750 0.093750
+vt 0.328125 0.125000
+vt 0.328125 0.093750
+vt 0.859375 0.218750
+vt 0.750000 0.906250
+vt 0.734375 0.750000
+vt 0.890625 0.562500
+vt 0.859375 0.187500
+vt 0.859375 0.156250
+vt 0.296875 0.062500
+vt 0.250000 0.906250
+vt 0.921875 0.718750
+vt 0.984375 0.093750
+vt 0.921875 0.656250
+vt 0.234375 0.937500
+vt 0.234375 0.906250
+vt 0.218750 0.843750
+vt 0.015625 0.250000
+vt 0.203125 0.906250
+vt 0.203125 0.875000
+vt 0.203125 0.843750
+vt 0.554688 0.031250
+vt 0.570312 0.031250
+vt 0.718750 0.718750
+vt 0.078125 0.750000
+vt 0.078125 0.718750
+vt 0.171875 0.812500
+vt 0.703125 0.750000
+vt 0.703125 0.718750
+vt 0.687500 0.656250
+vt 0.171875 0.250000
+vt 0.046875 0.343750
+vt 0.140625 0.750000
+vt 0.671875 0.687500
+vt 0.671875 0.656250
+vt 0.656250 0.593750
+vt 0.781250 0.406250
+vt 0.304688 0.031250
+vt 0.320312 0.031250
+vt 0.109375 0.718750
+vt 0.640625 0.625000
+vt 0.109375 0.656250
+vt 0.625000 0.531250
+vt 0.609375 0.593750
+vt 0.609375 0.562500
+vt 0.062500 0.593750
+vt 0.593750 0.468750
+vt 0.078125 0.656250
+vt 0.781250 0.906250
+vt 0.046875 0.625000
+vt 0.578125 0.531250
+vt 0.578125 0.500000
+vt 0.578125 0.468750
+vt 0.015625 0.593750
+vt 0.546875 0.531250
+vt 0.546875 0.500000
+vt 0.546875 0.468750
+vt 0.531250 0.406250
+vt 0.984375 0.531250
+vt 0.984375 0.500000
+vt 0.515625 0.437500
+vt 0.515625 0.406250
+vt 0.500000 0.343750
+vt 0.953125 0.437500
+vt 0.484375 0.375000
+vt 0.937500 0.343750
+vt 0.468750 0.281250
+vt 0.453125 0.343750
+vt 0.453125 0.312500
+vt 0.453125 0.281250
+vt 0.437500 0.218750
+vt 0.890625 0.343750
+vt 0.890625 0.312500
+vt 0.421875 0.250000
+vt 0.875000 0.218750
+vt 0.406250 0.156250
+vt 0.828125 0.125000
+vt 0.859375 0.468750
+vt 0.828125 0.093750
+vt 0.859375 0.250000
+vt 0.390625 0.187500
+vt 0.843750 0.156250
+vt 0.375000 0.093750
+vt 0.492188 0.968750
+vt 0.507812 0.968750
+vt 0.890625 0.625000
+vt 0.937500 0.468750
+vt 0.828125 0.218750
+vt 0.828125 0.187500
+vt 0.359375 0.125000
+vt 0.359375 0.093750
+vt 0.984375 0.218750
+vt 0.015625 0.562500
+vt 0.984375 0.156250
+vt 0.796875 0.125000
+vt 0.328125 0.062500
+vt 0.281250 0.906250
+vt 0.734375 0.781250
+vt 0.046875 0.718750
+vt 0.046875 0.687500
+vt 0.109375 0.062500
+vt 0.046875 0.656250
+vt 0.265625 0.937500
+vt 0.265625 0.906250
+vt 0.250000 0.843750
+vt 0.140625 0.218750
+vt 0.140625 0.156250
+vt 0.234375 0.875000
+vt 0.234375 0.843750
+vt 0.218750 0.781250
+vt 0.203125 0.656250
+vt 0.203125 0.718750
+vt 0.203125 0.687500
+vt 0.718750 0.656250
+vt 0.187500 0.593750
+vt 0.703125 0.687500
+vt 0.703125 0.656250
+vt 0.687500 0.593750
+vt 0.156250 0.531250
+vt 0.000000 0.093750
+vt 1.000000 0.093750
+vt 0.859375 0.343750
+vt 0.671875 0.625000
+vt 0.671875 0.593750
+vt 0.656250 0.531250
+vt 0.125000 0.468750
+vt 0.398438 0.031250
+vt 0.414062 0.031250
+vt 0.843750 0.406250
+vt 0.640625 0.593750
+vt 0.640625 0.562500
+vt 0.109375 0.531250
+vt 0.625000 0.468750
+vt 0.109375 0.468750
+vt 0.609375 0.531250
+vt 0.609375 0.500000
+vt 0.609375 0.468750
+vt 0.593750 0.406250
+vt 0.062500 0.406250
+vt 0.031250 0.906250
+vt 0.000000 0.468750
+vt 1.000000 0.468750
+vt 0.578125 0.437500
+vt 0.578125 0.406250
+vt 0.031250 0.343750
+vt 0.546875 0.437500
+vt 0.546875 0.406250
+vt 0.531250 0.343750
+vt 0.000000 0.281250
+vt 1.000000 0.281250
+vt 0.515625 0.375000
+vt 0.156250 0.468750
+vt 0.500000 0.281250
+vt 0.968750 0.218750
+vt 0.828125 0.437500
+vt 0.796875 0.062500
+vt 0.828125 0.406250
+vt 0.484375 0.343750
+vt 0.484375 0.312500
+vt 0.484375 0.281250
+vt 0.468750 0.218750
+vt 0.937500 0.156250
+vt 0.890625 0.906250
+vt 0.453125 0.250000
+vt 0.921875 0.187500
+vt 0.437500 0.156250
+vt 0.906250 0.093750
+vt 0.953125 0.125000
+vt 0.984375 0.468750
+vt 0.421875 0.218750
+vt 0.421875 0.187500
+vt 0.421875 0.156250
+vt 0.890625 0.093750
+vt 0.406250 0.093750
+vt 0.968750 0.281250
+vt 0.078125 0.062500
+vt 0.015625 0.625000
+vt 0.390625 0.156250
+vt 0.390625 0.125000
+vt 0.859375 0.062500
+vt 0.812500 0.906250
+vt 0.140625 0.500000
+vt 0.140625 0.468750
+vt 0.109375 0.125000
+vt 0.359375 0.062500
+vt 0.796875 0.937500
+vt 0.312500 0.906250
+vt 0.781250 0.843750
+vt 0.562500 0.156250
+vt 0.171875 0.625000
+vt 0.296875 0.937500
+vt 0.296875 0.906250
+vt 0.281250 0.843750
+vt 0.734375 0.625000
+vt 0.296875 0.593750
+vt 0.265625 0.875000
+vt 0.250000 0.781250
+vt 0.718750 0.156250
+vt 0.234375 0.812500
+vt 0.234375 0.781250
+vt 0.218750 0.718750
+vt 0.203125 0.750000
+vt 0.187500 0.656250
+vt 0.718750 0.593750
+vt 0.171875 0.718750
+vt 0.171875 0.687500
+vt 0.703125 0.625000
+vt 0.156250 0.593750
+vt 0.687500 0.531250
+vt 0.140625 0.625000
+vt 0.671875 0.562500
+vt 0.671875 0.531250
+vt 0.656250 0.468750
+vt 0.367188 0.031250
+vt 0.382812 0.031250
+vt 0.640625 0.531250
+vt 0.640625 0.500000
+vt 0.640625 0.468750
+vt 0.625000 0.406250
+vt 0.078125 0.593750
+vt 0.078125 0.562500
+vt 0.609375 0.437500
+vt 0.609375 0.406250
+vt 0.593750 0.343750
+vt 0.093750 0.093750
+vt 0.796875 0.375000
+vt 0.046875 0.531250
+vt 0.046875 0.500000
+vt 0.046875 0.468750
+vt 0.578125 0.375000
+vt 0.562500 0.343750
+vt 0.828125 0.468750
+vt 0.015625 0.437500
+vt 0.546875 0.375000
+vt 1.000000 0.343750
+vt 0.000000 0.343750
+vt 0.531250 0.281250
+vt 0.953125 0.406250
+vt 0.515625 0.343750
+vt 0.515625 0.312500
+vt 0.515625 0.281250
+vt 0.500000 0.218750
+vt 0.984375 0.593750
+vt 0.015625 0.937500
+vt 0.015625 0.906250
+vt 0.953125 0.343750
+vt 0.953125 0.312500
+vt 0.484375 0.250000
+vt 0.937500 0.218750
+vt 0.468750 0.156250
+vt 0.187500 0.781250
+vt 0.078125 0.125000
+vt 0.109375 0.437500
+vt 0.453125 0.218750
+vt 0.453125 0.187500
+vt 0.453125 0.156250
+vt 0.437500 0.093750
+vt 0.796875 0.218750
+vt 0.140625 0.593750
+vt 0.140625 0.562500
+vt 0.890625 0.218750
+vt 0.890625 0.187500
+vt 0.421875 0.125000
+vt 0.421875 0.093750
+vt 0.390625 0.093750
+vt 0.390625 0.062500
+vt 0.343750 0.906250
+vt 0.828125 0.062500
+vt 0.328125 0.937500
+vt 0.328125 0.906250
+vt 0.312500 0.843750
+vt 0.781250 0.281250
+vt 0.765625 0.937500
+vt 0.296875 0.875000
+vt 0.296875 0.843750
+vt 0.734375 0.656250
+vt 0.265625 0.843750
+vt 0.265625 0.812500
+vt 0.265625 0.781250
+vt 0.250000 0.718750
+vt 0.843750 0.781250
+vt 0.234375 0.750000
+vt 0.218750 0.656250
+vt 0.203125 0.593750
+vt 0.203125 0.562500
+vt 0.718750 0.531250
+vt 0.187500 0.468750
+vt 0.703125 0.593750
+vt 0.703125 0.562500
+vt 0.703125 0.531250
+vt 0.171875 0.468750
+vt 0.156250 0.406250
+vt 0.953125 0.281250
+vt 0.671875 0.500000
+vt 0.140625 0.437500
+vt 0.656250 0.406250
+vt 0.125000 0.343750
+vt 0.796875 0.437500
+vt 0.460938 0.031250
+vt 0.476562 0.031250
+vt 0.828125 0.781250
+vt 0.156250 0.093750
+vt 0.640625 0.437500
+vt 0.640625 0.406250
+vt 0.625000 0.343750
+vt 0.093750 0.343750
+vt 0.921875 0.375000
+vt 0.765625 0.625000
+vt 0.609375 0.375000
+vt 0.078125 0.375000
+vt 0.593750 0.281250
+vt 0.062500 0.281250
+vt 0.953125 0.468750
+vt 0.578125 0.343750
+vt 0.578125 0.312500
+vt 0.578125 0.281250
+vt 0.031250 0.218750
+vt 0.078125 0.437500
+vt 0.046875 0.062500
+vt 0.078125 0.406250
+vt 0.546875 0.343750
+vt 0.546875 0.312500
+vt 0.546875 0.281250
+vt 0.531250 0.218750
+vt 0.000000 0.156250
+vt 1.000000 0.156250
+vt 0.140625 0.843750
+vt 0.109375 0.500000
+vt 0.515625 0.250000
+vt 0.984375 0.187500
+vt 0.500000 0.156250
+vt 0.968750 0.093750
+vt 0.984375 0.406250
+vt 0.062500 0.843750
+vt 0.031250 0.406250
+vt 0.484375 0.218750
+vt 0.484375 0.187500
+vt 0.484375 0.156250
+vt 0.953125 0.093750
+vt 1.000000 0.843750
+vt 0.000000 0.843750
+vt 0.453125 0.125000
+vt 0.921875 0.062500
+vt 0.875000 0.906250
+vt 0.421875 0.062500
+vt 0.859375 0.937500
+vt 0.859375 0.906250
+vt 0.843750 0.843750
+vt 0.359375 0.937500
+vt 0.828125 0.875000
+vt 0.343750 0.843750
+vt 0.812500 0.781250
+vt 0.906250 0.281250
+vt 0.328125 0.875000
+vt 0.328125 0.843750
+vt 0.312500 0.781250
+vt 0.781250 0.718750
+vt 0.109375 0.281250
+vt 0.093750 0.406250
+vt 0.296875 0.812500
+vt 0.296875 0.781250
+vt 0.281250 0.718750
+vt 0.796875 0.843750
+vt 0.265625 0.750000
+vt 0.062500 0.343750
+vt 0.250000 0.656250
+vt 0.234375 0.718750
+vt 0.234375 0.687500
+vt 0.234375 0.656250
+vt 0.218750 0.593750
+vt 0.093750 0.468750
+vt 0.796875 0.750000
+vt 0.203125 0.625000
+vt 0.187500 0.531250
+vt 0.718750 0.468750
+vt 0.890625 0.281250
+vt 0.828125 0.843750
+vt 0.171875 0.593750
+vt 0.171875 0.562500
+vt 0.703125 0.500000
+vt 0.703125 0.468750
+vt 0.687500 0.406250
+vt 0.210938 0.031250
+vt 0.226562 0.031250
+vt 0.156250 0.843750
+vt 0.921875 0.437500
+vt 0.875000 0.468750
+vt 0.953125 0.781250
+vt 0.921875 0.406250
+vt 0.140625 0.531250
+vt 0.671875 0.468750
+vt 0.671875 0.437500
+vt 0.671875 0.406250
+vt 0.656250 0.343750
+vt 0.968750 0.156250
+vt 0.046875 0.375000
+vt 0.429688 0.031250
+vt 0.445312 0.031250
+vt 0.984375 0.906250
+vt 0.640625 0.375000
+vt 0.109375 0.406250
+vt 0.625000 0.281250
+vt 0.078125 0.531250
+vt 0.078125 0.500000
+vt 0.109375 0.812500
+vt 0.078125 0.468750
+vt 0.609375 0.343750
+vt 0.609375 0.312500
+vt 0.609375 0.281250
+vt 0.593750 0.218750
+vt 0.140625 0.906250
+vt 0.578125 0.250000
+vt 0.578125 0.218750
+vt 0.804688 0.031250
+vt 0.820312 0.031250
+vt 0.015625 0.343750
+vt 0.015625 0.312500
+vt 0.546875 0.250000
+vt 1.000000 0.218750
+vt 0.000000 0.218750
+vt 0.531250 0.156250
+vt 0.687500 0.468750
+vt 0.031250 0.281250
+vt 0.515625 0.218750
+vt 0.515625 0.187500
+vt 0.515625 0.156250
+vt 0.500000 0.093750
+vt 0.796875 0.406250
+vt 0.953125 0.218750
+vt 0.953125 0.187500
+vt 0.484375 0.125000
+vt 0.484375 0.093750
+vt 0.921875 0.156250
+vt 0.453125 0.093750
+vt 0.453125 0.062500
+vt 0.406250 0.906250
+vt 0.890625 0.062500
+vt 0.390625 0.937500
+vt 0.390625 0.906250
+vt 0.375000 0.843750
+vt 0.359375 0.906250
+vt 0.359375 0.875000
+vt 0.812500 0.843750
+vt 0.343750 0.781250
+vt 0.765625 0.718750
+vt 0.796875 0.875000
+vt 0.328125 0.812500
+vt 0.328125 0.781250
+vt 0.312500 0.718750
+vt 0.765625 0.843750
+vt 0.296875 0.750000
+vt 0.281250 0.656250
+vt 0.796875 0.812500
+vt 0.953125 0.531250
+vt 0.796875 0.781250
+vt 0.265625 0.718750
+vt 0.265625 0.687500
+vt 0.265625 0.656250
+vt 0.250000 0.593750
+vt 0.921875 0.750000
+vt 0.890625 0.375000
+vt 0.234375 0.625000
+vt 0.218750 0.531250
+vt 0.218750 0.406250
+vt 0.953125 0.875000
+vt 0.015625 0.281250
+vt 0.203125 0.437500
+vt 0.718750 0.406250
+vt 0.187500 0.343750
+vt 0.078125 0.812500
+vt 0.046875 0.437500
+vt 0.078125 0.781250
+vt 0.046875 0.406250
+vt 0.703125 0.437500
+vt 0.703125 0.406250
+vt 0.687500 0.343750
+vt 0.156250 0.281250
+vt 0.828125 0.531250
+vt 0.171875 0.281250
+vt 0.109375 0.875000
+vt 0.765625 0.500000
+vt 0.671875 0.375000
+vt 0.140625 0.312500
+vt 0.656250 0.281250
+vt 0.125000 0.218750
+vt 0.562500 0.906250
+vt 0.523438 0.031250
+vt 0.539062 0.031250
+vt 0.640625 0.343750
+vt 0.640625 0.312500
+vt 0.640625 0.281250
+vt 0.625000 0.218750
+vt 0.093750 0.218750
+vt 0.609375 0.250000
+vt 0.609375 0.218750
+vt 0.593750 0.156250
+vt 0.062500 0.156250
+vt 0.046875 0.218750
+vt 0.578125 0.187500
+vt 0.578125 0.156250
+vt 0.031250 0.093750
+vt 0.546875 0.218750
+vt 0.546875 0.187500
+vt 0.015625 0.125000
+vt 0.531250 0.093750
+vt 0.906250 0.656250
+vt 0.515625 0.125000
+vt 0.515625 0.093750
+vt 0.937500 0.906250
+vt 0.484375 0.062500
+vt 0.921875 0.937500
+vt 0.437500 0.906250
+vt 0.906250 0.843750
+vt 0.421875 0.937500
+vt 0.421875 0.906250
+vt 0.406250 0.843750
+vt 0.875000 0.781250
+vt 0.390625 0.875000
+vt 0.390625 0.843750
+vt 0.375000 0.781250
+vt 0.093750 0.843750
+vt 0.828125 0.156250
+vt 0.125000 0.906250
+vt 0.359375 0.843750
+vt 0.359375 0.812500
+vt 0.359375 0.781250
+vt 0.343750 0.718750
+vt 0.812500 0.656250
+vt 0.890625 0.656250
+vt 0.859375 0.281250
+vt 0.328125 0.750000
+vt 0.796875 0.687500
+vt 0.312500 0.656250
+vt 0.781250 0.593750
+vt 0.984375 0.250000
+vt 0.921875 0.781250
+vt 0.296875 0.718750
+vt 0.734375 0.375000
+vt 0.296875 0.656250
+vt 0.281250 0.593750
+vt 0.750000 0.156250
+vt 0.015625 0.375000
+vt 0.265625 0.625000
+vt 0.250000 0.531250
+vt 0.140625 0.250000
+vt 0.078125 0.875000
+vt 0.234375 0.593750
+vt 0.234375 0.562500
+vt 0.218750 0.468750
+vt 0.171875 0.375000
+vt 0.093750 0.156250
+vt 0.062500 0.718750
+vt 0.203125 0.531250
+vt 0.203125 0.500000
+vt 0.203125 0.468750
+vt 0.187500 0.406250
+vt 0.718750 0.343750
+vt 0.796875 0.343750
+vt 0.171875 0.437500
+vt 0.703125 0.375000
+vt 0.703125 0.343750
+vt 0.687500 0.281250
+vt 0.671875 0.343750
+vt 0.671875 0.312500
+vt 0.125000 0.281250
+vt 0.656250 0.218750
+vt 0.492188 0.031250
+vt 0.507812 0.031250
+vt 0.812500 0.093750
+vt 0.109375 0.343750
+vt 0.640625 0.250000
+vt 0.640625 0.218750
+vt 0.625000 0.156250
+vt 0.078125 0.343750
+vt 0.078125 0.312500
+vt 0.609375 0.187500
+vt 0.062500 0.218750
+vt 0.593750 0.093750
+vt 0.843750 0.906250
+vt 0.093750 0.281250
+vt 0.109375 0.156250
+vt 0.578125 0.125000
+vt 0.562500 0.093750
+vt 0.015625 0.218750
+vt 0.546875 0.156250
+vt 0.546875 0.125000
+vt 0.546875 0.093750
+vt 0.921875 0.593750
+vt 0.984375 0.125000
+vt 0.515625 0.062500
+vt 0.125000 0.156250
+vt 0.468750 0.906250
+vt 0.953125 0.062500
+vt 0.453125 0.937500
+vt 0.453125 0.906250
+vt 0.437500 0.843750
+vt 0.859375 0.625000
+vt 0.828125 0.250000
+vt 0.218750 0.906250
+vt 0.890625 0.937500
+vt 0.421875 0.875000
+vt 0.875000 0.843750
+vt 0.406250 0.781250
+vt 0.890625 0.750000
+vt 0.953125 0.156250
+vt 0.859375 0.875000
+vt 0.390625 0.812500
+vt 0.390625 0.781250
+vt 0.375000 0.718750
+vt 0.984375 0.343750
+vt 0.984375 0.312500
+vt 0.015625 0.656250
+vt 0.984375 0.281250
+vt 0.828125 0.812500
+vt 0.359375 0.750000
+vt 0.812500 0.718750
+vt 0.343750 0.656250
+vt 0.046875 0.812500
+vt 0.109375 0.187500
+vt 0.046875 0.781250
+vt 0.328125 0.718750
+vt 0.328125 0.687500
+vt 0.328125 0.656250
+vt 0.312500 0.593750
+vt 0.140625 0.343750
+vt 0.171875 0.656250
+vt 0.140625 0.281250
+vt 0.296875 0.625000
+vt 0.750000 0.218750
+vt 0.281250 0.531250
+vt 0.203125 0.781250
+vt 0.265625 0.593750
+vt 0.265625 0.562500
+vt 0.250000 0.468750
+vt 0.296875 0.468750
+vt 0.031250 0.531250
+vt 0.234375 0.531250
+vt 0.234375 0.500000
+vt 0.234375 0.468750
+s 0
+f 308/339/1 979/1106/1 775/894/1
+f 4/4/2 786/905/2 790/909/2
+f 475/552/3 1130/1262/3 1213/1348/3
+f 5/5/4 1042/1171/4 880/1001/4
+f 1/1/5 488/566/5 487/565/5
+f 478/555/6 950/1074/6 675/778/6
+f 476/553/7 1307/1444/7 1396/1536/7
+f 6/6/8 951/1075/8 967/1092/8
+f 2/2/9 590/683/9 589/682/9
+f 479/556/10 1912/2067/10 862/983/10
+f 477/554/11 1488/1632/11 1568/1714/11
+f 480/557/12 1825/1979/12 773/891/12
+f 3/3/13 690/795/13 689/794/13
+f 481/558/14 678/781/14 1044/1173/14
+f 3/3/15 687/792/15 691/796/15
+f 474/551/16 1212/1347/16 576/669/16
+f 20/20/17 793/912/17 798/917/17
+f 13/13/18 1578/1724/18 1582/1728/18
+f 7/7/19 1058/1187/19 1078/1208/19
+f 308/340/20 705/811/20 979/1105/20
+f 14/14/21 1664/1813/21 1670/1819/21
+f 7/7/22 1056/1185/22 1059/1188/22
+f 15/15/23 1753/1906/23 1760/1913/23
+f 8/8/24 1142/1274/24 1145/1277/24
+f 16/16/25 1841/1995/25 1845/1999/25
+f 9/9/26 1226/1361/26 1233/1368/26
+f 17/17/27 491/569/27 497/576/27
+f 10/10/28 1324/1462/28 1329/1467/28
+f 19/19/29 698/803/29 697/802/29
+f 11/11/30 1412/1552/30 1415/1555/30
+f 20/20/31 797/916/31 796/915/31
+f 13/13/32 1581/1727/32 1580/1726/32
+f 24/24/33 1146/1278/33 1150/1282/33
+f 33/33/34 502/582/34 501/581/34
+f 25/25/35 1234/1369/35 1243/1378/35
+f 34/34/36 600/693/36 599/692/36
+f 26/26/37 1330/1468/37 1335/1473/37
+f 34/34/38 598/691/38 601/694/38
+f 27/27/39 1416/1556/39 1421/1562/39
+f 35/35/40 700/805/40 704/809/40
+f 28/28/41 1503/1647/41 1506/1650/41
+f 22/22/42 975/1100/42 988/1115/42
+f 308/341/43 805/925/43 705/810/43
+f 30/30/44 1680/1830/44 1679/1829/44
+f 22/22/45 970/1095/45 976/1101/45
+f 30/30/46 1671/1820/46 1681/1831/46
+f 23/23/47 1060/1189/47 1063/1192/47
+f 32/32/48 1848/2002/48 1847/2001/48
+f 44/44/49 1510/1655/49 1509/1654/49
+f 37/37/50 889/1011/50 897/1019/50
+f 308/342/51 506/587/51 805/924/51
+f 44/44/52 1507/1651/52 1511/1656/52
+f 37/37/53 887/1009/53 890/1012/53
+f 45/45/54 1588/1734/54 1595/1742/54
+f 38/38/55 977/1102/55 981/1108/55
+f 47/47/56 1774/1928/56 1773/1927/56
+f 39/39/57 1064/1193/57 1068/1198/57
+f 47/47/58 1769/1922/58 1775/1929/58
+f 40/40/59 1151/1283/59 1156/1289/59
+f 48/48/60 1850/2004/60 1855/2010/60
+f 41/41/61 1244/1379/61 1253/1389/61
+f 49/49/62 504/584/62 510/592/62
+f 43/43/63 1427/1569/63 1426/1568/63
+f 50/50/64 602/695/64 608/702/64
+f 62/62/65 1689/1840/65 1696/1847/65
+f 56/56/66 1161/1294/66 1160/1293/66
+f 63/63/67 1776/1930/67 1779/1933/67
+f 56/56/68 1157/1290/68 1162/1295/68
+f 65/65/69 517/601/69 516/600/69
+f 58/58/70 1344/1483/70 1343/1482/70
+f 65/65/71 511/593/71 518/602/71
+f 59/59/72 1432/1574/72 1431/1573/72
+f 52/52/73 808/928/73 811/931/73
+f 308/343/74 603/697/74 506/586/74
+f 59/59/75 1429/1571/75 1433/1575/75
+f 52/52/76 806/926/76 809/929/76
+f 60/60/77 1512/1657/77 1516/1661/77
+f 53/53/78 891/1013/78 894/1016/78
+f 62/62/79 1695/1846/79 1694/1845/79
+f 54/54/80 982/1109/80 985/1112/80
+f 308/344/81 1323/1461/81 603/696/81
+f 74/74/82 1346/1485/82 1352/1491/82
+f 67/67/83 710/817/83 716/824/83
+f 75/75/84 1434/1576/84 1439/1582/84
+f 68/68/85 810/930/85 813/934/85
+f 77/77/86 1606/1753/86 1605/1752/86
+f 69/69/87 895/1017/87 899/1022/87
+f 77/77/88 1602/1749/88 1607/1754/88
+f 71/71/89 1080/1211/89 1079/1210/89
+f 78/78/90 1697/1848/90 1700/1851/90
+f 71/71/91 1074/1204/91 1081/1212/91
+f 79/79/92 1780/1934/92 1784/1938/92
+f 73/73/93 1267/1403/93 1266/1402/93
+f 81/81/94 522/607/94 521/606/94
+f 74/74/95 1351/1490/95 1350/1489/95
+f 67/67/96 715/823/96 714/821/96
+f 95/126/97 1787/1941/97 1786/1940/97
+f 87/118/98 724/834/98 1088/1219/98
+f 96/127/99 1869/2024/99 1868/2023/99
+f 89/120/100 1271/1407/100 1270/1406/100
+f 96/127/101 1866/2021/101 1870/2025/101
+f 90/121/102 1355/1494/102 1354/1493/102
+f 83/114/103 720/829/103 617/711/103
+f 308/345/104 1772/1926/104 1323/1460/104
+f 90/121/105 639/736/105 1356/1495/105
+f 84/115/106 815/936/106 814/935/106
+f 91/122/107 1110/1242/107 1442/1585/107
+f 84/115/108 807/927/108 816/937/108
+f 93/124/109 1613/1760/109 1612/1759/109
+f 85/116/110 1264/1400/110 903/1026/110
+f 93/124/111 560/650/111 1614/1761/111
+f 87/118/112 1087/1218/112 1086/1217/112
+f 99/130/113 727/838/113 726/837/113
+f 106/137/114 1357/1496/114 1361/1500/114
+f 99/130/115 722/831/115 728/839/115
+f 108/139/116 1532/1678/116 1531/1677/116
+f 100/131/117 817/938/117 823/944/117
+f 108/139/118 1529/1675/118 1533/1679/118
+f 102/133/119 1000/1129/119 999/1128/119
+f 110/141/120 1710/1863/120 1709/1862/120
+f 102/133/121 997/1126/121 1001/1130/121
+f 110/141/122 1706/1859/122 1711/1864/122
+f 104/135/123 1180/1314/123 1179/1313/123
+f 111/142/124 1789/1943/124 1792/1946/124
+f 105/136/125 1277/1414/125 1276/1413/125
+f 98/129/126 626/722/126 621/716/126
+f 308/346/127 1851/2006/127 1772/1925/127
+f 105/136/128 1273/1409/128 1278/1415/128
+f 117/148/129 908/1032/129 913/1037/129
+f 125/156/130 1621/1769/130 1628/1776/130
+f 119/150/131 1100/1232/131 1099/1231/131
+f 126/157/132 1712/1865/132 1717/1870/132
+f 120/151/133 1185/1319/133 1184/1318/133
+f 113/144/134 534/621/134 1383/1522/134
+f 308/347/135 1591/1738/135 1851/2005/135
+f 120/151/136 1182/1316/136 1186/1320/136
+f 113/144/137 529/616/137 535/622/137
+f 121/152/138 1279/1416/138 1282/1419/138
+f 114/145/139 628/724/139 634/731/139
+f 123/154/140 1453/1597/140 1452/1596/140
+f 115/146/141 729/840/141 734/846/141
+f 123/154/142 1447/1591/142 1454/1598/142
+f 117/148/143 912/1036/143 911/1035/143
+f 125/156/144 1627/1775/144 1626/1774/144
+f 136/167/145 1187/1321/145 1191/1325/145
+f 130/161/146 642/740/146 641/739/146
+f 138/169/147 1368/1507/147 1367/1506/147
+f 130/161/148 635/732/148 643/741/148
+f 138/169/149 1366/1505/149 1369/1508/149
+f 132/163/150 832/953/150 831/952/150
+f 140/171/151 1547/1693/151 1546/1692/151
+f 132/163/152 830/951/152 833/954/152
+f 140/171/153 1542/1688/153 1548/1694/153
+f 134/165/154 1013/1142/154 1012/1141/154
+f 142/173/155 1720/1873/155 1719/1872/155
+f 135/166/156 1106/1238/156 1105/1237/156
+f 128/159/157 1877/2032/157 632/728/157
+f 308/348/158 1685/1836/158 1591/1737/158
+f 135/166/159 1102/1234/159 1107/1239/159
+f 128/159/160 1875/2030/160 1878/2033/160
+f 155/186/161 1460/1604/161 1466/1610/161
+f 149/180/162 924/1048/162 923/1047/162
+f 156/187/163 1549/1695/163 1556/1702/163
+f 150/181/164 1021/1150/164 1020/1149/164
+f 143/174/165 1798/1952/165 640/737/165
+f 308/349/166 1424/1566/166 1685/1835/166
+f 150/181/167 1015/1144/167 1022/1151/167
+f 143/174/168 1796/1950/168 1799/1953/168
+f 151/182/169 1108/1240/169 1114/1246/169
+f 145/176/170 549/638/170 548/637/170
+f 153/184/171 1290/1427/171 1289/1426/171
+f 145/176/172 543/631/172 550/639/172
+f 153/184/173 1287/1424/173 1291/1428/173
+f 147/178/174 745/859/174 744/858/174
+f 155/186/175 1465/1609/175 1464/1608/175
+f 147/178/176 740/853/176 746/860/176
+f 159/190/177 1800/1954/177 1803/1957/177
+f 168/199/178 1199/1334/178 1198/1333/178
+f 160/191/179 1886/2041/179 1891/2046/179
+f 168/199/180 1197/1332/180 1200/1335/180
+f 162/193/181 655/755/181 654/754/181
+f 169/200/182 1292/1429/182 1295/1432/182
+f 162/193/183 651/750/183 656/756/183
+f 171/202/184 1473/1617/184 1472/1616/184
+f 164/195/185 841/962/185 840/961/185
+f 172/203/186 1558/1704/186 1557/1703/186
+f 165/196/187 932/1056/187 931/1055/187
+f 158/189/188 1723/1876/188 646/744/188
+f 308/350/189 1508/1653/189 1424/1565/189
+f 165/196/190 926/1050/190 933/1057/190
+f 158/189/191 1721/1874/191 1724/1877/191
+f 166/197/192 1023/1152/192 1029/1158/192
+f 179/210/193 759/876/193 758/875/193
+f 186/217/194 1382/1521/194 1389/1529/194
+f 180/211/195 847/968/195 846/967/195
+f 173/204/196 1638/1787/196 652/751/196
+f 308/351/197 1250/1386/197 1508/1652/197
+f 180/211/198 843/964/198 848/969/198
+f 174/205/199 1727/1880/199 1726/1879/199
+f 181/212/200 934/1058/200 940/1064/200
+f 175/206/201 1809/1963/201 1808/1962/201
+f 183/214/202 1122/1254/202 1121/1253/202
+f 175/206/203 1804/1958/203 1810/1964/203
+f 183/214/204 1119/1251/204 1123/1255/204
+f 177/208/205 564/655/205 563/654/205
+f 185/216/206 1300/1437/206 1299/1436/206
+f 177/208/207 558/648/207 565/656/207
+f 185/216/208 1296/1433/208 1301/1438/208
+f 198/229/209 1039/1168/209 1038/1167/209
+f 190/221/210 1729/1882/210 1733/1886/210
+f 198/229/211 1035/1164/211 1040/1169/211
+f 192/223/212 1905/2060/212 1904/2059/212
+f 200/231/213 1209/1344/213 1208/1343/213
+f 192/223/214 1900/2055/214 1906/2061/214
+f 200/231/215 1206/1341/215 1210/1345/215
+f 194/225/216 668/770/216 667/769/216
+f 201/232/217 1302/1439/217 1304/1441/217
+f 195/226/218 766/883/218 765/882/218
+f 188/219/219 1561/1707/219 658/758/219
+f 308/352/220 1338/1477/220 1250/1385/220
+f 195/226/221 761/878/221 767/884/221
+f 188/219/222 1559/1705/222 1562/1708/222
+f 196/227/223 849/970/223 856/977/223
+f 189/220/224 1640/1789/224 1644/1793/224
+f 216/247/225 1211/1346/225 1218/1353/225
+f 210/241/226 677/780/226 676/779/226
+f 203/234/227 1485/1629/227 664/765/227
+f 308/353/228 1066/1196/228 1338/1476/228
+f 210/241/229 670/772/229 1918/2073/229
+f 203/234/230 1481/1625/230 1486/1630/230
+f 211/242/231 768/885/231 776/895/231
+f 204/235/232 1563/1709/232 1567/1713/232
+f 213/244/233 953/1077/233 952/1076/233
+f 205/236/234 1645/1794/234 1650/1799/234
+f 213/244/235 947/1071/235 954/1078/235
+f 207/238/236 569/660/236 1821/1975/236
+f 215/246/237 1134/1266/237 1133/1265/237
+f 207/238/238 1817/1971/238 1823/1977/238
+f 215/246/239 1128/1260/239 1135/1267/239
+f 209/240/240 580/673/240 1489/1633/240
+f 228/259/241 865/986/241 870/991/241
+f 222/253/242 1742/1895/242 1741/1894/242
+f 230/261/243 1050/1179/243 1049/1178/243
+f 222/253/244 1737/1890/244 1743/1896/244
+f 230/261/245 1047/1176/245 1051/1180/245
+f 224/255/246 1916/2071/246 1915/2070/246
+f 232/263/247 1220/1355/247 1219/1354/247
+f 225/256/248 583/676/248 582/675/248
+f 218/249/249 1401/1541/249 671/773/249
+f 308/354/250 1154/1287/250 1066/1195/250
+f 225/256/251 581/674/251 584/677/251
+f 218/249/252 1395/1535/252 1402/1542/252
+f 226/257/253 679/782/253 682/786/253
+f 220/251/254 1570/1716/254 1569/1715/254
+f 228/259/255 869/990/255 868/989/255
+f 220/251/256 702/807/256 1571/1717/256
+f 233/264/257 1316/1453/257 680/783/257
+f 308/355/258 1672/1822/258 1154/1286/258
+f 240/271/259 1917/2072/259 1922/2077/259
+f 233/264/260 1312/1449/260 1317/1454/260
+f 241/272/261 585/678/261 587/680/261
+f 234/265/262 1403/1543/262 1407/1547/262
+f 243/274/263 783/902/263 782/901/263
+f 235/266/264 1491/1635/264 1494/1638/264
+f 243/274/265 780/899/265 784/903/265
+f 237/268/266 1657/1806/266 1656/1805/266
+f 245/276/267 963/1088/267 962/1087/267
+f 237/268/268 1655/1804/268 1658/1807/268
+f 245/276/269 959/1083/269 964/1089/269
+f 239/270/270 1832/1986/270 1831/1985/270
+f 246/277/271 1052/1181/271 876/997/271
+f 240/271/272 1921/2076/272 1920/2075/272
+f 252/283/273 1411/1551/273 1410/1550/273
+f 260/291/274 693/798/274 692/797/274
+f 252/283/275 1575/1721/275 1409/1549/275
+f 260/291/276 688/793/276 694/799/276
+f 254/285/277 1577/1723/277 1576/1722/277
+f 261/292/278 965/1090/278 969/1094/278
+f 255/286/279 1838/1992/279 1837/1991/279
+f 248/279/280 1055/1184/280 684/788/280
+f 308/356/281 749/864/281 1672/1821/281
+f 255/286/282 1833/1987/282 1839/1993/282
+f 249/280/283 1321/1458/283 1320/1457/283
+f 256/287/284 1749/1902/284 1177/1311/284
+f 249/280/285 1318/1455/285 1322/1459/285
+f 258/289/286 490/568/286 489/567/286
+f 250/281/287 1408/1548/287 1914/2069/287
+f 258/289/288 484/561/288 1265/1401/288
+f 270/301/289 1579/1725/289 1583/1729/289
+f 264/295/290 1111/1243/290 609/703/290
+f 271/302/291 1840/1994/291 916/1040/291
+f 264/295/292 1057/1186/292 1112/1244/292
+f 273/304/293 595/688/293 594/687/293
+f 265/296/294 1543/1689/294 1031/1160/294
+f 273/304/295 592/685/295 1764/1917/295
+f 267/298/296 1500/1644/296 1499/1643/296
+f 275/306/297 1256/1392/297 795/914/297
+f 267/298/298 1497/1641/298 1909/2064/298
+f 275/306/299 792/911/299 1257/1393/299
+f 269/300/300 1668/1817/300 1667/1816/300
+f 277/308/301 974/1099/301 973/1098/301
+f 270/301/302 957/1081/302 956/1080/302
+f 263/294/303 1143/1275/303 486/563/303
+f 308/357/304 881/1003/304 749/863/304
+f 290/321/305 503/583/305 1404/1544/305
+f 282/313/306 1235/1370/306 1231/1366/306
+f 290/321/307 499/578/307 1405/1545/307
+f 284/315/308 1552/1698/308 1551/1697/308
+f 292/323/309 878/999/309 877/998/309
+f 285/316/310 1476/1620/310 1678/1828/310
+f 278/309/311 886/1008/311 493/571/311
+f 308/358/312 515/599/312 881/1002/312
+f 285/316/313 1446/1590/313 1477/1621/313
+f 278/309/314 884/1006/314 1698/1849/314
+f 286/317/315 1584/1730/315 1032/1161/315
+f 279/310/316 1673/1823/316 1617/1765/316
+f 288/319/317 1768/1921/317 1908/2063/317
+f 280/311/318 1061/1190/318 1011/1140/318
+f 288/319/319 1762/1915/319 1910/2065/319
+f 282/313/320 638/735/320 637/734/320
+f 293/324/321 1807/1961/321 514/597/321
+f 301/332/322 1298/1435/322 1688/1839/322
+f 294/325/323 888/1010/323 892/1014/323
+f 303/334/324 1025/1154/324 1853/2008/324
+f 295/326/325 605/699/325 764/881/325
+f 303/334/326 1849/2003/326 1647/1796/326
+f 297/328/327 1171/1304/327 1339/1478/327
+f 305/336/328 1902/2057/328 606/700/328
+f 297/328/329 844/965/329 1341/1480/329
+f 305/336/330 1874/2029/330 1864/2019/330
+f 299/330/331 631/727/331 629/725/331
+f 306/337/332 505/585/332 512/594/332
+f 300/331/333 1618/1766/333 1428/1570/333
+f 293/324/334 801/920/334 500/579/334
+f 308/359/335 709/816/335 515/598/335
+f 300/331/336 1423/1564/336 1430/1572/336
+f 313/375/337 1207/1342/337 1347/1486/337
+f 321/383/338 1835/1989/338 546/634/338
+f 315/377/339 1514/1659/339 1513/1658/339
+f 322/384/340 1518/1663/340 519/603/340
+f 316/378/341 1691/1842/341 1690/1841/341
+f 309/371/342 983/1110/342 507/588/342
+f 308/360/343 978/1104/343 709/815/343
+f 316/378/344 1660/1809/344 1693/1844/344
+f 309/371/345 842/963/345 874/995/345
+f 317/379/346 1648/1797/346 1611/1758/346
+f 310/372/347 1805/1959/347 1241/1376/347
+f 319/381/348 1858/2013/348 1857/2012/348
+f 311/373/349 987/1114/349 1757/1910/349
+f 319/381/350 1863/2018/350 1098/1230/350
+f 312/374/351 1070/1200/351 1326/1464/351
+f 321/383/352 614/708/352 613/707/352
+f 332/394/353 1435/1577/353 1758/1911/353
+f 325/387/354 1624/1772/354 990/1118/354
+f 334/396/355 1249/1384/355 1332/1470/355
+f 326/388/356 896/1018/356 1903/2058/356
+f 334/396/357 1603/1750/357 1251/1387/357
+f 328/390/358 1398/1538/358 1397/1537/358
+f 336/398/359 712/819/359 1782/1936/359
+f 328/390/360 1075/1205/360 1400/1540/360
+f 336/398/361 1781/1935/361 713/820/361
+f 330/392/362 873/994/362 872/993/362
+f 337/399/363 616/710/363 620/715/363
+f 331/393/364 1521/1666/364 1520/1665/364
+f 324/386/365 1024/1153/365 513/595/365
+f 308/361/366 719/828/366 978/1103/366
+f 331/393/367 1240/1375/367 1522/1667/367
+f 324/386/368 711/818/368 1026/1155/368
+f 351/413/369 1018/1147/369 1239/1374/369
+f 345/407/370 1391/1531/370 1353/1492/370
+f 352/414/371 1785/1939/371 794/913/371
+f 346/408/372 1272/1408/372 943/1067/372
+f 339/401/373 1536/1682/373 520/604/373
+f 308/362/374 725/836/374 719/827/374
+f 346/408/375 1269/1405/375 944/1068/375
+f 339/401/376 1436/1578/376 1537/1683/376
+f 347/409/377 1625/1773/377 867/988/377
+f 341/403/378 994/1122/378 993/1121/378
+f 349/411/379 1703/1855/379 1702/1854/379
+f 341/403/380 731/842/380 1017/1146/380
+f 349/411/381 1708/1861/381 1751/1904/381
+f 343/405/382 1173/1306/382 1172/1305/382
+f 351/413/383 1236/1371/383 1867/2022/383
+f 343/405/384 819/940/384 1895/2050/384
+f 364/436/385 1894/2049/385 1893/2048/385
+f 356/420/386 723/833/386 1167/1300/386
+f 364/436/387 1444/1588/387 1896/2051/387
+f 358/424/388 907/1031/388 623/719/388
+f 366/440/389 1620/1768/389 1390/1530/389
+f 358/424/390 905/1029/390 624/720/390
+f 366/440/391 1616/1764/391 1392/1532/391
+f 360/428/392 1094/1226/392 1535/1681/392
+f 367/442/393 1418/1559/393 1314/1451/393
+f 361/430/394 1359/1498/394 1358/1497/394
+f 354/416/395 528/615/395 523/608/395
+f 308/363/396 732/844/396 725/835/396
+f 361/430/397 1437/1580/397 1463/1607/397
+f 354/416/398 524/611/398 1686/1837/398
+f 362/432/399 1274/1411/399 1623/1771/399
+f 356/420/400 1166/1299/400 1164/1297/400
+f 382/459/401 1622/1770/401 1629/1777/401
+f 376/453/402 1101/1233/402 1739/1892/402
+f 369/446/403 787/906/403 1193/1327/403
+f 308/364/404 737/850/404 732/843/404
+f 376/453/405 1096/1228/405 1604/1751/405
+f 369/446/406 627/723/406 1097/1229/406
+f 377/454/407 1246/1381/407 1530/1676/407
+f 371/448/408 827/948/408 826/947/408
+f 379/456/409 1539/1685/409 1538/1684/409
+f 371/448/410 553/642/410 1676/1826/410
+f 379/456/411 1469/1613/411 1585/1731/411
+f 373/450/412 1006/1135/412 1005/1134/412
+f 381/458/413 1715/1868/413 1714/1867/413
+f 373/450/414 800/919/414 1158/1291/414
+f 381/458/415 1683/1833/415 1888/2043/415
+f 375/452/416 618/713/416 1183/1317/416
+f 386/463/417 537/624/417 1820/1974/417
+f 394/471/418 1284/1421/418 1159/1292/418
+f 388/465/419 739/852/419 1313/1450/419
+f 396/473/420 1459/1603/420 1139/1271/420
+f 388/465/421 736/848/421 1315/1452/421
+f 397/474/422 531/618/422 1718/1871/422
+f 390/467/423 788/907/423 1871/2026/423
+f 397/474/424 612/706/424 532/619/424
+f 391/468/425 1189/1323/425 1188/1322/425
+f 384/461/426 1795/1949/426 961/1085/426
+f 308/365/427 742/856/427 737/849/427
+f 391/468/428 1385/1525/428 1238/1373/428
+f 385/462/429 859/980/429 636/733/429
+f 392/469/430 1103/1235/430 1677/1827/430
+f 385/462/431 707/813/431 861/982/431
+f 394/471/432 1286/1423/432 910/1034/432
+f 406/483/433 925/1049/433 858/979/433
+f 399/476/434 1883/2038/434 540/627/434
+f 308/366/435 750/866/435 742/855/435
+f 406/483/436 920/1044/436 763/880/436
+f 399/476/437 851/972/437 1457/1601/437
+f 407/484/438 751/867/438 781/900/438
+f 401/478/439 648/747/439 647/746/439
+f 409/486/440 1372/1511/440 1371/1510/440
+f 401/478/441 901/1024/441 929/1053/441
+f 409/486/442 1642/1791/442 1665/1814/442
+f 403/480/443 836/957/443 835/956/443
+f 411/488/444 1554/1700/444 1553/1699/444
+f 403/480/445 1790/1944/445 1813/1967/445
+f 411/488/446 771/889/446 1153/1285/446
+f 405/482/447 1308/1445/447 1019/1148/447
+f 412/489/448 1461/1605/448 1467/1611/448
+f 424/501/449 1116/1248/449 1814/1968/449
+f 418/495/450 557/647/450 743/857/450
+f 426/503/451 1309/1446/451 1305/1442/451
+f 418/495/452 552/641/452 533/620/452
+f 426/503/453 1293/1430/453 1310/1447/453
+f 420/497/454 753/869/454 972/1097/454
+f 427/504/455 1137/1269/455 1223/1358/455
+f 421/498/456 1027/1156/456 825/946/456
+f 414/491/457 1635/1784/457 547/635/457
+f 308/367/458 756/873/458 750/865/458
+f 421/498/459 1675/1825/459 1377/1516/459
+f 414/491/460 1633/1782/460 1636/1785/460
+f 422/499/461 927/1051/461 930/1054/461
+f 416/493/462 1084/1215/462 494/573/462
+f 424/501/463 1118/1250/463 1419/1560/463
+f 416/493/464 1801/1955/464 1085/1216/464
+f 429/506/465 696/801/465 554/643/465
+f 308/368/466 1701/1853/466 756/872/466
+f 436/513/467 755/871/467 1525/1670/467
+f 430/507/468 1639/1788/468 653/753/468
+f 437/514/469 1425/1567/469 1451/1595/469
+f 430/507/470 1637/1786/470 1666/1815/470
+f 439/516/471 1203/1338/471 1202/1337/471
+f 431/508/472 1573/1719/472 1592/1739/472
+f 439/516/473 1054/1183/473 922/1046/473
+f 433/510/474 660/761/474 659/760/474
+f 441/518/475 1387/1527/475 1386/1526/475
+f 433/510/476 1275/1412/476 1076/1206/476
+f 441/518/477 1381/1520/477 1806/1960/477
+f 435/512/478 525/612/478 845/966/478
+f 442/519/479 1297/1434/479 1378/1517/479
+f 436/513/480 760/877/480 1763/1916/480
+f 448/525/481 1816/1970/481 1221/1356/481
+f 456/533/482 1127/1259/482 1550/1696/482
+f 448/525/483 1812/1966/483 1224/1359/483
+f 456/533/484 1125/1257/484 526/613/484
+f 450/527/485 573/665/485 1053/1182/485
+f 458/535/486 1450/1594/486 1247/1382/486
+f 451/528/487 854/975/487 853/974/487
+f 444/521/488 1480/1624/488 562/652/488
+f 308/369/489 770/888/489 1701/1852/489
+f 451/528/490 971/1096/490 604/698/490
+f 444/521/491 1475/1619/491 852/973/491
+f 452/529/492 762/879/492 1713/1866/492
+f 446/523/493 1738/1891/493 1652/1801/493
+f 454/531/494 946/1070/494 1842/1996/494
+f 446/523/495 1641/1790/495 1740/1893/495
+f 454/531/496 942/1066/496 1077/1207/496
+f 466/543/497 575/667/497 1036/1165/497
+f 460/537/498 921/1045/498 936/1060/498
+f 467/544/499 1337/1475/499 757/874/499
+f 461/538/500 665/767/500 1735/1888/500
+f 468/545/501 769/886/501 1258/1394/501
+f 462/539/502 610/704/502 666/768/502
+f 469/546/503 1564/1710/503 1043/1172/503
+f 463/540/504 571/663/504 1730/1883/504
+f 471/548/505 1215/1350/505 1214/1349/505
+f 464/541/506 1599/1746/506 882/1004/506
+f 471/548/507 1048/1177/507 1216/1351/507
+f 465/542/508 802/921/508 674/777/508
+f 472/549/509 1129/1261/509 1132/1264/509
+f 466/543/510 1766/1919/510 485/562/510
+f 459/536/511 1565/1711/511 570/661/511
+f 308/370/512 775/893/512 770/887/512
+f 4/4/513 790/909/513 789/908/513
+f 475/552/3 1213/1348/3 1306/1443/3
+f 5/5/4 880/1001/4 879/1000/4
+f 1/1/5 487/565/5 672/775/5
+f 478/555/6 675/778/6 1822/1976/6
+f 476/553/7 1396/1536/7 673/776/7
+f 6/6/8 967/1092/8 966/1091/8
+f 2/2/9 589/682/9 577/670/9
+f 479/556/10 862/983/10 579/672/10
+f 477/554/11 1568/1714/11 578/671/11
+f 480/557/12 773/891/12 863/984/12
+f 3/3/13 689/794/13 860/981/13
+f 481/558/14 1044/1173/14 774/892/14
+f 3/3/15 691/796/15 690/795/15
+f 20/20/17 798/917/17 797/916/17
+f 13/13/18 1582/1728/18 1581/1727/18
+f 14/14/21 1670/1819/21 1669/1818/21
+f 7/7/514 1059/1188/514 1058/1187/514
+f 15/15/23 1760/1913/23 1759/1912/23
+f 8/8/24 1145/1277/24 1144/1276/24
+f 16/16/25 1845/1999/25 1844/1998/25
+f 9/9/26 1233/1368/26 1232/1367/26
+f 17/17/27 497/576/27 496/575/27
+f 10/10/28 1329/1467/28 1328/1466/28
+f 19/19/29 697/802/29 593/686/29
+f 11/11/30 1415/1555/30 1414/1554/30
+f 20/20/31 796/915/31 1492/1636/31
+f 13/13/32 1580/1726/32 1498/1642/32
+f 24/24/33 1150/1282/33 1149/1281/33
+f 33/33/34 501/581/34 1846/2000/34
+f 25/25/35 1243/1378/35 1242/1377/35
+f 34/34/36 599/692/36 498/577/36
+f 26/26/37 1335/1473/37 1334/1472/37
+f 34/34/515 601/694/515 600/693/515
+f 27/27/39 1421/1562/39 1420/1561/39
+f 35/35/40 704/809/40 703/808/40
+f 28/28/41 1506/1650/41 1505/1649/41
+f 30/30/44 1679/1829/44 1707/1860/44
+f 22/22/516 976/1101/516 975/1100/516
+f 30/30/46 1681/1831/46 1680/1830/46
+f 23/23/47 1063/1192/47 1062/1191/47
+f 32/32/48 1847/2001/48 1761/1914/48
+f 44/44/49 1509/1654/49 1422/1563/49
+f 44/44/52 1511/1656/52 1510/1655/52
+f 37/37/53 890/1012/53 889/1011/53
+f 45/45/54 1595/1742/54 1594/1741/54
+f 38/38/55 981/1108/55 980/1107/55
+f 47/47/56 1773/1927/56 1682/1832/56
+f 39/39/57 1068/1198/57 1067/1197/57
+f 47/47/58 1775/1929/58 1774/1928/58
+f 40/40/59 1156/1289/59 1155/1288/59
+f 48/48/60 1855/2010/60 1854/2009/60
+f 41/41/61 1253/1389/61 1252/1388/61
+f 49/49/62 510/592/62 509/591/62
+f 43/43/63 1426/1568/63 1336/1474/63
+f 50/50/517 608/702/517 607/701/517
+f 62/62/65 1696/1847/65 1695/1846/65
+f 56/56/66 1160/1293/66 568/659/66
+f 63/63/67 1779/1933/67 1778/1932/67
+f 56/56/68 1162/1295/68 1161/1294/68
+f 65/65/69 516/600/69 1856/2011/69
+f 58/58/70 1343/1482/70 1254/1390/70
+f 65/65/71 518/602/71 517/601/71
+f 59/59/72 1431/1573/72 1342/1481/72
+f 59/59/75 1433/1575/75 1432/1574/75
+f 52/52/518 809/929/518 808/928/518
+f 60/60/77 1516/1661/77 1515/1660/77
+f 53/53/78 894/1016/78 893/1015/78
+f 62/62/79 1694/1845/79 1596/1743/79
+f 54/54/80 985/1112/80 984/1111/80
+f 74/74/82 1352/1491/82 1351/1490/82
+f 67/67/519 716/824/519 715/823/519
+f 75/75/84 1439/1582/84 1438/1581/84
+f 68/68/520 813/934/520 812/933/520
+f 77/77/86 1605/1752/86 1517/1662/86
+f 69/69/87 899/1022/87 898/1021/87
+f 77/77/88 1607/1754/88 1606/1753/88
+f 71/71/89 1079/1210/89 986/1113/89
+f 78/78/90 1700/1851/90 1699/1850/90
+f 71/71/91 1081/1212/91 1080/1211/91
+f 79/79/521 1784/1938/521 1783/1937/521
+f 73/73/93 1266/1402/93 1163/1296/93
+f 81/81/94 521/606/94 1861/2016/94
+f 74/74/95 1350/1489/95 1261/1397/95
+f 95/126/97 1786/1940/97 645/743/97
+f 87/118/98 1088/1219/98 1087/1218/98
+f 96/127/99 1868/2023/99 1483/1627/99
+f 89/120/100 1270/1406/100 1170/1303/100
+f 96/127/101 1870/2025/101 1869/2024/101
+f 90/121/522 1354/1493/522 1268/1404/522
+f 90/121/523 1356/1495/523 1355/1494/523
+f 84/115/106 814/935/106 1771/1924/106
+f 91/122/107 1442/1585/107 1441/1584/107
+f 84/115/108 816/937/108 815/936/108
+f 93/124/109 1612/1759/109 1524/1669/109
+f 85/116/110 903/1026/110 902/1025/110
+f 93/124/111 1614/1761/111 1613/1760/111
+f 87/118/112 1086/1217/112 992/1120/112
+f 99/130/113 726/837/113 622/718/113
+f 106/137/114 1361/1500/114 1360/1499/114
+f 99/130/115 728/839/115 727/838/115
+f 108/139/116 1531/1677/116 1443/1586/116
+f 100/131/117 823/944/117 822/943/117
+f 108/139/118 1533/1679/118 1532/1678/118
+f 102/133/119 999/1128/119 904/1027/119
+f 110/141/120 1709/1862/120 1615/1762/120
+f 102/133/121 1001/1130/121 1000/1129/121
+f 110/141/122 1711/1864/122 1710/1863/122
+f 104/135/123 1179/1313/123 1089/1220/123
+f 111/142/124 1792/1946/124 1791/1945/124
+f 105/136/524 1276/1413/524 1176/1310/524
+f 105/136/525 1278/1415/525 1277/1414/525
+f 117/148/129 913/1037/129 912/1036/129
+f 125/156/130 1628/1776/130 1627/1775/130
+f 119/150/131 1099/1231/131 1002/1131/131
+f 126/157/132 1717/1870/132 1716/1869/132
+f 120/151/526 1184/1318/526 1095/1227/526
+f 120/151/527 1186/1320/527 1185/1319/527
+f 113/144/137 535/622/137 534/621/137
+f 121/152/138 1282/1419/138 1281/1418/138
+f 114/145/139 634/731/139 633/730/139
+f 123/154/140 1452/1596/140 1362/1501/140
+f 115/146/141 734/846/141 733/845/141
+f 123/154/142 1454/1598/142 1453/1597/142
+f 117/148/143 911/1035/143 824/945/143
+f 125/156/144 1626/1774/144 1534/1680/144
+f 136/167/145 1191/1325/145 1190/1324/145
+f 130/161/528 641/739/528 536/623/528
+f 138/169/147 1367/1506/147 1283/1420/147
+f 130/161/148 643/741/148 642/740/148
+f 138/169/149 1369/1508/149 1368/1507/149
+f 132/163/150 831/952/150 735/847/150
+f 140/171/151 1546/1692/151 1455/1599/151
+f 132/163/152 833/954/152 832/953/152
+f 140/171/529 1548/1694/529 1547/1693/529
+f 134/165/154 1012/1141/154 914/1038/154
+f 142/173/530 1719/1872/530 799/918/530
+f 135/166/156 1105/1237/156 1009/1138/156
+f 135/166/159 1107/1239/159 1106/1238/159
+f 128/159/160 1878/2033/160 1877/2032/160
+f 155/186/161 1466/1610/161 1465/1609/161
+f 149/180/162 923/1047/162 834/955/162
+f 156/187/163 1556/1702/163 1555/1701/163
+f 150/181/164 1020/1149/164 919/1043/164
+f 150/181/167 1022/1151/167 1021/1150/167
+f 143/174/168 1799/1953/168 1798/1952/168
+f 151/182/169 1114/1246/169 1113/1245/169
+f 145/176/170 548/637/170 1879/2034/170
+f 153/184/171 1289/1426/171 1192/1326/171
+f 145/176/172 550/639/172 549/638/172
+f 153/184/173 1291/1428/173 1290/1427/173
+f 147/178/174 744/858/174 644/742/174
+f 155/186/175 1464/1608/175 1370/1509/175
+f 147/178/176 746/860/176 745/859/176
+f 159/190/177 1803/1957/177 1802/1956/177
+f 168/199/178 1198/1333/178 1115/1247/178
+f 160/191/179 1891/2046/179 1890/2045/179
+f 168/199/180 1200/1335/180 1199/1334/180
+f 162/193/181 654/754/181 551/640/181
+f 169/200/182 1295/1432/182 1294/1431/182
+f 162/193/183 656/756/183 655/755/183
+f 171/202/184 1472/1616/184 1375/1514/184
+f 164/195/185 840/961/185 747/861/185
+f 172/203/531 1557/1703/531 1468/1612/531
+f 165/196/187 931/1055/187 839/960/187
+f 165/196/190 933/1057/190 932/1056/190
+f 158/189/191 1724/1877/191 1723/1876/191
+f 166/197/192 1029/1158/192 1028/1157/192
+f 179/210/193 758/875/193 657/757/193
+f 186/217/532 1389/1529/532 1388/1528/532
+f 180/211/195 846/967/195 754/870/195
+f 180/211/198 848/969/198 847/968/198
+f 174/205/533 1726/1879/533 1230/1365/533
+f 181/212/200 940/1064/200 939/1063/200
+f 175/206/201 1808/1962/201 1725/1878/201
+f 183/214/202 1121/1253/202 1030/1159/202
+f 175/206/203 1810/1964/203 1809/1963/203
+f 183/214/204 1123/1255/204 1122/1254/204
+f 177/208/205 563/654/205 1892/2047/205
+f 185/216/206 1299/1436/206 1201/1336/206
+f 177/208/207 565/656/207 564/655/207
+f 185/216/208 1301/1438/208 1300/1437/208
+f 198/229/209 1038/1167/209 941/1065/209
+f 190/221/210 1733/1886/210 1732/1885/210
+f 198/229/211 1040/1169/211 1039/1168/211
+f 192/223/212 1904/2059/212 1811/1965/212
+f 200/231/213 1208/1343/213 1124/1256/213
+f 192/223/214 1906/2061/214 1905/2060/214
+f 200/231/534 1210/1345/534 1209/1344/534
+f 194/225/216 667/769/216 566/657/216
+f 201/232/535 1304/1441/535 1303/1440/535
+f 195/226/218 765/882/218 663/764/218
+f 195/226/221 767/884/221 766/883/221
+f 188/219/222 1562/1708/222 1561/1707/222
+f 196/227/223 856/977/223 855/976/223
+f 189/220/224 1644/1793/224 1643/1792/224
+f 216/247/225 1218/1353/225 1217/1352/225
+f 210/241/226 676/779/226 574/666/226
+f 210/241/229 1918/2073/229 677/780/229
+f 203/234/230 1486/1630/230 1485/1629/230
+f 211/242/231 776/895/231 960/1084/231
+f 204/235/232 1567/1713/232 1566/1712/232
+f 213/244/233 952/1076/233 857/978/233
+f 205/236/234 1650/1799/234 1649/1798/234
+f 213/244/235 954/1078/235 953/1077/235
+f 207/238/236 1821/1975/236 1734/1887/236
+f 215/246/237 1133/1265/237 1041/1170/237
+f 207/238/238 1823/1977/238 569/660/238
+f 215/246/239 1135/1267/239 1134/1266/239
+f 209/240/240 1489/1633/240 1907/2062/240
+f 228/259/241 870/991/241 869/990/241
+f 222/253/242 1741/1894/242 1651/1800/242
+f 230/261/243 1049/1178/243 955/1079/243
+f 222/253/244 1743/1896/244 1742/1895/244
+f 230/261/245 1051/1180/245 1050/1179/245
+f 224/255/246 1915/2070/246 1824/1978/246
+f 232/263/247 1219/1354/247 1136/1268/247
+f 225/256/536 582/675/536 1913/2068/536
+f 225/256/537 584/677/537 583/676/537
+f 218/249/252 1402/1542/252 1401/1541/252
+f 226/257/253 682/786/253 681/785/253
+f 220/251/254 1569/1715/254 1487/1631/254
+f 228/259/255 868/989/255 777/896/255
+f 220/251/256 1571/1717/256 1570/1716/256
+f 240/271/538 1922/2077/538 1921/2076/538
+f 233/264/260 1317/1454/260 1316/1453/260
+f 241/272/261 587/680/261 586/679/261
+f 234/265/262 1407/1547/262 1406/1546/262
+f 243/274/263 782/901/263 683/787/263
+f 235/266/264 1494/1638/264 1493/1637/264
+f 243/274/265 784/903/265 783/902/265
+f 237/268/266 1656/1805/266 1572/1718/266
+f 245/276/267 962/1087/267 871/992/267
+f 237/268/268 1658/1807/268 1657/1806/268
+f 245/276/269 964/1089/269 963/1088/269
+f 239/270/270 1831/1985/270 1744/1897/270
+f 246/277/271 876/997/271 875/996/271
+f 240/271/539 1920/2075/539 1828/1982/539
+f 252/283/273 1410/1550/273 1495/1639/273
+f 260/291/274 692/797/274 785/904/274
+f 252/283/275 1409/1549/275 1411/1551/275
+f 260/291/276 694/799/276 693/798/276
+f 254/285/277 1576/1722/277 1659/1808/277
+f 261/292/278 969/1094/278 968/1093/278
+f 255/286/279 1837/1991/279 1748/1901/279
+f 255/286/282 1839/1993/282 1838/1992/282
+f 249/280/283 1320/1457/283 1882/2037/283
+f 256/287/284 1177/1311/284 1752/1905/284
+f 249/280/285 1322/1459/285 1321/1458/285
+f 258/289/286 489/567/286 588/681/286
+f 250/281/287 1914/2069/287 1225/1360/287
+f 258/289/288 1265/1401/288 490/568/288
+f 270/301/289 1583/1729/289 957/1081/289
+f 264/295/290 609/703/290 1141/1273/290
+f 271/302/291 916/1040/291 1843/1997/291
+f 264/295/540 1112/1244/540 1111/1243/540
+f 273/304/293 594/687/293 1754/1907/293
+f 265/296/294 1031/1160/294 1327/1465/294
+f 273/304/295 1764/1917/295 595/688/295
+f 267/298/296 1499/1643/296 1227/1362/296
+f 275/306/297 795/914/297 492/570/297
+f 267/298/298 1909/2064/298 1500/1644/298
+f 275/306/541 1257/1393/541 1256/1392/541
+f 269/300/300 1667/1816/300 1413/1553/300
+f 277/308/301 973/1098/301 695/800/301
+f 270/301/302 956/1080/302 1663/1812/302
+f 290/321/305 1404/1544/305 597/690/305
+f 282/313/306 1231/1366/306 638/735/306
+f 290/321/307 1405/1545/307 503/583/307
+f 284/315/308 1551/1697/308 1502/1646/308
+f 292/323/309 877/998/309 1593/1740/309
+f 285/316/310 1678/1828/310 1417/1557/310
+f 285/316/313 1477/1621/313 1476/1620/313
+f 278/309/314 1698/1849/314 886/1008/314
+f 286/317/315 1032/1161/315 1587/1733/315
+f 279/310/316 1617/1765/316 1148/1280/316
+f 288/319/317 1908/2063/317 918/1042/317
+f 280/311/318 1011/1140/318 1178/1312/318
+f 288/319/319 1910/2065/319 1768/1921/319
+f 282/313/320 637/734/320 1073/1203/320
+f 293/324/321 514/597/321 801/920/321
+f 301/332/322 1688/1839/322 1545/1691/322
+f 294/325/323 892/1014/323 1765/1918/323
+f 303/334/324 1853/2008/324 1589/1735/324
+f 295/326/325 764/881/325 1692/1843/325
+f 303/334/326 1647/1796/326 1025/1154/326
+f 297/328/327 1339/1478/327 1065/1194/327
+f 305/336/328 606/700/328 1770/1923/328
+f 297/328/329 1341/1480/329 1171/1304/329
+f 305/336/330 1864/2019/330 1902/2057/330
+f 299/330/331 629/725/331 1245/1380/331
+f 306/337/332 512/594/332 1478/1622/332
+f 300/331/333 1428/1570/333 1071/1201/333
+f 300/331/336 1430/1572/336 1618/1766/336
+f 313/375/337 1347/1486/337 1248/1383/337
+f 321/383/338 546/634/338 614/708/338
+f 315/377/339 1513/1658/339 1255/1391/339
+f 322/384/340 519/603/340 1544/1690/340
+f 316/378/341 1690/1841/341 685/790/341
+f 316/378/344 1693/1844/344 1691/1842/344
+f 309/371/345 874/995/345 983/1110/345
+f 317/379/346 1611/1758/346 1609/1756/346
+f 310/372/542 1241/1376/542 1830/1984/542
+f 319/381/348 1857/2012/348 1597/1744/348
+f 311/373/349 1757/1910/349 1755/1908/349
+f 319/381/350 1098/1230/350 1858/2013/350
+f 312/374/351 1326/1464/351 1325/1463/351
+f 321/383/352 613/707/352 1777/1931/352
+f 332/394/353 1758/1911/353 1756/1909/353
+f 325/387/354 990/1118/354 989/1117/354
+f 334/396/355 1332/1470/355 1654/1803/355
+f 326/388/356 1903/2058/356 1901/2056/356
+f 334/396/357 1251/1387/357 1249/1384/357
+f 328/390/358 1397/1537/358 1836/1990/358
+f 336/398/359 1782/1936/359 1860/2015/359
+f 328/390/360 1400/1540/360 1398/1538/360
+f 336/398/361 713/820/361 712/819/361
+f 330/392/362 872/993/362 1345/1484/362
+f 337/399/363 620/715/363 619/714/363
+f 331/393/364 1520/1665/364 1262/1398/364
+f 331/393/367 1522/1667/367 1521/1666/367
+f 324/386/368 1026/1155/368 1024/1153/368
+f 351/413/369 1239/1374/369 1236/1371/369
+f 345/407/370 1353/1492/370 1082/1213/370
+f 352/414/371 794/913/371 1788/1942/371
+f 346/408/372 943/1067/372 1919/2074/372
+f 346/408/375 944/1068/375 1272/1408/375
+f 339/401/376 1537/1683/376 1536/1682/376
+f 347/409/377 867/988/377 1526/1671/377
+f 341/403/378 993/1121/378 717/825/378
+f 349/411/379 1702/1854/379 1440/1583/379
+f 341/403/380 1017/1146/380 994/1122/380
+f 349/411/381 1751/1904/381 1703/1855/381
+f 343/405/382 1172/1305/382 900/1023/382
+f 351/413/383 1867/2022/383 1608/1755/383
+f 343/405/384 1895/2050/384 1173/1306/384
+f 364/436/385 1893/2048/385 1528/1673/385
+f 356/420/386 1167/1300/386 1166/1299/386
+f 364/436/387 1896/2051/387 1894/2049/387
+f 358/424/388 623/719/388 996/1124/388
+f 366/440/389 1390/1530/389 1705/1857/389
+f 358/424/390 624/720/390 907/1031/390
+f 366/440/391 1392/1532/391 1620/1768/391
+f 360/428/392 1535/1681/392 1175/1308/392
+f 367/442/393 1314/1451/393 1872/2027/393
+f 361/430/394 1358/1497/394 1090/1221/394
+f 361/430/397 1463/1607/397 1359/1498/397
+f 354/416/398 1686/1837/398 528/615/398
+f 362/432/399 1623/1771/399 1016/1145/399
+f 356/420/400 1164/1297/400 1630/1778/400
+f 382/459/401 1629/1777/401 1462/1606/401
+f 376/453/402 1739/1892/402 1181/1315/402
+f 376/453/405 1604/1751/405 1101/1233/405
+f 369/446/406 1097/1229/406 787/906/406
+f 377/454/407 1530/1676/407 1363/1502/407
+f 371/448/408 826/947/408 530/617/408
+f 379/456/409 1538/1684/409 1280/1417/409
+f 371/448/410 1676/1826/410 827/948/410
+f 379/456/411 1585/1731/411 1539/1685/411
+f 373/450/412 1005/1134/412 730/841/412
+f 381/458/413 1714/1867/413 1448/1592/413
+f 373/450/414 1158/1291/414 1006/1135/414
+f 381/458/415 1888/2043/415 1715/1868/415
+f 375/452/416 1183/1317/416 909/1033/416
+f 386/463/417 1820/1974/417 542/630/417
+f 394/471/418 1159/1292/418 1286/1423/418
+f 388/465/419 1313/1450/419 829/950/419
+f 396/473/420 1139/1271/420 1541/1687/420
+f 388/465/421 1315/1452/421 739/852/421
+f 397/474/543 1718/1871/543 1456/1600/543
+f 390/467/423 1871/2026/423 1008/1137/423
+f 397/474/424 532/619/424 531/618/424
+f 391/468/425 1188/1322/425 915/1039/425
+f 391/468/428 1238/1373/428 1189/1323/428
+f 385/462/429 636/733/429 1793/1947/429
+f 392/469/430 1677/1827/430 1674/1824/430
+f 385/462/544 861/982/544 859/980/544
+f 394/471/432 910/1034/432 1365/1504/432
+f 406/483/433 858/979/433 1014/1143/433
+f 406/483/436 763/880/436 925/1049/436
+f 399/476/437 1457/1601/437 1883/2038/437
+f 407/484/438 781/900/438 1194/1329/438
+f 401/478/439 647/746/439 1797/1951/439
+f 409/486/440 1371/1510/440 1109/1241/440
+f 401/478/441 929/1053/441 648/747/441
+f 409/486/442 1665/1814/442 1372/1511/442
+f 403/480/443 835/956/443 544/632/443
+f 411/488/444 1553/1699/444 1288/1425/444
+f 403/480/445 1813/1967/445 836/957/445
+f 411/488/446 1153/1285/446 1554/1700/446
+f 405/482/447 1019/1148/447 741/854/447
+f 412/489/448 1467/1611/448 701/806/448
+f 424/501/449 1814/1968/449 1118/1250/449
+f 418/495/450 743/857/450 650/749/450
+f 426/503/451 1305/1442/451 1374/1513/451
+f 418/495/452 533/620/452 557/647/452
+f 426/503/453 1310/1447/453 1309/1446/453
+f 420/497/454 972/1097/454 838/959/454
+f 427/504/455 1223/1358/455 1222/1357/455
+f 421/498/456 825/946/456 748/862/456
+f 421/498/459 1377/1516/459 1027/1156/459
+f 414/491/460 1636/1785/460 1635/1784/460
+f 422/499/461 930/1054/461 928/1052/461
+f 416/493/462 494/573/462 1885/2040/462
+f 424/501/463 1419/1560/463 1196/1331/463
+f 416/493/464 1085/1216/464 1084/1215/464
+f 436/513/467 1525/1670/467 760/877/467
+f 430/507/545 653/753/545 1862/2017/545
+f 437/514/469 1451/1595/469 1449/1593/469
+f 430/507/470 1666/1815/470 1639/1788/470
+f 439/516/471 1202/1337/471 935/1059/471
+f 431/508/472 1592/1739/472 1897/2052/472
+f 439/516/473 922/1046/473 1203/1338/473
+f 433/510/474 659/760/474 778/897/474
+f 441/518/475 1386/1526/475 1120/1252/475
+f 433/510/476 1076/1206/476 660/761/476
+f 441/518/546 1806/1960/546 1387/1527/546
+f 435/512/478 845/966/478 559/649/478
+f 442/519/547 1378/1517/547 1376/1515/547
+f 436/513/480 1763/1916/480 495/574/480
+f 448/525/481 1221/1356/481 1899/2054/481
+f 456/533/482 1550/1696/482 1205/1340/482
+f 448/525/483 1224/1359/483 1816/1970/483
+f 456/533/484 526/613/484 1127/1259/484
+f 450/527/485 1053/1182/485 662/763/485
+f 458/535/486 1247/1382/486 1852/2007/486
+f 451/528/487 853/974/487 567/658/487
+f 451/528/490 604/698/490 854/975/490
+f 444/521/491 852/973/491 1480/1624/491
+f 452/529/492 1713/1866/492 1590/1736/492
+f 446/523/493 1652/1801/493 1728/1881/493
+f 454/531/494 1842/1996/494 1034/1163/494
+f 446/523/495 1740/1893/495 1738/1891/495
+f 454/531/496 1077/1207/496 946/1070/496
+f 466/543/548 1036/1165/548 1766/1919/548
+f 460/537/498 936/1060/498 1348/1487/498
+f 467/544/499 757/874/499 1037/1166/499
+f 461/538/500 1735/1888/500 1482/1626/500
+f 468/545/501 1258/1394/501 772/890/501
+f 462/539/502 666/768/502 820/941/502
+f 469/546/503 1043/1172/503 1263/1399/503
+f 463/540/504 1730/1883/504 1646/1795/504
+f 471/548/505 1214/1349/505 948/1072/505
+f 464/541/506 882/1004/506 938/1062/506
+f 471/548/507 1216/1351/507 1215/1350/507
+f 465/542/508 674/777/508 1818/1972/508
+f 472/549/509 1132/1264/509 1131/1263/509
+f 466/543/549 485/562/549 669/771/549
+f 485/562/549 3/3/549 802/921/549
+f 485/562/549 802/921/549 669/771/549
+f 669/771/549 802/921/549 465/542/549
+f 1132/1264/509 482/559/509 678/781/509
+f 1132/1264/509 678/781/509 1131/1263/509
+f 1131/1263/509 678/781/509 481/558/509
+f 674/777/508 477/554/508 1599/1746/508
+f 674/777/508 1599/1746/508 1818/1972/508
+f 1818/1972/508 1599/1746/508 464/541/508
+f 1216/1351/507 481/558/507 1825/1979/507
+f 1216/1351/507 1825/1979/507 1215/1350/507
+f 1215/1350/507 1825/1979/507 480/557/507
+f 882/1004/506 2/2/506 571/663/506
+f 882/1004/506 571/663/506 938/1062/506
+f 938/1062/506 571/663/506 463/540/506
+f 1214/1349/505 479/556/505 818/939/505
+f 1214/1349/505 818/939/505 948/1072/505
+f 948/1072/505 818/939/505 470/547/505
+f 1730/1883/504 476/553/504 610/704/504
+f 1730/1883/504 610/704/504 1646/1795/504
+f 1646/1795/504 610/704/504 462/539/504
+f 1043/1172/503 479/556/503 951/1075/503
+f 1043/1172/503 951/1075/503 1263/1399/503
+f 1263/1399/503 951/1075/503 6/6/503
+f 666/768/502 1/1/502 665/767/502
+f 666/768/502 665/767/502 820/941/502
+f 820/941/502 665/767/502 461/538/502
+f 1258/1394/501 6/6/501 950/1074/501
+f 1258/1394/501 950/1074/501 772/890/501
+f 772/890/501 950/1074/501 478/555/501
+f 1735/1888/500 475/552/500 921/1045/500
+f 1735/1888/500 921/1045/500 1482/1626/500
+f 1482/1626/500 921/1045/500 460/537/500
+f 757/874/499 478/555/499 1042/1171/499
+f 757/874/499 1042/1171/499 1037/1166/499
+f 1037/1166/499 1042/1171/499 5/5/499
+f 936/1060/498 474/551/498 1565/1711/498
+f 936/1060/498 1565/1711/498 1348/1487/498
+f 1348/1487/498 1565/1711/498 459/536/498
+f 1036/1165/497 5/5/497 786/905/497
+f 1036/1165/548 786/905/548 1766/1919/548
+f 1766/1919/497 786/905/497 4/4/497
+f 1077/1207/496 470/547/496 1564/1710/496
+f 1077/1207/496 1564/1710/496 946/1070/496
+f 946/1070/496 1564/1710/496 469/546/496
+f 1740/1893/495 462/539/495 820/941/495
+f 1740/1893/495 820/941/495 1738/1891/495
+f 1738/1891/495 820/941/495 461/538/495
+f 1842/1996/494 468/545/494 1519/1664/494
+f 1842/1996/494 1519/1664/494 1034/1163/494
+f 1034/1163/494 1519/1664/494 453/530/494
+f 1652/1801/493 460/537/493 1731/1884/493
+f 1652/1801/493 1731/1884/493 1728/1881/493
+f 1728/1881/493 1731/1884/493 445/522/493
+f 1713/1866/492 468/545/492 1337/1475/492
+f 1713/1866/492 1337/1475/492 1590/1736/492
+f 1590/1736/492 1337/1475/492 467/544/492
+f 852/973/491 460/537/491 1348/1487/491
+f 852/973/491 1348/1487/491 1480/1624/491
+f 1480/1624/491 1348/1487/491 459/536/491
+f 604/698/490 467/544/490 575/667/490
+f 604/698/490 575/667/490 854/975/490
+f 854/975/490 575/667/490 466/543/490
+f 853/974/487 465/542/487 573/665/487
+f 853/974/487 573/665/487 567/658/487
+f 567/658/487 573/665/487 450/527/487
+f 1247/1382/486 472/549/486 1393/1533/486
+f 1247/1382/486 1393/1533/486 1852/2007/486
+f 1852/2007/486 1393/1533/486 457/534/486
+f 1053/1182/485 464/541/485 1147/1279/485
+f 1053/1182/485 1147/1279/485 662/763/485
+f 662/763/485 1147/1279/485 449/526/485
+f 526/613/484 472/549/484 1048/1177/484
+f 526/613/484 1048/1177/484 1127/1259/484
+f 1127/1259/484 1048/1177/484 471/548/484
+f 1224/1359/483 464/541/483 938/1062/483
+f 1224/1359/483 938/1062/483 1816/1970/483
+f 1816/1970/483 938/1062/483 463/540/483
+f 1550/1696/482 470/547/482 998/1127/482
+f 1550/1696/482 998/1127/482 1205/1340/482
+f 1205/1340/482 998/1127/482 455/532/482
+f 1221/1356/481 462/539/481 1661/1810/481
+f 1221/1356/481 1661/1810/481 1899/2054/481
+f 1899/2054/481 1661/1810/481 447/524/481
+f 1763/1916/480 450/527/480 525/612/480
+f 1763/1916/480 525/612/480 495/574/480
+f 495/574/480 525/612/480 435/512/480
+f 1378/1517/547 458/535/547 1852/2007/547
+f 1378/1517/547 1852/2007/547 1376/1515/547
+f 1376/1515/547 1852/2007/547 457/534/547
+f 845/966/478 449/526/478 611/705/478
+f 845/966/478 611/705/478 559/649/478
+f 559/649/478 611/705/478 434/511/478
+f 1806/1960/546 457/534/546 1125/1257/546
+f 1806/1960/546 1125/1257/546 1387/1527/546
+f 1387/1527/546 1125/1257/546 456/533/546
+f 1076/1206/476 449/526/476 1812/1966/476
+f 1076/1206/476 1812/1966/476 660/761/476
+f 660/761/476 1812/1966/476 448/525/476
+f 1386/1526/475 455/532/475 1881/2036/475
+f 1386/1526/475 1881/2036/475 1120/1252/475
+f 1120/1252/475 1881/2036/475 440/517/475
+f 659/760/474 447/524/474 1152/1284/474
+f 659/760/474 1152/1284/474 778/897/474
+f 778/897/474 1152/1284/474 432/509/474
+f 922/1046/473 455/532/473 942/1066/473
+f 922/1046/473 942/1066/473 1203/1338/473
+f 1203/1338/473 942/1066/473 454/531/473
+f 1592/1739/472 447/524/472 1641/1790/472
+f 1592/1739/472 1641/1790/472 1897/2052/472
+f 1897/2052/472 1641/1790/472 446/523/472
+f 1202/1337/471 453/530/471 1004/1133/471
+f 1202/1337/471 1004/1133/471 935/1059/471
+f 935/1059/471 1004/1133/471 438/515/471
+f 1666/1815/470 446/523/470 1728/1881/470
+f 1666/1815/470 1728/1881/470 1639/1788/470
+f 1639/1788/470 1728/1881/470 445/522/470
+f 1451/1595/469 453/530/469 762/879/469
+f 1451/1595/469 762/879/469 1449/1593/469
+f 1449/1593/469 762/879/469 452/529/469
+f 653/753/468 444/521/468 696/801/468
+f 653/753/545 696/801/545 1862/2017/545
+f 1862/2017/468 696/801/468 429/506/468
+f 1525/1670/467 452/529/467 971/1096/467
+f 1525/1670/467 971/1096/467 760/877/467
+f 760/877/467 971/1096/467 451/528/467
+f 1085/1216/464 432/509/464 1573/1719/464
+f 1085/1216/464 1573/1719/464 1084/1215/464
+f 1084/1215/464 1573/1719/464 431/508/464
+f 1419/1560/463 438/515/463 850/971/463
+f 1419/1560/463 850/971/463 1196/1331/463
+f 1196/1331/463 850/971/463 423/500/463
+f 494/573/462 430/507/462 1889/2044/462
+f 494/573/462 1889/2044/462 1885/2040/462
+f 1885/2040/462 1889/2044/462 415/492/462
+f 930/1054/461 438/515/461 1425/1567/461
+f 930/1054/461 1425/1567/461 928/1052/461
+f 928/1052/461 1425/1567/461 437/514/461
+f 1636/1785/460 430/507/460 1862/2017/460
+f 1636/1785/460 1862/2017/460 1635/1784/460
+f 1635/1784/460 1862/2017/460 429/506/460
+f 1377/1516/459 437/514/459 755/871/459
+f 1377/1516/459 755/871/459 1027/1156/459
+f 1027/1156/459 755/871/459 436/513/459
+f 825/946/456 435/512/456 753/869/456
+f 825/946/456 753/869/456 748/862/456
+f 748/862/456 753/869/456 420/497/456
+f 1223/1358/455 443/520/455 1297/1434/455
+f 1223/1358/455 1297/1434/455 1222/1357/455
+f 1222/1357/455 1297/1434/455 442/519/455
+f 972/1097/454 434/511/454 1880/2035/454
+f 972/1097/454 1880/2035/454 838/959/454
+f 838/959/454 1880/2035/454 419/496/454
+f 1310/1447/453 442/519/453 1381/1520/453
+f 1310/1447/453 1381/1520/453 1309/1446/453
+f 1309/1446/453 1381/1520/453 441/518/453
+f 533/620/452 434/511/452 1275/1412/452
+f 533/620/452 1275/1412/452 557/647/452
+f 557/647/452 1275/1412/452 433/510/452
+f 1305/1442/451 440/517/451 1379/1518/451
+f 1305/1442/451 1379/1518/451 1374/1513/451
+f 1374/1513/451 1379/1518/451 425/502/451
+f 743/857/450 432/509/450 1003/1132/450
+f 743/857/450 1003/1132/450 650/749/450
+f 650/749/450 1003/1132/450 417/494/450
+f 1814/1968/449 440/517/449 1054/1183/449
+f 1814/1968/449 1054/1183/449 1118/1250/449
+f 1118/1250/449 1054/1183/449 439/516/449
+f 1467/1611/448 428/505/448 1137/1269/448
+f 1467/1611/448 1137/1269/448 701/806/448
+f 701/806/448 1137/1269/448 427/504/448
+f 1019/1148/447 419/496/447 1384/1524/447
+f 1019/1148/447 1384/1524/447 741/854/447
+f 741/854/447 1384/1524/447 404/481/447
+f 1153/1285/446 427/504/446 1293/1430/446
+f 1153/1285/446 1293/1430/446 1554/1700/446
+f 1554/1700/446 1293/1430/446 426/503/446
+f 1813/1967/445 419/496/445 552/641/445
+f 1813/1967/445 552/641/445 836/957/445
+f 836/957/445 552/641/445 418/495/445
+f 1553/1699/444 425/502/444 1229/1364/444
+f 1553/1699/444 1229/1364/444 1288/1425/444
+f 1288/1425/444 1229/1364/444 410/487/444
+f 835/956/443 417/494/443 1887/2042/443
+f 835/956/443 1887/2042/443 544/632/443
+f 544/632/443 1887/2042/443 402/479/443
+f 1665/1814/442 425/502/442 1116/1248/442
+f 1665/1814/442 1116/1248/442 1372/1511/442
+f 1372/1511/442 1116/1248/442 424/501/442
+f 929/1053/441 417/494/441 1801/1955/441
+f 929/1053/441 1801/1955/441 648/747/441
+f 648/747/441 1801/1955/441 416/493/441
+f 1371/1510/440 423/500/440 1746/1899/440
+f 1371/1510/440 1746/1899/440 1109/1241/440
+f 1109/1241/440 1746/1899/440 408/485/440
+f 647/746/439 415/492/439 1010/1139/439
+f 647/746/439 1010/1139/439 1797/1951/439
+f 1797/1951/439 1010/1139/439 400/477/439
+f 781/900/438 423/500/438 927/1051/438
+f 781/900/438 927/1051/438 1194/1329/438
+f 1194/1329/438 927/1051/438 422/499/438
+f 1457/1601/437 415/492/437 1633/1782/437
+f 1457/1601/550 1633/1782/550 1883/2038/550
+f 1883/2038/550 1633/1782/550 414/491/550
+f 763/880/436 422/499/436 1675/1825/436
+f 763/880/436 1675/1825/436 925/1049/436
+f 925/1049/436 1675/1825/436 421/498/436
+f 858/979/433 420/497/433 1308/1445/433
+f 858/979/433 1308/1445/433 1014/1143/433
+f 1014/1143/433 1308/1445/433 405/482/433
+f 910/1034/432 408/485/432 1598/1745/432
+f 910/1034/432 1598/1745/432 1365/1504/432
+f 1365/1504/432 1598/1745/432 393/470/432
+f 861/982/544 401/478/544 1797/1951/544
+f 861/982/544 1797/1951/544 859/980/544
+f 859/980/431 1797/1951/431 400/477/431
+f 1677/1827/430 408/485/430 751/867/430
+f 1677/1827/430 751/867/430 1674/1824/430
+f 1674/1824/430 751/867/430 407/484/430
+f 636/733/429 399/476/429 1795/1949/429
+f 636/733/429 1795/1949/429 1793/1947/429
+f 1793/1947/429 1795/1949/429 384/461/429
+f 1238/1373/428 407/484/428 920/1044/428
+f 1238/1373/428 920/1044/428 1189/1323/428
+f 1189/1323/428 920/1044/428 406/483/428
+f 1188/1322/425 405/482/425 788/907/425
+f 1188/1322/425 788/907/425 915/1039/425
+f 915/1039/425 788/907/425 390/467/425
+f 532/619/424 413/490/424 1461/1605/424
+f 532/619/424 1461/1605/424 531/618/424
+f 531/618/424 1461/1605/424 412/489/424
+f 1871/2026/423 404/481/423 1228/1363/423
+f 1871/2026/423 1228/1363/423 1008/1137/423
+f 1008/1137/423 1228/1363/423 389/466/423
+f 1718/1871/543 411/488/543 1459/1603/543
+f 1718/1871/543 1459/1603/543 1456/1600/543
+f 1456/1600/543 1459/1603/543 396/473/543
+f 1315/1452/421 404/481/421 1790/1944/421
+f 1315/1452/421 1790/1944/421 739/852/421
+f 739/852/421 1790/1944/421 403/480/421
+f 1139/1271/420 410/487/420 1083/1214/420
+f 1139/1271/420 1083/1214/420 1541/1687/420
+f 1541/1687/420 1083/1214/420 395/472/420
+f 1313/1450/419 402/479/419 1745/1898/419
+f 1313/1450/419 1745/1898/419 829/950/419
+f 829/950/419 1745/1898/419 387/464/419
+f 1159/1292/418 410/487/418 1642/1791/418
+f 1159/1292/418 1642/1791/418 1286/1423/418
+f 1286/1423/418 1642/1791/418 409/486/418
+f 1820/1974/417 402/479/417 901/1024/417
+f 1820/1974/417 901/1024/417 542/630/417
+f 542/630/417 901/1024/417 401/478/417
+f 1183/1317/416 389/466/416 706/812/416
+f 1183/1317/416 706/812/416 909/1033/416
+f 909/1033/416 706/812/416 374/451/416
+f 1888/2043/415 397/474/415 1456/1600/415
+f 1888/2043/415 1456/1600/415 1715/1868/415
+f 1715/1868/415 1456/1600/415 396/473/415
+f 1158/1291/414 389/466/414 736/848/414
+f 1158/1291/414 736/848/414 1006/1135/414
+f 1006/1135/414 736/848/414 388/465/414
+f 1714/1867/413 395/472/413 539/626/413
+f 1714/1867/413 539/626/413 1448/1592/413
+f 1448/1592/413 539/626/413 380/457/413
+f 1005/1134/412 387/464/412 1237/1372/412
+f 1005/1134/412 1237/1372/412 730/841/412
+f 730/841/412 1237/1372/412 372/449/412
+f 1585/1731/411 395/472/411 1284/1421/411
+f 1585/1731/411 1284/1421/411 1539/1685/411
+f 1539/1685/411 1284/1421/411 394/471/411
+f 1676/1826/410 387/464/410 537/624/410
+f 1676/1826/410 537/624/410 827/948/410
+f 827/948/410 537/624/410 386/463/410
+f 1538/1684/409 393/470/409 1092/1224/409
+f 1538/1684/409 1092/1224/409 1280/1417/409
+f 1280/1417/409 1092/1224/409 378/455/409
+f 826/947/408 385/462/408 1750/1903/408
+f 826/947/408 1750/1903/408 530/617/408
+f 530/617/408 1750/1903/408 370/447/408
+f 1530/1676/407 393/470/407 1103/1235/407
+f 1530/1676/407 1103/1235/407 1363/1502/407
+f 1363/1502/407 1103/1235/407 392/469/407
+f 1097/1229/406 385/462/406 1793/1947/406
+f 1097/1229/406 1793/1947/406 787/906/406
+f 787/906/406 1793/1947/406 384/461/406
+f 1604/1751/405 392/469/405 1385/1525/405
+f 1604/1751/405 1385/1525/405 1101/1233/405
+f 1101/1233/405 1385/1525/405 391/468/405
+f 1739/1892/402 390/467/402 618/713/402
+f 1739/1892/402 618/713/402 1181/1315/402
+f 1181/1315/402 618/713/402 375/452/402
+f 1629/1777/401 398/475/401 612/706/401
+f 1629/1777/401 612/706/401 1462/1606/401
+f 1462/1606/401 612/706/401 397/474/401
+f 1164/1297/400 370/447/400 821/942/400
+f 1164/1297/400 821/942/400 1630/1778/400
+f 1630/1778/400 821/942/400 355/418/400
+f 1623/1771/399 378/455/399 1246/1381/399
+f 1623/1771/399 1246/1381/399 1016/1145/399
+f 1016/1145/399 1246/1381/399 377/454/399
+f 1686/1837/398 370/447/398 627/723/398
+f 1686/1837/398 627/723/398 528/615/398
+f 528/615/398 627/723/398 369/446/398
+f 1463/1607/551 377/454/551 1096/1228/551
+f 1463/1607/551 1096/1228/551 1359/1498/551
+f 1359/1498/551 1096/1228/551 376/453/551
+f 1358/1497/552 375/452/552 1094/1226/552
+f 1358/1497/394 1094/1226/394 1090/1221/394
+f 1090/1221/552 1094/1226/552 360/428/552
+f 1314/1451/393 383/460/393 1622/1770/393
+f 1314/1451/393 1622/1770/393 1872/2027/393
+f 1872/2027/393 1622/1770/393 382/459/393
+f 1535/1681/392 374/451/392 538/625/392
+f 1535/1681/392 538/625/392 1175/1308/392
+f 1175/1308/392 538/625/392 359/426/392
+f 1392/1532/391 382/459/391 1683/1833/391
+f 1392/1532/391 1683/1833/391 1620/1768/391
+f 1620/1768/391 1683/1833/391 381/458/391
+f 624/720/390 374/451/390 800/919/390
+f 624/720/390 800/919/390 907/1031/390
+f 907/1031/390 800/919/390 373/450/390
+f 1390/1530/389 380/457/389 1819/1973/389
+f 1390/1530/389 1819/1973/389 1705/1857/389
+f 1705/1857/389 1819/1973/389 365/438/389
+f 623/719/388 372/449/388 1091/1223/388
+f 623/719/388 1091/1223/388 996/1124/388
+f 996/1124/388 1091/1223/388 357/422/388
+f 1896/2051/387 380/457/387 1469/1613/387
+f 1896/2051/387 1469/1613/387 1894/2049/387
+f 1894/2049/387 1469/1613/387 379/456/387
+f 1167/1300/386 372/449/386 553/642/386
+f 1167/1300/386 553/642/386 1166/1299/386
+f 1166/1299/386 553/642/386 371/448/386
+f 1893/2048/385 378/455/385 937/1061/385
+f 1893/2048/385 937/1061/385 1528/1673/385
+f 1528/1673/385 937/1061/385 363/434/385
+f 1895/2050/384 359/427/384 905/1028/384
+f 1895/2050/384 905/1028/384 1173/1306/384
+f 1173/1306/384 905/1028/384 358/425/384
+f 1867/2022/383 365/439/383 1319/1456/383
+f 1867/2022/383 1319/1456/383 1608/1755/383
+f 1608/1755/383 1319/1456/383 350/412/383
+f 1172/1305/382 357/423/382 545/633/382
+f 1172/1305/382 545/633/382 900/1023/382
+f 900/1023/382 545/633/382 342/404/382
+f 1751/1904/381 365/439/381 1444/1587/381
+f 1751/1904/381 1444/1587/381 1703/1855/381
+f 1703/1855/381 1444/1587/381 364/437/381
+f 1017/1146/380 357/423/380 723/832/380
+f 1017/1146/380 723/832/380 994/1122/380
+f 994/1122/380 723/832/380 356/421/380
+f 1702/1854/379 363/435/379 1826/1980/379
+f 1702/1854/379 1826/1980/379 1440/1583/379
+f 1440/1583/379 1826/1980/379 348/410/379
+f 993/1121/378 355/419/378 721/830/378
+f 993/1121/378 721/830/378 717/825/378
+f 717/825/378 721/830/378 340/402/378
+f 867/988/377 363/435/377 1274/1410/377
+f 867/988/377 1274/1410/377 1526/1671/377
+f 1526/1671/377 1274/1410/377 362/433/377
+f 1537/1683/376 355/419/376 524/610/376
+f 1537/1683/376 524/610/376 1536/1682/376
+f 1536/1682/376 524/610/376 354/417/376
+f 944/1068/375 362/433/375 1437/1579/375
+f 944/1068/375 1437/1579/375 1272/1408/375
+f 1272/1408/375 1437/1579/375 361/431/375
+f 943/1067/372 360/429/372 1391/1531/372
+f 943/1067/372 1391/1531/372 1919/2074/372
+f 1919/2074/372 1391/1531/372 345/407/372
+f 794/913/371 368/445/371 1418/1558/371
+f 794/913/371 1418/1558/371 1788/1942/371
+f 1788/1942/371 1418/1558/371 367/443/371
+f 1353/1492/370 359/427/370 1471/1615/370
+f 1353/1492/370 1471/1615/370 1082/1213/370
+f 1082/1213/370 1471/1615/370 344/406/370
+f 1239/1374/369 367/443/369 1616/1763/369
+f 1239/1374/369 1616/1763/369 1236/1371/369
+f 1236/1371/369 1616/1763/369 366/441/369
+f 1026/1155/368 340/402/368 1436/1578/368
+f 1026/1155/368 1436/1578/368 1024/1153/368
+f 1024/1153/368 1436/1578/368 339/401/368
+f 1522/1667/367 347/409/367 1269/1405/367
+f 1522/1667/367 1269/1405/367 1521/1666/367
+f 1521/1666/367 1269/1405/367 346/408/367
+f 1520/1665/364 345/407/364 873/994/364
+f 1520/1665/553 873/994/553 1262/1398/553
+f 1262/1398/364 873/994/364 330/392/364
+f 620/715/363 353/415/363 1785/1939/363
+f 620/715/363 1785/1939/363 619/714/363
+f 619/714/363 1785/1939/363 352/414/363
+f 872/993/362 344/406/362 1349/1488/362
+f 872/993/362 1349/1488/362 1345/1484/362
+f 1345/1484/362 1349/1488/362 329/391/362
+f 713/820/361 352/414/361 1018/1147/361
+f 713/820/361 1018/1147/361 712/819/361
+f 712/819/361 1018/1147/361 351/413/361
+f 1400/1540/360 344/406/360 819/940/360
+f 1400/1540/360 819/940/360 1398/1538/360
+f 1398/1538/360 819/940/360 343/405/360
+f 1782/1936/359 350/412/359 1165/1298/359
+f 1782/1936/359 1165/1298/359 1860/2015/359
+f 1860/2015/359 1165/1298/359 335/397/359
+f 1397/1537/358 342/404/358 1168/1301/358
+f 1397/1537/358 1168/1301/358 1836/1990/358
+f 1836/1990/358 1168/1301/358 327/389/358
+f 1251/1387/357 350/412/357 1708/1861/357
+f 1251/1387/357 1708/1861/357 1249/1384/357
+f 1249/1384/357 1708/1861/357 349/411/357
+f 1903/2058/356 342/404/356 731/842/356
+f 1903/2058/356 731/842/356 1901/2056/356
+f 1901/2056/356 731/842/356 341/403/356
+f 1332/1470/355 348/410/355 1684/1834/355
+f 1332/1470/355 1684/1834/355 1654/1803/355
+f 1654/1803/355 1684/1834/355 333/395/355
+f 990/1118/354 341/403/354 717/825/354
+f 990/1118/354 717/825/354 989/1117/354
+f 989/1117/354 717/825/354 340/402/354
+f 1758/1911/353 348/410/353 1625/1773/353
+f 1758/1911/353 1625/1773/353 1756/1909/353
+f 1756/1909/353 1625/1773/353 347/409/353
+f 613/707/352 335/397/352 630/726/352
+f 613/707/352 630/726/352 1777/1931/352
+f 1777/1931/352 630/726/352 320/382/352
+f 1326/1464/351 328/390/351 1836/1990/351
+f 1326/1464/351 1836/1990/351 1325/1463/351
+f 1325/1463/351 1836/1990/351 327/389/351
+f 1098/1230/350 335/397/350 1603/1750/350
+f 1098/1230/350 1603/1750/350 1858/2013/350
+f 1858/2013/350 1603/1750/350 334/396/350
+f 1757/1910/349 327/389/349 896/1018/349
+f 1757/1910/349 896/1018/349 1755/1908/349
+f 1755/1908/349 896/1018/349 326/388/349
+f 1857/2012/348 333/395/348 1601/1748/348
+f 1857/2012/348 1601/1748/348 1597/1744/348
+f 1597/1744/348 1601/1748/348 318/380/348
+f 1241/1376/542 326/388/542 1624/1772/542
+f 1241/1376/542 1624/1772/542 1830/1984/542
+f 1830/1984/347 1624/1772/347 325/387/347
+f 1611/1758/346 333/395/346 1435/1577/346
+f 1611/1758/346 1435/1577/346 1609/1756/346
+f 1609/1756/346 1435/1577/346 332/394/346
+f 874/995/345 325/387/345 711/818/345
+f 874/995/554 711/818/554 983/1110/554
+f 983/1110/555 711/818/555 324/386/555
+f 1693/1844/344 332/394/344 1240/1375/344
+f 1693/1844/344 1240/1375/344 1691/1842/344
+f 1691/1842/344 1240/1375/344 331/393/344
+f 1690/1841/341 330/392/341 1514/1659/341
+f 1690/1841/341 1514/1659/341 685/790/341
+f 685/790/341 1514/1659/341 315/377/341
+f 519/603/340 338/400/340 616/710/340
+f 519/603/340 616/710/340 1544/1690/340
+f 1544/1690/340 616/710/340 337/399/340
+f 1513/1658/339 329/391/339 1260/1396/339
+f 1513/1658/339 1260/1396/339 1255/1391/339
+f 1255/1391/339 1260/1396/339 314/376/339
+f 546/634/338 337/399/338 1781/1935/338
+f 546/634/338 1781/1935/338 614/708/338
+f 614/708/338 1781/1935/338 336/398/338
+f 1347/1486/337 329/391/337 1075/1205/337
+f 1347/1486/337 1075/1205/337 1248/1383/337
+f 1248/1383/337 1075/1205/337 328/390/337
+f 1430/1572/336 317/379/336 1660/1809/336
+f 1430/1572/336 1660/1809/336 1618/1766/336
+f 1618/1766/336 1660/1809/336 316/378/336
+f 1428/1570/333 315/377/333 631/727/333
+f 1428/1570/333 631/727/333 1071/1201/333
+f 1071/1201/333 631/727/333 299/330/333
+f 512/594/332 323/385/332 1518/1663/332
+f 512/594/332 1518/1663/332 1478/1622/332
+f 1478/1622/332 1518/1663/332 322/384/332
+f 629/725/331 314/376/331 718/826/331
+f 629/725/331 718/826/331 1245/1380/331
+f 1245/1380/331 718/826/331 298/329/331
+f 1864/2019/330 322/384/330 1835/1989/330
+f 1864/2019/330 1835/1989/330 1902/2057/330
+f 1902/2057/330 1835/1989/330 321/383/330
+f 1341/1480/329 314/376/329 1207/1342/329
+f 1341/1480/329 1207/1342/329 1171/1304/329
+f 1171/1304/329 1207/1342/329 313/375/329
+f 606/700/328 320/382/328 555/645/328
+f 606/700/328 555/645/328 1770/1923/328
+f 1770/1923/328 555/645/328 304/335/328
+f 1339/1478/327 312/374/327 1069/1199/327
+f 1339/1478/327 1069/1199/327 1065/1194/327
+f 1065/1194/327 1069/1199/327 296/327/327
+f 1647/1796/326 320/382/326 1863/2018/326
+f 1647/1796/326 1863/2018/326 1025/1154/326
+f 1025/1154/326 1863/2018/326 319/381/326
+f 764/881/325 312/374/325 987/1114/325
+f 764/881/325 987/1114/325 1692/1843/325
+f 1692/1843/325 987/1114/325 311/373/325
+f 1853/2008/324 318/380/324 1104/1236/324
+f 1853/2008/324 1104/1236/324 1589/1735/324
+f 1589/1735/324 1104/1236/324 302/333/324
+f 892/1014/323 311/373/323 1805/1959/323
+f 892/1014/323 1805/1959/323 1765/1918/323
+f 1765/1918/323 1805/1959/323 310/372/323
+f 1688/1839/322 318/380/322 1648/1797/322
+f 1688/1839/322 1648/1797/322 1545/1691/322
+f 1545/1691/322 1648/1797/322 317/379/322
+f 514/597/321 310/372/321 842/963/321
+f 514/597/321 842/963/321 801/920/321
+f 801/920/321 842/963/321 309/371/321
+f 637/734/320 296/327/320 1333/1471/320
+f 637/734/320 1333/1471/320 1073/1203/320
+f 1073/1203/320 1333/1471/320 281/312/320
+f 1910/2065/319 304/335/319 1849/2003/319
+f 1910/2065/319 1849/2003/319 1768/1921/319
+f 1768/1921/319 1849/2003/319 303/334/319
+f 1011/1140/318 296/327/318 605/699/318
+f 1011/1140/318 605/699/318 1178/1312/318
+f 1178/1312/318 605/699/318 295/326/318
+f 1908/2063/317 302/333/317 949/1073/317
+f 1908/2063/317 949/1073/317 918/1042/317
+f 918/1042/317 949/1073/317 287/318/317
+f 1617/1765/316 295/326/316 888/1010/316
+f 1617/1765/316 888/1010/316 1148/1280/316
+f 1148/1280/316 888/1010/316 294/325/316
+f 1032/1161/315 302/333/315 1298/1435/315
+f 1032/1161/315 1298/1435/315 1587/1733/315
+f 1587/1733/315 1298/1435/315 301/332/315
+f 1698/1849/314 294/325/314 1807/1961/314
+f 1698/1849/314 1807/1961/314 886/1008/314
+f 886/1008/314 1807/1961/314 293/324/314
+f 1477/1621/313 301/332/313 1423/1564/313
+f 1477/1621/313 1423/1564/313 1476/1620/313
+f 1476/1620/313 1423/1564/313 300/331/313
+f 1678/1828/310 299/330/310 1552/1698/310
+f 1678/1828/310 1552/1698/310 1417/1557/310
+f 1417/1557/310 1552/1698/310 284/315/310
+f 877/998/309 306/337/309 803/922/309
+f 877/998/309 803/922/309 1593/1740/309
+f 1593/1740/309 803/922/309 291/322/309
+f 1551/1697/308 298/329/308 1504/1648/308
+f 1551/1697/308 1504/1648/308 1502/1646/308
+f 1502/1646/308 1504/1648/308 283/314/308
+f 1405/1545/307 306/337/307 1874/2029/307
+f 1405/1545/307 1874/2029/307 503/583/307
+f 503/583/307 1874/2029/307 305/336/307
+f 1231/1366/306 298/329/306 844/965/306
+f 1231/1366/306 844/965/306 638/735/306
+f 638/735/306 844/965/306 297/328/306
+f 1404/1544/305 304/335/305 1829/1983/305
+f 1404/1544/305 1829/1983/305 597/690/305
+f 597/690/305 1829/1983/305 289/320/305
+f 956/1080/302 284/315/302 1668/1817/302
+f 956/1080/302 1668/1817/302 1663/1812/302
+f 1663/1812/302 1668/1817/302 269/300/302
+f 973/1098/301 291/322/301 699/804/301
+f 973/1098/301 699/804/301 695/800/301
+f 695/800/301 699/804/301 276/307/301
+f 1667/1816/300 283/314/300 1484/1628/300
+f 1667/1816/300 1484/1628/300 1413/1553/300
+f 1413/1553/300 1484/1628/300 268/299/300
+f 1257/1393/541 291/322/541 499/578/541
+f 1257/1393/299 499/578/299 1256/1392/299
+f 1256/1392/541 499/578/541 290/321/541
+f 1909/2064/298 283/314/298 1235/1370/298
+f 1909/2064/298 1235/1370/298 1500/1644/298
+f 1500/1644/298 1235/1370/298 282/313/298
+f 795/914/297 289/320/297 1331/1469/297
+f 795/914/297 1331/1469/297 492/570/297
+f 492/570/297 1331/1469/297 274/305/297
+f 1499/1643/296 281/312/296 561/651/296
+f 1499/1643/296 561/651/296 1227/1362/296
+f 1227/1362/296 561/651/296 266/297/296
+f 1764/1917/295 289/320/295 1762/1915/295
+f 1764/1917/295 1762/1915/295 595/688/295
+f 595/688/295 1762/1915/295 288/319/295
+f 1031/1160/294 281/312/294 1061/1190/294
+f 1031/1160/294 1061/1190/294 1327/1465/294
+f 1327/1465/294 1061/1190/294 280/311/294
+f 594/687/293 287/318/293 1834/1988/293
+f 594/687/293 1834/1988/293 1754/1907/293
+f 1754/1907/293 1834/1988/293 272/303/293
+f 1112/1244/540 280/311/540 1673/1823/540
+f 1112/1244/292 1673/1823/292 1111/1243/292
+f 1111/1243/540 1673/1823/540 279/310/540
+f 916/1040/291 287/318/291 1584/1730/291
+f 916/1040/291 1584/1730/291 1843/1997/291
+f 1843/1997/291 1584/1730/291 286/317/291
+f 609/703/290 278/309/290 1143/1275/290
+f 609/703/290 1143/1275/290 1141/1273/290
+f 1141/1273/290 1143/1275/290 263/294/290
+f 1583/1729/289 286/317/289 1446/1590/289
+f 1583/1729/289 1446/1590/289 957/1081/289
+f 957/1081/556 1446/1590/556 285/316/556
+f 1265/1401/288 274/305/288 592/685/288
+f 1265/1401/288 592/685/288 490/568/288
+f 490/568/288 592/685/288 273/304/288
+f 1914/2069/287 266/297/287 1543/1689/287
+f 1914/2069/287 1543/1689/287 1225/1360/287
+f 1225/1360/287 1543/1689/287 265/296/287
+f 489/567/286 272/303/286 591/684/286
+f 489/567/286 591/684/286 588/681/286
+f 588/681/286 591/684/286 257/288/286
+f 1322/1459/285 265/296/285 1057/1186/285
+f 1322/1459/285 1057/1186/285 1321/1458/285
+f 1321/1458/285 1057/1186/285 264/295/285
+f 1177/1311/284 272/303/284 1840/1994/284
+f 1177/1311/284 1840/1994/284 1752/1905/284
+f 1752/1905/284 1840/1994/284 271/302/284
+f 1320/1457/283 263/294/283 1055/1184/283
+f 1320/1457/283 1055/1184/283 1882/2037/283
+f 1882/2037/283 1055/1184/283 248/279/283
+f 1839/1993/282 271/302/282 1579/1725/282
+f 1839/1993/282 1579/1725/282 1838/1992/282
+f 1838/1992/282 1579/1725/282 270/301/282
+f 1837/1991/279 269/300/279 1577/1723/279
+f 1837/1991/279 1577/1723/279 1748/1901/279
+f 1748/1901/279 1577/1723/279 254/285/279
+f 969/1094/278 277/308/278 695/800/278
+f 969/1094/278 695/800/278 968/1093/278
+f 968/1093/278 695/800/278 276/307/278
+f 1576/1722/277 268/299/277 1662/1811/277
+f 1576/1722/277 1662/1811/277 1659/1808/277
+f 1659/1808/277 1662/1811/277 253/284/277
+f 694/799/276 276/307/276 792/911/276
+f 694/799/276 792/911/276 693/798/276
+f 693/798/276 792/911/276 275/306/276
+f 1409/1549/275 268/299/275 1497/1641/275
+f 1409/1549/275 1497/1641/275 1411/1551/275
+f 1411/1551/275 1497/1641/275 267/298/275
+f 692/797/274 274/305/274 791/910/274
+f 692/797/274 791/910/274 785/904/274
+f 785/904/274 791/910/274 259/290/274
+f 1410/1550/273 266/297/273 1496/1640/273
+f 1410/1550/273 1496/1640/273 1495/1639/273
+f 1495/1639/273 1496/1640/273 251/282/273
+f 1920/2075/539 254/285/539 1832/1986/539
+f 1920/2075/539 1832/1986/539 1828/1982/539
+f 1828/1982/539 1832/1986/539 239/270/539
+f 876/997/271 262/293/271 965/1090/271
+f 876/997/271 965/1090/271 875/996/271
+f 875/996/271 965/1090/271 261/292/271
+f 1831/1985/270 253/284/270 1747/1900/270
+f 1831/1985/270 1747/1900/270 1744/1897/270
+f 1744/1897/270 1747/1900/270 238/269/270
+f 964/1089/269 261/292/269 688/793/269
+f 964/1089/269 688/793/269 963/1088/269
+f 963/1088/269 688/793/269 260/291/269
+f 1658/1807/268 253/284/268 1575/1721/268
+f 1658/1807/268 1575/1721/268 1657/1806/268
+f 1657/1806/268 1575/1721/268 252/283/268
+f 962/1087/267 259/290/267 686/791/267
+f 962/1087/267 686/791/267 871/992/267
+f 871/992/267 686/791/267 244/275/267
+f 1656/1805/266 251/282/266 1574/1720/266
+f 1656/1805/266 1574/1720/266 1572/1718/266
+f 1572/1718/266 1574/1720/266 236/267/266
+f 784/903/265 259/290/265 484/561/265
+f 784/903/265 484/561/265 783/902/265
+f 783/902/265 484/561/265 258/289/265
+f 1494/1638/264 251/282/264 1408/1548/264
+f 1494/1638/264 1408/1548/264 1493/1637/264
+f 1493/1637/264 1408/1548/264 250/281/264
+f 782/901/263 257/288/263 483/560/263
+f 782/901/263 483/560/263 683/787/263
+f 683/787/263 483/560/263 242/273/263
+f 1407/1547/262 250/281/262 1318/1455/262
+f 1407/1547/262 1318/1455/262 1406/1546/262
+f 1406/1546/262 1318/1455/262 249/280/262
+f 587/680/261 257/288/261 1749/1902/261
+f 587/680/261 1749/1902/261 586/679/261
+f 586/679/261 1749/1902/261 256/287/261
+f 1317/1454/260 249/280/260 1882/2037/260
+f 1317/1454/260 1882/2037/260 1316/1453/260
+f 1316/1453/260 1882/2037/260 248/279/260
+f 1922/2077/538 256/287/538 1833/1987/538
+f 1922/2077/259 1833/1987/259 1921/2076/259
+f 1921/2076/538 1833/1987/538 255/286/538
+f 1571/1717/256 236/267/256 1491/1635/256
+f 1571/1717/256 1491/1635/256 1570/1716/256
+f 1570/1716/256 1491/1635/256 235/266/256
+f 868/989/255 242/273/255 779/898/255
+f 868/989/255 779/898/255 777/896/255
+f 777/896/255 779/898/255 227/258/255
+f 1569/1715/254 234/265/254 1490/1634/254
+f 1569/1715/254 1490/1634/254 1487/1631/254
+f 1487/1631/254 1490/1634/254 219/250/254
+f 682/786/253 242/273/253 585/678/253
+f 682/786/253 585/678/253 681/785/253
+f 681/785/253 585/678/253 241/272/253
+f 1402/1542/252 234/265/252 1312/1449/252
+f 1402/1542/252 1312/1449/252 1401/1541/252
+f 1401/1541/252 1312/1449/252 233/264/252
+f 584/677/537 241/272/537 1917/2072/537
+f 584/677/537 1917/2072/537 583/676/537
+f 583/676/537 1917/2072/537 240/271/537
+f 582/675/248 239/270/248 1916/2071/248
+f 582/675/248 1916/2071/248 1913/2068/248
+f 1913/2068/248 1916/2071/248 224/255/248
+f 1219/1354/247 246/277/247 1138/1270/247
+f 1219/1354/247 1138/1270/247 1136/1268/247
+f 1136/1268/247 1138/1270/247 231/262/247
+f 1915/2070/246 238/269/246 1827/1981/246
+f 1915/2070/246 1827/1981/246 1824/1978/246
+f 1824/1978/246 1827/1981/246 223/254/246
+f 1051/1180/245 246/277/245 959/1083/245
+f 1051/1180/245 959/1083/245 1050/1179/245
+f 1050/1179/245 959/1083/245 245/276/245
+f 1743/1896/244 238/269/244 1655/1804/244
+f 1743/1896/244 1655/1804/244 1742/1895/244
+f 1742/1895/244 1655/1804/244 237/268/244
+f 1049/1178/243 244/275/243 958/1082/243
+f 1049/1178/243 958/1082/243 955/1079/243
+f 955/1079/243 958/1082/243 229/260/243
+f 1741/1894/242 236/267/242 1653/1802/242
+f 1741/1894/242 1653/1802/242 1651/1800/242
+f 1651/1800/242 1653/1802/242 221/252/242
+f 870/991/241 244/275/241 780/899/241
+f 870/991/241 780/899/241 869/990/241
+f 869/990/241 780/899/241 243/274/241
+f 1489/1633/240 223/254/240 1911/2066/240
+f 1489/1633/240 1911/2066/240 1907/2062/240
+f 1907/2062/240 1911/2066/240 208/239/240
+f 1135/1267/239 231/262/239 1047/1176/239
+f 1135/1267/239 1047/1176/239 1134/1266/239
+f 1134/1266/239 1047/1176/239 230/261/239
+f 1823/1977/238 223/254/238 1737/1890/238
+f 1823/1977/238 1737/1890/238 569/660/238
+f 569/660/238 1737/1890/238 222/253/238
+f 1133/1265/237 229/260/237 1046/1175/237
+f 1133/1265/237 1046/1175/237 1041/1170/237
+f 1041/1170/237 1046/1175/237 214/245/237
+f 1821/1975/236 221/252/236 1736/1889/236
+f 1821/1975/236 1736/1889/236 1734/1887/236
+f 1734/1887/236 1736/1889/236 206/237/236
+f 954/1078/235 229/260/235 865/986/235
+f 954/1078/235 865/986/235 953/1077/235
+f 953/1077/235 865/986/235 228/259/235
+f 1650/1799/234 221/252/234 702/807/234
+f 1650/1799/234 702/807/234 1649/1798/234
+f 1649/1798/234 702/807/234 220/251/234
+f 952/1076/233 227/258/233 864/985/233
+f 952/1076/233 864/985/233 857/978/233
+f 857/978/233 864/985/233 212/243/233
+f 1567/1713/232 220/251/232 1487/1631/232
+f 1567/1713/232 1487/1631/232 1566/1712/232
+f 1566/1712/232 1487/1631/232 219/250/232
+f 776/895/231 227/258/231 679/782/231
+f 776/895/231 679/782/231 960/1084/231
+f 960/1084/231 679/782/231 226/257/231
+f 1486/1630/230 219/250/230 1395/1535/230
+f 1486/1630/230 1395/1535/230 1485/1629/230
+f 1485/1629/230 1395/1535/230 218/249/230
+f 1918/2073/229 226/257/229 581/674/229
+f 1918/2073/229 581/674/229 677/780/229
+f 677/780/229 581/674/229 225/256/229
+f 676/779/226 224/255/226 580/673/226
+f 676/779/226 580/673/226 574/666/226
+f 574/666/226 580/673/226 209/240/226
+f 1218/1353/225 232/263/225 1136/1268/225
+f 1218/1353/225 1136/1268/225 1217/1352/225
+f 1217/1352/225 1136/1268/225 231/262/225
+f 1644/1793/224 205/236/224 1563/1709/224
+f 1644/1793/224 1563/1709/224 1643/1792/224
+f 1643/1792/224 1563/1709/224 204/235/224
+f 856/977/223 212/243/223 768/885/223
+f 856/977/223 768/885/223 855/976/223
+f 855/976/223 768/885/223 211/242/223
+f 1562/1708/557 204/235/557 1481/1625/557
+f 1562/1708/222 1481/1625/222 1561/1707/222
+f 1561/1707/222 1481/1625/222 203/234/222
+f 767/884/221 211/242/221 670/772/221
+f 767/884/221 670/772/221 766/883/221
+f 766/883/221 670/772/221 210/241/221
+f 765/882/218 209/240/218 668/770/218
+f 765/882/218 668/770/218 663/764/218
+f 663/764/218 668/770/218 194/225/218
+f 1304/1441/535 217/248/535 1211/1346/535
+f 1304/1441/535 1211/1346/535 1303/1440/535
+f 1303/1440/535 1211/1346/535 216/247/535
+f 667/769/216 208/239/216 572/664/216
+f 667/769/216 572/664/216 566/657/216
+f 566/657/216 572/664/216 193/224/216
+f 1210/1345/534 216/247/534 1128/1260/534
+f 1210/1345/534 1128/1260/534 1209/1344/534
+f 1209/1344/534 1128/1260/534 215/246/534
+f 1906/2061/214 208/239/214 1817/1971/214
+f 1906/2061/214 1817/1971/214 1905/2060/214
+f 1905/2060/214 1817/1971/214 207/238/214
+f 1208/1343/213 214/245/213 1126/1258/213
+f 1208/1343/213 1126/1258/213 1124/1256/213
+f 1124/1256/213 1126/1258/213 199/230/213
+f 1904/2059/212 206/237/212 1815/1969/212
+f 1904/2059/212 1815/1969/212 1811/1965/212
+f 1811/1965/212 1815/1969/212 191/222/212
+f 1040/1169/211 214/245/211 947/1071/211
+f 1040/1169/211 947/1071/211 1039/1168/211
+f 1039/1168/211 947/1071/211 213/244/211
+f 1733/1886/210 206/237/210 1645/1794/210
+f 1733/1886/210 1645/1794/210 1732/1885/210
+f 1732/1885/210 1645/1794/210 205/236/210
+f 1038/1167/209 212/243/209 945/1069/209
+f 1038/1167/209 945/1069/209 941/1065/209
+f 941/1065/209 945/1069/209 197/228/209
+f 1301/1438/208 201/232/208 1206/1341/208
+f 1301/1438/208 1206/1341/208 1300/1437/208
+f 1300/1437/208 1206/1341/208 200/231/208
+f 565/656/207 193/224/207 1900/2055/207
+f 565/656/207 1900/2055/207 564/655/207
+f 564/655/207 1900/2055/207 192/223/207
+f 1299/1436/206 199/230/206 1204/1339/206
+f 1299/1436/206 1204/1339/206 1201/1336/206
+f 1201/1336/206 1204/1339/206 184/215/206
+f 563/654/205 191/222/205 1898/2053/205
+f 563/654/205 1898/2053/205 1892/2047/205
+f 1892/2047/205 1898/2053/205 176/207/205
+f 1123/1255/204 199/230/204 1035/1164/204
+f 1123/1255/204 1035/1164/204 1122/1254/204
+f 1122/1254/204 1035/1164/204 198/229/204
+f 1810/1964/203 191/222/203 1729/1882/203
+f 1810/1964/203 1729/1882/203 1809/1963/203
+f 1809/1963/203 1729/1882/203 190/221/203
+f 1121/1253/202 197/228/202 1033/1162/202
+f 1121/1253/202 1033/1162/202 1030/1159/202
+f 1030/1159/202 1033/1162/202 182/213/202
+f 1808/1962/201 189/220/201 1727/1880/201
+f 1808/1962/201 1727/1880/201 1725/1878/201
+f 1725/1878/201 1727/1880/201 174/205/201
+f 940/1064/200 197/228/200 849/970/200
+f 940/1064/200 849/970/200 939/1063/200
+f 939/1063/200 849/970/200 196/227/200
+f 1726/1879/199 188/219/199 1638/1787/199
+f 1726/1879/199 1638/1787/199 1230/1365/199
+f 1230/1365/199 1638/1787/199 173/204/199
+f 848/969/198 196/227/198 761/878/198
+f 848/969/198 761/878/198 847/968/198
+f 847/968/198 761/878/198 195/226/198
+f 846/967/195 194/225/195 759/876/195
+f 846/967/195 759/876/195 754/870/195
+f 754/870/195 759/876/195 179/210/195
+f 1389/1529/194 202/233/194 1302/1439/194
+f 1389/1529/194 1302/1439/194 1388/1528/194
+f 1388/1528/532 1302/1439/532 201/232/532
+f 758/875/193 193/224/193 661/762/193
+f 758/875/193 661/762/193 657/757/193
+f 657/757/193 661/762/193 178/209/193
+f 1029/1158/192 182/213/192 934/1058/192
+f 1029/1158/192 934/1058/192 1028/1157/192
+f 1028/1157/192 934/1058/192 181/212/192
+f 1724/1877/191 174/205/191 1230/1365/191
+f 1724/1877/191 1230/1365/191 1723/1876/191
+f 1723/1876/558 1230/1365/558 173/204/558
+f 933/1057/190 181/212/190 843/964/190
+f 933/1057/190 843/964/190 932/1056/190
+f 932/1056/190 843/964/190 180/211/190
+f 931/1055/187 179/210/187 841/962/187
+f 931/1055/187 841/962/187 839/960/187
+f 839/960/187 841/962/187 164/195/187
+f 1557/1703/531 186/217/531 1473/1617/531
+f 1557/1703/531 1473/1617/531 1468/1612/531
+f 1468/1612/531 1473/1617/531 171/202/531
+f 840/961/185 178/209/185 752/868/185
+f 840/961/185 752/868/185 747/861/185
+f 747/861/185 752/868/185 163/194/185
+f 1472/1616/184 185/216/184 1380/1519/184
+f 1472/1616/184 1380/1519/184 1375/1514/184
+f 1375/1514/184 1380/1519/184 170/201/184
+f 656/756/183 178/209/183 558/648/183
+f 656/756/183 558/648/183 655/755/183
+f 655/755/183 558/648/183 177/208/183
+f 1295/1432/182 185/216/182 1201/1336/182
+f 1295/1432/182 1201/1336/182 1294/1431/182
+f 1294/1431/182 1201/1336/182 184/215/182
+f 654/754/181 176/207/181 556/646/181
+f 654/754/181 556/646/181 551/640/181
+f 551/640/181 556/646/181 161/192/181
+f 1200/1335/180 184/215/180 1119/1251/180
+f 1200/1335/180 1119/1251/180 1199/1334/180
+f 1199/1334/180 1119/1251/180 183/214/180
+f 1891/2046/179 176/207/179 1804/1958/179
+f 1891/2046/179 1804/1958/179 1890/2045/179
+f 1890/2045/179 1804/1958/179 175/206/179
+f 1198/1333/178 182/213/178 1117/1249/178
+f 1198/1333/178 1117/1249/178 1115/1247/178
+f 1115/1247/178 1117/1249/178 167/198/178
+f 1803/1957/177 175/206/177 1725/1878/177
+f 1803/1957/177 1725/1878/177 1802/1956/177
+f 1802/1956/177 1725/1878/177 174/205/177
+f 746/860/176 163/194/176 651/750/176
+f 746/860/176 651/750/176 745/859/176
+f 745/859/176 651/750/176 162/193/176
+f 1464/1608/175 169/200/175 1373/1512/175
+f 1464/1608/175 1373/1512/175 1370/1509/175
+f 1370/1509/175 1373/1512/175 154/185/175
+f 744/858/174 161/192/174 649/748/174
+f 744/858/174 649/748/174 644/742/174
+f 644/742/174 649/748/174 146/177/174
+f 1291/1428/173 169/200/173 1197/1332/173
+f 1291/1428/173 1197/1332/173 1290/1427/173
+f 1290/1427/173 1197/1332/173 168/199/173
+f 550/639/172 161/192/172 1886/2041/172
+f 550/639/172 1886/2041/172 549/638/172
+f 549/638/172 1886/2041/172 160/191/172
+f 1289/1426/171 167/198/171 1195/1330/171
+f 1289/1426/171 1195/1330/171 1192/1326/171
+f 1192/1326/171 1195/1330/171 152/183/171
+f 548/637/559 159/190/559 1884/2039/559
+f 548/637/170 1884/2039/170 1879/2034/170
+f 1879/2034/559 1884/2039/559 144/175/559
+f 1114/1246/169 167/198/169 1023/1152/169
+f 1114/1246/169 1023/1152/169 1113/1245/169
+f 1113/1245/169 1023/1152/169 166/197/169
+f 1799/1953/560 159/190/560 1721/1874/560
+f 1799/1953/168 1721/1874/168 1798/1952/168
+f 1798/1952/168 1721/1874/168 158/189/168
+f 1022/1151/167 166/197/167 926/1050/167
+f 1022/1151/167 926/1050/167 1021/1150/167
+f 1021/1150/167 926/1050/167 165/196/167
+f 1020/1149/561 164/195/561 924/1048/561
+f 1020/1149/164 924/1048/164 919/1043/164
+f 919/1043/164 924/1048/164 149/180/164
+f 1556/1702/163 172/203/163 1468/1612/163
+f 1556/1702/163 1468/1612/163 1555/1701/163
+f 1555/1701/163 1468/1612/163 171/202/163
+f 923/1047/162 163/194/162 837/958/162
+f 923/1047/162 837/958/162 834/955/162
+f 834/955/162 837/958/162 148/179/162
+f 1466/1610/562 171/202/562 1375/1514/562
+f 1466/1610/562 1375/1514/562 1465/1609/562
+f 1465/1609/161 1375/1514/161 170/201/161
+f 1878/2033/160 144/175/160 1796/1950/160
+f 1878/2033/160 1796/1950/160 1877/2032/160
+f 1877/2032/160 1796/1950/160 143/174/160
+f 1107/1239/159 151/182/159 1015/1144/159
+f 1107/1239/159 1015/1144/159 1106/1238/159
+f 1106/1238/159 1015/1144/159 150/181/159
+f 1105/1237/563 149/180/563 1013/1142/563
+f 1105/1237/156 1013/1142/156 1009/1138/156
+f 1009/1138/156 1013/1142/156 134/165/156
+f 1719/1872/530 156/187/530 1631/1780/530
+f 1719/1872/530 1631/1780/530 799/918/530
+f 799/918/530 1631/1780/530 141/172/530
+f 1012/1141/154 148/179/154 917/1041/154
+f 1012/1141/154 917/1041/154 914/1038/154
+f 914/1038/154 917/1041/154 133/164/154
+f 1548/1694/529 156/187/529 1460/1604/529
+f 1548/1694/529 1460/1604/529 1547/1693/529
+f 1547/1693/529 1460/1604/529 155/186/529
+f 833/954/152 148/179/152 740/853/152
+f 833/954/152 740/853/152 832/953/152
+f 832/953/152 740/853/152 147/178/152
+f 1546/1692/151 154/185/151 1458/1602/151
+f 1546/1692/151 1458/1602/151 1455/1599/151
+f 1455/1599/151 1458/1602/151 139/170/151
+f 831/952/150 146/177/150 738/851/150
+f 831/952/150 738/851/150 735/847/150
+f 735/847/150 738/851/150 131/162/150
+f 1369/1508/149 154/185/149 1287/1424/149
+f 1369/1508/149 1287/1424/149 1368/1507/149
+f 1368/1507/149 1287/1424/149 153/184/149
+f 643/741/148 146/177/148 543/631/148
+f 643/741/148 543/631/148 642/740/148
+f 642/740/148 543/631/148 145/176/148
+f 1367/1506/147 152/183/147 1285/1422/147
+f 1367/1506/147 1285/1422/147 1283/1420/147
+f 1283/1420/147 1285/1422/147 137/168/147
+f 641/739/146 144/175/146 541/629/146
+f 641/739/146 541/629/146 536/623/146
+f 536/623/146 541/629/146 129/160/146
+f 1191/1325/145 152/183/145 1108/1240/145
+f 1191/1325/145 1108/1240/145 1190/1324/145
+f 1190/1324/145 1108/1240/145 151/182/145
+f 1626/1774/144 139/170/144 1540/1686/144
+f 1626/1774/144 1540/1686/144 1534/1680/144
+f 1534/1680/144 1540/1686/144 124/155/144
+f 911/1035/143 131/162/143 828/949/143
+f 911/1035/143 828/949/143 824/945/143
+f 824/945/143 828/949/143 116/147/143
+f 1454/1598/142 139/170/142 1366/1505/142
+f 1454/1598/142 1366/1505/142 1453/1597/142
+f 1453/1597/142 1366/1505/142 138/169/142
+f 734/846/141 131/162/141 635/732/141
+f 734/846/141 635/732/141 733/845/141
+f 733/845/141 635/732/141 130/161/141
+f 1452/1596/140 137/168/140 1364/1503/140
+f 1452/1596/140 1364/1503/140 1362/1501/140
+f 1362/1501/140 1364/1503/140 122/153/140
+f 634/731/139 130/161/139 536/623/139
+f 634/731/139 536/623/139 633/730/139
+f 633/730/139 536/623/139 129/160/139
+f 1282/1419/138 137/168/138 1187/1321/138
+f 1282/1419/138 1187/1321/138 1281/1418/138
+f 1281/1418/138 1187/1321/138 136/167/138
+f 535/622/137 129/160/137 1875/2030/137
+f 535/622/137 1875/2030/137 534/621/137
+f 534/621/137 1875/2030/137 128/159/137
+f 1186/1320/136 136/167/136 1102/1234/136
+f 1186/1320/136 1102/1234/136 1185/1319/136
+f 1185/1319/136 1102/1234/136 135/166/136
+f 1184/1318/526 134/165/526 1100/1232/526
+f 1184/1318/526 1100/1232/526 1095/1227/526
+f 1095/1227/526 1100/1232/526 119/150/526
+f 1717/1870/132 142/173/132 799/918/132
+f 1717/1870/132 799/918/132 1716/1869/132
+f 1716/1869/132 799/918/132 141/172/132
+f 1099/1231/131 133/164/131 1007/1136/131
+f 1099/1231/131 1007/1136/131 1002/1131/131
+f 1002/1131/131 1007/1136/131 118/149/131
+f 1628/1776/130 141/172/130 1542/1688/130
+f 1628/1776/130 1542/1688/130 1627/1775/130
+f 1627/1775/130 1542/1688/130 140/171/130
+f 913/1037/129 133/164/129 830/951/129
+f 913/1037/129 830/951/129 912/1036/129
+f 912/1036/129 830/951/129 132/163/129
+f 1278/1415/128 121/152/128 1182/1316/128
+f 1278/1415/128 1182/1316/128 1277/1414/128
+f 1277/1414/128 1182/1316/128 120/151/128
+f 1276/1413/564 119/150/564 1180/1314/564
+f 1276/1413/524 1180/1314/524 1176/1310/524
+f 1176/1310/524 1180/1314/524 104/135/524
+f 1792/1946/124 127/158/124 1712/1865/124
+f 1792/1946/124 1712/1865/124 1791/1945/124
+f 1791/1945/124 1712/1865/124 126/157/124
+f 1179/1313/123 118/149/123 1093/1225/123
+f 1179/1313/123 1093/1225/123 1089/1220/123
+f 1089/1220/123 1093/1225/123 103/134/123
+f 1711/1864/122 126/157/122 1621/1769/122
+f 1711/1864/122 1621/1769/122 1710/1863/122
+f 1710/1863/122 1621/1769/122 125/156/122
+f 1001/1130/121 118/149/121 908/1032/121
+f 1001/1130/121 908/1032/121 1000/1129/121
+f 1000/1129/121 908/1032/121 117/148/121
+f 1709/1862/120 124/155/120 1619/1767/120
+f 1709/1862/120 1619/1767/120 1615/1762/120
+f 1615/1762/120 1619/1767/120 109/140/120
+f 999/1128/119 116/147/119 906/1030/119
+f 999/1128/119 906/1030/119 904/1027/119
+f 904/1027/119 906/1030/119 101/132/119
+f 1533/1679/118 124/155/118 1447/1591/118
+f 1533/1679/118 1447/1591/118 1532/1678/118
+f 1532/1678/118 1447/1591/118 123/154/118
+f 823/944/117 116/147/117 729/840/117
+f 823/944/117 729/840/117 822/943/117
+f 822/943/117 729/840/117 115/146/117
+f 1531/1677/116 122/153/116 1445/1589/116
+f 1531/1677/116 1445/1589/116 1443/1586/116
+f 1443/1586/116 1445/1589/116 107/138/116
+f 728/839/115 115/146/115 628/724/115
+f 728/839/115 628/724/115 727/838/115
+f 727/838/115 628/724/115 114/145/115
+f 1361/1500/114 122/153/114 1279/1416/114
+f 1361/1500/114 1279/1416/114 1360/1499/114
+f 1360/1499/114 1279/1416/114 121/152/114
+f 726/837/113 113/144/113 626/722/113
+f 726/837/113 626/722/113 622/718/113
+f 622/718/113 626/722/113 98/129/113
+f 1086/1217/112 101/132/112 995/1123/112
+f 1086/1217/112 995/1123/112 992/1120/112
+f 992/1120/112 995/1123/112 86/117/112
+f 1614/1761/111 109/140/111 1529/1675/111
+f 1614/1761/111 1529/1675/111 1613/1760/111
+f 1613/1760/111 1529/1675/111 108/139/111
+f 903/1026/110 101/132/110 817/938/110
+f 903/1026/110 817/938/110 902/1025/110
+f 902/1025/110 817/938/110 100/131/110
+f 1612/1759/109 107/138/109 1527/1672/109
+f 1612/1759/109 1527/1672/109 1524/1669/109
+f 1524/1669/109 1527/1672/109 92/123/109
+f 816/937/108 100/131/108 722/831/108
+f 816/937/108 722/831/108 815/936/108
+f 815/936/108 722/831/108 99/130/108
+f 1442/1585/107 107/138/107 1357/1496/107
+f 1442/1585/107 1357/1496/107 1441/1584/107
+f 1441/1584/107 1357/1496/107 106/137/107
+f 814/935/106 98/129/106 720/829/106
+f 814/935/106 720/829/106 1771/1924/106
+f 1771/1924/106 720/829/106 83/114/106
+f 1356/1495/105 106/137/105 1273/1409/105
+f 1356/1495/105 1273/1409/105 1355/1494/105
+f 1355/1494/105 1273/1409/105 105/136/105
+f 1354/1493/522 104/135/522 1271/1407/522
+f 1354/1493/522 1271/1407/522 1268/1404/522
+f 1268/1404/102 1271/1407/102 89/120/102
+f 1870/2025/101 112/143/101 1789/1943/101
+f 1870/2025/101 1789/1943/101 1869/2024/101
+f 1869/2024/101 1789/1943/101 111/142/101
+f 1270/1406/100 103/134/100 1174/1307/100
+f 1270/1406/100 1174/1307/100 1170/1303/100
+f 1170/1303/100 1174/1307/100 88/119/100
+f 1868/2023/99 110/141/99 1787/1941/99
+f 1868/2023/99 1787/1941/99 1483/1627/99
+f 1483/1627/99 1787/1941/99 95/126/99
+f 1088/1219/98 103/134/98 997/1126/98
+f 1088/1219/98 997/1126/98 1087/1218/98
+f 1087/1218/98 997/1126/98 102/133/98
+f 1786/1940/97 109/140/97 1704/1856/97
+f 1786/1940/97 1704/1856/97 645/743/97
+f 645/743/97 1704/1856/97 94/125/97
+f 1350/1489/565 89/120/565 1267/1403/565
+f 1350/1489/95 1267/1403/95 1261/1397/95
+f 1261/1397/95 1267/1403/95 73/73/95
+f 521/606/94 96/127/94 1865/2020/94
+f 521/606/94 1865/2020/94 1861/2016/94
+f 1861/2016/94 1865/2020/94 80/80/94
+f 1266/1402/93 88/119/93 1169/1302/93
+f 1266/1402/93 1169/1302/93 1163/1296/93
+f 1163/1296/93 1169/1302/93 72/72/93
+f 1784/1938/521 96/127/521 1483/1627/521
+f 1784/1938/521 1483/1627/521 1783/1937/521
+f 1783/1937/521 1483/1627/521 95/126/521
+f 1081/1212/91 88/119/91 724/834/91
+f 1081/1212/91 724/834/91 1080/1211/91
+f 1080/1211/91 724/834/91 87/118/91
+f 1700/1851/90 95/126/90 645/743/90
+f 1700/1851/90 645/743/90 1699/1850/90
+f 1699/1850/90 645/743/90 94/125/90
+f 1079/1210/89 86/117/89 991/1119/89
+f 1079/1210/89 991/1119/89 986/1113/89
+f 986/1113/89 991/1119/89 70/70/89
+f 1607/1754/88 94/125/88 560/650/88
+f 1607/1754/88 560/650/88 1606/1753/88
+f 1606/1753/88 560/650/88 93/124/88
+f 899/1022/87 86/117/87 1264/1400/87
+f 899/1022/87 1264/1400/87 898/1021/87
+f 898/1021/87 1264/1400/87 85/116/87
+f 1605/1752/86 92/123/86 1523/1668/86
+f 1605/1752/86 1523/1668/86 1517/1662/86
+f 1517/1662/86 1523/1668/86 76/76/86
+f 813/934/520 85/116/520 807/927/520
+f 813/934/85 807/927/85 812/933/85
+f 812/933/520 807/927/520 84/115/520
+f 1439/1582/84 92/123/84 1110/1242/84
+f 1439/1582/84 1110/1242/84 1438/1581/84
+f 1438/1581/84 1110/1242/84 91/122/84
+f 716/824/83 84/115/83 1771/1924/83
+f 716/824/566 1771/1924/566 715/823/566
+f 715/823/519 1771/1924/519 83/114/519
+f 1352/1491/82 91/122/82 639/736/82
+f 1352/1491/82 639/736/82 1351/1490/82
+f 1351/1490/82 639/736/82 90/121/82
+f 985/1112/80 70/70/80 895/1017/80
+f 985/1112/80 895/1017/80 984/1111/80
+f 984/1111/80 895/1017/80 69/69/80
+f 1694/1845/79 76/76/79 1600/1747/79
+f 1694/1845/79 1600/1747/79 1596/1743/79
+f 1596/1743/79 1600/1747/79 61/61/79
+f 894/1016/78 69/69/78 810/930/78
+f 894/1016/78 810/930/78 893/1015/78
+f 893/1015/78 810/930/78 68/68/78
+f 1516/1661/77 76/76/77 1434/1576/77
+f 1516/1661/77 1434/1576/77 1515/1660/77
+f 1515/1660/77 1434/1576/77 75/75/77
+f 809/929/76 68/68/76 710/817/76
+f 809/929/76 710/817/76 808/928/76
+f 808/928/518 710/817/518 67/67/518
+f 1433/1575/75 75/75/75 1346/1485/75
+f 1433/1575/75 1346/1485/75 1432/1574/75
+f 1432/1574/75 1346/1485/75 74/74/75
+f 1431/1573/72 73/73/72 1344/1483/72
+f 1431/1573/567 1344/1483/567 1342/1481/567
+f 1342/1481/567 1344/1483/567 58/58/567
+f 518/602/71 81/81/71 1861/2016/71
+f 518/602/71 1861/2016/71 517/601/71
+f 517/601/71 1861/2016/71 80/80/71
+f 1343/1482/70 72/72/70 1259/1395/70
+f 1343/1482/70 1259/1395/70 1254/1390/70
+f 1254/1390/70 1259/1395/70 57/57/70
+f 516/600/69 79/79/69 1859/2014/69
+f 516/600/69 1859/2014/69 1856/2011/69
+f 1856/2011/69 1859/2014/69 64/64/69
+f 1162/1295/68 72/72/68 1074/1204/68
+f 1162/1295/68 1074/1204/68 1161/1294/68
+f 1161/1294/68 1074/1204/68 71/71/68
+f 1779/1933/67 79/79/67 1697/1848/67
+f 1779/1933/67 1697/1848/67 1778/1932/67
+f 1778/1932/67 1697/1848/67 78/78/67
+f 1160/1293/66 70/70/66 1072/1202/66
+f 1160/1293/66 1072/1202/66 568/659/66
+f 568/659/66 1072/1202/66 55/55/66
+f 1696/1847/65 78/78/65 1602/1749/65
+f 1696/1847/65 1602/1749/65 1695/1846/65
+f 1695/1846/65 1602/1749/65 77/77/65
+f 608/702/64 66/66/64 511/593/64
+f 608/702/64 511/593/64 607/701/64
+f 607/701/64 511/593/64 65/65/64
+f 1426/1568/63 57/57/63 1340/1479/63
+f 1426/1568/63 1340/1479/63 1336/1474/63
+f 1336/1474/63 1340/1479/63 42/42/63
+f 510/592/62 65/65/62 1856/2011/62
+f 510/592/62 1856/2011/62 509/591/62
+f 509/591/62 1856/2011/62 64/64/62
+f 1253/1389/61 57/57/61 1157/1290/61
+f 1253/1389/61 1157/1290/61 1252/1388/61
+f 1252/1388/61 1157/1290/61 56/56/61
+f 1855/2010/60 64/64/60 1776/1930/60
+f 1855/2010/60 1776/1930/60 1854/2009/60
+f 1854/2009/60 1776/1930/60 63/63/60
+f 1156/1289/59 56/56/59 568/659/59
+f 1156/1289/59 568/659/59 1155/1288/59
+f 1155/1288/59 568/659/59 55/55/59
+f 1775/1929/58 63/63/58 1689/1840/58
+f 1775/1929/58 1689/1840/58 1774/1928/58
+f 1774/1928/58 1689/1840/58 62/62/58
+f 1068/1198/57 55/55/57 982/1109/57
+f 1068/1198/57 982/1109/57 1067/1197/57
+f 1067/1197/57 982/1109/57 54/54/57
+f 1773/1927/56 61/61/56 1687/1838/56
+f 1773/1927/56 1687/1838/56 1682/1832/56
+f 1682/1832/56 1687/1838/56 46/46/56
+f 981/1108/55 54/54/55 891/1013/55
+f 981/1108/55 891/1013/55 980/1107/55
+f 980/1107/55 891/1013/55 53/53/55
+f 1595/1742/54 61/61/54 1512/1657/54
+f 1595/1742/54 1512/1657/54 1594/1741/54
+f 1594/1741/54 1512/1657/54 60/60/54
+f 890/1012/53 53/53/53 806/926/53
+f 890/1012/568 806/926/568 889/1011/568
+f 889/1011/53 806/926/53 52/52/53
+f 1511/1656/52 60/60/52 1429/1571/52
+f 1511/1656/52 1429/1571/52 1510/1655/52
+f 1510/1655/52 1429/1571/52 59/59/52
+f 1509/1654/49 58/58/49 1427/1569/49
+f 1509/1654/49 1427/1569/49 1422/1563/49
+f 1422/1563/49 1427/1569/49 43/43/49
+f 1847/2001/48 46/46/48 1767/1920/48
+f 1847/2001/48 1767/1920/48 1761/1914/48
+f 1761/1914/48 1767/1920/48 31/31/48
+f 1063/1192/569 39/39/569 977/1102/569
+f 1063/1192/569 977/1102/569 1062/1191/569
+f 1062/1191/47 977/1102/47 38/38/47
+f 1681/1831/46 46/46/46 1588/1734/46
+f 1681/1831/46 1588/1734/46 1680/1830/46
+f 1680/1830/46 1588/1734/46 45/45/46
+f 976/1101/45 38/38/45 887/1009/45
+f 976/1101/516 887/1009/516 975/1100/516
+f 975/1100/45 887/1009/45 37/37/45
+f 1679/1829/44 44/44/44 1586/1732/44
+f 1679/1829/44 1586/1732/44 1707/1860/44
+f 1707/1860/44 1586/1732/44 29/29/44
+f 1506/1650/41 44/44/41 1422/1563/41
+f 1506/1650/41 1422/1563/41 1505/1649/41
+f 1505/1649/41 1422/1563/41 43/43/41
+f 704/809/40 51/51/40 602/695/40
+f 704/809/40 602/695/40 703/808/40
+f 703/808/40 602/695/40 50/50/40
+f 1421/1562/39 43/43/39 1336/1474/39
+f 1421/1562/39 1336/1474/39 1420/1561/39
+f 1420/1561/39 1336/1474/39 42/42/39
+f 601/694/515 50/50/515 504/584/515
+f 601/694/515 504/584/515 600/693/515
+f 600/693/38 504/584/38 49/49/38
+f 1335/1473/37 42/42/37 1244/1379/37
+f 1335/1473/37 1244/1379/37 1334/1472/37
+f 1334/1472/37 1244/1379/37 41/41/37
+f 599/692/36 48/48/36 502/582/36
+f 599/692/36 502/582/36 498/577/36
+f 498/577/36 502/582/36 33/33/36
+f 1243/1378/35 41/41/35 1151/1283/35
+f 1243/1378/35 1151/1283/35 1242/1377/35
+f 1242/1377/35 1151/1283/35 40/40/35
+f 501/581/34 47/47/34 1848/2002/34
+f 501/581/34 1848/2002/34 1846/2000/34
+f 1846/2000/34 1848/2002/34 32/32/34
+f 1150/1282/33 40/40/33 1064/1193/33
+f 1150/1282/33 1064/1193/33 1149/1281/33
+f 1149/1281/33 1064/1193/33 39/39/33
+f 1580/1726/32 27/27/32 1501/1645/32
+f 1580/1726/32 1501/1645/32 1498/1642/32
+f 1498/1642/32 1501/1645/32 12/12/32
+f 796/915/31 34/34/31 698/803/31
+f 796/915/31 698/803/31 1492/1636/31
+f 1492/1636/31 698/803/31 19/19/31
+f 1415/1555/30 27/27/30 1330/1468/30
+f 1415/1555/30 1330/1468/30 1414/1554/30
+f 1414/1554/30 1330/1468/30 26/26/30
+f 697/802/29 33/33/29 596/689/29
+f 697/802/29 596/689/29 593/686/29
+f 593/686/29 596/689/29 18/18/29
+f 1329/1467/28 26/26/28 1234/1369/28
+f 1329/1467/28 1234/1369/28 1328/1466/28
+f 1328/1466/28 1234/1369/28 25/25/28
+f 497/576/27 33/33/27 1846/2000/27
+f 497/576/27 1846/2000/27 496/575/27
+f 496/575/27 1846/2000/27 32/32/27
+f 1233/1368/26 25/25/26 1146/1278/26
+f 1233/1368/26 1146/1278/26 1232/1367/26
+f 1232/1367/26 1146/1278/26 24/24/26
+f 1845/1999/25 32/32/25 1761/1914/25
+f 1845/1999/25 1761/1914/25 1844/1998/25
+f 1844/1998/25 1761/1914/25 31/31/25
+f 1145/1277/24 24/24/24 1060/1189/24
+f 1145/1277/24 1060/1189/24 1144/1276/24
+f 1144/1276/24 1060/1189/24 23/23/24
+f 1760/1913/23 31/31/23 1671/1820/23
+f 1760/1913/23 1671/1820/23 1759/1912/23
+f 1759/1912/23 1671/1820/23 30/30/23
+f 1059/1188/514 23/23/514 970/1095/514
+f 1059/1188/22 970/1095/22 1058/1187/22
+f 1058/1187/22 970/1095/22 22/22/22
+f 1670/1819/21 30/30/21 1707/1860/21
+f 1670/1819/21 1707/1860/21 1669/1818/21
+f 1669/1818/21 1707/1860/21 29/29/21
+f 1582/1728/18 29/29/18 1503/1647/18
+f 1582/1728/18 1503/1647/18 1581/1727/18
+f 1581/1727/570 1503/1647/570 28/28/570
+f 798/917/17 36/36/17 700/805/17
+f 798/917/17 700/805/17 797/916/17
+f 797/916/17 700/805/17 35/35/17
+f 691/796/15 14/14/15 1578/1724/15
+f 691/796/15 1578/1724/15 690/795/15
+f 690/795/571 1578/1724/571 13/13/571
+f 1044/1173/14 21/21/14 793/912/14
+f 1044/1173/14 793/912/14 774/892/14
+f 774/892/14 793/912/14 20/20/14
+f 689/794/13 12/12/13 1488/1632/13
+f 689/794/13 1488/1632/13 860/981/13
+f 860/981/13 1488/1632/13 477/554/13
+f 773/891/12 20/20/12 1492/1636/12
+f 773/891/12 1492/1636/12 863/984/12
+f 863/984/12 1492/1636/12 19/19/12
+f 1568/1714/11 11/11/11 590/683/11
+f 1568/1714/11 590/683/11 578/671/11
+f 578/671/11 590/683/11 2/2/11
+f 862/983/10 19/19/10 593/686/10
+f 862/983/10 593/686/10 579/672/10
+f 579/672/10 593/686/10 18/18/10
+f 589/682/9 10/10/9 1307/1444/9
+f 589/682/9 1307/1444/9 577/670/9
+f 577/670/9 1307/1444/9 476/553/9
+f 967/1092/8 18/18/8 491/569/8
+f 967/1092/8 491/569/8 966/1091/8
+f 966/1091/8 491/569/8 17/17/8
+f 1396/1536/7 9/9/7 488/566/7
+f 1396/1536/7 488/566/7 673/776/7
+f 673/776/7 488/566/7 1/1/7
+f 675/778/6 17/17/6 1841/1995/6
+f 675/778/6 1841/1995/6 1822/1976/6
+f 1822/1976/6 1841/1995/6 16/16/6
+f 487/565/5 8/8/5 1130/1262/5
+f 487/565/5 1130/1262/5 672/775/5
+f 672/775/5 1130/1262/5 475/552/5
+f 880/1001/4 16/16/4 1753/1906/4
+f 880/1001/4 1753/1906/4 879/1000/4
+f 879/1000/4 1753/1906/4 15/15/4
+f 1213/1348/3 7/7/3 1212/1347/3
+f 1213/1348/3 1212/1347/3 1306/1443/3
+f 1306/1443/3 1212/1347/3 474/551/3
+f 790/909/513 15/15/513 1664/1813/513
+f 790/909/513 1664/1813/513 789/908/513
+f 789/908/572 1664/1813/572 14/14/572
+f 775/893/512 482/559/512 508/590/512
+f 775/893/512 508/590/512 770/887/512
+f 770/887/512 508/590/512 473/550/512
+f 1565/1711/511 474/551/511 576/668/511
+f 1565/1711/511 576/668/511 570/661/511
+f 570/661/511 576/668/511 82/82/511
+f 1766/1919/549 4/4/549 687/792/549
+f 1766/1919/510 687/792/510 485/562/510
+f 485/562/549 687/792/549 3/3/549
+f 1129/1261/509 473/550/509 508/590/509
+f 1129/1261/509 508/590/509 1132/1264/509
+f 1132/1264/509 508/590/509 482/559/509
+f 802/921/508 3/3/508 860/981/508
+f 802/921/508 860/981/508 674/777/508
+f 674/777/508 860/981/508 477/554/508
+f 1048/1177/507 472/549/507 1131/1263/507
+f 1048/1177/507 1131/1263/507 1216/1351/507
+f 1216/1351/507 1131/1263/507 481/558/507
+f 1599/1746/506 477/554/506 578/671/506
+f 1599/1746/506 578/671/506 882/1004/506
+f 882/1004/506 578/671/506 2/2/506
+f 1215/1350/505 480/557/505 1912/2067/505
+f 1215/1350/505 1912/2067/505 1214/1349/505
+f 1214/1349/505 1912/2067/505 479/556/505
+f 571/663/504 2/2/504 577/670/504
+f 571/663/504 577/670/504 1730/1883/504
+f 1730/1883/504 577/670/504 476/553/504
+f 1564/1710/503 470/547/503 818/939/503
+f 1564/1710/503 818/939/503 1043/1172/503
+f 1043/1172/503 818/939/503 479/556/503
+f 610/704/502 476/553/502 673/776/502
+f 610/704/502 673/776/502 666/768/502
+f 666/768/502 673/776/502 1/1/502
+f 769/886/501 469/546/501 1263/1399/501
+f 769/886/501 1263/1399/501 1258/1394/501
+f 1258/1394/501 1263/1399/501 6/6/501
+f 665/767/500 1/1/500 672/775/500
+f 665/767/500 672/775/500 1735/1888/500
+f 1735/1888/500 672/775/500 475/552/500
+f 1337/1475/499 468/545/499 772/890/499
+f 1337/1475/499 772/890/499 757/874/499
+f 757/874/499 772/890/499 478/555/499
+f 921/1045/498 475/552/498 1306/1443/498
+f 921/1045/498 1306/1443/498 936/1060/498
+f 936/1060/498 1306/1443/498 474/551/498
+f 575/667/497 467/544/497 1037/1166/497
+f 575/667/497 1037/1166/497 1036/1165/497
+f 1036/1165/497 1037/1166/497 5/5/497
+f 942/1066/496 455/532/496 998/1127/496
+f 942/1066/496 998/1127/496 1077/1207/496
+f 1077/1207/496 998/1127/496 470/547/496
+f 1641/1790/495 447/524/495 1661/1810/495
+f 1641/1790/495 1661/1810/495 1740/1893/495
+f 1740/1893/495 1661/1810/495 462/539/495
+f 946/1070/494 469/546/494 769/886/494
+f 946/1070/494 769/886/494 1842/1996/494
+f 1842/1996/494 769/886/494 468/545/494
+f 1738/1891/493 461/538/493 1482/1626/493
+f 1738/1891/493 1482/1626/493 1652/1801/493
+f 1652/1801/493 1482/1626/493 460/537/493
+f 762/879/492 453/530/492 1519/1664/492
+f 762/879/492 1519/1664/492 1713/1866/492
+f 1713/1866/492 1519/1664/492 468/545/492
+f 1475/1619/491 445/522/491 1731/1884/491
+f 1475/1619/491 1731/1884/491 852/973/491
+f 852/973/491 1731/1884/491 460/537/491
+f 971/1096/490 452/529/490 1590/1736/490
+f 971/1096/490 1590/1736/490 604/698/490
+f 604/698/490 1590/1736/490 467/544/490
+f 770/888/489 473/550/489 1450/1594/489
+f 770/888/489 1450/1594/489 1701/1852/489
+f 1701/1852/489 1450/1594/489 458/535/489
+f 1480/1624/488 459/536/488 570/662/488
+f 1480/1624/488 570/662/488 562/652/488
+f 562/652/488 570/662/488 82/83/488
+f 854/975/487 466/543/487 669/771/487
+f 854/975/487 669/771/487 853/974/487
+f 853/974/487 669/771/487 465/542/487
+f 1450/1594/486 473/550/486 1129/1261/486
+f 1450/1594/486 1129/1261/486 1247/1382/486
+f 1247/1382/486 1129/1261/486 472/549/486
+f 573/665/485 465/542/485 1818/1972/485
+f 573/665/485 1818/1972/485 1053/1182/485
+f 1053/1182/485 1818/1972/485 464/541/485
+f 1125/1257/484 457/534/484 1393/1533/484
+f 1125/1257/484 1393/1533/484 526/613/484
+f 526/613/484 1393/1533/484 472/549/484
+f 1812/1966/483 449/526/483 1147/1279/483
+f 1812/1966/483 1147/1279/483 1224/1359/483
+f 1224/1359/483 1147/1279/483 464/541/483
+f 1127/1259/482 471/548/482 948/1072/482
+f 1127/1259/482 948/1072/482 1550/1696/482
+f 1550/1696/482 948/1072/482 470/547/482
+f 1816/1970/481 463/540/481 1646/1795/481
+f 1816/1970/481 1646/1795/481 1221/1356/481
+f 1221/1356/481 1646/1795/481 462/539/481
+f 760/877/480 451/528/480 567/658/480
+f 760/877/480 567/658/480 1763/1916/480
+f 1763/1916/480 567/658/480 450/527/480
+f 1297/1434/547 443/520/547 1560/1706/547
+f 1297/1434/547 1560/1706/547 1378/1517/547
+f 1378/1517/547 1560/1706/547 458/535/547
+f 525/612/478 450/527/478 662/763/478
+f 525/612/478 662/763/478 845/966/478
+f 845/966/478 662/763/478 449/526/478
+f 1381/1520/477 442/519/477 1376/1515/477
+f 1381/1520/477 1376/1515/477 1806/1960/477
+f 1806/1960/546 1376/1515/546 457/534/546
+f 1275/1412/476 434/511/476 611/705/476
+f 1275/1412/476 611/705/476 1076/1206/476
+f 1076/1206/476 611/705/476 449/526/476
+f 1387/1527/475 456/533/475 1205/1340/475
+f 1387/1527/475 1205/1340/475 1386/1526/475
+f 1386/1526/475 1205/1340/475 455/532/475
+f 660/761/474 448/525/474 1899/2054/474
+f 660/761/474 1899/2054/474 659/760/474
+f 659/760/474 1899/2054/474 447/524/474
+f 1054/1183/473 440/517/473 1881/2036/473
+f 1054/1183/473 1881/2036/473 922/1046/473
+f 922/1046/473 1881/2036/473 455/532/473
+f 1573/1719/472 432/509/472 1152/1284/472
+f 1573/1719/472 1152/1284/472 1592/1739/472
+f 1592/1739/472 1152/1284/472 447/524/472
+f 1203/1338/471 454/531/471 1034/1163/471
+f 1203/1338/471 1034/1163/471 1202/1337/471
+f 1202/1337/471 1034/1163/471 453/530/471
+f 1637/1786/573 431/508/573 1897/2052/573
+f 1637/1786/573 1897/2052/573 1666/1815/573
+f 1666/1815/573 1897/2052/573 446/523/573
+f 1425/1567/469 438/515/469 1004/1133/469
+f 1425/1567/469 1004/1133/469 1451/1595/469
+f 1451/1595/469 1004/1133/469 453/530/469
+f 1639/1788/468 445/522/468 1475/1619/468
+f 1639/1788/468 1475/1619/468 653/753/468
+f 653/753/468 1475/1619/468 444/521/468
+f 755/871/467 437/514/467 1449/1593/467
+f 755/871/467 1449/1593/467 1525/1670/467
+f 1525/1670/467 1449/1593/467 452/529/467
+f 1701/1853/466 458/535/466 1560/1706/466
+f 1701/1853/466 1560/1706/466 756/872/466
+f 756/872/466 1560/1706/466 443/520/466
+f 696/801/465 444/521/465 562/653/465
+f 696/801/465 562/653/465 554/643/465
+f 554/643/465 562/653/465 82/84/465
+f 1801/1955/464 417/494/464 1003/1132/464
+f 1801/1955/464 1003/1132/464 1085/1216/464
+f 1085/1216/464 1003/1132/464 432/509/464
+f 1118/1250/463 439/516/463 935/1059/463
+f 1118/1250/463 935/1059/463 1419/1560/463
+f 1419/1560/463 935/1059/463 438/515/463
+f 1084/1215/462 431/508/462 1637/1786/462
+f 1084/1215/462 1637/1786/462 494/573/462
+f 494/573/462 1637/1786/462 430/507/462
+f 927/1051/461 423/500/461 850/971/461
+f 927/1051/461 850/971/461 930/1054/461
+f 930/1054/461 850/971/461 438/515/461
+f 1633/1782/460 415/492/460 1889/2044/460
+f 1633/1782/460 1889/2044/460 1636/1785/460
+f 1636/1785/460 1889/2044/460 430/507/460
+f 1675/1825/459 422/499/459 928/1052/459
+f 1675/1825/459 928/1052/459 1377/1516/459
+f 1377/1516/459 928/1052/459 437/514/459
+f 756/873/458 443/520/458 1474/1618/458
+f 756/873/458 1474/1618/458 750/865/458
+f 750/865/458 1474/1618/458 428/505/458
+f 1635/1784/457 429/506/457 554/644/457
+f 1635/1784/457 554/644/457 547/635/457
+f 547/635/457 554/644/457 82/85/457
+f 1027/1156/456 436/513/456 495/574/456
+f 1027/1156/456 495/574/456 825/946/456
+f 825/946/456 495/574/456 435/512/456
+f 1137/1269/455 428/505/455 1474/1618/455
+f 1137/1269/574 1474/1618/574 1223/1358/574
+f 1223/1358/455 1474/1618/455 443/520/455
+f 753/869/454 435/512/454 559/649/454
+f 753/869/454 559/649/454 972/1097/454
+f 972/1097/454 559/649/454 434/511/454
+f 1293/1430/453 427/504/453 1222/1357/453
+f 1293/1430/453 1222/1357/453 1310/1447/453
+f 1310/1447/453 1222/1357/453 442/519/453
+f 552/641/452 419/496/452 1880/2035/452
+f 552/641/452 1880/2035/452 533/620/452
+f 533/620/452 1880/2035/452 434/511/452
+f 1309/1446/451 441/518/451 1120/1252/451
+f 1309/1446/451 1120/1252/451 1305/1442/451
+f 1305/1442/451 1120/1252/451 440/517/451
+f 557/647/450 433/510/450 778/897/450
+f 557/647/450 778/897/450 743/857/450
+f 743/857/450 778/897/450 432/509/450
+f 1116/1248/449 425/502/449 1379/1518/449
+f 1116/1248/449 1379/1518/449 1814/1968/449
+f 1814/1968/449 1379/1518/449 440/517/449
+f 1461/1605/448 413/490/448 1722/1875/448
+f 1461/1605/448 1722/1875/448 1467/1611/448
+f 1467/1611/448 1722/1875/448 428/505/448
+f 1308/1445/447 420/497/447 838/959/447
+f 1308/1445/447 838/959/447 1019/1148/447
+f 1019/1148/447 838/959/447 419/496/447
+f 771/889/446 412/489/446 701/806/446
+f 771/889/446 701/806/446 1153/1285/446
+f 1153/1285/446 701/806/446 427/504/446
+f 1790/1944/445 404/481/445 1384/1524/445
+f 1790/1944/445 1384/1524/445 1813/1967/445
+f 1813/1967/445 1384/1524/445 419/496/445
+f 1554/1700/444 426/503/444 1374/1513/444
+f 1554/1700/444 1374/1513/444 1553/1699/444
+f 1553/1699/444 1374/1513/444 425/502/444
+f 836/957/443 418/495/443 650/749/443
+f 836/957/443 650/749/443 835/956/443
+f 835/956/443 650/749/443 417/494/443
+f 1642/1791/442 410/487/442 1229/1364/442
+f 1642/1791/442 1229/1364/442 1665/1814/442
+f 1665/1814/442 1229/1364/442 425/502/442
+f 901/1024/441 402/479/441 1887/2042/441
+f 901/1024/441 1887/2042/441 929/1053/441
+f 929/1053/441 1887/2042/441 417/494/441
+f 1372/1511/440 424/501/440 1196/1331/440
+f 1372/1511/440 1196/1331/440 1371/1510/440
+f 1371/1510/440 1196/1331/440 423/500/440
+f 648/747/439 416/493/439 1885/2040/439
+f 648/747/439 1885/2040/439 647/746/439
+f 647/746/439 1885/2040/439 415/492/439
+f 751/867/438 408/485/438 1746/1899/438
+f 751/867/438 1746/1899/438 781/900/438
+f 781/900/438 1746/1899/438 423/500/438
+f 851/972/437 400/477/437 1010/1139/437
+f 851/972/437 1010/1139/437 1457/1601/437
+f 1457/1601/437 1010/1139/437 415/492/437
+f 920/1044/436 407/484/436 1194/1329/436
+f 920/1044/436 1194/1329/436 763/880/436
+f 763/880/436 1194/1329/436 422/499/436
+f 750/866/435 428/505/435 1722/1875/435
+f 750/866/435 1722/1875/435 742/855/435
+f 742/855/435 1722/1875/435 413/490/435
+f 1883/2038/434 414/491/434 547/636/434
+f 1883/2038/434 547/636/434 540/627/434
+f 540/627/434 547/636/434 82/86/434
+f 925/1049/433 421/498/433 748/862/433
+f 925/1049/433 748/862/433 858/979/433
+f 858/979/433 748/862/433 420/497/433
+f 1286/1423/432 409/486/432 1109/1241/432
+f 1286/1423/432 1109/1241/432 910/1034/432
+f 910/1034/432 1109/1241/432 408/485/432
+f 707/813/431 386/463/431 542/630/431
+f 707/813/544 542/630/544 861/982/544
+f 861/982/431 542/630/431 401/478/431
+f 1103/1235/430 393/470/430 1598/1745/430
+f 1103/1235/430 1598/1745/430 1677/1827/430
+f 1677/1827/430 1598/1745/430 408/485/430
+f 859/980/429 400/477/429 851/972/429
+f 859/980/429 851/972/429 636/733/429
+f 636/733/429 851/972/429 399/476/429
+f 1385/1525/428 392/469/428 1674/1824/428
+f 1385/1525/428 1674/1824/428 1238/1373/428
+f 1238/1373/428 1674/1824/428 407/484/428
+f 742/856/427 413/490/427 1632/1781/427
+f 742/856/427 1632/1781/427 737/849/427
+f 737/849/427 1632/1781/427 398/475/427
+f 1795/1949/426 399/476/426 540/628/426
+f 1795/1949/426 540/628/426 961/1085/426
+f 961/1085/426 540/628/426 82/87/426
+f 1189/1323/425 406/483/425 1014/1143/425
+f 1189/1323/425 1014/1143/425 1188/1322/425
+f 1188/1322/425 1014/1143/425 405/482/425
+f 612/706/424 398/475/424 1632/1781/424
+f 612/706/424 1632/1781/424 532/619/424
+f 532/619/424 1632/1781/424 413/490/424
+f 788/907/423 405/482/423 741/854/423
+f 788/907/423 741/854/423 1871/2026/423
+f 1871/2026/423 741/854/423 404/481/423
+f 531/618/543 412/489/543 771/889/543
+f 531/618/422 771/889/422 1718/1871/422
+f 1718/1871/422 771/889/422 411/488/422
+f 736/848/421 389/466/421 1228/1363/421
+f 736/848/421 1228/1363/421 1315/1452/421
+f 1315/1452/421 1228/1363/421 404/481/421
+f 1459/1603/420 411/488/420 1288/1425/420
+f 1459/1603/420 1288/1425/420 1139/1271/420
+f 1139/1271/420 1288/1425/420 410/487/420
+f 739/852/419 403/480/419 544/632/419
+f 739/852/419 544/632/419 1313/1450/419
+f 1313/1450/419 544/632/419 402/479/419
+f 1284/1421/418 395/472/418 1083/1214/418
+f 1284/1421/418 1083/1214/418 1159/1292/418
+f 1159/1292/418 1083/1214/418 410/487/418
+f 537/624/417 387/464/417 1745/1898/417
+f 537/624/417 1745/1898/417 1820/1974/417
+f 1820/1974/417 1745/1898/417 402/479/417
+f 618/713/416 390/467/416 1008/1137/416
+f 618/713/416 1008/1137/416 1183/1317/416
+f 1183/1317/416 1008/1137/416 389/466/416
+f 1683/1833/415 382/459/415 1462/1606/415
+f 1683/1833/415 1462/1606/415 1888/2043/415
+f 1888/2043/415 1462/1606/415 397/474/415
+f 800/919/414 374/451/414 706/812/414
+f 800/919/414 706/812/414 1158/1291/414
+f 1158/1291/414 706/812/414 389/466/414
+f 1715/1868/413 396/473/413 1541/1687/413
+f 1715/1868/413 1541/1687/413 1714/1867/413
+f 1714/1867/413 1541/1687/413 395/472/413
+f 1006/1135/412 388/465/412 829/950/412
+f 1006/1135/412 829/950/412 1005/1134/412
+f 1005/1134/412 829/950/412 387/464/412
+f 1469/1613/411 380/457/411 539/626/411
+f 1469/1613/411 539/626/411 1585/1731/411
+f 1585/1731/411 539/626/411 395/472/411
+f 553/642/410 372/449/410 1237/1372/410
+f 553/642/410 1237/1372/410 1676/1826/410
+f 1676/1826/410 1237/1372/410 387/464/410
+f 1539/1685/409 394/471/409 1365/1504/409
+f 1539/1685/409 1365/1504/409 1538/1684/409
+f 1538/1684/409 1365/1504/409 393/470/409
+f 827/948/408 386/463/408 707/813/408
+f 827/948/408 707/813/408 826/947/408
+f 826/947/408 707/813/408 385/462/408
+f 1246/1381/407 378/455/407 1092/1224/407
+f 1246/1381/407 1092/1224/407 1530/1676/407
+f 1530/1676/407 1092/1224/407 393/470/407
+f 627/723/406 370/447/406 1750/1903/406
+f 627/723/406 1750/1903/406 1097/1229/406
+f 1097/1229/406 1750/1903/406 385/462/406
+f 1096/1228/405 377/454/405 1363/1502/405
+f 1096/1228/405 1363/1502/405 1604/1751/405
+f 1604/1751/405 1363/1502/405 392/469/405
+f 737/850/404 398/475/404 1876/2031/404
+f 737/850/404 1876/2031/404 732/843/404
+f 732/843/404 1876/2031/404 383/460/404
+f 787/906/403 384/461/403 961/1086/403
+f 787/906/403 961/1086/403 1193/1327/403
+f 1193/1327/403 961/1086/403 82/88/403
+f 1101/1233/402 391/468/402 915/1039/402
+f 1101/1233/402 915/1039/402 1739/1892/402
+f 1739/1892/402 915/1039/402 390/467/402
+f 1622/1770/401 383/460/401 1876/2031/401
+f 1622/1770/401 1876/2031/401 1629/1777/401
+f 1629/1777/401 1876/2031/401 398/475/401
+f 1166/1299/400 371/448/400 530/617/400
+f 1166/1299/400 530/617/400 1164/1297/400
+f 1164/1297/400 530/617/400 370/447/400
+f 1274/1411/399 363/434/399 937/1061/399
+f 1274/1411/399 937/1061/399 1623/1771/399
+f 1623/1771/399 937/1061/399 378/455/399
+f 524/611/398 355/418/398 821/942/398
+f 524/611/398 821/942/398 1686/1837/398
+f 1686/1837/398 821/942/398 370/447/398
+f 1437/1580/551 362/432/551 1016/1145/551
+f 1437/1580/397 1016/1145/397 1463/1607/397
+f 1463/1607/551 1016/1145/551 377/454/551
+f 732/844/575 383/460/575 866/987/575
+f 732/844/575 866/987/575 725/835/575
+f 725/835/575 866/987/575 368/444/575
+f 528/615/395 369/446/395 1193/1328/395
+f 528/615/395 1193/1328/395 523/608/395
+f 523/608/576 1193/1328/576 82/89/576
+f 1359/1498/552 376/453/552 1181/1315/552
+f 1359/1498/552 1181/1315/552 1358/1497/552
+f 1358/1497/552 1181/1315/552 375/452/552
+f 1418/1559/393 368/444/393 866/987/393
+f 1418/1559/393 866/987/393 1314/1451/393
+f 1314/1451/393 866/987/393 383/460/393
+f 1094/1226/392 375/452/392 909/1033/392
+f 1094/1226/392 909/1033/392 1535/1681/392
+f 1535/1681/392 909/1033/392 374/451/392
+f 1616/1764/391 367/442/391 1872/2027/391
+f 1616/1764/391 1872/2027/391 1392/1532/391
+f 1392/1532/391 1872/2027/391 382/459/391
+f 905/1029/390 359/426/390 538/625/390
+f 905/1029/390 538/625/390 624/720/390
+f 624/720/390 538/625/390 374/451/390
+f 1620/1768/389 381/458/389 1448/1592/389
+f 1620/1768/389 1448/1592/389 1390/1530/389
+f 1390/1530/389 1448/1592/389 380/457/389
+f 907/1031/388 373/450/388 730/841/388
+f 907/1031/388 730/841/388 623/719/388
+f 623/719/388 730/841/388 372/449/388
+f 1444/1588/387 365/438/387 1819/1973/387
+f 1444/1588/387 1819/1973/387 1896/2051/387
+f 1896/2051/387 1819/1973/387 380/457/387
+f 723/833/386 357/422/386 1091/1223/386
+f 723/833/386 1091/1223/386 1167/1300/386
+f 1167/1300/386 1091/1223/386 372/449/386
+f 1894/2049/385 379/456/385 1280/1417/385
+f 1894/2049/385 1280/1417/385 1893/2048/385
+f 1893/2048/385 1280/1417/385 378/455/385
+f 819/940/384 344/406/384 1471/1615/384
+f 819/940/384 1471/1615/384 1895/2050/384
+f 1895/2050/384 1471/1615/384 359/427/384
+f 1236/1371/383 366/441/383 1705/1858/383
+f 1236/1371/383 1705/1858/383 1867/2022/383
+f 1867/2022/383 1705/1858/383 365/439/383
+f 1173/1306/382 358/425/382 996/1125/382
+f 1173/1306/382 996/1125/382 1172/1305/382
+f 1172/1305/382 996/1125/382 357/423/382
+f 1708/1861/381 350/412/381 1319/1456/381
+f 1708/1861/381 1319/1456/381 1751/1904/381
+f 1751/1904/381 1319/1456/381 365/439/381
+f 731/842/380 342/404/380 545/633/380
+f 731/842/380 545/633/380 1017/1146/380
+f 1017/1146/380 545/633/380 357/423/380
+f 1703/1855/379 364/437/379 1528/1674/379
+f 1703/1855/379 1528/1674/379 1702/1854/379
+f 1702/1854/379 1528/1674/379 363/435/379
+f 994/1122/378 356/421/378 1630/1779/378
+f 994/1122/378 1630/1779/378 993/1121/378
+f 993/1121/378 1630/1779/378 355/419/378
+f 1625/1773/377 348/410/377 1826/1980/377
+f 1625/1773/377 1826/1980/377 867/988/377
+f 867/988/377 1826/1980/377 363/435/377
+f 1436/1578/376 340/402/376 721/830/376
+f 1436/1578/376 721/830/376 1537/1683/376
+f 1537/1683/376 721/830/376 355/419/376
+f 1269/1405/375 347/409/375 1526/1671/375
+f 1269/1405/375 1526/1671/375 944/1068/375
+f 944/1068/375 1526/1671/375 362/433/375
+f 725/836/374 368/445/374 625/721/374
+f 725/836/577 625/721/577 719/827/577
+f 719/827/374 625/721/374 353/415/374
+f 1536/1682/373 354/417/373 523/609/373
+f 1536/1682/578 523/609/578 520/604/578
+f 520/604/373 523/609/373 82/90/373
+f 1272/1408/372 361/431/372 1090/1222/372
+f 1272/1408/372 1090/1222/372 943/1067/372
+f 943/1067/372 1090/1222/372 360/429/372
+f 1785/1939/371 353/415/371 625/721/371
+f 1785/1939/371 625/721/371 794/913/371
+f 794/913/371 625/721/371 368/445/371
+f 1391/1531/370 360/429/370 1175/1309/370
+f 1391/1531/370 1175/1309/370 1353/1492/370
+f 1353/1492/370 1175/1309/370 359/427/370
+f 1018/1147/369 352/414/369 1788/1942/369
+f 1018/1147/369 1788/1942/369 1239/1374/369
+f 1239/1374/369 1788/1942/369 367/443/369
+f 711/818/368 325/387/368 989/1117/368
+f 711/818/368 989/1117/368 1026/1155/368
+f 1026/1155/368 989/1117/368 340/402/368
+f 1240/1375/367 332/394/367 1756/1909/367
+f 1240/1375/579 1756/1909/579 1522/1667/579
+f 1522/1667/367 1756/1909/367 347/409/367
+f 719/828/366 353/415/366 1610/1757/366
+f 719/828/366 1610/1757/366 978/1103/366
+f 978/1103/366 1610/1757/366 338/400/366
+f 1024/1153/365 339/401/365 520/605/365
+f 1024/1153/365 520/605/365 513/595/365
+f 513/595/365 520/605/365 82/91/365
+f 1521/1666/364 346/408/364 1919/2074/364
+f 1521/1666/364 1919/2074/364 1520/1665/364
+f 1520/1665/364 1919/2074/364 345/407/364
+f 616/710/363 338/400/363 1610/1757/363
+f 616/710/363 1610/1757/363 620/715/363
+f 620/715/363 1610/1757/363 353/415/363
+f 873/994/362 345/407/362 1082/1213/362
+f 873/994/362 1082/1213/362 872/993/362
+f 872/993/362 1082/1213/362 344/406/362
+f 1781/1935/361 337/399/361 619/714/361
+f 1781/1935/361 619/714/361 713/820/361
+f 713/820/361 619/714/361 352/414/361
+f 1075/1205/360 329/391/360 1349/1488/360
+f 1075/1205/360 1349/1488/360 1400/1540/360
+f 1400/1540/360 1349/1488/360 344/406/360
+f 712/819/359 351/413/359 1608/1755/359
+f 712/819/359 1608/1755/359 1782/1936/359
+f 1782/1936/359 1608/1755/359 350/412/359
+f 1398/1538/358 343/405/358 900/1023/358
+f 1398/1538/358 900/1023/358 1397/1537/358
+f 1397/1537/358 900/1023/358 342/404/358
+f 1603/1750/357 335/397/357 1165/1298/357
+f 1603/1750/357 1165/1298/357 1251/1387/357
+f 1251/1387/357 1165/1298/357 350/412/357
+f 896/1018/356 327/389/356 1168/1301/356
+f 896/1018/356 1168/1301/356 1903/2058/356
+f 1903/2058/356 1168/1301/356 342/404/356
+f 1249/1384/355 349/411/355 1440/1583/355
+f 1249/1384/355 1440/1583/355 1332/1470/355
+f 1332/1470/355 1440/1583/355 348/410/355
+f 1624/1772/354 326/388/354 1901/2056/354
+f 1624/1772/354 1901/2056/354 990/1118/354
+f 990/1118/354 1901/2056/354 341/403/354
+f 1435/1577/353 333/395/353 1684/1834/353
+f 1435/1577/353 1684/1834/353 1758/1911/353
+f 1758/1911/353 1684/1834/353 348/410/353
+f 614/708/352 336/398/352 1860/2015/352
+f 614/708/352 1860/2015/352 613/707/352
+f 613/707/352 1860/2015/352 335/397/352
+f 1070/1200/351 313/375/351 1248/1383/351
+f 1070/1200/351 1248/1383/351 1326/1464/351
+f 1326/1464/351 1248/1383/351 328/390/351
+f 1863/2018/350 320/382/350 630/726/350
+f 1863/2018/350 630/726/350 1098/1230/350
+f 1098/1230/350 630/726/350 335/397/350
+f 987/1114/349 312/374/349 1325/1463/349
+f 987/1114/349 1325/1463/349 1757/1910/349
+f 1757/1910/349 1325/1463/349 327/389/349
+f 1858/2013/348 334/396/348 1654/1803/348
+f 1858/2013/348 1654/1803/348 1857/2012/348
+f 1857/2012/348 1654/1803/348 333/395/348
+f 1805/1959/542 311/373/542 1755/1908/542
+f 1805/1959/542 1755/1908/542 1241/1376/542
+f 1241/1376/347 1755/1908/347 326/388/347
+f 1648/1797/346 318/380/346 1601/1748/346
+f 1648/1797/346 1601/1748/346 1611/1758/346
+f 1611/1758/346 1601/1748/346 333/395/346
+f 842/963/345 310/372/345 1830/1984/345
+f 842/963/345 1830/1984/345 874/995/345
+f 874/995/345 1830/1984/345 325/387/345
+f 1660/1809/344 317/379/344 1609/1756/344
+f 1660/1809/344 1609/1756/344 1693/1844/344
+f 1693/1844/344 1609/1756/344 332/394/344
+f 978/1104/343 338/400/343 1470/1614/343
+f 978/1104/343 1470/1614/343 709/815/343
+f 709/815/343 1470/1614/343 323/385/343
+f 983/1110/342 324/386/342 513/596/342
+f 983/1110/342 513/596/342 507/588/342
+f 507/588/342 513/596/342 82/92/342
+f 1691/1842/341 331/393/341 1262/1398/341
+f 1691/1842/341 1262/1398/341 1690/1841/341
+f 1690/1841/341 1262/1398/341 330/392/341
+f 1518/1663/340 323/385/340 1470/1614/340
+f 1518/1663/340 1470/1614/340 519/603/340
+f 519/603/340 1470/1614/340 338/400/340
+f 1514/1659/339 330/392/339 1345/1484/339
+f 1514/1659/339 1345/1484/339 1513/1658/339
+f 1513/1658/339 1345/1484/339 329/391/339
+f 1835/1989/338 322/384/338 1544/1690/338
+f 1835/1989/580 1544/1690/580 546/634/580
+f 546/634/338 1544/1690/338 337/399/338
+f 1207/1342/337 314/376/337 1260/1396/337
+f 1207/1342/337 1260/1396/337 1347/1486/337
+f 1347/1486/337 1260/1396/337 329/391/337
+f 1423/1564/336 301/332/336 1545/1691/336
+f 1423/1564/336 1545/1691/336 1430/1572/336
+f 1430/1572/336 1545/1691/336 317/379/336
+f 709/816/335 323/385/335 1399/1539/335
+f 709/816/335 1399/1539/335 515/598/335
+f 515/598/335 1399/1539/335 307/338/335
+f 801/920/334 309/371/334 507/589/334
+f 801/920/334 507/589/334 500/579/334
+f 500/579/334 507/589/334 82/93/334
+f 1618/1766/333 316/378/333 685/790/333
+f 1618/1766/333 685/790/333 1428/1570/333
+f 1428/1570/333 685/790/333 315/377/333
+f 505/585/332 307/338/332 1399/1539/332
+f 505/585/332 1399/1539/332 512/594/332
+f 512/594/332 1399/1539/332 323/385/332
+f 631/727/331 315/377/331 1255/1391/331
+f 631/727/331 1255/1391/331 629/725/331
+f 629/725/331 1255/1391/331 314/376/331
+f 1874/2029/330 306/337/330 1478/1622/330
+f 1874/2029/330 1478/1622/330 1864/2019/330
+f 1864/2019/330 1478/1622/330 322/384/330
+f 844/965/329 298/329/329 718/826/329
+f 844/965/329 718/826/329 1341/1480/329
+f 1341/1480/329 718/826/329 314/376/329
+f 1902/2057/328 321/383/328 1777/1931/328
+f 1902/2057/328 1777/1931/328 606/700/328
+f 606/700/328 1777/1931/328 320/382/328
+f 1171/1304/327 313/375/327 1070/1200/327
+f 1171/1304/327 1070/1200/327 1339/1478/327
+f 1339/1478/327 1070/1200/327 312/374/327
+f 1849/2003/326 304/335/326 555/645/326
+f 1849/2003/326 555/645/326 1647/1796/326
+f 1647/1796/326 555/645/326 320/382/326
+f 605/699/325 296/327/325 1069/1199/325
+f 605/699/325 1069/1199/325 764/881/325
+f 764/881/325 1069/1199/325 312/374/325
+f 1025/1154/324 319/381/324 1597/1744/324
+f 1025/1154/324 1597/1744/324 1853/2008/324
+f 1853/2008/324 1597/1744/324 318/380/324
+f 888/1010/323 295/326/323 1692/1843/323
+f 888/1010/323 1692/1843/323 892/1014/323
+f 892/1014/323 1692/1843/323 311/373/323
+f 1298/1435/322 302/333/322 1104/1236/322
+f 1298/1435/322 1104/1236/322 1688/1839/322
+f 1688/1839/322 1104/1236/322 318/380/322
+f 1807/1961/321 294/325/321 1765/1918/321
+f 1807/1961/581 1765/1918/581 514/597/581
+f 514/597/321 1765/1918/321 310/372/321
+f 638/735/320 297/328/320 1065/1194/320
+f 638/735/320 1065/1194/320 637/734/320
+f 637/734/320 1065/1194/320 296/327/320
+f 1762/1915/319 289/320/319 1829/1983/319
+f 1762/1915/319 1829/1983/319 1910/2065/319
+f 1910/2065/319 1829/1983/319 304/335/319
+f 1061/1190/318 281/312/318 1333/1471/318
+f 1061/1190/318 1333/1471/318 1011/1140/318
+f 1011/1140/318 1333/1471/318 296/327/318
+f 1768/1921/317 303/334/317 1589/1735/317
+f 1768/1921/317 1589/1735/317 1908/2063/317
+f 1908/2063/317 1589/1735/317 302/333/317
+f 1673/1823/316 280/311/316 1178/1312/316
+f 1673/1823/316 1178/1312/316 1617/1765/316
+f 1617/1765/316 1178/1312/316 295/326/316
+f 1584/1730/315 287/318/315 949/1073/315
+f 1584/1730/315 949/1073/315 1032/1161/315
+f 1032/1161/315 949/1073/315 302/333/315
+f 884/1006/314 279/310/314 1148/1280/314
+f 884/1006/314 1148/1280/314 1698/1849/314
+f 1698/1849/314 1148/1280/314 294/325/314
+f 1446/1590/313 286/317/313 1587/1733/313
+f 1446/1590/313 1587/1733/313 1477/1621/313
+f 1477/1621/313 1587/1733/313 301/332/313
+f 515/599/312 307/338/312 878/999/312
+f 515/599/312 878/999/312 881/1002/312
+f 881/1002/312 878/999/312 292/323/312
+f 886/1008/311 293/324/311 500/580/311
+f 886/1008/311 500/580/311 493/571/311
+f 493/571/311 500/580/311 82/94/311
+f 1476/1620/310 300/331/310 1071/1201/310
+f 1476/1620/310 1071/1201/310 1678/1828/310
+f 1678/1828/310 1071/1201/310 299/330/310
+f 878/999/309 307/338/309 505/585/309
+f 878/999/309 505/585/309 877/998/309
+f 877/998/309 505/585/309 306/337/309
+f 1552/1698/308 299/330/308 1245/1380/308
+f 1552/1698/308 1245/1380/308 1551/1697/308
+f 1551/1697/308 1245/1380/308 298/329/308
+f 499/578/307 291/322/307 803/922/307
+f 499/578/307 803/922/307 1405/1545/307
+f 1405/1545/307 803/922/307 306/337/307
+f 1235/1370/306 283/314/306 1504/1648/306
+f 1235/1370/306 1504/1648/306 1231/1366/306
+f 1231/1366/306 1504/1648/306 298/329/306
+f 503/583/305 305/336/305 1770/1923/305
+f 503/583/305 1770/1923/305 1404/1544/305
+f 1404/1544/305 1770/1923/305 304/335/305
+f 881/1003/304 292/323/304 974/1099/304
+f 881/1003/304 974/1099/304 749/863/304
+f 749/863/304 974/1099/304 277/308/304
+f 1143/1275/303 278/309/303 493/572/303
+f 1143/1275/303 493/572/303 486/563/303
+f 486/563/303 493/572/303 82/95/303
+f 957/1081/582 285/316/582 1417/1557/582
+f 957/1081/302 1417/1557/302 956/1080/302
+f 956/1080/302 1417/1557/302 284/315/302
+f 974/1099/583 292/323/583 1593/1740/583
+f 974/1099/301 1593/1740/301 973/1098/301
+f 973/1098/301 1593/1740/301 291/322/301
+f 1668/1817/300 284/315/300 1502/1646/300
+f 1668/1817/300 1502/1646/300 1667/1816/300
+f 1667/1816/300 1502/1646/300 283/314/300
+f 792/911/541 276/307/541 699/804/541
+f 792/911/541 699/804/541 1257/1393/541
+f 1257/1393/299 699/804/299 291/322/299
+f 1497/1641/298 268/299/298 1484/1628/298
+f 1497/1641/298 1484/1628/298 1909/2064/298
+f 1909/2064/298 1484/1628/298 283/314/298
+f 1256/1392/297 290/321/297 597/690/297
+f 1256/1392/297 597/690/297 795/914/297
+f 795/914/297 597/690/297 289/320/297
+f 1500/1644/296 282/313/296 1073/1203/296
+f 1500/1644/296 1073/1203/296 1499/1643/296
+f 1499/1643/296 1073/1203/296 281/312/296
+f 592/685/295 274/305/295 1331/1469/295
+f 592/685/295 1331/1469/295 1764/1917/295
+f 1764/1917/295 1331/1469/295 289/320/295
+f 1543/1689/294 266/297/294 561/651/294
+f 1543/1689/294 561/651/294 1031/1160/294
+f 1031/1160/294 561/651/294 281/312/294
+f 595/688/293 288/319/293 918/1042/293
+f 595/688/293 918/1042/293 594/687/293
+f 594/687/293 918/1042/293 287/318/293
+f 1057/1186/540 265/296/540 1327/1465/540
+f 1057/1186/292 1327/1465/292 1112/1244/292
+f 1112/1244/292 1327/1465/292 280/311/292
+f 1840/1994/291 272/303/291 1834/1988/291
+f 1840/1994/291 1834/1988/291 916/1040/291
+f 916/1040/291 1834/1988/291 287/318/291
+f 1111/1243/290 279/310/290 884/1006/290
+f 1111/1243/290 884/1006/290 609/703/290
+f 609/703/290 884/1006/290 278/309/290
+f 1579/1725/289 271/302/289 1843/1997/289
+f 1579/1725/289 1843/1997/289 1583/1729/289
+f 1583/1729/289 1843/1997/289 286/317/289
+f 484/561/288 259/290/288 791/910/288
+f 484/561/288 791/910/288 1265/1401/288
+f 1265/1401/288 791/910/288 274/305/288
+f 1408/1548/287 251/282/287 1496/1640/287
+f 1408/1548/287 1496/1640/287 1914/2069/287
+f 1914/2069/287 1496/1640/287 266/297/287
+f 490/568/286 273/304/286 1754/1907/286
+f 490/568/286 1754/1907/286 489/567/286
+f 489/567/286 1754/1907/286 272/303/286
+f 1318/1455/285 250/281/285 1225/1360/285
+f 1318/1455/285 1225/1360/285 1322/1459/285
+f 1322/1459/285 1225/1360/285 265/296/285
+f 1749/1902/284 257/288/284 591/684/284
+f 1749/1902/284 591/684/284 1177/1311/284
+f 1177/1311/284 591/684/284 272/303/284
+f 1321/1458/283 264/295/283 1141/1273/283
+f 1321/1458/283 1141/1273/283 1320/1457/283
+f 1320/1457/283 1141/1273/283 263/294/283
+f 1833/1987/282 256/287/282 1752/1905/282
+f 1833/1987/282 1752/1905/282 1839/1993/282
+f 1839/1993/282 1752/1905/282 271/302/282
+f 749/864/281 277/308/281 883/1005/281
+f 749/864/281 883/1005/281 1672/1821/281
+f 1672/1821/281 883/1005/281 262/293/281
+f 1055/1184/280 263/294/280 486/564/280
+f 1055/1184/280 486/564/280 684/788/280
+f 684/788/280 486/564/280 82/96/280
+f 1838/1992/279 270/301/279 1663/1812/279
+f 1838/1992/279 1663/1812/279 1837/1991/279
+f 1837/1991/279 1663/1812/279 269/300/279
+f 965/1090/278 262/293/278 883/1005/278
+f 965/1090/278 883/1005/278 969/1094/278
+f 969/1094/278 883/1005/278 277/308/278
+f 1577/1723/277 269/300/277 1413/1553/277
+f 1577/1723/277 1413/1553/277 1576/1722/277
+f 1576/1722/277 1413/1553/277 268/299/277
+f 688/793/276 261/292/276 968/1093/276
+f 688/793/276 968/1093/276 694/799/276
+f 694/799/276 968/1093/276 276/307/276
+f 1575/1721/275 253/284/275 1662/1811/275
+f 1575/1721/275 1662/1811/275 1409/1549/275
+f 1409/1549/275 1662/1811/275 268/299/275
+f 693/798/274 275/306/274 492/570/274
+f 693/798/274 492/570/274 692/797/274
+f 692/797/274 492/570/274 274/305/274
+f 1411/1551/273 267/298/273 1227/1362/273
+f 1411/1551/273 1227/1362/273 1410/1550/273
+f 1410/1550/273 1227/1362/273 266/297/273
+f 1921/2076/272 255/286/272 1748/1901/272
+f 1921/2076/539 1748/1901/539 1920/2075/539
+f 1920/2075/272 1748/1901/272 254/285/272
+f 1052/1181/271 247/278/271 1140/1272/271
+f 1052/1181/271 1140/1272/271 876/997/271
+f 876/997/271 1140/1272/271 262/293/271
+f 1832/1986/270 254/285/270 1659/1808/270
+f 1832/1986/270 1659/1808/270 1831/1985/270
+f 1831/1985/270 1659/1808/270 253/284/270
+f 959/1083/269 246/277/269 875/996/269
+f 959/1083/269 875/996/269 964/1089/269
+f 964/1089/269 875/996/269 261/292/269
+f 1655/1804/268 238/269/268 1747/1900/268
+f 1655/1804/268 1747/1900/268 1658/1807/268
+f 1658/1807/268 1747/1900/268 253/284/268
+f 963/1088/267 260/291/267 785/904/267
+f 963/1088/267 785/904/267 962/1087/267
+f 962/1087/267 785/904/267 259/290/267
+f 1657/1806/266 252/283/266 1495/1639/266
+f 1657/1806/266 1495/1639/266 1656/1805/266
+f 1656/1805/266 1495/1639/266 251/282/266
+f 780/899/265 244/275/265 686/791/265
+f 780/899/265 686/791/265 784/903/265
+f 784/903/265 686/791/265 259/290/265
+f 1491/1635/264 236/267/264 1574/1720/264
+f 1491/1635/264 1574/1720/264 1494/1638/264
+f 1494/1638/264 1574/1720/264 251/282/264
+f 783/902/263 258/289/263 588/681/263
+f 783/902/263 588/681/263 782/901/263
+f 782/901/263 588/681/263 257/288/263
+f 1403/1543/262 235/266/262 1493/1637/262
+f 1403/1543/262 1493/1637/262 1407/1547/262
+f 1407/1547/262 1493/1637/262 250/281/262
+f 585/678/261 242/273/261 483/560/261
+f 585/678/261 483/560/261 587/680/261
+f 587/680/261 483/560/261 257/288/261
+f 1312/1449/260 234/265/260 1406/1546/260
+f 1312/1449/260 1406/1546/260 1317/1454/260
+f 1317/1454/260 1406/1546/260 249/280/260
+f 1917/2072/259 241/272/259 586/679/259
+f 1917/2072/259 586/679/259 1922/2077/259
+f 1922/2077/259 586/679/259 256/287/259
+f 1672/1822/258 262/293/258 1140/1272/258
+f 1672/1822/258 1140/1272/258 1154/1286/258
+f 1154/1286/258 1140/1272/258 247/278/258
+f 1316/1453/257 248/279/257 684/789/257
+f 1316/1453/257 684/789/257 680/783/257
+f 680/783/257 684/789/257 82/97/257
+f 702/807/256 221/252/256 1653/1802/256
+f 702/807/256 1653/1802/256 1571/1717/256
+f 1571/1717/256 1653/1802/256 236/267/256
+f 869/990/255 243/274/255 683/787/255
+f 869/990/255 683/787/255 868/989/255
+f 868/989/255 683/787/255 242/273/255
+f 1570/1716/254 235/266/254 1403/1543/254
+f 1570/1716/254 1403/1543/254 1569/1715/254
+f 1569/1715/254 1403/1543/254 234/265/254
+f 679/782/253 227/258/253 779/898/253
+f 679/782/253 779/898/253 682/786/253
+f 682/786/253 779/898/253 242/273/253
+f 1395/1535/252 219/250/252 1490/1634/252
+f 1395/1535/252 1490/1634/252 1402/1542/252
+f 1402/1542/252 1490/1634/252 234/265/252
+f 581/674/537 226/257/537 681/785/537
+f 581/674/537 681/785/537 584/677/537
+f 584/677/537 681/785/537 241/272/537
+f 1154/1287/250 247/278/250 1220/1355/250
+f 1154/1287/250 1220/1355/250 1066/1195/250
+f 1066/1195/250 1220/1355/250 232/263/250
+f 1401/1541/249 233/264/249 680/784/249
+f 1401/1541/249 680/784/249 671/773/249
+f 671/773/249 680/784/249 82/98/249
+f 583/676/248 240/271/248 1828/1982/248
+f 583/676/248 1828/1982/248 582/675/248
+f 582/675/248 1828/1982/248 239/270/248
+f 1220/1355/247 247/278/247 1052/1181/247
+f 1220/1355/247 1052/1181/247 1219/1354/247
+f 1219/1354/247 1052/1181/247 246/277/247
+f 1916/2071/246 239/270/246 1744/1897/246
+f 1916/2071/246 1744/1897/246 1915/2070/246
+f 1915/2070/246 1744/1897/246 238/269/246
+f 1047/1176/245 231/262/245 1138/1270/245
+f 1047/1176/245 1138/1270/245 1051/1180/245
+f 1051/1180/245 1138/1270/245 246/277/245
+f 1737/1890/244 223/254/244 1827/1981/244
+f 1737/1890/244 1827/1981/244 1743/1896/244
+f 1743/1896/244 1827/1981/244 238/269/244
+f 1050/1179/243 245/276/243 871/992/243
+f 1050/1179/243 871/992/243 1049/1178/243
+f 1049/1178/243 871/992/243 244/275/243
+f 1742/1895/242 237/268/242 1572/1718/242
+f 1742/1895/242 1572/1718/242 1741/1894/242
+f 1741/1894/242 1572/1718/242 236/267/242
+f 865/986/241 229/260/241 958/1082/241
+f 865/986/241 958/1082/241 870/991/241
+f 870/991/241 958/1082/241 244/275/241
+f 580/673/240 224/255/240 1824/1978/240
+f 580/673/240 1824/1978/240 1489/1633/240
+f 1489/1633/240 1824/1978/240 223/254/240
+f 1128/1260/239 216/247/239 1217/1352/239
+f 1128/1260/239 1217/1352/239 1135/1267/239
+f 1135/1267/239 1217/1352/239 231/262/239
+f 1817/1971/238 208/239/238 1911/2066/238
+f 1817/1971/238 1911/2066/238 1823/1977/238
+f 1823/1977/238 1911/2066/238 223/254/238
+f 1134/1266/237 230/261/237 955/1079/237
+f 1134/1266/237 955/1079/237 1133/1265/237
+f 1133/1265/237 955/1079/237 229/260/237
+f 569/660/236 222/253/236 1651/1800/236
+f 569/660/236 1651/1800/236 1821/1975/236
+f 1821/1975/236 1651/1800/236 221/252/236
+f 947/1071/235 214/245/235 1046/1175/235
+f 947/1071/235 1046/1175/235 954/1078/235
+f 954/1078/235 1046/1175/235 229/260/235
+f 1645/1794/234 206/237/234 1736/1889/234
+f 1645/1794/234 1736/1889/234 1650/1799/234
+f 1650/1799/234 1736/1889/234 221/252/234
+f 953/1077/233 228/259/233 777/896/233
+f 953/1077/233 777/896/233 952/1076/233
+f 952/1076/233 777/896/233 227/258/233
+f 1563/1709/232 205/236/232 1649/1798/232
+f 1563/1709/232 1649/1798/232 1567/1713/232
+f 1567/1713/232 1649/1798/232 220/251/232
+f 768/885/231 212/243/231 864/985/231
+f 768/885/231 864/985/231 776/895/231
+f 776/895/231 864/985/231 227/258/231
+f 1481/1625/230 204/235/230 1566/1712/230
+f 1481/1625/230 1566/1712/230 1486/1630/230
+f 1486/1630/230 1566/1712/230 219/250/230
+f 670/772/229 211/242/229 960/1084/229
+f 670/772/229 960/1084/229 1918/2073/229
+f 1918/2073/229 960/1084/229 226/257/229
+f 1066/1196/228 232/263/228 1311/1448/228
+f 1066/1196/228 1311/1448/228 1338/1476/228
+f 1338/1476/228 1311/1448/228 217/248/228
+f 1485/1629/227 218/249/227 671/774/227
+f 1485/1629/227 671/774/227 664/765/227
+f 664/765/227 671/774/227 82/99/227
+f 677/780/226 225/256/226 1913/2068/226
+f 677/780/226 1913/2068/226 676/779/226
+f 676/779/226 1913/2068/226 224/255/226
+f 1211/1346/225 217/248/225 1311/1448/225
+f 1211/1346/584 1311/1448/584 1218/1353/584
+f 1218/1353/225 1311/1448/225 232/263/225
+f 1640/1789/224 190/221/224 1732/1885/224
+f 1640/1789/224 1732/1885/224 1644/1793/224
+f 1644/1793/224 1732/1885/224 205/236/224
+f 849/970/223 197/228/223 945/1069/223
+f 849/970/223 945/1069/223 856/977/223
+f 856/977/223 945/1069/223 212/243/223
+f 1559/1705/222 189/220/222 1643/1792/222
+f 1559/1705/222 1643/1792/222 1562/1708/222
+f 1562/1708/222 1643/1792/222 204/235/222
+f 761/878/221 196/227/221 855/976/221
+f 761/878/221 855/976/221 767/884/221
+f 767/884/221 855/976/221 211/242/221
+f 1338/1477/220 217/248/220 1394/1534/220
+f 1338/1477/220 1394/1534/220 1250/1385/220
+f 1250/1385/220 1394/1534/220 202/233/220
+f 1561/1707/219 203/234/219 664/766/219
+f 1561/1707/219 664/766/219 658/758/219
+f 658/758/219 664/766/219 82/100/219
+f 766/883/218 210/241/218 574/666/218
+f 766/883/218 574/666/218 765/882/218
+f 765/882/218 574/666/218 209/240/218
+f 1302/1439/535 202/233/535 1394/1534/535
+f 1302/1439/217 1394/1534/217 1304/1441/217
+f 1304/1441/535 1394/1534/535 217/248/535
+f 668/770/216 209/240/216 1907/2062/216
+f 668/770/216 1907/2062/216 667/769/216
+f 667/769/216 1907/2062/216 208/239/216
+f 1206/1341/534 201/232/534 1303/1440/534
+f 1206/1341/534 1303/1440/534 1210/1345/534
+f 1210/1345/215 1303/1440/215 216/247/215
+f 1900/2055/214 193/224/214 572/664/214
+f 1900/2055/214 572/664/214 1906/2061/214
+f 1906/2061/214 572/664/214 208/239/214
+f 1209/1344/213 215/246/213 1041/1170/213
+f 1209/1344/213 1041/1170/213 1208/1343/213
+f 1208/1343/213 1041/1170/213 214/245/213
+f 1905/2060/212 207/238/212 1734/1887/212
+f 1905/2060/212 1734/1887/212 1904/2059/212
+f 1904/2059/212 1734/1887/212 206/237/212
+f 1035/1164/211 199/230/211 1126/1258/211
+f 1035/1164/211 1126/1258/211 1040/1169/211
+f 1040/1169/211 1126/1258/211 214/245/211
+f 1729/1882/210 191/222/210 1815/1969/210
+f 1729/1882/210 1815/1969/210 1733/1886/210
+f 1733/1886/210 1815/1969/210 206/237/210
+f 1039/1168/209 213/244/209 857/978/209
+f 1039/1168/209 857/978/209 1038/1167/209
+f 1038/1167/209 857/978/209 212/243/209
+f 1296/1433/208 186/217/208 1388/1528/208
+f 1296/1433/208 1388/1528/208 1301/1438/208
+f 1301/1438/208 1388/1528/208 201/232/208
+f 558/648/207 178/209/207 661/762/207
+f 558/648/207 661/762/207 565/656/207
+f 565/656/207 661/762/207 193/224/207
+f 1300/1437/206 200/231/206 1124/1256/206
+f 1300/1437/206 1124/1256/206 1299/1436/206
+f 1299/1436/206 1124/1256/206 199/230/206
+f 564/655/205 192/223/205 1811/1965/205
+f 564/655/205 1811/1965/205 563/654/205
+f 563/654/205 1811/1965/205 191/222/205
+f 1119/1251/204 184/215/204 1204/1339/204
+f 1119/1251/204 1204/1339/204 1123/1255/204
+f 1123/1255/204 1204/1339/204 199/230/204
+f 1804/1958/203 176/207/203 1898/2053/203
+f 1804/1958/203 1898/2053/203 1810/1964/203
+f 1810/1964/203 1898/2053/203 191/222/203
+f 1122/1254/202 198/229/202 941/1065/202
+f 1122/1254/202 941/1065/202 1121/1253/202
+f 1121/1253/202 941/1065/202 197/228/202
+f 1809/1963/201 190/221/201 1640/1789/201
+f 1809/1963/201 1640/1789/201 1808/1962/201
+f 1808/1962/201 1640/1789/201 189/220/201
+f 934/1058/200 182/213/200 1033/1162/200
+f 934/1058/200 1033/1162/200 940/1064/200
+f 940/1064/200 1033/1162/200 197/228/200
+f 1727/1880/199 189/220/199 1559/1705/199
+f 1727/1880/199 1559/1705/199 1726/1879/199
+f 1726/1879/533 1559/1705/533 188/219/533
+f 843/964/198 181/212/198 939/1063/198
+f 843/964/198 939/1063/198 848/969/198
+f 848/969/198 939/1063/198 196/227/198
+f 1250/1386/197 202/233/197 1479/1623/197
+f 1250/1386/197 1479/1623/197 1508/1652/197
+f 1508/1652/197 1479/1623/197 187/218/197
+f 1638/1787/196 188/219/196 658/759/196
+f 1638/1787/196 658/759/196 652/751/196
+f 652/751/196 658/759/196 82/101/196
+f 847/968/195 195/226/195 663/764/195
+f 847/968/195 663/764/195 846/967/195
+f 846/967/195 663/764/195 194/225/195
+f 1382/1521/532 187/218/532 1479/1623/532
+f 1382/1521/532 1479/1623/532 1389/1529/532
+f 1389/1529/532 1479/1623/532 202/233/532
+f 759/876/193 194/225/193 566/657/193
+f 759/876/193 566/657/193 758/875/193
+f 758/875/193 566/657/193 193/224/193
+f 1023/1152/192 167/198/192 1117/1249/192
+f 1023/1152/192 1117/1249/192 1029/1158/192
+f 1029/1158/192 1117/1249/192 182/213/192
+f 1721/1874/191 159/190/191 1802/1956/191
+f 1721/1874/191 1802/1956/191 1724/1877/191
+f 1724/1877/191 1802/1956/191 174/205/191
+f 926/1050/190 166/197/190 1028/1157/190
+f 926/1050/190 1028/1157/190 933/1057/190
+f 933/1057/190 1028/1157/190 181/212/190
+f 1508/1653/189 187/218/189 1558/1704/189
+f 1508/1653/189 1558/1704/189 1424/1565/189
+f 1424/1565/189 1558/1704/189 172/203/189
+f 1723/1876/188 173/204/188 652/752/188
+f 1723/1876/188 652/752/188 646/744/188
+f 646/744/188 652/752/188 82/102/188
+f 932/1056/187 180/211/187 754/870/187
+f 932/1056/187 754/870/187 931/1055/187
+f 931/1055/187 754/870/187 179/210/187
+f 1558/1704/186 187/218/186 1382/1521/186
+f 1558/1704/531 1382/1521/531 1557/1703/531
+f 1557/1703/531 1382/1521/531 186/217/531
+f 841/962/185 179/210/185 657/757/185
+f 841/962/185 657/757/185 840/961/185
+f 840/961/185 657/757/185 178/209/185
+f 1473/1617/184 186/217/184 1296/1433/184
+f 1473/1617/184 1296/1433/184 1472/1616/184
+f 1472/1616/184 1296/1433/184 185/216/184
+f 651/750/183 163/194/183 752/868/183
+f 651/750/183 752/868/183 656/756/183
+f 656/756/183 752/868/183 178/209/183
+f 1292/1429/182 170/201/182 1380/1519/182
+f 1292/1429/182 1380/1519/182 1295/1432/182
+f 1295/1432/182 1380/1519/182 185/216/182
+f 655/755/181 177/208/181 1892/2047/181
+f 655/755/181 1892/2047/181 654/754/181
+f 654/754/181 1892/2047/181 176/207/181
+f 1197/1332/180 169/200/180 1294/1431/180
+f 1197/1332/180 1294/1431/180 1200/1335/180
+f 1200/1335/180 1294/1431/180 184/215/180
+f 1886/2041/179 161/192/179 556/646/179
+f 1886/2041/179 556/646/179 1891/2046/179
+f 1891/2046/179 556/646/179 176/207/179
+f 1199/1334/178 183/214/178 1030/1159/178
+f 1199/1334/178 1030/1159/178 1198/1333/178
+f 1198/1333/178 1030/1159/178 182/213/178
+f 1800/1954/177 160/191/177 1890/2045/177
+f 1800/1954/177 1890/2045/177 1803/1957/177
+f 1803/1957/177 1890/2045/177 175/206/177
+f 740/853/176 148/179/176 837/958/176
+f 740/853/176 837/958/176 746/860/176
+f 746/860/176 837/958/176 163/194/176
+f 1465/1609/175 170/201/175 1292/1429/175
+f 1465/1609/175 1292/1429/175 1464/1608/175
+f 1464/1608/175 1292/1429/175 169/200/175
+f 745/859/174 162/193/174 551/640/174
+f 745/859/174 551/640/174 744/858/174
+f 744/858/174 551/640/174 161/192/174
+f 1287/1424/173 154/185/173 1373/1512/173
+f 1287/1424/173 1373/1512/173 1291/1428/173
+f 1291/1428/173 1373/1512/173 169/200/173
+f 543/631/172 146/177/172 649/748/172
+f 543/631/172 649/748/172 550/639/172
+f 550/639/172 649/748/172 161/192/172
+f 1290/1427/171 168/199/171 1115/1247/171
+f 1290/1427/171 1115/1247/171 1289/1426/171
+f 1289/1426/171 1115/1247/171 167/198/171
+f 549/638/170 160/191/170 1800/1954/170
+f 549/638/559 1800/1954/559 548/637/559
+f 548/637/170 1800/1954/170 159/190/170
+f 1108/1240/169 152/183/169 1195/1330/169
+f 1108/1240/169 1195/1330/169 1114/1246/169
+f 1114/1246/169 1195/1330/169 167/198/169
+f 1796/1950/168 144/175/168 1884/2039/168
+f 1796/1950/168 1884/2039/168 1799/1953/168
+f 1799/1953/168 1884/2039/168 159/190/168
+f 1015/1144/167 151/182/167 1113/1245/167
+f 1015/1144/167 1113/1245/167 1022/1151/167
+f 1022/1151/585 1113/1245/585 166/197/585
+f 1424/1566/166 172/203/166 1634/1783/166
+f 1424/1566/166 1634/1783/166 1685/1835/166
+f 1685/1835/166 1634/1783/166 157/188/166
+f 1798/1952/165 158/189/165 646/745/165
+f 1798/1952/165 646/745/165 640/737/165
+f 640/737/165 646/745/165 82/103/165
+f 1021/1150/164 165/196/164 839/960/164
+f 1021/1150/164 839/960/164 1020/1149/164
+f 1020/1149/164 839/960/164 164/195/164
+f 1549/1695/163 157/188/163 1634/1783/163
+f 1549/1695/586 1634/1783/586 1556/1702/586
+f 1556/1702/163 1634/1783/163 172/203/163
+f 924/1048/162 164/195/162 747/861/162
+f 924/1048/162 747/861/162 923/1047/162
+f 923/1047/162 747/861/162 163/194/162
+f 1460/1604/562 156/187/562 1555/1701/562
+f 1460/1604/161 1555/1701/161 1466/1610/161
+f 1466/1610/562 1555/1701/562 171/202/562
+f 1875/2030/160 129/160/160 541/629/160
+f 1875/2030/160 541/629/160 1878/2033/160
+f 1878/2033/160 541/629/160 144/175/160
+f 1102/1234/159 136/167/159 1190/1324/159
+f 1102/1234/159 1190/1324/159 1107/1239/159
+f 1107/1239/587 1190/1324/587 151/182/587
+f 1685/1836/158 157/188/158 1720/1873/158
+f 1685/1836/158 1720/1873/158 1591/1737/158
+f 1591/1737/158 1720/1873/158 142/173/158
+f 1877/2032/157 143/174/157 640/738/157
+f 1877/2032/157 640/738/157 632/728/157
+f 632/728/157 640/738/157 82/104/157
+f 1106/1238/156 150/181/156 919/1043/156
+f 1106/1238/156 919/1043/156 1105/1237/156
+f 1105/1237/156 919/1043/156 149/180/156
+f 1720/1873/530 157/188/530 1549/1695/530
+f 1720/1873/530 1549/1695/530 1719/1872/530
+f 1719/1872/530 1549/1695/530 156/187/530
+f 1013/1142/154 149/180/154 834/955/154
+f 1013/1142/154 834/955/154 1012/1141/154
+f 1012/1141/154 834/955/154 148/179/154
+f 1542/1688/529 141/172/529 1631/1780/529
+f 1542/1688/529 1631/1780/529 1548/1694/529
+f 1548/1694/529 1631/1780/529 156/187/529
+f 830/951/152 133/164/152 917/1041/152
+f 830/951/152 917/1041/152 833/954/152
+f 833/954/152 917/1041/152 148/179/152
+f 1547/1693/151 155/186/151 1370/1509/151
+f 1547/1693/151 1370/1509/151 1546/1692/151
+f 1546/1692/151 1370/1509/151 154/185/151
+f 832/953/150 147/178/150 644/742/150
+f 832/953/150 644/742/150 831/952/150
+f 831/952/150 644/742/150 146/177/150
+f 1366/1505/149 139/170/149 1458/1602/149
+f 1366/1505/149 1458/1602/149 1369/1508/149
+f 1369/1508/149 1458/1602/149 154/185/149
+f 635/732/148 131/162/148 738/851/148
+f 635/732/148 738/851/148 643/741/148
+f 643/741/148 738/851/148 146/177/148
+f 1368/1507/147 153/184/147 1192/1326/147
+f 1368/1507/147 1192/1326/147 1367/1506/147
+f 1367/1506/147 1192/1326/147 152/183/147
+f 642/740/146 145/176/146 1879/2034/146
+f 642/740/146 1879/2034/146 641/739/146
+f 641/739/146 1879/2034/146 144/175/146
+f 1187/1321/145 137/168/145 1285/1422/145
+f 1187/1321/145 1285/1422/145 1191/1325/145
+f 1191/1325/145 1285/1422/145 152/183/145
+f 1627/1775/144 140/171/144 1455/1599/144
+f 1627/1775/144 1455/1599/144 1626/1774/144
+f 1626/1774/144 1455/1599/144 139/170/144
+f 912/1036/143 132/163/143 735/847/143
+f 912/1036/143 735/847/143 911/1035/143
+f 911/1035/143 735/847/143 131/162/143
+f 1447/1591/142 124/155/142 1540/1686/142
+f 1447/1591/142 1540/1686/142 1454/1598/142
+f 1454/1598/142 1540/1686/142 139/170/142
+f 729/840/141 116/147/141 828/949/141
+f 729/840/141 828/949/141 734/846/141
+f 734/846/141 828/949/141 131/162/141
+f 1453/1597/140 138/169/140 1283/1420/140
+f 1453/1597/140 1283/1420/140 1452/1596/140
+f 1452/1596/140 1283/1420/140 137/168/140
+f 628/724/139 115/146/139 733/845/139
+f 628/724/139 733/845/139 634/731/139
+f 634/731/139 733/845/139 130/161/139
+f 1279/1416/138 122/153/138 1364/1503/138
+f 1279/1416/138 1364/1503/138 1282/1419/138
+f 1282/1419/138 1364/1503/138 137/168/138
+f 529/616/137 114/145/137 633/730/137
+f 529/616/137 633/730/137 535/622/137
+f 535/622/137 633/730/137 129/160/137
+f 1182/1316/136 121/152/136 1281/1418/136
+f 1182/1316/136 1281/1418/136 1186/1320/136
+f 1186/1320/136 1281/1418/136 136/167/136
+f 1591/1738/588 142/173/588 1794/1948/588
+f 1591/1738/588 1794/1948/588 1851/2005/588
+f 1851/2005/588 1794/1948/588 127/158/588
+f 534/621/134 128/159/134 632/729/134
+f 534/621/134 632/729/134 1383/1522/134
+f 1383/1522/589 632/729/589 82/105/589
+f 1185/1319/526 135/166/526 1009/1138/526
+f 1185/1319/526 1009/1138/526 1184/1318/526
+f 1184/1318/526 1009/1138/526 134/165/526
+f 1712/1865/132 127/158/132 1794/1948/132
+f 1712/1865/132 1794/1948/132 1717/1870/132
+f 1717/1870/132 1794/1948/132 142/173/132
+f 1100/1232/131 134/165/131 914/1038/131
+f 1100/1232/131 914/1038/131 1099/1231/131
+f 1099/1231/131 914/1038/131 133/164/131
+f 1621/1769/130 126/157/130 1716/1869/130
+f 1621/1769/130 1716/1869/130 1628/1776/130
+f 1628/1776/130 1716/1869/130 141/172/130
+f 908/1032/129 118/149/129 1007/1136/129
+f 908/1032/129 1007/1136/129 913/1037/129
+f 913/1037/129 1007/1136/129 133/164/129
+f 1273/1409/128 106/137/128 1360/1499/128
+f 1273/1409/128 1360/1499/128 1278/1415/128
+f 1278/1415/590 1360/1499/590 121/152/590
+f 1851/2006/127 127/158/127 1873/2028/127
+f 1851/2006/591 1873/2028/591 1772/1925/591
+f 1772/1925/127 1873/2028/127 112/143/127
+f 626/722/126 113/144/126 1383/1523/126
+f 626/722/592 1383/1523/592 621/716/592
+f 621/716/126 1383/1523/126 82/106/126
+f 1277/1414/524 120/151/524 1095/1227/524
+f 1277/1414/524 1095/1227/524 1276/1413/524
+f 1276/1413/524 1095/1227/524 119/150/524
+f 1789/1943/124 112/143/124 1873/2028/124
+f 1789/1943/124 1873/2028/124 1792/1946/124
+f 1792/1946/124 1873/2028/124 127/158/124
+f 1180/1314/123 119/150/123 1002/1131/123
+f 1180/1314/123 1002/1131/123 1179/1313/123
+f 1179/1313/123 1002/1131/123 118/149/123
+f 1706/1859/122 111/142/122 1791/1945/122
+f 1706/1859/122 1791/1945/122 1711/1864/122
+f 1711/1864/122 1791/1945/122 126/157/122
+f 997/1126/121 103/134/121 1093/1225/121
+f 997/1126/121 1093/1225/121 1001/1130/121
+f 1001/1130/121 1093/1225/121 118/149/121
+f 1710/1863/120 125/156/120 1534/1680/120
+f 1710/1863/120 1534/1680/120 1709/1862/120
+f 1709/1862/120 1534/1680/120 124/155/120
+f 1000/1129/119 117/148/119 824/945/119
+f 1000/1129/119 824/945/119 999/1128/119
+f 999/1128/119 824/945/119 116/147/119
+f 1529/1675/118 109/140/118 1619/1767/118
+f 1529/1675/118 1619/1767/118 1533/1679/118
+f 1533/1679/118 1619/1767/118 124/155/118
+f 817/938/117 101/132/117 906/1030/117
+f 817/938/117 906/1030/117 823/944/117
+f 823/944/117 906/1030/117 116/147/117
+f 1532/1678/116 123/154/116 1362/1501/116
+f 1532/1678/116 1362/1501/116 1531/1677/116
+f 1531/1677/116 1362/1501/116 122/153/116
+f 722/831/115 100/131/115 822/943/115
+f 722/831/115 822/943/115 728/839/115
+f 728/839/115 822/943/115 115/146/115
+f 1357/1496/114 107/138/114 1445/1589/114
+f 1357/1496/114 1445/1589/114 1361/1500/114
+f 1361/1500/114 1445/1589/114 122/153/114
+f 727/838/113 114/145/113 529/616/113
+f 727/838/113 529/616/113 726/837/113
+f 726/837/113 529/616/113 113/144/113
+f 1087/1218/112 102/133/112 904/1027/112
+f 1087/1218/112 904/1027/112 1086/1217/112
+f 1086/1217/112 904/1027/112 101/132/112
+f 560/650/111 94/125/111 1704/1856/111
+f 560/650/111 1704/1856/111 1614/1761/111
+f 1614/1761/111 1704/1856/111 109/140/111
+f 1264/1400/110 86/117/110 995/1123/110
+f 1264/1400/110 995/1123/110 903/1026/110
+f 903/1026/110 995/1123/110 101/132/110
+f 1613/1760/109 108/139/109 1443/1586/109
+f 1613/1760/109 1443/1586/109 1612/1759/109
+f 1612/1759/109 1443/1586/109 107/138/109
+f 807/927/108 85/116/108 902/1025/108
+f 807/927/108 902/1025/108 816/937/108
+f 816/937/108 902/1025/108 100/131/108
+f 1110/1242/107 92/123/107 1527/1672/107
+f 1110/1242/107 1527/1672/107 1442/1585/107
+f 1442/1585/107 1527/1672/107 107/138/107
+f 815/936/106 99/130/106 622/718/106
+f 815/936/106 622/718/106 814/935/106
+f 814/935/106 622/718/106 98/129/106
+f 639/736/523 91/122/523 1441/1584/523
+f 639/736/105 1441/1584/105 1356/1495/105
+f 1356/1495/105 1441/1584/105 106/137/105
+f 1772/1926/104 112/143/104 527/614/104
+f 1772/1926/104 527/614/104 1323/1460/104
+f 1323/1460/104 527/614/104 97/128/104
+f 720/829/103 98/129/103 621/717/103
+f 720/829/103 621/717/103 617/711/103
+f 617/711/103 621/717/103 82/107/103
+f 1355/1494/522 105/136/522 1176/1310/522
+f 1355/1494/522 1176/1310/522 1354/1493/522
+f 1354/1493/522 1176/1310/522 104/135/522
+f 1866/2021/101 97/128/101 527/614/101
+f 1866/2021/101 527/614/101 1870/2025/101
+f 1870/2025/101 527/614/101 112/143/101
+f 1271/1407/100 104/135/100 1089/1220/100
+f 1271/1407/100 1089/1220/100 1270/1406/100
+f 1270/1406/100 1089/1220/100 103/134/100
+f 1869/2024/99 111/142/99 1706/1859/99
+f 1869/2024/99 1706/1859/99 1868/2023/99
+f 1868/2023/99 1706/1859/99 110/141/99
+f 724/834/98 88/119/98 1174/1307/98
+f 724/834/98 1174/1307/98 1088/1219/98
+f 1088/1219/98 1174/1307/98 103/134/98
+f 1787/1941/97 110/141/97 1615/1762/97
+f 1787/1941/97 1615/1762/97 1786/1940/97
+f 1786/1940/97 1615/1762/97 109/140/97
+f 715/823/96 83/114/96 617/712/96
+f 715/823/96 617/712/96 714/821/96
+f 714/821/96 617/712/96 82/108/96
+f 1351/1490/95 90/121/95 1268/1404/95
+f 1351/1490/95 1268/1404/95 1350/1489/95
+f 1350/1489/95 1268/1404/95 89/120/95
+f 522/607/593 97/128/593 1866/2021/593
+f 522/607/94 1866/2021/94 521/606/94
+f 521/606/94 1866/2021/94 96/127/94
+f 1267/1403/93 89/120/93 1170/1303/93
+f 1267/1403/93 1170/1303/93 1266/1402/93
+f 1266/1402/93 1170/1303/93 88/119/93
+f 1780/1934/92 80/80/92 1865/2020/92
+f 1780/1934/521 1865/2020/521 1784/1938/521
+f 1784/1938/92 1865/2020/92 96/127/92
+f 1074/1204/91 72/72/91 1169/1302/91
+f 1074/1204/91 1169/1302/91 1081/1212/91
+f 1081/1212/91 1169/1302/91 88/119/91
+f 1697/1848/90 79/79/90 1783/1937/90
+f 1697/1848/90 1783/1937/90 1700/1851/90
+f 1700/1851/90 1783/1937/90 95/126/90
+f 1080/1211/89 87/118/89 992/1120/89
+f 1080/1211/89 992/1120/89 1079/1210/89
+f 1079/1210/89 992/1120/89 86/117/89
+f 1602/1749/88 78/78/88 1699/1850/88
+f 1602/1749/88 1699/1850/88 1607/1754/88
+f 1607/1754/88 1699/1850/88 94/125/88
+f 895/1017/87 70/70/87 991/1119/87
+f 895/1017/87 991/1119/87 899/1022/87
+f 899/1022/87 991/1119/87 86/117/87
+f 1606/1753/86 93/124/86 1524/1669/86
+f 1606/1753/86 1524/1669/86 1605/1752/86
+f 1605/1752/86 1524/1669/86 92/123/86
+f 810/930/85 69/69/85 898/1021/85
+f 810/930/520 898/1021/520 813/934/520
+f 813/934/85 898/1021/85 85/116/85
+f 1434/1576/84 76/76/84 1523/1668/84
+f 1434/1576/84 1523/1668/84 1439/1582/84
+f 1439/1582/84 1523/1668/84 92/123/84
+f 710/817/83 68/68/83 812/933/83
+f 710/817/83 812/933/83 716/824/83
+f 716/824/83 812/933/83 84/115/83
+f 1346/1485/82 75/75/82 1438/1581/82
+f 1346/1485/82 1438/1581/82 1352/1491/82
+f 1352/1491/594 1438/1581/594 91/122/594
+f 1323/1461/81 97/128/81 522/607/81
+f 1323/1461/81 522/607/81 603/696/81
+f 603/696/81 522/607/81 81/81/81
+f 982/1109/80 55/55/80 1072/1202/80
+f 982/1109/80 1072/1202/80 985/1112/80
+f 985/1112/80 1072/1202/80 70/70/80
+f 1695/1846/79 77/77/79 1517/1662/79
+f 1695/1846/79 1517/1662/79 1694/1845/79
+f 1694/1845/79 1517/1662/79 76/76/79
+f 891/1013/78 54/54/78 984/1111/78
+f 891/1013/78 984/1111/78 894/1016/78
+f 894/1016/78 984/1111/78 69/69/78
+f 1512/1657/77 61/61/77 1600/1747/77
+f 1512/1657/77 1600/1747/77 1516/1661/77
+f 1516/1661/77 1600/1747/77 76/76/77
+f 806/926/76 53/53/76 893/1015/76
+f 806/926/76 893/1015/76 809/929/76
+f 809/929/76 893/1015/76 68/68/76
+f 1429/1571/595 60/60/595 1515/1660/595
+f 1429/1571/75 1515/1660/75 1433/1575/75
+f 1433/1575/75 1515/1660/75 75/75/75
+f 603/697/74 81/81/74 615/709/74
+f 603/697/74 615/709/74 506/586/74
+f 506/586/74 615/709/74 66/66/74
+f 808/928/73 67/67/73 714/822/73
+f 808/928/73 714/822/73 811/931/73
+f 811/931/73 714/822/73 82/109/73
+f 1432/1574/72 74/74/72 1261/1397/72
+f 1432/1574/72 1261/1397/72 1431/1573/72
+f 1431/1573/72 1261/1397/72 73/73/72
+f 511/593/71 66/66/71 615/709/71
+f 511/593/71 615/709/71 518/602/71
+f 518/602/71 615/709/71 81/81/71
+f 1344/1483/70 73/73/70 1163/1296/70
+f 1344/1483/70 1163/1296/70 1343/1482/70
+f 1343/1482/70 1163/1296/70 72/72/70
+f 517/601/69 80/80/69 1780/1934/69
+f 517/601/69 1780/1934/69 516/600/69
+f 516/600/69 1780/1934/69 79/79/69
+f 1157/1290/68 57/57/68 1259/1395/68
+f 1157/1290/68 1259/1395/68 1162/1295/68
+f 1162/1295/68 1259/1395/68 72/72/68
+f 1776/1930/67 64/64/67 1859/2014/67
+f 1776/1930/67 1859/2014/67 1779/1933/67
+f 1779/1933/67 1859/2014/67 79/79/67
+f 1161/1294/66 71/71/66 986/1113/66
+f 1161/1294/66 986/1113/66 1160/1293/66
+f 1160/1293/66 986/1113/66 70/70/66
+f 1689/1840/65 63/63/65 1778/1932/65
+f 1689/1840/65 1778/1932/65 1696/1847/65
+f 1696/1847/65 1778/1932/65 78/78/65
+f 602/695/64 51/51/64 708/814/64
+f 602/695/64 708/814/64 608/702/64
+f 608/702/64 708/814/64 66/66/64
+f 1427/1569/63 58/58/63 1254/1390/63
+f 1427/1569/63 1254/1390/63 1426/1568/63
+f 1426/1568/63 1254/1390/63 57/57/63
+f 504/584/62 50/50/62 607/701/62
+f 504/584/62 607/701/62 510/592/62
+f 510/592/62 607/701/62 65/65/62
+f 1244/1379/61 42/42/61 1340/1479/61
+f 1244/1379/61 1340/1479/61 1253/1389/61
+f 1253/1389/61 1340/1479/61 57/57/61
+f 1850/2004/60 49/49/60 509/591/60
+f 1850/2004/60 509/591/60 1855/2010/60
+f 1855/2010/60 509/591/60 64/64/60
+f 1151/1283/59 41/41/59 1252/1388/59
+f 1151/1283/59 1252/1388/59 1156/1289/59
+f 1156/1289/59 1252/1388/59 56/56/59
+f 1769/1922/58 48/48/58 1854/2009/58
+f 1769/1922/58 1854/2009/58 1775/1929/58
+f 1775/1929/58 1854/2009/58 63/63/58
+f 1064/1193/57 40/40/57 1155/1288/57
+f 1064/1193/57 1155/1288/57 1068/1198/57
+f 1068/1198/57 1155/1288/57 55/55/57
+f 1774/1928/56 62/62/56 1596/1743/56
+f 1774/1928/56 1596/1743/56 1773/1927/56
+f 1773/1927/56 1596/1743/56 61/61/56
+f 977/1102/55 39/39/55 1067/1197/55
+f 977/1102/55 1067/1197/55 981/1108/55
+f 981/1108/55 1067/1197/55 54/54/55
+f 1588/1734/54 46/46/54 1687/1838/54
+f 1588/1734/54 1687/1838/54 1595/1742/54
+f 1595/1742/54 1687/1838/54 61/61/54
+f 887/1009/53 38/38/53 980/1107/53
+f 887/1009/53 980/1107/53 890/1012/53
+f 890/1012/53 980/1107/53 53/53/53
+f 1507/1651/52 45/45/52 1594/1741/52
+f 1507/1651/52 1594/1741/52 1511/1656/52
+f 1511/1656/52 1594/1741/52 60/60/52
+f 506/587/51 66/66/51 708/814/51
+f 506/587/51 708/814/51 805/924/51
+f 805/924/51 708/814/51 51/51/51
+f 889/1011/50 52/52/50 811/932/50
+f 889/1011/50 811/932/50 897/1019/50
+f 897/1019/50 811/932/50 82/110/50
+f 1510/1655/49 59/59/49 1342/1481/49
+f 1510/1655/49 1342/1481/49 1509/1654/49
+f 1509/1654/596 1342/1481/596 58/58/596
+f 1848/2002/48 47/47/48 1682/1832/48
+f 1848/2002/48 1682/1832/48 1847/2001/48
+f 1847/2001/48 1682/1832/48 46/46/48
+f 1060/1189/47 24/24/47 1149/1281/47
+f 1060/1189/569 1149/1281/569 1063/1192/569
+f 1063/1192/47 1149/1281/47 39/39/47
+f 1671/1820/46 31/31/46 1767/1920/46
+f 1671/1820/46 1767/1920/46 1681/1831/46
+f 1681/1831/46 1767/1920/46 46/46/46
+f 970/1095/45 23/23/45 1062/1191/45
+f 970/1095/45 1062/1191/45 976/1101/45
+f 976/1101/45 1062/1191/45 38/38/45
+f 1680/1830/44 45/45/44 1507/1651/44
+f 1680/1830/44 1507/1651/44 1679/1829/44
+f 1679/1829/44 1507/1651/44 44/44/44
+f 805/925/43 51/51/43 804/923/43
+f 805/925/43 804/923/43 705/810/43
+f 705/810/43 804/923/43 36/36/43
+f 975/1100/42 37/37/42 897/1020/42
+f 975/1100/42 897/1020/42 988/1115/42
+f 988/1115/42 897/1020/42 82/111/42
+f 1503/1647/41 29/29/41 1586/1732/41
+f 1503/1647/41 1586/1732/41 1506/1650/41
+f 1506/1650/41 1586/1732/41 44/44/41
+f 700/805/40 36/36/40 804/923/40
+f 700/805/40 804/923/40 704/809/40
+f 704/809/40 804/923/40 51/51/40
+f 1416/1556/39 28/28/39 1505/1649/39
+f 1416/1556/39 1505/1649/39 1421/1562/39
+f 1421/1562/39 1505/1649/39 43/43/39
+f 598/691/515 35/35/515 703/808/515
+f 598/691/38 703/808/38 601/694/38
+f 601/694/38 703/808/38 50/50/38
+f 1330/1468/37 27/27/37 1420/1561/37
+f 1330/1468/37 1420/1561/37 1335/1473/37
+f 1335/1473/37 1420/1561/37 42/42/37
+f 600/693/36 49/49/36 1850/2004/36
+f 600/693/36 1850/2004/36 599/692/36
+f 599/692/36 1850/2004/36 48/48/36
+f 1234/1369/35 26/26/35 1334/1472/35
+f 1234/1369/35 1334/1472/35 1243/1378/35
+f 1243/1378/35 1334/1472/35 41/41/35
+f 502/582/34 48/48/34 1769/1922/34
+f 502/582/34 1769/1922/34 501/581/34
+f 501/581/34 1769/1922/34 47/47/34
+f 1146/1278/33 25/25/33 1242/1377/33
+f 1146/1278/33 1242/1377/33 1150/1282/33
+f 1150/1282/33 1242/1377/33 40/40/33
+f 1581/1727/32 28/28/32 1416/1556/32
+f 1581/1727/32 1416/1556/32 1580/1726/32
+f 1580/1726/32 1416/1556/32 27/27/32
+f 797/916/31 35/35/31 598/691/31
+f 797/916/31 598/691/31 796/915/31
+f 796/915/31 598/691/31 34/34/31
+f 1412/1552/30 12/12/30 1501/1645/30
+f 1412/1552/30 1501/1645/30 1415/1555/30
+f 1415/1555/30 1501/1645/30 27/27/30
+f 698/803/29 34/34/29 498/577/29
+f 698/803/29 498/577/29 697/802/29
+f 697/802/29 498/577/29 33/33/29
+f 1324/1462/28 11/11/28 1414/1554/28
+f 1324/1462/28 1414/1554/28 1329/1467/28
+f 1329/1467/28 1414/1554/28 26/26/28
+f 491/569/27 18/18/27 596/689/27
+f 491/569/27 596/689/27 497/576/27
+f 497/576/27 596/689/27 33/33/27
+f 1226/1361/26 10/10/26 1328/1466/26
+f 1226/1361/26 1328/1466/26 1233/1368/26
+f 1233/1368/26 1328/1466/26 25/25/26
+f 1841/1995/25 17/17/25 496/575/25
+f 1841/1995/25 496/575/25 1845/1999/25
+f 1845/1999/25 496/575/25 32/32/25
+f 1142/1274/24 9/9/24 1232/1367/24
+f 1142/1274/24 1232/1367/24 1145/1277/24
+f 1145/1277/24 1232/1367/24 24/24/24
+f 1753/1906/23 16/16/23 1844/1998/23
+f 1753/1906/23 1844/1998/23 1760/1913/23
+f 1760/1913/23 1844/1998/23 31/31/23
+f 1056/1185/22 8/8/22 1144/1276/22
+f 1056/1185/514 1144/1276/514 1059/1188/514
+f 1059/1188/22 1144/1276/22 23/23/22
+f 1664/1813/597 15/15/597 1759/1912/597
+f 1664/1813/21 1759/1912/21 1670/1819/21
+f 1670/1819/21 1759/1912/21 30/30/21
+f 705/811/20 36/36/20 885/1007/20
+f 705/811/20 885/1007/20 979/1105/20
+f 979/1105/20 885/1007/20 21/21/20
+f 1058/1187/19 22/22/19 988/1116/19
+f 1058/1187/19 988/1116/19 1078/1208/19
+f 1078/1208/19 988/1116/19 82/112/19
+f 1578/1724/570 14/14/570 1669/1818/570
+f 1578/1724/570 1669/1818/570 1582/1728/570
+f 1582/1728/570 1669/1818/570 29/29/570
+f 793/912/17 21/21/17 885/1007/17
+f 793/912/17 885/1007/17 798/917/17
+f 798/917/17 885/1007/17 36/36/17
+f 1212/1347/16 7/7/16 1078/1209/16
+f 1212/1347/16 1078/1209/16 576/669/16
+f 576/669/16 1078/1209/16 82/113/16
+f 687/792/598 4/4/598 789/908/598
+f 687/792/598 789/908/598 691/796/598
+f 691/796/15 789/908/15 14/14/15
+f 678/781/14 482/559/14 1045/1174/14
+f 678/781/14 1045/1174/14 1044/1173/14
+f 1044/1173/14 1045/1174/14 21/21/14
+f 690/795/13 13/13/13 1498/1642/13
+f 690/795/13 1498/1642/13 689/794/13
+f 689/794/13 1498/1642/13 12/12/13
+f 1825/1979/12 481/558/12 774/892/12
+f 1825/1979/12 774/892/12 773/891/12
+f 773/891/12 774/892/12 20/20/12
+f 1488/1632/11 12/12/11 1412/1552/11
+f 1488/1632/11 1412/1552/11 1568/1714/11
+f 1568/1714/11 1412/1552/11 11/11/11
+f 1912/2067/10 480/557/10 863/984/10
+f 1912/2067/10 863/984/10 862/983/10
+f 862/983/10 863/984/10 19/19/10
+f 590/683/9 11/11/9 1324/1462/9
+f 590/683/9 1324/1462/9 589/682/9
+f 589/682/9 1324/1462/9 10/10/9
+f 951/1075/8 479/556/8 579/672/8
+f 951/1075/8 579/672/8 967/1092/8
+f 967/1092/8 579/672/8 18/18/8
+f 1307/1444/7 10/10/7 1226/1361/7
+f 1307/1444/7 1226/1361/7 1396/1536/7
+f 1396/1536/7 1226/1361/7 9/9/7
+f 950/1074/6 6/6/6 966/1091/6
+f 950/1074/6 966/1091/6 675/778/6
+f 675/778/6 966/1091/6 17/17/6
+f 488/566/5 9/9/5 1142/1274/5
+f 488/566/5 1142/1274/5 487/565/5
+f 487/565/5 1142/1274/5 8/8/5
+f 1042/1171/4 478/555/4 1822/1976/4
+f 1042/1171/4 1822/1976/4 880/1001/4
+f 880/1001/4 1822/1976/4 16/16/4
+f 1130/1262/3 8/8/3 1056/1185/3
+f 1130/1262/3 1056/1185/3 1213/1348/3
+f 1213/1348/3 1056/1185/3 7/7/3
+f 786/905/572 5/5/572 879/1000/572
+f 786/905/2 879/1000/2 790/909/2
+f 790/909/2 879/1000/2 15/15/2
+f 979/1106/1 21/21/1 1045/1174/1
+f 979/1106/1 1045/1174/1 775/894/1
+f 775/894/1 1045/1174/1 482/559/1
diff --git a/src/main/resources/assets/tectech/models/Star.obj b/src/main/resources/assets/tectech/models/Star.obj
new file mode 100644
index 0000000000..a3469e9f05
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/Star.obj
@@ -0,0 +1,2537 @@
+# Blender 3.4.1
+# www.blender.org
+mtllib untitled.mtl
+o Sphere
+v 0.000000 61.528751 -41.112198
+v 0.000000 41.112198 -61.528751
+v 0.000000 14.436684 -72.578110
+v 0.000000 0.000000 -74.000000
+v 0.000000 -14.436684 -72.578110
+v 0.000000 -41.112198 -61.528751
+v 2.816457 72.578110 -14.159286
+v 5.524680 68.367081 -27.774443
+v 8.020593 61.528751 -40.322239
+v 10.208277 52.325901 -51.320473
+v 12.003664 41.112198 -60.346489
+v 13.337756 28.318575 -67.053429
+v 14.159286 14.436684 -71.183540
+v 14.436684 0.000000 -72.578110
+v 14.159286 -14.436684 -71.183540
+v 13.337756 -28.318575 -67.053429
+v 12.003664 -41.112198 -60.346489
+v 10.208277 -52.325901 -51.320473
+v 8.020593 -61.528751 -40.322239
+v 5.524680 -68.367081 -27.774443
+v 2.816457 -72.578110 -14.159286
+v 5.524679 72.578110 -13.337756
+v 10.837049 68.367081 -26.162952
+v 15.732958 61.528751 -37.982712
+v 20.024256 52.325901 -48.342827
+v 23.546032 41.112198 -56.845146
+v 26.162949 28.318575 -63.162949
+v 27.774441 14.436684 -67.053429
+v 28.318573 0.000000 -68.367081
+v 27.774441 -14.436684 -67.053429
+v 26.162949 -28.318575 -63.162949
+v 23.546032 -41.112198 -56.845146
+v 20.024256 -52.325901 -48.342827
+v 15.732958 -61.528751 -37.982712
+v 10.837049 -68.367081 -26.162952
+v 5.524679 -72.578110 -13.337756
+v 8.020591 72.578110 -12.003662
+v 15.732958 68.367081 -23.546034
+v 22.840712 61.528751 -34.183537
+v 29.070713 52.325901 -43.507397
+v 34.183537 41.112198 -51.159275
+v 37.982712 28.318575 -56.845150
+v 40.322239 14.436684 -60.346489
+v 41.112198 0.000000 -61.528740
+v 40.322239 -14.436684 -60.346489
+v 37.982712 -28.318575 -56.845150
+v 34.183537 -41.112198 -51.159275
+v 29.070713 -52.325901 -43.507397
+v 22.840712 -61.528751 -34.183537
+v 15.732958 -68.367081 -23.546034
+v 8.020591 -72.578110 -12.003662
+v 10.208276 72.578110 -10.208275
+v 20.024256 68.367081 -20.024254
+v 29.070711 61.528751 -29.070707
+v 37.000000 52.325901 -37.000000
+v 43.507389 41.112198 -43.507385
+v 48.342823 28.318575 -48.342827
+v 51.320473 14.436684 -51.320469
+v 52.325901 0.000000 -52.325890
+v 51.320473 -14.436684 -51.320469
+v 48.342823 -28.318575 -48.342827
+v 43.507389 -41.112198 -43.507385
+v 37.000000 -52.325901 -37.000000
+v 29.070711 -61.528751 -29.070707
+v 20.024256 -68.367081 -20.024254
+v 10.208276 -72.578110 -10.208275
+v 12.003662 72.578110 -8.020590
+v 23.546034 68.367081 -15.732955
+v 34.183540 61.528751 -22.840708
+v 43.507397 52.325901 -29.070713
+v 51.159283 41.112198 -34.183533
+v 56.845146 28.318575 -37.982719
+v 60.346489 14.436684 -40.322231
+v 61.528748 0.000000 -41.112179
+v 60.346489 -14.436684 -40.322231
+v 56.845146 -28.318575 -37.982719
+v 51.159283 -41.112198 -34.183533
+v 43.507397 -52.325901 -29.070713
+v 34.183540 -61.528751 -22.840708
+v 23.546034 -68.367081 -15.732955
+v 12.003662 -72.578110 -8.020590
+v 0.000000 74.000000 0.000000
+v 13.337753 72.578110 -5.524678
+v 26.162949 68.367081 -10.837048
+v 37.982712 61.528751 -15.732952
+v 48.342827 52.325901 -20.024256
+v 56.845146 41.112198 -23.546022
+v 63.162945 28.318575 -26.162952
+v 67.053421 14.436684 -27.774431
+v 68.367073 0.000000 -28.318558
+v 67.053421 -14.436684 -27.774431
+v 63.162945 -28.318575 -26.162952
+v 56.845146 -41.112198 -23.546022
+v 48.342827 -52.325901 -20.024256
+v 37.982712 -61.528751 -15.732952
+v 26.162949 -68.367081 -10.837048
+v 13.337753 -72.578110 -5.524678
+v 14.159284 72.578110 -2.816456
+v 27.774437 68.367081 -5.524678
+v 40.322235 61.528751 -8.020587
+v 51.320473 52.325901 -10.208279
+v 60.346481 41.112198 -12.003656
+v 67.053421 28.318575 -13.337759
+v 71.183533 14.436684 -14.159279
+v 72.578094 0.000000 -14.436669
+v 71.183533 -14.436684 -14.159279
+v 67.053421 -28.318575 -13.337759
+v 60.346481 -41.112198 -12.003656
+v 51.320473 -52.325901 -10.208279
+v 40.322235 -61.528751 -8.020587
+v 27.774437 -68.367081 -5.524678
+v 14.159284 -72.578110 -2.816456
+v 14.436680 72.578110 0.000001
+v 28.318571 68.367081 0.000002
+v 41.112190 61.528751 0.000004
+v 52.325897 52.325901 -0.000001
+v 61.528736 41.112198 0.000007
+v 68.367081 28.318575 -0.000003
+v 72.578102 14.436684 0.000007
+v 73.999977 0.000000 0.000012
+v 72.578102 -14.436684 0.000007
+v 68.367081 -28.318575 -0.000003
+v 61.528736 -41.112198 0.000007
+v 52.325897 -52.325901 -0.000001
+v 41.112190 -61.528751 0.000004
+v 28.318571 -68.367081 0.000002
+v 14.436680 -72.578110 0.000001
+v 14.159283 72.578110 2.816457
+v 27.774437 68.367081 5.524681
+v 40.322231 61.528751 8.020594
+v 51.320469 52.325901 10.208275
+v 60.346478 41.112198 12.003668
+v 67.053421 28.318575 13.337752
+v 71.183525 14.436684 14.159291
+v 72.578079 0.000000 14.436691
+v 71.183525 -14.436684 14.159291
+v 67.053421 -28.318575 13.337752
+v 60.346478 -41.112198 12.003668
+v 51.320469 -52.325901 10.208275
+v 40.322231 -61.528751 8.020594
+v 27.774437 -68.367081 5.524681
+v 14.159283 -72.578110 2.816457
+v 13.337751 72.578110 5.524679
+v 26.162949 68.367081 10.837049
+v 37.982704 61.528751 15.732958
+v 48.342823 52.325901 20.024252
+v 56.845135 41.112198 23.546034
+v 63.162945 28.318575 26.162945
+v 67.053413 14.436684 27.774443
+v 68.367050 0.000000 28.318575
+v 67.053413 -14.436684 27.774443
+v 63.162945 -28.318575 26.162945
+v 56.845135 -41.112198 23.546034
+v 48.342823 -52.325901 20.024252
+v 37.982704 -61.528751 15.732958
+v 26.162949 -68.367081 10.837049
+v 13.337751 -72.578110 5.524679
+v 12.003658 72.578110 8.020589
+v 23.546030 68.367081 15.732956
+v 34.183529 61.528751 22.840710
+v 43.507389 52.325901 29.070709
+v 51.159267 41.112198 34.183537
+v 56.845146 28.318575 37.982708
+v 60.346478 14.436684 40.322235
+v 61.528713 0.000000 41.112194
+v 60.346478 -14.436684 40.322235
+v 56.845146 -28.318575 37.982708
+v 51.159267 -41.112198 34.183537
+v 43.507389 -52.325901 29.070709
+v 34.183529 -61.528751 22.840710
+v 23.546030 -68.367081 15.732956
+v 12.003658 -72.578110 8.020589
+v 10.208272 72.578110 10.208273
+v 20.024250 68.367081 20.024254
+v 29.070698 61.528751 29.070709
+v 36.999996 52.325901 36.999996
+v 43.507378 41.112198 43.507385
+v 48.342823 28.318575 48.342819
+v 51.320457 14.436684 51.320469
+v 52.325863 0.000000 52.325893
+v 51.320457 -14.436684 51.320469
+v 48.342823 -28.318575 48.342819
+v 43.507378 -41.112198 43.507385
+v 36.999996 -52.325901 36.999996
+v 29.070698 -61.528751 29.070709
+v 20.024250 -68.367081 20.024254
+v 10.208272 -72.578110 10.208273
+v 8.020587 72.578110 12.003658
+v 15.732951 68.367081 23.546032
+v 22.840698 61.528751 34.183537
+v 29.070709 52.325901 43.507389
+v 34.183525 41.112198 51.159271
+v 37.982712 28.318575 56.845139
+v 40.322220 14.436684 60.346481
+v 41.112160 0.000000 61.528732
+v 40.322220 -14.436684 60.346481
+v 37.982712 -28.318575 56.845139
+v 34.183525 -41.112198 51.159271
+v 29.070709 -52.325901 43.507389
+v 22.840698 -61.528751 34.183537
+v 15.732951 -68.367081 23.546032
+v 8.020587 -72.578110 12.003658
+v 5.524676 72.578110 13.337749
+v 10.837043 68.367081 26.162947
+v 15.732944 61.528751 37.982704
+v 20.024252 52.325901 48.342823
+v 23.546019 41.112198 56.845135
+v 26.162949 28.318575 63.162933
+v 27.774422 14.436684 67.053413
+v 28.318539 0.000000 68.367058
+v 27.774422 -14.436684 67.053413
+v 26.162949 -28.318575 63.162933
+v 23.546019 -41.112198 56.845135
+v 20.024252 -52.325901 48.342823
+v 15.732944 -61.528751 37.982704
+v 10.837043 -68.367081 26.162947
+v 5.524676 -72.578110 13.337749
+v 2.816455 72.578110 14.159278
+v 5.524674 68.367081 27.774433
+v 8.020581 61.528751 40.322220
+v 10.208275 52.325901 51.320469
+v 12.003653 41.112198 60.346474
+v 13.337756 28.318575 67.053413
+v 14.159272 14.436684 71.183517
+v 14.436653 0.000000 72.578072
+v 14.159272 -14.436684 71.183517
+v 13.337756 -28.318575 67.053413
+v 12.003653 -41.112198 60.346474
+v 10.208275 -52.325901 51.320469
+v 8.020581 -61.528751 40.322220
+v 5.524674 -68.367081 27.774433
+v 2.816455 -72.578110 14.159278
+v -0.000001 72.578110 14.436674
+v -0.000004 68.367081 28.318567
+v -0.000007 61.528751 41.112175
+v -0.000001 52.325901 52.325893
+v -0.000008 41.112198 61.528728
+v 0.000002 28.318575 68.367065
+v -0.000010 14.436684 72.578087
+v -0.000024 0.000000 73.999954
+v -0.000010 -14.436684 72.578087
+v 0.000002 -28.318575 68.367065
+v -0.000008 -41.112198 61.528728
+v -0.000001 -52.325901 52.325893
+v -0.000007 -61.528751 41.112175
+v -0.000004 -68.367081 28.318567
+v -0.000001 -72.578110 14.436674
+v -2.816456 72.578110 14.159277
+v -5.524682 68.367081 27.774433
+v -8.020595 61.528751 40.322216
+v -10.208276 52.325901 51.320461
+v -12.003667 41.112198 60.346466
+v -13.337750 28.318575 67.053406
+v -14.159292 14.436684 71.183517
+v -14.436698 0.000000 72.578056
+v -14.159292 -14.436684 71.183517
+v -13.337750 -28.318575 67.053406
+v -12.003667 -41.112198 60.346466
+v -10.208276 -52.325901 51.320461
+v -8.020595 -61.528751 40.322216
+v -5.524682 -68.367081 27.774433
+v -2.816456 -72.578110 14.159277
+v -5.524676 72.578110 13.337748
+v -10.837049 68.367081 26.162945
+v -15.732955 61.528751 37.982693
+v -20.024252 52.325901 48.342819
+v -23.546032 41.112198 56.845127
+v -26.162939 28.318575 63.162930
+v -27.774441 14.436684 67.053398
+v -28.318579 0.000000 68.367027
+v -27.774441 -14.436684 67.053398
+v -26.162939 -28.318575 63.162930
+v -23.546032 -41.112198 56.845127
+v -20.024252 -52.325901 48.342819
+v -15.732955 -61.528751 37.982693
+v -10.837049 -68.367081 26.162945
+v -5.524676 -72.578110 13.337748
+v -8.020586 72.578110 12.003654
+v -15.732955 68.367081 23.546026
+v -22.840706 61.528751 34.183514
+v -29.070709 52.325901 43.507385
+v -34.183533 41.112198 51.159260
+v -37.982700 28.318575 56.845135
+v -40.322235 14.436684 60.346462
+v -41.112190 0.000000 61.528687
+v -40.322235 -14.436684 60.346462
+v -37.982700 -28.318575 56.845135
+v -34.183533 -41.112198 51.159260
+v -29.070709 -52.325901 43.507385
+v -22.840706 -61.528751 34.183514
+v -15.732955 -68.367081 23.546026
+v -8.020586 -72.578110 12.003654
+v -10.208269 72.578110 10.208268
+v -20.024252 68.367081 20.024246
+v -29.070700 61.528751 29.070686
+v -36.999992 52.325901 36.999992
+v -43.507381 41.112198 43.507370
+v -48.342812 28.318575 48.342815
+v -51.320461 14.436684 51.320446
+v -52.325878 0.000000 52.325840
+v -51.320461 -14.436684 51.320446
+v -48.342812 -28.318575 48.342815
+v -43.507381 -41.112198 43.507370
+v -36.999992 -52.325901 36.999992
+v -29.070700 -61.528751 29.070686
+v -20.024252 -68.367081 20.024246
+v -10.208269 -72.578110 10.208268
+v 0.000000 -74.000000 0.000000
+v -12.003654 72.578110 8.020584
+v -23.546028 68.367081 15.732948
+v -34.183525 61.528751 22.840689
+v -43.507385 52.325901 29.070705
+v -51.159267 41.112198 34.183517
+v -56.845131 28.318575 37.982704
+v -60.346478 14.436684 40.322208
+v -61.528713 0.000000 41.112137
+v -60.346478 -14.436684 40.322208
+v -56.845131 -28.318575 37.982704
+v -51.159267 -41.112198 34.183517
+v -43.507385 -52.325901 29.070705
+v -34.183525 -61.528751 22.840689
+v -23.546028 -68.367081 15.732948
+v -12.003654 -72.578110 8.020584
+v -13.337746 72.578110 5.524674
+v -26.162941 68.367081 10.837042
+v -37.982693 61.528751 15.732935
+v -48.342819 52.325901 20.024250
+v -56.845127 41.112198 23.546009
+v -63.162926 28.318575 26.162941
+v -67.053406 14.436684 27.774412
+v -68.367035 0.000000 28.318518
+v -67.053406 -14.436684 27.774412
+v -63.162926 -28.318575 26.162941
+v -56.845127 -41.112198 23.546009
+v -48.342819 -52.325901 20.024250
+v -37.982693 -61.528751 15.732935
+v -26.162941 -68.367081 10.837042
+v -13.337746 -72.578110 5.524674
+v -14.159275 72.578110 2.816453
+v -27.774429 68.367081 5.524674
+v -40.322208 61.528751 8.020576
+v -51.320461 52.325901 10.208273
+v -60.346462 41.112198 12.003646
+v -67.053406 28.318575 13.337751
+v -71.183517 14.436684 14.159263
+v -72.578049 0.000000 14.436638
+v -71.183517 -14.436684 14.159263
+v -67.053406 -28.318575 13.337751
+v -60.346462 -41.112198 12.003646
+v -51.320461 -52.325901 10.208273
+v -40.322208 -61.528751 8.020576
+v -27.774429 -68.367081 5.524674
+v -14.159275 -72.578110 2.816453
+v -14.436670 72.578110 -0.000001
+v -28.318560 68.367081 -0.000004
+v -41.112164 61.528751 -0.000011
+v -52.325890 52.325901 -0.000002
+v -61.528721 41.112198 -0.000012
+v -68.367058 28.318575 -0.000001
+v -72.578079 14.436684 -0.000020
+v -73.999931 0.000000 -0.000033
+v -72.578079 -14.436684 -0.000020
+v -68.367058 -28.318575 -0.000001
+v -61.528721 -41.112198 -0.000012
+v -52.325890 -52.325901 -0.000002
+v -41.112164 -61.528751 -0.000011
+v -28.318560 -68.367081 -0.000004
+v -14.436670 -72.578110 -0.000001
+v -14.159273 72.578110 -2.816456
+v -27.774427 68.367081 -5.524681
+v -40.322205 61.528751 -8.020597
+v -51.320457 52.325901 -10.208277
+v -60.346455 41.112198 -12.003671
+v -67.053398 28.318575 -13.337752
+v -71.183502 14.436684 -14.159300
+v -72.578033 0.000000 -14.436703
+v -71.183502 -14.436684 -14.159300
+v -67.053398 -28.318575 -13.337752
+v -60.346455 -41.112198 -12.003671
+v -51.320457 -52.325901 -10.208277
+v -40.322205 -61.528751 -8.020597
+v -27.774427 -68.367081 -5.524681
+v -14.159273 -72.578110 -2.816456
+v -13.337744 72.578110 -5.524676
+v -26.162937 68.367081 -10.837048
+v -37.982677 61.528751 -15.732954
+v -48.342815 52.325901 -20.024252
+v -56.845112 41.112198 -23.546032
+v -63.162922 28.318575 -26.162939
+v -67.053391 14.436684 -27.774445
+v -68.367004 0.000000 -28.318579
+v -67.053391 -14.436684 -27.774445
+v -63.162922 -28.318575 -26.162939
+v -56.845112 -41.112198 -23.546032
+v -48.342815 -52.325901 -20.024252
+v -37.982677 -61.528751 -15.732954
+v -26.162937 -68.367081 -10.837048
+v -13.337744 -72.578110 -5.524676
+v -12.003652 72.578110 -8.020586
+v -23.546019 68.367081 -15.732952
+v -34.183502 61.528751 -22.840704
+v -43.507381 52.325901 -29.070707
+v -51.159245 41.112198 -34.183533
+v -56.845127 28.318575 -37.982700
+v -60.346451 14.436684 -40.322235
+v -61.528667 0.000000 -41.112186
+v -60.346451 -14.436684 -40.322235
+v -56.845127 -28.318575 -37.982700
+v -51.159245 -41.112198 -34.183533
+v -43.507381 -52.325901 -29.070707
+v -34.183502 -61.528751 -22.840704
+v -23.546019 -68.367081 -15.732952
+v -12.003652 -72.578110 -8.020586
+v -10.208266 72.578110 -10.208268
+v -20.024242 68.367081 -20.024246
+v -29.070673 61.528751 -29.070696
+v -36.999989 52.325901 -36.999992
+v -43.507355 41.112198 -43.507378
+v -48.342804 28.318575 -48.342804
+v -51.320431 14.436684 -51.320457
+v -52.325821 0.000000 -52.325871
+v -51.320431 -14.436684 -51.320457
+v -48.342804 -28.318575 -48.342804
+v -43.507355 -41.112198 -43.507378
+v -36.999989 -52.325901 -36.999992
+v -29.070673 -61.528751 -29.070696
+v -20.024242 -68.367081 -20.024246
+v -10.208266 -72.578110 -10.208268
+v -8.020582 72.578110 -12.003653
+v -15.732945 68.367081 -23.546022
+v -22.840677 61.528751 -34.183517
+v -29.070700 52.325901 -43.507385
+v -34.183506 41.112198 -51.159260
+v -37.982697 28.318575 -56.845127
+v -40.322197 14.436684 -60.346466
+v -41.112122 0.000000 -61.528702
+v -40.322197 -14.436684 -60.346466
+v -37.982697 -28.318575 -56.845127
+v -34.183506 -41.112198 -51.159260
+v -29.070700 -52.325901 -43.507385
+v -22.840677 -61.528751 -34.183517
+v -15.732945 -68.367081 -23.546022
+v -8.020582 -72.578110 -12.003653
+v -5.524673 72.578110 -13.337743
+v -10.837040 68.367081 -26.162939
+v -15.732925 61.528751 -37.982681
+v -20.024244 52.325901 -48.342819
+v -23.546001 41.112198 -56.845119
+v -26.162935 28.318575 -63.162922
+v -27.774405 14.436684 -67.053398
+v -28.318510 0.000000 -68.367020
+v -27.774405 -14.436684 -67.053398
+v -26.162935 -28.318575 -63.162922
+v -23.546001 -41.112198 -56.845119
+v -20.024244 -52.325901 -48.342819
+v -15.732925 -61.528751 -37.982681
+v -10.837040 -68.367081 -26.162939
+v -5.524673 -72.578110 -13.337743
+v -2.816453 72.578110 -14.159271
+v -5.524672 68.367081 -27.774427
+v -8.020567 61.528751 -40.322193
+v -10.208268 52.325901 -51.320461
+v -12.003638 41.112198 -60.346451
+v -13.337746 28.318575 -67.053398
+v -14.159258 14.436684 -71.183502
+v -14.436632 0.000000 -72.578026
+v -14.159258 -14.436684 -71.183502
+v -13.337746 -28.318575 -67.053398
+v -12.003638 -41.112198 -60.346451
+v -10.208268 -52.325901 -51.320461
+v -8.020567 -61.528751 -40.322193
+v -5.524672 -68.367081 -27.774427
+v -2.816453 -72.578110 -14.159271
+v 0.000001 72.578110 -14.436667
+v 0.000005 68.367081 -28.318558
+v 0.000007 52.325901 -52.325890
+v 0.000004 28.318575 -68.367050
+v 0.000004 -28.318575 -68.367050
+v 0.000007 -52.325901 -52.325890
+v 0.000016 -61.528751 -41.112144
+v 0.000005 -68.367081 -28.318558
+v 0.000001 -72.578110 -14.436667
+vn 0.0097 -0.9951 -0.0980
+vn 0.0975 -0.0976 -0.9904
+vn 0.0286 0.9565 -0.2902
+vn 0.0938 -0.2890 -0.9527
+vn 0.0464 0.8810 -0.4709
+vn 0.0865 -0.4696 -0.8786
+vn 0.0624 0.7715 -0.6332
+vn 0.0759 -0.6326 -0.7708
+vn 0.0759 0.6326 -0.7708
+vn 0.0624 -0.7715 -0.6332
+vn 0.0865 0.4696 -0.8786
+vn 0.0464 -0.8810 -0.4709
+vn 0.0938 0.2890 -0.9527
+vn 0.0286 -0.9565 -0.2902
+vn 0.0975 0.0975 -0.9904
+vn 0.0097 0.9951 -0.0980
+vn 0.0846 -0.9565 -0.2790
+vn 0.2889 0.0976 -0.9524
+vn 0.0286 0.9951 -0.0942
+vn 0.0286 -0.9951 -0.0942
+vn 0.2889 -0.0976 -0.9524
+vn 0.0846 0.9565 -0.2790
+vn 0.2779 -0.2890 -0.9161
+vn 0.1374 0.8810 -0.4528
+vn 0.2563 -0.4696 -0.8448
+vn 0.1847 0.7715 -0.6088
+vn 0.2248 -0.6326 -0.7412
+vn 0.2248 0.6326 -0.7412
+vn 0.1847 -0.7715 -0.6088
+vn 0.2563 0.4696 -0.8448
+vn 0.1374 -0.8810 -0.4528
+vn 0.2779 0.2890 -0.9161
+vn 0.2999 0.7715 -0.5611
+vn 0.3651 -0.6326 -0.6831
+vn 0.3651 0.6326 -0.6831
+vn 0.2999 -0.7715 -0.5611
+vn 0.4162 0.4696 -0.7786
+vn 0.2230 -0.8810 -0.4173
+vn 0.4513 0.2890 -0.8443
+vn 0.1374 -0.9565 -0.2571
+vn 0.4691 0.0975 -0.8777
+vn 0.0464 0.9951 -0.0869
+vn 0.0464 -0.9951 -0.0869
+vn 0.4691 -0.0975 -0.8777
+vn 0.1374 0.9565 -0.2571
+vn 0.4513 -0.2890 -0.8443
+vn 0.2231 0.8810 -0.4173
+vn 0.4162 -0.4696 -0.7786
+vn 0.6314 0.0975 -0.7693
+vn 0.0625 0.9951 -0.0761
+vn 0.0625 -0.9951 -0.0761
+vn 0.6314 -0.0975 -0.7693
+vn 0.1850 0.9565 -0.2254
+vn 0.6073 -0.2890 -0.7400
+vn 0.3002 0.8810 -0.3658
+vn 0.5601 -0.4696 -0.6825
+vn 0.4036 0.7715 -0.4918
+vn 0.4913 -0.6326 -0.5987
+vn 0.4913 0.6326 -0.5987
+vn 0.4036 -0.7715 -0.4918
+vn 0.5601 0.4696 -0.6825
+vn 0.3002 -0.8810 -0.3658
+vn 0.6073 0.2890 -0.7400
+vn 0.1850 -0.9565 -0.2254
+vn 0.5987 -0.6326 -0.4913
+vn 0.5987 0.6326 -0.4913
+vn 0.4918 -0.7715 -0.4036
+vn 0.6825 0.4696 -0.5601
+vn 0.3658 -0.8810 -0.3002
+vn 0.7400 0.2890 -0.6073
+vn 0.2254 -0.9566 -0.1850
+vn 0.7693 0.0975 -0.6314
+vn 0.0761 0.9951 -0.0625
+vn 0.0761 -0.9951 -0.0625
+vn 0.7693 -0.0975 -0.6314
+vn 0.2254 0.9565 -0.1850
+vn 0.7400 -0.2890 -0.6073
+vn 0.3658 0.8810 -0.3002
+vn 0.6825 -0.4696 -0.5601
+vn 0.4918 0.7715 -0.4036
+vn 0.0869 -0.9951 -0.0464
+vn 0.8777 -0.0975 -0.4691
+vn 0.2571 0.9565 -0.1374
+vn 0.8443 -0.2890 -0.4513
+vn 0.4173 0.8810 -0.2230
+vn 0.7786 -0.4696 -0.4162
+vn 0.5611 0.7715 -0.2999
+vn 0.6831 -0.6326 -0.3651
+vn 0.6831 0.6326 -0.3651
+vn 0.5611 -0.7715 -0.2999
+vn 0.7786 0.4696 -0.4162
+vn 0.4173 -0.8810 -0.2230
+vn 0.8443 0.2890 -0.4513
+vn 0.2571 -0.9565 -0.1374
+vn 0.8777 0.0975 -0.4691
+vn 0.0869 0.9951 -0.0464
+vn 0.6088 -0.7715 -0.1847
+vn 0.8448 0.4696 -0.2563
+vn 0.4528 -0.8810 -0.1374
+vn 0.9161 0.2890 -0.2779
+vn 0.2790 -0.9565 -0.0846
+vn 0.9524 0.0975 -0.2889
+vn 0.0942 0.9951 -0.0286
+vn 0.0942 -0.9951 -0.0286
+vn 0.9524 -0.0975 -0.2889
+vn 0.2790 0.9565 -0.0846
+vn 0.9161 -0.2890 -0.2779
+vn 0.4528 0.8810 -0.1374
+vn 0.8448 -0.4696 -0.2563
+vn 0.6088 0.7715 -0.1847
+vn 0.7412 -0.6326 -0.2248
+vn 0.7412 0.6326 -0.2248
+vn 0.2902 0.9565 -0.0286
+vn 0.9527 -0.2890 -0.0938
+vn 0.4709 0.8810 -0.0464
+vn 0.8786 -0.4696 -0.0865
+vn 0.6332 0.7715 -0.0624
+vn 0.7708 -0.6326 -0.0759
+vn 0.7708 0.6326 -0.0759
+vn 0.6332 -0.7715 -0.0624
+vn 0.8786 0.4696 -0.0865
+vn 0.4709 -0.8810 -0.0464
+vn 0.9527 0.2890 -0.0938
+vn 0.2902 -0.9565 -0.0286
+vn 0.9904 0.0975 -0.0975
+vn 0.0980 0.9951 -0.0097
+vn 0.0980 -0.9951 -0.0097
+vn 0.9904 -0.0975 -0.0975
+vn 0.8786 0.4696 0.0865
+vn 0.4709 -0.8810 0.0464
+vn 0.9527 0.2890 0.0938
+vn 0.2902 -0.9565 0.0286
+vn 0.9904 0.0975 0.0976
+vn 0.0980 0.9951 0.0097
+vn 0.0980 -0.9951 0.0097
+vn 0.9904 -0.0975 0.0976
+vn 0.2902 0.9565 0.0286
+vn 0.9527 -0.2890 0.0938
+vn 0.4709 0.8810 0.0464
+vn 0.8786 -0.4696 0.0865
+vn 0.6332 0.7715 0.0624
+vn 0.7708 -0.6326 0.0759
+vn 0.7708 0.6326 0.0759
+vn 0.6332 -0.7715 0.0624
+vn 0.9161 -0.2890 0.2779
+vn 0.4528 0.8810 0.1374
+vn 0.8448 -0.4696 0.2563
+vn 0.6088 0.7715 0.1847
+vn 0.7412 -0.6326 0.2248
+vn 0.7412 0.6326 0.2248
+vn 0.6088 -0.7715 0.1847
+vn 0.8448 0.4696 0.2563
+vn 0.4528 -0.8810 0.1374
+vn 0.9161 0.2890 0.2779
+vn 0.2790 -0.9565 0.0846
+vn 0.9524 0.0975 0.2889
+vn 0.0942 0.9951 0.0286
+vn 0.0942 -0.9951 0.0286
+vn 0.9524 -0.0975 0.2889
+vn 0.2790 0.9565 0.0846
+vn 0.4173 -0.8810 0.2230
+vn 0.8443 0.2890 0.4513
+vn 0.2571 -0.9565 0.1374
+vn 0.8777 0.0975 0.4691
+vn 0.0869 0.9951 0.0464
+vn 0.0869 -0.9951 0.0464
+vn 0.8777 -0.0975 0.4691
+vn 0.2571 0.9565 0.1374
+vn 0.8443 -0.2890 0.4513
+vn 0.4173 0.8810 0.2231
+vn 0.7786 -0.4696 0.4162
+vn 0.5611 0.7715 0.2999
+vn 0.6831 -0.6326 0.3651
+vn 0.6831 0.6326 0.3651
+vn 0.5611 -0.7715 0.2999
+vn 0.7786 0.4696 0.4162
+vn 0.3658 0.8810 0.3002
+vn 0.6825 -0.4696 0.5601
+vn 0.4918 0.7715 0.4036
+vn 0.5987 -0.6326 0.4913
+vn 0.5987 0.6326 0.4913
+vn 0.4918 -0.7715 0.4036
+vn 0.6825 0.4696 0.5601
+vn 0.3658 -0.8810 0.3002
+vn 0.7400 0.2890 0.6073
+vn 0.2254 -0.9565 0.1850
+vn 0.7693 0.0975 0.6314
+vn 0.0761 0.9951 0.0625
+vn 0.0761 -0.9951 0.0625
+vn 0.7693 -0.0975 0.6314
+vn 0.2254 0.9565 0.1850
+vn 0.7400 -0.2890 0.6073
+vn 0.6073 0.2890 0.7400
+vn 0.1850 -0.9565 0.2254
+vn 0.6314 0.0975 0.7693
+vn 0.0625 0.9951 0.0761
+vn 0.0625 -0.9951 0.0761
+vn 0.6314 -0.0975 0.7693
+vn 0.1850 0.9565 0.2254
+vn 0.6073 -0.2890 0.7400
+vn 0.3002 0.8810 0.3658
+vn 0.5601 -0.4696 0.6825
+vn 0.4036 0.7715 0.4918
+vn 0.4913 -0.6326 0.5987
+vn 0.4913 0.6326 0.5987
+vn 0.4036 -0.7715 0.4918
+vn 0.5601 0.4696 0.6825
+vn 0.3002 -0.8810 0.3658
+vn 0.4162 -0.4696 0.7786
+vn 0.2999 0.7715 0.5611
+vn 0.3651 -0.6326 0.6831
+vn 0.3651 0.6326 0.6831
+vn 0.2999 -0.7715 0.5611
+vn 0.4162 0.4696 0.7786
+vn 0.2230 -0.8810 0.4173
+vn 0.4513 0.2890 0.8443
+vn 0.1374 -0.9565 0.2571
+vn 0.4691 0.0975 0.8777
+vn 0.0464 0.9951 0.0869
+vn 0.0464 -0.9951 0.0869
+vn 0.4691 -0.0975 0.8777
+vn 0.1374 0.9565 0.2571
+vn 0.4513 -0.2890 0.8443
+vn 0.2230 0.8810 0.4173
+vn 0.0846 -0.9565 0.2790
+vn 0.2889 0.0975 0.9524
+vn 0.0286 0.9951 0.0942
+vn 0.0286 -0.9951 0.0942
+vn 0.2889 -0.0975 0.9524
+vn 0.0846 0.9565 0.2790
+vn 0.2779 -0.2890 0.9161
+vn 0.1374 0.8810 0.4528
+vn 0.2563 -0.4696 0.8448
+vn 0.1847 0.7715 0.6088
+vn 0.2248 -0.6326 0.7412
+vn 0.2248 0.6326 0.7412
+vn 0.1847 -0.7715 0.6088
+vn 0.2563 0.4696 0.8448
+vn 0.1374 -0.8810 0.4528
+vn 0.2779 0.2890 0.9161
+vn 0.0759 -0.6326 0.7708
+vn 0.0759 0.6326 0.7708
+vn 0.0624 -0.7715 0.6332
+vn 0.0865 0.4696 0.8786
+vn 0.0464 -0.8810 0.4709
+vn 0.0938 0.2890 0.9527
+vn 0.0286 -0.9565 0.2902
+vn 0.0975 0.0975 0.9904
+vn 0.0097 0.9951 0.0980
+vn 0.0097 -0.9951 0.0980
+vn 0.0975 -0.0975 0.9904
+vn 0.0286 0.9565 0.2902
+vn 0.0938 -0.2890 0.9527
+vn 0.0464 0.8810 0.4709
+vn 0.0865 -0.4696 0.8786
+vn 0.0624 0.7715 0.6332
+vn -0.0097 0.9951 0.0980
+vn -0.0097 -0.9951 0.0980
+vn -0.0975 -0.0975 0.9904
+vn -0.0286 0.9565 0.2902
+vn -0.0938 -0.2890 0.9527
+vn -0.0464 0.8810 0.4709
+vn -0.0865 -0.4696 0.8786
+vn -0.0624 0.7715 0.6332
+vn -0.0759 -0.6326 0.7708
+vn -0.0759 0.6326 0.7708
+vn -0.0624 -0.7715 0.6332
+vn -0.0865 0.4696 0.8786
+vn -0.0464 -0.8810 0.4709
+vn -0.0938 0.2890 0.9527
+vn -0.0286 -0.9565 0.2902
+vn -0.0976 0.0975 0.9904
+vn -0.2248 0.6326 0.7412
+vn -0.1847 -0.7715 0.6088
+vn -0.2563 0.4696 0.8448
+vn -0.1374 -0.8810 0.4528
+vn -0.2779 0.2890 0.9161
+vn -0.0846 -0.9565 0.2790
+vn -0.2889 0.0975 0.9524
+vn -0.0286 0.9951 0.0942
+vn -0.0286 -0.9951 0.0942
+vn -0.2889 -0.0975 0.9524
+vn -0.0846 0.9565 0.2790
+vn -0.2779 -0.2890 0.9161
+vn -0.1374 0.8810 0.4528
+vn -0.2563 -0.4696 0.8448
+vn -0.1847 0.7715 0.6088
+vn -0.2248 -0.6326 0.7412
+vn -0.4691 -0.0975 0.8777
+vn -0.1374 0.9565 0.2571
+vn -0.4513 -0.2890 0.8443
+vn -0.2230 0.8810 0.4173
+vn -0.4162 -0.4696 0.7786
+vn -0.2999 0.7715 0.5611
+vn -0.3651 -0.6326 0.6831
+vn -0.3651 0.6326 0.6831
+vn -0.2999 -0.7715 0.5611
+vn -0.4162 0.4696 0.7786
+vn -0.2230 -0.8810 0.4173
+vn -0.4513 0.2890 0.8443
+vn -0.1374 -0.9565 0.2571
+vn -0.4691 0.0975 0.8777
+vn -0.0464 0.9951 0.0869
+vn -0.0464 -0.9951 0.0869
+vn -0.4036 -0.7715 0.4918
+vn -0.5601 0.4696 0.6825
+vn -0.3002 -0.8810 0.3658
+vn -0.6073 0.2890 0.7400
+vn -0.1850 -0.9565 0.2254
+vn -0.6314 0.0975 0.7693
+vn -0.0625 0.9951 0.0761
+vn -0.0625 -0.9951 0.0761
+vn -0.6314 -0.0975 0.7693
+vn -0.1850 0.9565 0.2254
+vn -0.6073 -0.2890 0.7400
+vn -0.3002 0.8810 0.3658
+vn -0.5601 -0.4696 0.6825
+vn -0.4036 0.7715 0.4918
+vn -0.4913 -0.6326 0.5987
+vn -0.4913 0.6326 0.5987
+vn -0.2254 0.9565 0.1850
+vn -0.7400 -0.2890 0.6073
+vn -0.3658 0.8810 0.3002
+vn -0.6825 -0.4696 0.5601
+vn -0.4918 0.7715 0.4036
+vn -0.5987 -0.6326 0.4913
+vn -0.5987 0.6326 0.4913
+vn -0.4918 -0.7715 0.4036
+vn -0.6825 0.4696 0.5601
+vn -0.3658 -0.8810 0.3002
+vn -0.7400 0.2890 0.6073
+vn -0.2254 -0.9566 0.1850
+vn -0.7693 0.0975 0.6314
+vn -0.0761 0.9951 0.0625
+vn -0.0761 -0.9951 0.0625
+vn -0.7693 -0.0975 0.6314
+vn -0.7786 0.4696 0.4162
+vn -0.4173 -0.8810 0.2231
+vn -0.8443 0.2890 0.4513
+vn -0.2571 -0.9565 0.1374
+vn -0.8777 0.0975 0.4691
+vn -0.0869 0.9951 0.0464
+vn -0.0869 -0.9951 0.0464
+vn -0.8777 -0.0975 0.4691
+vn -0.2571 0.9565 0.1374
+vn -0.8443 -0.2890 0.4513
+vn -0.4173 0.8810 0.2230
+vn -0.7786 -0.4696 0.4162
+vn -0.5611 0.7715 0.2999
+vn -0.6831 -0.6326 0.3651
+vn -0.6831 0.6326 0.3651
+vn -0.5611 -0.7715 0.2999
+vn -0.9161 -0.2890 0.2779
+vn -0.4528 0.8810 0.1374
+vn -0.8448 -0.4696 0.2563
+vn -0.6088 0.7715 0.1847
+vn -0.7412 -0.6326 0.2248
+vn -0.7412 0.6326 0.2248
+vn -0.6088 -0.7715 0.1847
+vn -0.8448 0.4696 0.2563
+vn -0.4528 -0.8810 0.1374
+vn -0.9161 0.2890 0.2779
+vn -0.2790 -0.9565 0.0846
+vn -0.9524 0.0975 0.2889
+vn -0.0942 0.9951 0.0286
+vn -0.0942 -0.9951 0.0286
+vn -0.9524 -0.0975 0.2889
+vn -0.2790 0.9565 0.0846
+vn -0.4709 -0.8810 0.0464
+vn -0.9527 0.2890 0.0938
+vn -0.2902 -0.9565 0.0286
+vn -0.9904 0.0975 0.0975
+vn -0.0980 0.9951 0.0097
+vn -0.0980 -0.9951 0.0097
+vn -0.9904 -0.0975 0.0976
+vn -0.2902 0.9565 0.0286
+vn -0.9527 -0.2890 0.0938
+vn -0.4709 0.8810 0.0464
+vn -0.8786 -0.4696 0.0865
+vn -0.6332 0.7715 0.0624
+vn -0.7708 -0.6326 0.0759
+vn -0.7708 0.6326 0.0759
+vn -0.6332 -0.7715 0.0624
+vn -0.8786 0.4696 0.0865
+vn -0.8786 -0.4696 -0.0865
+vn -0.6332 0.7715 -0.0624
+vn -0.7708 -0.6326 -0.0759
+vn -0.7708 0.6326 -0.0759
+vn -0.6332 -0.7715 -0.0624
+vn -0.8786 0.4696 -0.0865
+vn -0.4709 -0.8810 -0.0464
+vn -0.9527 0.2890 -0.0938
+vn -0.2902 -0.9565 -0.0286
+vn -0.9904 0.0975 -0.0975
+vn -0.0980 0.9951 -0.0097
+vn -0.0980 -0.9951 -0.0097
+vn -0.9904 -0.0975 -0.0976
+vn -0.2902 0.9565 -0.0286
+vn -0.9527 -0.2890 -0.0938
+vn -0.4709 0.8810 -0.0464
+vn -0.2790 -0.9565 -0.0846
+vn -0.9524 0.0975 -0.2889
+vn -0.0942 0.9951 -0.0286
+vn -0.0942 -0.9951 -0.0286
+vn -0.9524 -0.0975 -0.2889
+vn -0.2790 0.9565 -0.0846
+vn -0.9161 -0.2890 -0.2779
+vn -0.4528 0.8810 -0.1374
+vn -0.8448 -0.4696 -0.2563
+vn -0.6088 0.7715 -0.1847
+vn -0.7412 -0.6326 -0.2248
+vn -0.7412 0.6326 -0.2248
+vn -0.6088 -0.7715 -0.1847
+vn -0.8448 0.4696 -0.2563
+vn -0.4528 -0.8810 -0.1374
+vn -0.9161 0.2890 -0.2779
+vn -0.5611 0.7715 -0.2999
+vn -0.6831 -0.6326 -0.3651
+vn -0.6831 0.6326 -0.3651
+vn -0.5611 -0.7715 -0.2999
+vn -0.7786 0.4696 -0.4162
+vn -0.4173 -0.8810 -0.2231
+vn -0.8443 0.2890 -0.4513
+vn -0.2571 -0.9565 -0.1374
+vn -0.8777 0.0975 -0.4691
+vn -0.0869 0.9951 -0.0464
+vn -0.0869 -0.9951 -0.0464
+vn -0.8777 -0.0975 -0.4691
+vn -0.2571 0.9565 -0.1374
+vn -0.8443 -0.2890 -0.4513
+vn -0.4173 0.8810 -0.2231
+vn -0.7786 -0.4696 -0.4162
+vn -0.7693 0.0975 -0.6314
+vn -0.0761 0.9951 -0.0625
+vn -0.0761 -0.9951 -0.0625
+vn -0.7693 -0.0975 -0.6314
+vn -0.2254 0.9565 -0.1850
+vn -0.7400 -0.2890 -0.6073
+vn -0.3658 0.8810 -0.3002
+vn -0.6825 -0.4696 -0.5601
+vn -0.4918 0.7715 -0.4036
+vn -0.5987 -0.6326 -0.4913
+vn -0.5987 0.6326 -0.4913
+vn -0.4918 -0.7715 -0.4036
+vn -0.6825 0.4696 -0.5601
+vn -0.3658 -0.8810 -0.3002
+vn -0.7400 0.2890 -0.6073
+vn -0.2254 -0.9565 -0.1850
+vn -0.4913 -0.6326 -0.5987
+vn -0.4913 0.6326 -0.5987
+vn -0.4036 -0.7715 -0.4918
+vn -0.5601 0.4696 -0.6825
+vn -0.3002 -0.8810 -0.3658
+vn -0.6073 0.2890 -0.7400
+vn -0.1850 -0.9565 -0.2254
+vn -0.6314 0.0975 -0.7693
+vn -0.0625 0.9951 -0.0761
+vn -0.0625 -0.9951 -0.0761
+vn -0.6314 -0.0975 -0.7693
+vn -0.1850 0.9565 -0.2254
+vn -0.6073 -0.2890 -0.7400
+vn -0.3002 0.8810 -0.3658
+vn -0.5601 -0.4696 -0.6825
+vn -0.4036 0.7715 -0.4918
+vn -0.0464 0.9951 -0.0869
+vn -0.0464 -0.9951 -0.0869
+vn -0.4691 -0.0975 -0.8777
+vn -0.1374 0.9565 -0.2571
+vn -0.4513 -0.2890 -0.8443
+vn -0.2230 0.8810 -0.4173
+vn -0.4162 -0.4696 -0.7786
+vn -0.2999 0.7715 -0.5611
+vn -0.3651 -0.6326 -0.6831
+vn -0.3651 0.6326 -0.6831
+vn -0.2999 -0.7715 -0.5611
+vn -0.4162 0.4696 -0.7786
+vn -0.2230 -0.8810 -0.4173
+vn -0.4513 0.2890 -0.8443
+vn -0.1374 -0.9565 -0.2571
+vn -0.4691 0.0975 -0.8777
+vn -0.2248 0.6326 -0.7412
+vn -0.1847 -0.7715 -0.6088
+vn -0.2563 0.4696 -0.8448
+vn -0.1374 -0.8810 -0.4528
+vn -0.2779 0.2890 -0.9161
+vn -0.0846 -0.9565 -0.2790
+vn -0.2889 0.0975 -0.9524
+vn -0.0286 0.9951 -0.0942
+vn -0.0286 -0.9951 -0.0942
+vn -0.2889 -0.0975 -0.9524
+vn -0.0846 0.9565 -0.2790
+vn -0.2779 -0.2890 -0.9161
+vn -0.1374 0.8810 -0.4528
+vn -0.2563 -0.4696 -0.8448
+vn -0.1847 0.7715 -0.6088
+vn -0.2248 -0.6326 -0.7412
+vn -0.0976 -0.0975 -0.9904
+vn -0.0286 0.9565 -0.2902
+vn -0.0938 -0.2890 -0.9527
+vn -0.0464 0.8810 -0.4709
+vn -0.0865 -0.4696 -0.8786
+vn -0.0624 0.7715 -0.6332
+vn -0.0759 -0.6326 -0.7708
+vn -0.0759 0.6326 -0.7708
+vn -0.0624 -0.7715 -0.6332
+vn -0.0865 0.4696 -0.8786
+vn -0.0464 -0.8810 -0.4709
+vn -0.0938 0.2890 -0.9527
+vn -0.0286 -0.9565 -0.2902
+vn -0.0976 0.0975 -0.9904
+vn -0.0097 0.9951 -0.0980
+vn -0.0097 -0.9951 -0.0980
+vn 0.0975 -0.0975 -0.9904
+vn 0.0975 0.0976 -0.9904
+vn 0.2231 -0.8810 -0.4173
+vn 0.2230 0.8810 -0.4173
+vn 0.2254 -0.9565 -0.1850
+vn 0.4173 -0.8810 0.2231
+vn 0.2571 0.9566 0.1374
+vn 0.4173 0.8810 0.2230
+vn 0.2231 -0.8810 0.4173
+vn -0.0976 -0.0975 0.9904
+vn -0.0975 0.0975 0.9904
+vn -0.2231 0.8810 0.4173
+vn -0.2231 -0.8810 0.4173
+vn -0.2254 -0.9565 0.1850
+vn -0.4173 -0.8810 0.2230
+vn -0.9904 0.0975 0.0976
+vn -0.9904 -0.0975 0.0975
+vn -0.9904 0.0975 -0.0976
+vn -0.9904 -0.0975 -0.0975
+vt 0.750000 0.812500
+vt 0.750000 0.687500
+vt 0.750000 0.562500
+vt 0.750000 0.500000
+vt 0.750000 0.437500
+vt 0.750000 0.312500
+vt 0.718750 0.937500
+vt 0.718750 0.875000
+vt 0.718750 0.812500
+vt 0.718750 0.750000
+vt 0.718750 0.687500
+vt 0.718750 0.625000
+vt 0.718750 0.562500
+vt 0.718750 0.500000
+vt 0.718750 0.437500
+vt 0.718750 0.375000
+vt 0.718750 0.312500
+vt 0.718750 0.250000
+vt 0.718750 0.187500
+vt 0.718750 0.125000
+vt 0.718750 0.062500
+vt 0.687500 0.937500
+vt 0.687500 0.875000
+vt 0.687500 0.812500
+vt 0.687500 0.750000
+vt 0.687500 0.687500
+vt 0.687500 0.625000
+vt 0.687500 0.562500
+vt 0.687500 0.500000
+vt 0.687500 0.437500
+vt 0.687500 0.375000
+vt 0.687500 0.312500
+vt 0.687500 0.250000
+vt 0.687500 0.187500
+vt 0.687500 0.125000
+vt 0.687500 0.062500
+vt 0.656250 0.937500
+vt 0.656250 0.875000
+vt 0.656250 0.812500
+vt 0.656250 0.750000
+vt 0.656250 0.687500
+vt 0.656250 0.625000
+vt 0.656250 0.562500
+vt 0.656250 0.500000
+vt 0.656250 0.437500
+vt 0.656250 0.375000
+vt 0.656250 0.312500
+vt 0.656250 0.250000
+vt 0.656250 0.187500
+vt 0.656250 0.125000
+vt 0.656250 0.062500
+vt 0.625000 0.937500
+vt 0.625000 0.875000
+vt 0.625000 0.812500
+vt 0.625000 0.750000
+vt 0.625000 0.687500
+vt 0.625000 0.625000
+vt 0.625000 0.562500
+vt 0.625000 0.500000
+vt 0.625000 0.437500
+vt 0.625000 0.375000
+vt 0.625000 0.312500
+vt 0.625000 0.250000
+vt 0.625000 0.187500
+vt 0.625000 0.125000
+vt 0.625000 0.062500
+vt 0.593750 0.937500
+vt 0.593750 0.875000
+vt 0.593750 0.812500
+vt 0.593750 0.750000
+vt 0.593750 0.687500
+vt 0.593750 0.625000
+vt 0.593750 0.562500
+vt 0.593750 0.500000
+vt 0.593750 0.437500
+vt 0.593750 0.375000
+vt 0.593750 0.312500
+vt 0.593750 0.250000
+vt 0.593750 0.187500
+vt 0.593750 0.125000
+vt 0.593750 0.062500
+vt 0.734375 1.000000
+vt 0.703125 1.000000
+vt 0.671875 1.000000
+vt 0.640625 1.000000
+vt 0.609375 1.000000
+vt 0.578125 1.000000
+vt 0.546875 1.000000
+vt 0.515625 1.000000
+vt 0.484375 1.000000
+vt 0.453125 1.000000
+vt 0.421875 1.000000
+vt 0.390625 1.000000
+vt 0.359375 1.000000
+vt 0.328125 1.000000
+vt 0.296875 1.000000
+vt 0.265625 1.000000
+vt 0.234375 1.000000
+vt 0.203125 1.000000
+vt 0.171875 1.000000
+vt 0.140625 1.000000
+vt 0.109375 1.000000
+vt 0.078125 1.000000
+vt 0.046875 1.000000
+vt 0.015625 1.000000
+vt 0.984375 1.000000
+vt 0.953125 1.000000
+vt 0.921875 1.000000
+vt 0.890625 1.000000
+vt 0.859375 1.000000
+vt 0.828125 1.000000
+vt 0.796875 1.000000
+vt 0.765625 1.000000
+vt 0.562500 0.937500
+vt 0.562500 0.875000
+vt 0.562500 0.812500
+vt 0.562500 0.750000
+vt 0.562500 0.687500
+vt 0.562500 0.625000
+vt 0.562500 0.562500
+vt 0.562500 0.500000
+vt 0.562500 0.437500
+vt 0.562500 0.375000
+vt 0.562500 0.312500
+vt 0.562500 0.250000
+vt 0.562500 0.187500
+vt 0.562500 0.125000
+vt 0.562500 0.062500
+vt 0.531250 0.937500
+vt 0.531250 0.875000
+vt 0.531250 0.812500
+vt 0.531250 0.750000
+vt 0.531250 0.687500
+vt 0.531250 0.625000
+vt 0.531250 0.562500
+vt 0.531250 0.500000
+vt 0.531250 0.437500
+vt 0.531250 0.375000
+vt 0.531250 0.312500
+vt 0.531250 0.250000
+vt 0.531250 0.187500
+vt 0.531250 0.125000
+vt 0.531250 0.062500
+vt 0.500000 0.937500
+vt 0.500000 0.875000
+vt 0.500000 0.812500
+vt 0.500000 0.750000
+vt 0.500000 0.687500
+vt 0.500000 0.625000
+vt 0.500000 0.562500
+vt 0.500000 0.500000
+vt 0.500000 0.437500
+vt 0.500000 0.375000
+vt 0.500000 0.312500
+vt 0.500000 0.250000
+vt 0.500000 0.187500
+vt 0.500000 0.125000
+vt 0.500000 0.062500
+vt 0.468750 0.937500
+vt 0.468750 0.875000
+vt 0.468750 0.812500
+vt 0.468750 0.750000
+vt 0.468750 0.687500
+vt 0.468750 0.625000
+vt 0.468750 0.562500
+vt 0.468750 0.500000
+vt 0.468750 0.437500
+vt 0.468750 0.375000
+vt 0.468750 0.312500
+vt 0.468750 0.250000
+vt 0.468750 0.187500
+vt 0.468750 0.125000
+vt 0.468750 0.062500
+vt 0.437500 0.937500
+vt 0.437500 0.875000
+vt 0.437500 0.812500
+vt 0.437500 0.750000
+vt 0.437500 0.687500
+vt 0.437500 0.625000
+vt 0.437500 0.562500
+vt 0.437500 0.500000
+vt 0.437500 0.437500
+vt 0.437500 0.375000
+vt 0.437500 0.312500
+vt 0.437500 0.250000
+vt 0.437500 0.187500
+vt 0.437500 0.125000
+vt 0.437500 0.062500
+vt 0.406250 0.937500
+vt 0.406250 0.875000
+vt 0.406250 0.812500
+vt 0.406250 0.750000
+vt 0.406250 0.687500
+vt 0.406250 0.625000
+vt 0.406250 0.562500
+vt 0.406250 0.500000
+vt 0.406250 0.437500
+vt 0.406250 0.375000
+vt 0.406250 0.312500
+vt 0.406250 0.250000
+vt 0.406250 0.187500
+vt 0.406250 0.125000
+vt 0.406250 0.062500
+vt 0.375000 0.937500
+vt 0.375000 0.875000
+vt 0.375000 0.812500
+vt 0.375000 0.750000
+vt 0.375000 0.687500
+vt 0.375000 0.625000
+vt 0.375000 0.562500
+vt 0.375000 0.500000
+vt 0.375000 0.437500
+vt 0.375000 0.375000
+vt 0.375000 0.312500
+vt 0.375000 0.250000
+vt 0.375000 0.187500
+vt 0.375000 0.125000
+vt 0.375000 0.062500
+vt 0.343750 0.937500
+vt 0.343750 0.875000
+vt 0.343750 0.812500
+vt 0.343750 0.750000
+vt 0.343750 0.687500
+vt 0.343750 0.625000
+vt 0.343750 0.562500
+vt 0.343750 0.500000
+vt 0.343750 0.437500
+vt 0.343750 0.375000
+vt 0.343750 0.312500
+vt 0.343750 0.250000
+vt 0.343750 0.187500
+vt 0.343750 0.125000
+vt 0.343750 0.062500
+vt 0.312500 0.937500
+vt 0.312500 0.875000
+vt 0.312500 0.812500
+vt 0.312500 0.750000
+vt 0.312500 0.687500
+vt 0.312500 0.625000
+vt 0.312500 0.562500
+vt 0.312500 0.500000
+vt 0.312500 0.437500
+vt 0.312500 0.375000
+vt 0.312500 0.312500
+vt 0.312500 0.250000
+vt 0.312500 0.187500
+vt 0.312500 0.125000
+vt 0.312500 0.062500
+vt 0.281250 0.937500
+vt 0.281250 0.875000
+vt 0.281250 0.812500
+vt 0.281250 0.750000
+vt 0.281250 0.687500
+vt 0.281250 0.625000
+vt 0.281250 0.562500
+vt 0.281250 0.500000
+vt 0.281250 0.437500
+vt 0.281250 0.375000
+vt 0.281250 0.312500
+vt 0.281250 0.250000
+vt 0.281250 0.187500
+vt 0.281250 0.125000
+vt 0.281250 0.062500
+vt 0.250000 0.937500
+vt 0.250000 0.875000
+vt 0.250000 0.812500
+vt 0.250000 0.750000
+vt 0.250000 0.687500
+vt 0.250000 0.625000
+vt 0.250000 0.562500
+vt 0.250000 0.500000
+vt 0.250000 0.437500
+vt 0.250000 0.375000
+vt 0.250000 0.312500
+vt 0.250000 0.250000
+vt 0.250000 0.187500
+vt 0.250000 0.125000
+vt 0.250000 0.062500
+vt 0.218750 0.937500
+vt 0.218750 0.875000
+vt 0.218750 0.812500
+vt 0.218750 0.750000
+vt 0.218750 0.687500
+vt 0.218750 0.625000
+vt 0.218750 0.562500
+vt 0.218750 0.500000
+vt 0.218750 0.437500
+vt 0.218750 0.375000
+vt 0.218750 0.312500
+vt 0.218750 0.250000
+vt 0.218750 0.187500
+vt 0.218750 0.125000
+vt 0.218750 0.062500
+vt 0.187500 0.937500
+vt 0.187500 0.875000
+vt 0.187500 0.812500
+vt 0.187500 0.750000
+vt 0.187500 0.687500
+vt 0.187500 0.625000
+vt 0.187500 0.562500
+vt 0.187500 0.500000
+vt 0.187500 0.437500
+vt 0.187500 0.375000
+vt 0.187500 0.312500
+vt 0.187500 0.250000
+vt 0.187500 0.187500
+vt 0.187500 0.125000
+vt 0.187500 0.062500
+vt 0.156250 0.937500
+vt 0.156250 0.875000
+vt 0.156250 0.812500
+vt 0.156250 0.750000
+vt 0.156250 0.687500
+vt 0.156250 0.625000
+vt 0.156250 0.562500
+vt 0.156250 0.500000
+vt 0.156250 0.437500
+vt 0.156250 0.375000
+vt 0.156250 0.312500
+vt 0.156250 0.250000
+vt 0.156250 0.187500
+vt 0.156250 0.125000
+vt 0.156250 0.062500
+vt 0.125000 0.937500
+vt 0.125000 0.875000
+vt 0.125000 0.812500
+vt 0.125000 0.750000
+vt 0.125000 0.687500
+vt 0.125000 0.625000
+vt 0.125000 0.562500
+vt 0.125000 0.500000
+vt 0.125000 0.437500
+vt 0.125000 0.375000
+vt 0.125000 0.312500
+vt 0.125000 0.250000
+vt 0.125000 0.187500
+vt 0.125000 0.125000
+vt 0.125000 0.062500
+vt 0.734375 0.000000
+vt 0.703125 0.000000
+vt 0.671875 0.000000
+vt 0.640625 0.000000
+vt 0.609375 0.000000
+vt 0.578125 0.000000
+vt 0.546875 0.000000
+vt 0.515625 0.000000
+vt 0.484375 0.000000
+vt 0.453125 0.000000
+vt 0.421875 0.000000
+vt 0.390625 0.000000
+vt 0.359375 0.000000
+vt 0.328125 0.000000
+vt 0.296875 0.000000
+vt 0.265625 0.000000
+vt 0.234375 0.000000
+vt 0.203125 0.000000
+vt 0.171875 0.000000
+vt 0.140625 0.000000
+vt 0.109375 0.000000
+vt 0.078125 0.000000
+vt 0.046875 0.000000
+vt 0.015625 0.000000
+vt 0.984375 0.000000
+vt 0.953125 0.000000
+vt 0.921875 0.000000
+vt 0.890625 0.000000
+vt 0.859375 0.000000
+vt 0.828125 0.000000
+vt 0.796875 0.000000
+vt 0.765625 0.000000
+vt 0.093750 0.937500
+vt 0.093750 0.875000
+vt 0.093750 0.812500
+vt 0.093750 0.750000
+vt 0.093750 0.687500
+vt 0.093750 0.625000
+vt 0.093750 0.562500
+vt 0.093750 0.500000
+vt 0.093750 0.437500
+vt 0.093750 0.375000
+vt 0.093750 0.312500
+vt 0.093750 0.250000
+vt 0.093750 0.187500
+vt 0.093750 0.125000
+vt 0.093750 0.062500
+vt 0.062500 0.937500
+vt 0.062500 0.875000
+vt 0.062500 0.812500
+vt 0.062500 0.750000
+vt 0.062500 0.687500
+vt 0.062500 0.625000
+vt 0.062500 0.562500
+vt 0.062500 0.500000
+vt 0.062500 0.437500
+vt 0.062500 0.375000
+vt 0.062500 0.312500
+vt 0.062500 0.250000
+vt 0.062500 0.187500
+vt 0.062500 0.125000
+vt 0.062500 0.062500
+vt 0.031250 0.937500
+vt 0.031250 0.875000
+vt 0.031250 0.812500
+vt 0.031250 0.750000
+vt 0.031250 0.687500
+vt 0.031250 0.625000
+vt 0.031250 0.562500
+vt 0.031250 0.500000
+vt 0.031250 0.437500
+vt 0.031250 0.375000
+vt 0.031250 0.312500
+vt 0.031250 0.250000
+vt 0.031250 0.187500
+vt 0.031250 0.125000
+vt 0.031250 0.062500
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 0.000000 0.875000
+vt 1.000000 0.875000
+vt 0.000000 0.812500
+vt 1.000000 0.812500
+vt 0.000000 0.750000
+vt 1.000000 0.750000
+vt 0.000000 0.687500
+vt 1.000000 0.687500
+vt 0.000000 0.625000
+vt 1.000000 0.625000
+vt 0.000000 0.562500
+vt 1.000000 0.562500
+vt 0.000000 0.500000
+vt 1.000000 0.500000
+vt 0.000000 0.437500
+vt 1.000000 0.437500
+vt 0.000000 0.375000
+vt 1.000000 0.375000
+vt 0.000000 0.312500
+vt 1.000000 0.312500
+vt 0.000000 0.250000
+vt 1.000000 0.250000
+vt 0.000000 0.187500
+vt 1.000000 0.187500
+vt 0.000000 0.125000
+vt 1.000000 0.125000
+vt 1.000000 0.062500
+vt 0.000000 0.062500
+vt 0.968750 0.937500
+vt 0.968750 0.875000
+vt 0.968750 0.812500
+vt 0.968750 0.750000
+vt 0.968750 0.687500
+vt 0.968750 0.625000
+vt 0.968750 0.562500
+vt 0.968750 0.500000
+vt 0.968750 0.437500
+vt 0.968750 0.375000
+vt 0.968750 0.312500
+vt 0.968750 0.250000
+vt 0.968750 0.187500
+vt 0.968750 0.125000
+vt 0.968750 0.062500
+vt 0.937500 0.937500
+vt 0.937500 0.875000
+vt 0.937500 0.812500
+vt 0.937500 0.750000
+vt 0.937500 0.687500
+vt 0.937500 0.625000
+vt 0.937500 0.562500
+vt 0.937500 0.500000
+vt 0.937500 0.437500
+vt 0.937500 0.375000
+vt 0.937500 0.312500
+vt 0.937500 0.250000
+vt 0.937500 0.187500
+vt 0.937500 0.125000
+vt 0.937500 0.062500
+vt 0.906250 0.937500
+vt 0.906250 0.875000
+vt 0.906250 0.812500
+vt 0.906250 0.750000
+vt 0.906250 0.687500
+vt 0.906250 0.625000
+vt 0.906250 0.562500
+vt 0.906250 0.500000
+vt 0.906250 0.437500
+vt 0.906250 0.375000
+vt 0.906250 0.312500
+vt 0.906250 0.250000
+vt 0.906250 0.187500
+vt 0.906250 0.125000
+vt 0.906250 0.062500
+vt 0.875000 0.937500
+vt 0.875000 0.875000
+vt 0.875000 0.812500
+vt 0.875000 0.750000
+vt 0.875000 0.687500
+vt 0.875000 0.625000
+vt 0.875000 0.562500
+vt 0.875000 0.500000
+vt 0.875000 0.437500
+vt 0.875000 0.375000
+vt 0.875000 0.312500
+vt 0.875000 0.250000
+vt 0.875000 0.187500
+vt 0.875000 0.125000
+vt 0.875000 0.062500
+vt 0.843750 0.937500
+vt 0.843750 0.875000
+vt 0.843750 0.812500
+vt 0.843750 0.750000
+vt 0.843750 0.687500
+vt 0.843750 0.625000
+vt 0.843750 0.562500
+vt 0.843750 0.500000
+vt 0.843750 0.437500
+vt 0.843750 0.375000
+vt 0.843750 0.312500
+vt 0.843750 0.250000
+vt 0.843750 0.187500
+vt 0.843750 0.125000
+vt 0.843750 0.062500
+vt 0.812500 0.937500
+vt 0.812500 0.875000
+vt 0.812500 0.812500
+vt 0.812500 0.750000
+vt 0.812500 0.687500
+vt 0.812500 0.625000
+vt 0.812500 0.562500
+vt 0.812500 0.500000
+vt 0.812500 0.437500
+vt 0.812500 0.375000
+vt 0.812500 0.312500
+vt 0.812500 0.250000
+vt 0.812500 0.187500
+vt 0.812500 0.125000
+vt 0.812500 0.062500
+vt 0.781250 0.937500
+vt 0.781250 0.875000
+vt 0.781250 0.812500
+vt 0.781250 0.750000
+vt 0.781250 0.687500
+vt 0.781250 0.625000
+vt 0.781250 0.562500
+vt 0.781250 0.500000
+vt 0.781250 0.437500
+vt 0.781250 0.375000
+vt 0.781250 0.312500
+vt 0.781250 0.250000
+vt 0.781250 0.187500
+vt 0.781250 0.125000
+vt 0.781250 0.062500
+vt 0.750000 0.937500
+vt 0.750000 0.875000
+vt 0.750000 0.750000
+vt 0.750000 0.625000
+vt 0.750000 0.375000
+vt 0.750000 0.250000
+vt 0.750000 0.187500
+vt 0.750000 0.125000
+vt 0.750000 0.062500
+s 0
+f 308/339/1 482/559/1 21/21/1
+f 4/4/2 15/15/2 5/5/2
+f 475/552/3 7/7/3 8/8/3
+f 5/5/4 16/16/4 478/555/4
+f 1/1/5 8/8/5 9/9/5
+f 478/555/6 17/17/6 6/6/6
+f 476/553/7 9/9/7 10/10/7
+f 6/6/8 18/18/8 479/556/8
+f 2/2/9 10/10/9 11/11/9
+f 479/556/10 19/19/10 480/557/10
+f 477/554/11 11/11/11 12/12/11
+f 480/557/12 20/20/12 481/558/12
+f 3/3/13 12/12/13 13/13/13
+f 481/558/14 21/21/14 482/559/14
+f 3/3/15 14/14/15 4/4/15
+f 474/551/16 82/82/16 7/7/16
+f 20/20/17 36/36/17 21/21/17
+f 13/13/18 29/29/18 14/14/18
+f 7/7/19 82/83/19 22/22/19
+f 308/340/20 21/21/20 36/36/20
+f 14/14/21 30/30/21 15/15/21
+f 7/7/22 23/23/22 8/8/22
+f 15/15/23 31/31/23 16/16/23
+f 8/8/24 24/24/24 9/9/24
+f 16/16/25 32/32/25 17/17/25
+f 9/9/26 25/25/26 10/10/26
+f 17/17/27 33/33/27 18/18/27
+f 10/10/28 26/26/28 11/11/28
+f 19/19/29 33/33/29 34/34/29
+f 11/11/30 27/27/30 12/12/30
+f 20/20/31 34/34/31 35/35/31
+f 13/13/32 27/27/32 28/28/32
+f 24/24/33 40/40/33 25/25/33
+f 33/33/34 47/47/34 48/48/34
+f 25/25/35 41/41/35 26/26/35
+f 34/34/36 48/48/36 49/49/36
+f 26/26/37 42/42/37 27/27/37
+f 34/34/38 50/50/38 35/35/38
+f 27/27/39 43/43/39 28/28/39
+f 35/35/40 51/51/40 36/36/40
+f 28/28/41 44/44/41 29/29/41
+f 22/22/42 82/84/42 37/37/42
+f 308/341/43 36/36/43 51/51/43
+f 30/30/44 44/44/44 45/45/44
+f 22/22/45 38/38/45 23/23/45
+f 30/30/46 46/46/46 31/31/46
+f 23/23/47 39/39/47 24/24/47
+f 32/32/48 46/46/48 47/47/48
+f 44/44/49 58/58/49 59/59/49
+f 37/37/50 82/85/50 52/52/50
+f 308/342/51 51/51/51 66/66/51
+f 44/44/52 60/60/52 45/45/52
+f 37/37/53 53/53/53 38/38/53
+f 45/45/54 61/61/54 46/46/54
+f 38/38/55 54/54/55 39/39/55
+f 47/47/56 61/61/56 62/62/56
+f 39/39/57 55/55/57 40/40/57
+f 47/47/58 63/63/58 48/48/58
+f 40/40/59 56/56/59 41/41/59
+f 48/48/60 64/64/60 49/49/60
+f 41/41/61 57/57/61 42/42/61
+f 49/49/62 65/65/62 50/50/62
+f 43/43/63 57/57/63 58/58/63
+f 50/50/64 66/66/64 51/51/64
+f 62/62/65 78/78/65 63/63/65
+f 56/56/66 70/70/66 71/71/66
+f 63/63/67 79/79/67 64/64/67
+f 56/56/68 72/72/68 57/57/68
+f 65/65/69 79/79/69 80/80/69
+f 58/58/70 72/72/70 73/73/70
+f 65/65/71 81/81/71 66/66/71
+f 59/59/72 73/73/72 74/74/72
+f 52/52/73 82/86/73 67/67/73
+f 308/343/74 66/66/74 81/81/74
+f 59/59/75 75/75/75 60/60/75
+f 52/52/76 68/68/76 53/53/76
+f 60/60/77 76/76/77 61/61/77
+f 53/53/78 69/69/78 54/54/78
+f 62/62/79 76/76/79 77/77/79
+f 54/54/80 70/70/80 55/55/80
+f 308/344/81 81/81/81 97/128/81
+f 74/74/82 91/122/82 75/75/82
+f 67/67/83 84/115/83 68/68/83
+f 75/75/84 92/123/84 76/76/84
+f 68/68/85 85/116/85 69/69/85
+f 77/77/86 92/123/86 93/124/86
+f 69/69/87 86/117/87 70/70/87
+f 77/77/88 94/125/88 78/78/88
+f 71/71/89 86/117/89 87/118/89
+f 78/78/90 95/126/90 79/79/90
+f 71/71/91 88/119/91 72/72/91
+f 79/79/92 96/127/92 80/80/92
+f 73/73/93 88/119/93 89/120/93
+f 81/81/94 96/127/94 97/128/94
+f 74/74/95 89/120/95 90/121/95
+f 67/67/96 82/87/96 83/114/96
+f 95/126/97 109/140/97 110/141/97
+f 87/118/98 103/134/98 88/119/98
+f 96/127/99 110/141/99 111/142/99
+f 89/120/100 103/134/100 104/135/100
+f 96/127/101 112/143/101 97/128/101
+f 90/121/102 104/135/102 105/136/102
+f 83/114/103 82/88/103 98/129/103
+f 308/345/104 97/128/104 112/143/104
+f 90/121/105 106/137/105 91/122/105
+f 84/115/106 98/129/106 99/130/106
+f 91/122/107 107/138/107 92/123/107
+f 84/115/108 100/131/108 85/116/108
+f 93/124/109 107/138/109 108/139/109
+f 85/116/110 101/132/110 86/117/110
+f 93/124/111 109/140/111 94/125/111
+f 87/118/112 101/132/112 102/133/112
+f 99/130/113 113/144/113 114/145/113
+f 106/137/114 122/153/114 107/138/114
+f 99/130/115 115/146/115 100/131/115
+f 108/139/116 122/153/116 123/154/116
+f 100/131/117 116/147/117 101/132/117
+f 108/139/118 124/155/118 109/140/118
+f 102/133/119 116/147/119 117/148/119
+f 110/141/120 124/155/120 125/156/120
+f 102/133/121 118/149/121 103/134/121
+f 110/141/122 126/157/122 111/142/122
+f 104/135/123 118/149/123 119/150/123
+f 111/142/124 127/158/124 112/143/124
+f 105/136/125 119/150/125 120/151/125
+f 98/129/126 82/89/126 113/144/126
+f 308/346/127 112/143/127 127/158/127
+f 105/136/128 121/152/128 106/137/128
+f 117/148/129 133/164/129 118/149/129
+f 125/156/130 141/172/130 126/157/130
+f 119/150/131 133/164/131 134/165/131
+f 126/157/132 142/173/132 127/158/132
+f 120/151/133 134/165/133 135/166/133
+f 113/144/134 82/90/134 128/159/134
+f 308/347/135 127/158/135 142/173/135
+f 120/151/136 136/167/136 121/152/136
+f 113/144/137 129/160/137 114/145/137
+f 121/152/138 137/168/138 122/153/138
+f 114/145/139 130/161/139 115/146/139
+f 123/154/140 137/168/140 138/169/140
+f 115/146/141 131/162/141 116/147/141
+f 123/154/142 139/170/142 124/155/142
+f 117/148/143 131/162/143 132/163/143
+f 125/156/144 139/170/144 140/171/144
+f 136/167/145 152/183/145 137/168/145
+f 130/161/146 144/175/146 145/176/146
+f 138/169/147 152/183/147 153/184/147
+f 130/161/148 146/177/148 131/162/148
+f 138/169/149 154/185/149 139/170/149
+f 132/163/150 146/177/150 147/178/150
+f 140/171/151 154/185/151 155/186/151
+f 132/163/152 148/179/152 133/164/152
+f 140/171/153 156/187/153 141/172/153
+f 134/165/154 148/179/154 149/180/154
+f 142/173/155 156/187/155 157/188/155
+f 135/166/156 149/180/156 150/181/156
+f 128/159/157 82/91/157 143/174/157
+f 308/348/158 142/173/158 157/188/158
+f 135/166/159 151/182/159 136/167/159
+f 128/159/160 144/175/160 129/160/160
+f 155/186/161 171/202/161 156/187/161
+f 149/180/162 163/194/162 164/195/162
+f 156/187/163 172/203/163 157/188/163
+f 150/181/164 164/195/164 165/196/164
+f 143/174/165 82/92/165 158/189/165
+f 308/349/166 157/188/166 172/203/166
+f 150/181/167 166/197/167 151/182/167
+f 143/174/168 159/190/168 144/175/168
+f 151/182/169 167/198/169 152/183/169
+f 145/176/170 159/190/170 160/191/170
+f 153/184/171 167/198/171 168/199/171
+f 145/176/172 161/192/172 146/177/172
+f 153/184/173 169/200/173 154/185/173
+f 147/178/174 161/192/174 162/193/174
+f 155/186/175 169/200/175 170/201/175
+f 147/178/176 163/194/176 148/179/176
+f 159/190/177 175/206/177 160/191/177
+f 168/199/178 182/213/178 183/214/178
+f 160/191/179 176/207/179 161/192/179
+f 168/199/180 184/215/180 169/200/180
+f 162/193/181 176/207/181 177/208/181
+f 169/200/182 185/216/182 170/201/182
+f 162/193/183 178/209/183 163/194/183
+f 171/202/184 185/216/184 186/217/184
+f 164/195/185 178/209/185 179/210/185
+f 172/203/186 186/217/186 187/218/186
+f 165/196/187 179/210/187 180/211/187
+f 158/189/188 82/93/188 173/204/188
+f 308/350/189 172/203/189 187/218/189
+f 165/196/190 181/212/190 166/197/190
+f 158/189/191 174/205/191 159/190/191
+f 166/197/192 182/213/192 167/198/192
+f 179/210/193 193/224/193 194/225/193
+f 186/217/194 202/233/194 187/218/194
+f 180/211/195 194/225/195 195/226/195
+f 173/204/196 82/94/196 188/219/196
+f 308/351/197 187/218/197 202/233/197
+f 180/211/198 196/227/198 181/212/198
+f 174/205/199 188/219/199 189/220/199
+f 181/212/200 197/228/200 182/213/200
+f 175/206/201 189/220/201 190/221/201
+f 183/214/202 197/228/202 198/229/202
+f 175/206/203 191/222/203 176/207/203
+f 183/214/204 199/230/204 184/215/204
+f 177/208/205 191/222/205 192/223/205
+f 185/216/206 199/230/206 200/231/206
+f 177/208/207 193/224/207 178/209/207
+f 185/216/208 201/232/208 186/217/208
+f 198/229/209 212/243/209 213/244/209
+f 190/221/210 206/237/210 191/222/210
+f 198/229/211 214/245/211 199/230/211
+f 192/223/212 206/237/212 207/238/212
+f 200/231/213 214/245/213 215/246/213
+f 192/223/214 208/239/214 193/224/214
+f 200/231/215 216/247/215 201/232/215
+f 194/225/216 208/239/216 209/240/216
+f 201/232/217 217/248/217 202/233/217
+f 195/226/218 209/240/218 210/241/218
+f 188/219/219 82/95/219 203/234/219
+f 308/352/220 202/233/220 217/248/220
+f 195/226/221 211/242/221 196/227/221
+f 188/219/222 204/235/222 189/220/222
+f 196/227/223 212/243/223 197/228/223
+f 189/220/224 205/236/224 190/221/224
+f 216/247/225 232/263/225 217/248/225
+f 210/241/226 224/255/226 225/256/226
+f 203/234/227 82/96/227 218/249/227
+f 308/353/228 217/248/228 232/263/228
+f 210/241/229 226/257/229 211/242/229
+f 203/234/230 219/250/230 204/235/230
+f 211/242/231 227/258/231 212/243/231
+f 204/235/232 220/251/232 205/236/232
+f 213/244/233 227/258/233 228/259/233
+f 205/236/234 221/252/234 206/237/234
+f 213/244/235 229/260/235 214/245/235
+f 207/238/236 221/252/236 222/253/236
+f 215/246/237 229/260/237 230/261/237
+f 207/238/238 223/254/238 208/239/238
+f 215/246/239 231/262/239 216/247/239
+f 209/240/240 223/254/240 224/255/240
+f 228/259/241 244/275/241 229/260/241
+f 222/253/242 236/267/242 237/268/242
+f 230/261/243 244/275/243 245/276/243
+f 222/253/244 238/269/244 223/254/244
+f 230/261/245 246/277/245 231/262/245
+f 224/255/246 238/269/246 239/270/246
+f 232/263/247 246/277/247 247/278/247
+f 225/256/248 239/270/248 240/271/248
+f 218/249/249 82/97/249 233/264/249
+f 308/354/250 232/263/250 247/278/250
+f 225/256/251 241/272/251 226/257/251
+f 218/249/252 234/265/252 219/250/252
+f 226/257/253 242/273/253 227/258/253
+f 220/251/254 234/265/254 235/266/254
+f 228/259/255 242/273/255 243/274/255
+f 220/251/256 236/267/256 221/252/256
+f 233/264/257 82/98/257 248/279/257
+f 308/355/258 247/278/258 262/293/258
+f 240/271/259 256/287/259 241/272/259
+f 233/264/260 249/280/260 234/265/260
+f 241/272/261 257/288/261 242/273/261
+f 234/265/262 250/281/262 235/266/262
+f 243/274/263 257/288/263 258/289/263
+f 235/266/264 251/282/264 236/267/264
+f 243/274/265 259/290/265 244/275/265
+f 237/268/266 251/282/266 252/283/266
+f 245/276/267 259/290/267 260/291/267
+f 237/268/268 253/284/268 238/269/268
+f 245/276/269 261/292/269 246/277/269
+f 239/270/270 253/284/270 254/285/270
+f 246/277/271 262/293/271 247/278/271
+f 240/271/272 254/285/272 255/286/272
+f 252/283/273 266/297/273 267/298/273
+f 260/291/274 274/305/274 275/306/274
+f 252/283/275 268/299/275 253/284/275
+f 260/291/276 276/307/276 261/292/276
+f 254/285/277 268/299/277 269/300/277
+f 261/292/278 277/308/278 262/293/278
+f 255/286/279 269/300/279 270/301/279
+f 248/279/280 82/99/280 263/294/280
+f 308/356/281 262/293/281 277/308/281
+f 255/286/282 271/302/282 256/287/282
+f 249/280/283 263/294/283 264/295/283
+f 256/287/284 272/303/284 257/288/284
+f 249/280/285 265/296/285 250/281/285
+f 258/289/286 272/303/286 273/304/286
+f 250/281/287 266/297/287 251/282/287
+f 258/289/288 274/305/288 259/290/288
+f 270/301/289 286/317/289 271/302/289
+f 264/295/290 278/309/290 279/310/290
+f 271/302/291 287/318/291 272/303/291
+f 264/295/292 280/311/292 265/296/292
+f 273/304/293 287/318/293 288/319/293
+f 265/296/294 281/312/294 266/297/294
+f 273/304/295 289/320/295 274/305/295
+f 267/298/296 281/312/296 282/313/296
+f 275/306/297 289/320/297 290/321/297
+f 267/298/298 283/314/298 268/299/298
+f 275/306/299 291/322/299 276/307/299
+f 269/300/300 283/314/300 284/315/300
+f 277/308/301 291/322/301 292/323/301
+f 270/301/302 284/315/302 285/316/302
+f 263/294/303 82/100/303 278/309/303
+f 308/357/304 277/308/304 292/323/304
+f 290/321/305 304/335/305 305/336/305
+f 282/313/306 298/329/306 283/314/306
+f 290/321/307 306/337/307 291/322/307
+f 284/315/308 298/329/308 299/330/308
+f 292/323/309 306/337/309 307/338/309
+f 285/316/310 299/330/310 300/331/310
+f 278/309/311 82/101/311 293/324/311
+f 308/358/312 292/323/312 307/338/312
+f 285/316/313 301/332/313 286/317/313
+f 278/309/314 294/325/314 279/310/314
+f 286/317/315 302/333/315 287/318/315
+f 279/310/316 295/326/316 280/311/316
+f 288/319/317 302/333/317 303/334/317
+f 280/311/318 296/327/318 281/312/318
+f 288/319/319 304/335/319 289/320/319
+f 282/313/320 296/327/320 297/328/320
+f 293/324/321 310/372/321 294/325/321
+f 301/332/322 318/380/322 302/333/322
+f 294/325/323 311/373/323 295/326/323
+f 303/334/324 318/380/324 319/381/324
+f 295/326/325 312/374/325 296/327/325
+f 303/334/326 320/382/326 304/335/326
+f 297/328/327 312/374/327 313/375/327
+f 305/336/328 320/382/328 321/383/328
+f 297/328/329 314/376/329 298/329/329
+f 305/336/330 322/384/330 306/337/330
+f 299/330/331 314/376/331 315/377/331
+f 306/337/332 323/385/332 307/338/332
+f 300/331/333 315/377/333 316/378/333
+f 293/324/334 82/102/334 309/371/334
+f 308/359/335 307/338/335 323/385/335
+f 300/331/336 317/379/336 301/332/336
+f 313/375/337 329/391/337 314/376/337
+f 321/383/338 337/399/338 322/384/338
+f 315/377/339 329/391/339 330/392/339
+f 322/384/340 338/400/340 323/385/340
+f 316/378/341 330/392/341 331/393/341
+f 309/371/342 82/103/342 324/386/342
+f 308/360/343 323/385/343 338/400/343
+f 316/378/344 332/394/344 317/379/344
+f 309/371/345 325/387/345 310/372/345
+f 317/379/346 333/395/346 318/380/346
+f 310/372/347 326/388/347 311/373/347
+f 319/381/348 333/395/348 334/396/348
+f 311/373/349 327/389/349 312/374/349
+f 319/381/350 335/397/350 320/382/350
+f 312/374/351 328/390/351 313/375/351
+f 321/383/352 335/397/352 336/398/352
+f 332/394/353 348/410/353 333/395/353
+f 325/387/354 341/403/354 326/388/354
+f 334/396/355 348/410/355 349/411/355
+f 326/388/356 342/404/356 327/389/356
+f 334/396/357 350/412/357 335/397/357
+f 328/390/358 342/404/358 343/405/358
+f 336/398/359 350/412/359 351/413/359
+f 328/390/360 344/406/360 329/391/360
+f 336/398/361 352/414/361 337/399/361
+f 330/392/362 344/406/362 345/407/362
+f 337/399/363 353/415/363 338/400/363
+f 331/393/364 345/407/364 346/408/364
+f 324/386/365 82/104/365 339/401/365
+f 308/361/366 338/400/366 353/415/366
+f 331/393/367 347/409/367 332/394/367
+f 324/386/368 340/402/368 325/387/368
+f 351/413/369 367/442/369 352/414/369
+f 345/407/370 359/426/370 360/428/370
+f 352/414/371 368/445/371 353/415/371
+f 346/408/372 360/428/372 361/430/372
+f 339/401/373 82/105/373 354/416/373
+f 308/362/374 353/415/374 368/445/374
+f 346/408/375 362/432/375 347/409/375
+f 339/401/376 355/418/376 340/402/376
+f 347/409/377 363/434/377 348/410/377
+f 341/403/378 355/418/378 356/420/378
+f 349/411/379 363/434/379 364/436/379
+f 341/403/380 357/422/380 342/404/380
+f 349/411/381 365/438/381 350/412/381
+f 343/405/382 357/422/382 358/424/382
+f 351/413/383 365/438/383 366/440/383
+f 343/405/384 359/426/384 344/406/384
+f 364/437/385 378/455/385 379/456/385
+f 356/421/386 372/449/386 357/423/386
+f 364/437/387 380/457/387 365/439/387
+f 358/425/388 372/449/388 373/450/388
+f 366/441/389 380/457/389 381/458/389
+f 358/425/390 374/451/390 359/427/390
+f 366/441/391 382/459/391 367/443/391
+f 360/429/392 374/451/392 375/452/392
+f 367/443/393 383/460/393 368/444/393
+f 361/431/394 375/452/394 376/453/394
+f 354/417/395 82/106/395 369/446/395
+f 308/363/396 368/444/396 383/460/396
+f 361/431/397 377/454/397 362/433/397
+f 354/417/398 370/447/398 355/419/398
+f 362/433/399 378/455/399 363/435/399
+f 356/421/400 370/447/400 371/448/400
+f 382/459/401 398/475/401 383/460/401
+f 376/453/402 390/467/402 391/468/402
+f 369/446/403 82/107/403 384/461/403
+f 308/364/404 383/460/404 398/475/404
+f 376/453/405 392/469/405 377/454/405
+f 369/446/406 385/462/406 370/447/406
+f 377/454/407 393/470/407 378/455/407
+f 371/448/408 385/462/408 386/463/408
+f 379/456/409 393/470/409 394/471/409
+f 371/448/410 387/464/410 372/449/410
+f 379/456/411 395/472/411 380/457/411
+f 373/450/412 387/464/412 388/465/412
+f 381/458/413 395/472/413 396/473/413
+f 373/450/414 389/466/414 374/451/414
+f 381/458/415 397/474/415 382/459/415
+f 375/452/416 389/466/416 390/467/416
+f 386/463/417 402/479/417 387/464/417
+f 394/471/418 410/487/418 395/472/418
+f 388/465/419 402/479/419 403/480/419
+f 396/473/420 410/487/420 411/488/420
+f 388/465/421 404/481/421 389/466/421
+f 397/474/422 411/488/422 412/489/422
+f 390/467/423 404/481/423 405/482/423
+f 397/474/424 413/490/424 398/475/424
+f 391/468/425 405/482/425 406/483/425
+f 384/461/426 82/108/426 399/476/426
+f 308/365/427 398/475/427 413/490/427
+f 391/468/428 407/484/428 392/469/428
+f 385/462/429 399/476/429 400/477/429
+f 392/469/430 408/485/430 393/470/430
+f 385/462/431 401/478/431 386/463/431
+f 394/471/432 408/485/432 409/486/432
+f 406/483/433 420/497/433 421/498/433
+f 399/476/434 82/109/434 414/491/434
+f 308/366/435 413/490/435 428/505/435
+f 406/483/436 422/499/436 407/484/436
+f 399/476/437 415/492/437 400/477/437
+f 407/484/438 423/500/438 408/485/438
+f 401/478/439 415/492/439 416/493/439
+f 409/486/440 423/500/440 424/501/440
+f 401/478/441 417/494/441 402/479/441
+f 409/486/442 425/502/442 410/487/442
+f 403/480/443 417/494/443 418/495/443
+f 411/488/444 425/502/444 426/503/444
+f 403/480/445 419/496/445 404/481/445
+f 411/488/446 427/504/446 412/489/446
+f 405/482/447 419/496/447 420/497/447
+f 412/489/448 428/505/448 413/490/448
+f 424/501/449 440/517/449 425/502/449
+f 418/495/450 432/509/450 433/510/450
+f 426/503/451 440/517/451 441/518/451
+f 418/495/452 434/511/452 419/496/452
+f 426/503/453 442/519/453 427/504/453
+f 420/497/454 434/511/454 435/512/454
+f 427/504/455 443/520/455 428/505/455
+f 421/498/456 435/512/456 436/513/456
+f 414/491/457 82/110/457 429/506/457
+f 308/367/458 428/505/458 443/520/458
+f 421/498/459 437/514/459 422/499/459
+f 414/491/460 430/507/460 415/492/460
+f 422/499/461 438/515/461 423/500/461
+f 416/493/462 430/507/462 431/508/462
+f 424/501/463 438/515/463 439/516/463
+f 416/493/464 432/509/464 417/494/464
+f 429/506/465 82/111/465 444/521/465
+f 308/368/466 443/520/466 458/535/466
+f 436/513/467 452/529/467 437/514/467
+f 430/507/468 444/521/468 445/522/468
+f 437/514/469 453/530/469 438/515/469
+f 430/507/470 446/523/470 431/508/470
+f 439/516/471 453/530/471 454/531/471
+f 431/508/472 447/524/472 432/509/472
+f 439/516/473 455/532/473 440/517/473
+f 433/510/474 447/524/474 448/525/474
+f 441/518/475 455/532/475 456/533/475
+f 433/510/476 449/526/476 434/511/476
+f 441/518/477 457/534/477 442/519/477
+f 435/512/478 449/526/478 450/527/478
+f 442/519/479 458/535/479 443/520/479
+f 436/513/480 450/527/480 451/528/480
+f 448/525/481 462/539/481 463/540/481
+f 456/533/482 470/547/482 471/548/482
+f 448/525/483 464/541/483 449/526/483
+f 456/533/484 472/549/484 457/534/484
+f 450/527/485 464/541/485 465/542/485
+f 458/535/486 472/549/486 473/550/486
+f 451/528/487 465/542/487 466/543/487
+f 444/521/488 82/112/488 459/536/488
+f 308/369/489 458/535/489 473/550/489
+f 451/528/490 467/544/490 452/529/490
+f 444/521/491 460/537/491 445/522/491
+f 452/529/492 468/545/492 453/530/492
+f 446/523/493 460/537/493 461/538/493
+f 454/531/494 468/545/494 469/546/494
+f 446/523/495 462/539/495 447/524/495
+f 454/531/496 470/547/496 455/532/496
+f 466/543/497 5/5/497 467/544/497
+f 460/537/498 474/551/498 475/552/498
+f 467/544/499 478/555/499 468/545/499
+f 461/538/500 475/552/500 1/1/500
+f 468/545/501 6/6/501 469/546/501
+f 462/539/502 1/1/502 476/553/502
+f 469/546/503 479/556/503 470/547/503
+f 463/540/504 476/553/504 2/2/504
+f 471/548/505 479/556/505 480/557/505
+f 464/541/506 2/2/506 477/554/506
+f 471/548/507 481/558/507 472/549/507
+f 465/542/508 477/554/508 3/3/508
+f 472/549/509 482/559/509 473/550/509
+f 466/543/510 3/3/510 4/4/510
+f 459/536/511 82/113/511 474/551/511
+f 308/370/512 473/550/512 482/559/512
+f 4/4/513 14/14/513 15/15/513
+f 475/552/3 474/551/3 7/7/3
+f 5/5/4 15/15/4 16/16/4
+f 1/1/5 475/552/5 8/8/5
+f 478/555/6 16/16/6 17/17/6
+f 476/553/7 1/1/7 9/9/7
+f 6/6/8 17/17/8 18/18/8
+f 2/2/9 476/553/9 10/10/9
+f 479/556/10 18/18/10 19/19/10
+f 477/554/11 2/2/11 11/11/11
+f 480/557/12 19/19/12 20/20/12
+f 3/3/13 477/554/13 12/12/13
+f 481/558/14 20/20/14 21/21/14
+f 3/3/514 13/13/514 14/14/514
+f 20/20/17 35/35/17 36/36/17
+f 13/13/18 28/28/18 29/29/18
+f 14/14/21 29/29/21 30/30/21
+f 7/7/22 22/22/22 23/23/22
+f 15/15/23 30/30/23 31/31/23
+f 8/8/24 23/23/24 24/24/24
+f 16/16/25 31/31/25 32/32/25
+f 9/9/26 24/24/26 25/25/26
+f 17/17/27 32/32/27 33/33/27
+f 10/10/28 25/25/28 26/26/28
+f 19/19/29 18/18/29 33/33/29
+f 11/11/30 26/26/30 27/27/30
+f 20/20/31 19/19/31 34/34/31
+f 13/13/32 12/12/32 27/27/32
+f 24/24/33 39/39/33 40/40/33
+f 33/33/34 32/32/34 47/47/34
+f 25/25/35 40/40/35 41/41/35
+f 34/34/36 33/33/36 48/48/36
+f 26/26/37 41/41/37 42/42/37
+f 34/34/515 49/49/515 50/50/515
+f 27/27/39 42/42/39 43/43/39
+f 35/35/40 50/50/40 51/51/40
+f 28/28/41 43/43/41 44/44/41
+f 30/30/44 29/29/44 44/44/44
+f 22/22/45 37/37/45 38/38/45
+f 30/30/46 45/45/46 46/46/46
+f 23/23/516 38/38/516 39/39/516
+f 32/32/48 31/31/48 46/46/48
+f 44/44/49 43/43/49 58/58/49
+f 44/44/52 59/59/52 60/60/52
+f 37/37/53 52/52/53 53/53/53
+f 45/45/54 60/60/54 61/61/54
+f 38/38/55 53/53/55 54/54/55
+f 47/47/56 46/46/56 61/61/56
+f 39/39/57 54/54/57 55/55/57
+f 47/47/58 62/62/58 63/63/58
+f 40/40/59 55/55/59 56/56/59
+f 48/48/60 63/63/60 64/64/60
+f 41/41/61 56/56/61 57/57/61
+f 49/49/62 64/64/62 65/65/62
+f 43/43/63 42/42/63 57/57/63
+f 50/50/64 65/65/64 66/66/64
+f 62/62/65 77/77/65 78/78/65
+f 56/56/66 55/55/66 70/70/66
+f 63/63/67 78/78/67 79/79/67
+f 56/56/68 71/71/68 72/72/68
+f 65/65/69 64/64/69 79/79/69
+f 58/58/70 57/57/70 72/72/70
+f 65/65/517 80/80/517 81/81/517
+f 59/59/72 58/58/72 73/73/72
+f 59/59/75 74/74/75 75/75/75
+f 52/52/76 67/67/76 68/68/76
+f 60/60/77 75/75/77 76/76/77
+f 53/53/78 68/68/78 69/69/78
+f 62/62/79 61/61/79 76/76/79
+f 54/54/80 69/69/80 70/70/80
+f 74/74/82 90/121/82 91/122/82
+f 67/67/83 83/114/83 84/115/83
+f 75/75/84 91/122/84 92/123/84
+f 68/68/85 84/115/85 85/116/85
+f 77/77/86 76/76/86 92/123/86
+f 69/69/87 85/116/87 86/117/87
+f 77/77/88 93/124/88 94/125/88
+f 71/71/89 70/70/89 86/117/89
+f 78/78/90 94/125/90 95/126/90
+f 71/71/91 87/118/91 88/119/91
+f 79/79/92 95/126/92 96/127/92
+f 73/73/93 72/72/93 88/119/93
+f 81/81/94 80/80/94 96/127/94
+f 74/74/95 73/73/95 89/120/95
+f 95/126/97 94/125/97 109/140/97
+f 87/118/98 102/133/98 103/134/98
+f 96/127/99 95/126/99 110/141/99
+f 89/120/100 88/119/100 103/134/100
+f 96/127/101 111/142/101 112/143/101
+f 90/121/102 89/120/102 104/135/102
+f 90/121/105 105/136/105 106/137/105
+f 84/115/106 83/114/106 98/129/106
+f 91/122/107 106/137/107 107/138/107
+f 84/115/108 99/130/108 100/131/108
+f 93/124/109 92/123/109 107/138/109
+f 85/116/110 100/131/110 101/132/110
+f 93/124/111 108/139/111 109/140/111
+f 87/118/112 86/117/112 101/132/112
+f 99/130/113 98/129/113 113/144/113
+f 106/137/114 121/152/114 122/153/114
+f 99/130/115 114/145/115 115/146/115
+f 108/139/116 107/138/116 122/153/116
+f 100/131/117 115/146/117 116/147/117
+f 108/139/118 123/154/118 124/155/118
+f 102/133/119 101/132/119 116/147/119
+f 110/141/120 109/140/120 124/155/120
+f 102/133/121 117/148/121 118/149/121
+f 110/141/122 125/156/122 126/157/122
+f 104/135/123 103/134/123 118/149/123
+f 111/142/124 126/157/124 127/158/124
+f 105/136/125 104/135/125 119/150/125
+f 105/136/128 120/151/128 121/152/128
+f 117/148/129 132/163/129 133/164/129
+f 125/156/130 140/171/130 141/172/130
+f 119/150/131 118/149/131 133/164/131
+f 126/157/132 141/172/132 142/173/132
+f 120/151/133 119/150/133 134/165/133
+f 120/151/136 135/166/136 136/167/136
+f 113/144/137 128/159/137 129/160/137
+f 121/152/138 136/167/138 137/168/138
+f 114/145/139 129/160/139 130/161/139
+f 123/154/140 122/153/140 137/168/140
+f 115/146/141 130/161/141 131/162/141
+f 123/154/142 138/169/142 139/170/142
+f 117/148/143 116/147/143 131/162/143
+f 125/156/144 124/155/144 139/170/144
+f 136/167/145 151/182/145 152/183/145
+f 130/161/146 129/160/146 144/175/146
+f 138/169/147 137/168/147 152/183/147
+f 130/161/148 145/176/148 146/177/148
+f 138/169/149 153/184/149 154/185/149
+f 132/163/150 131/162/150 146/177/150
+f 140/171/151 139/170/151 154/185/151
+f 132/163/152 147/178/152 148/179/152
+f 140/171/153 155/186/153 156/187/153
+f 134/165/154 133/164/154 148/179/154
+f 142/173/155 141/172/155 156/187/155
+f 135/166/156 134/165/156 149/180/156
+f 135/166/159 150/181/159 151/182/159
+f 128/159/160 143/174/160 144/175/160
+f 155/186/518 170/201/518 171/202/518
+f 149/180/162 148/179/162 163/194/162
+f 156/187/163 171/202/163 172/203/163
+f 150/181/164 149/180/164 164/195/164
+f 150/181/167 165/196/167 166/197/167
+f 143/174/519 158/189/519 159/190/519
+f 151/182/169 166/197/169 167/198/169
+f 145/176/520 144/175/520 159/190/520
+f 153/184/171 152/183/171 167/198/171
+f 145/176/172 160/191/172 161/192/172
+f 153/184/173 168/199/173 169/200/173
+f 147/178/174 146/177/174 161/192/174
+f 155/186/175 154/185/175 169/200/175
+f 147/178/176 162/193/176 163/194/176
+f 159/190/177 174/205/177 175/206/177
+f 168/199/178 167/198/178 182/213/178
+f 160/191/179 175/206/179 176/207/179
+f 168/199/180 183/214/180 184/215/180
+f 162/193/181 161/192/181 176/207/181
+f 169/200/182 184/215/182 185/216/182
+f 162/193/183 177/208/183 178/209/183
+f 171/202/184 170/201/184 185/216/184
+f 164/195/185 163/194/185 178/209/185
+f 172/203/186 171/202/186 186/217/186
+f 165/196/187 164/195/187 179/210/187
+f 165/196/190 180/211/190 181/212/190
+f 158/189/191 173/204/191 174/205/191
+f 166/197/192 181/212/192 182/213/192
+f 179/210/193 178/209/193 193/224/193
+f 186/217/194 201/232/194 202/233/194
+f 180/211/195 179/210/195 194/225/195
+f 180/211/198 195/226/198 196/227/198
+f 174/205/199 173/204/199 188/219/199
+f 181/212/200 196/227/200 197/228/200
+f 175/206/201 174/205/201 189/220/201
+f 183/214/202 182/213/202 197/228/202
+f 175/206/203 190/221/203 191/222/203
+f 183/214/204 198/229/204 199/230/204
+f 177/208/205 176/207/205 191/222/205
+f 185/216/206 184/215/206 199/230/206
+f 177/208/207 192/223/207 193/224/207
+f 185/216/208 200/231/208 201/232/208
+f 198/229/209 197/228/209 212/243/209
+f 190/221/210 205/236/210 206/237/210
+f 198/229/211 213/244/211 214/245/211
+f 192/223/212 191/222/212 206/237/212
+f 200/231/213 199/230/213 214/245/213
+f 192/223/214 207/238/214 208/239/214
+f 200/231/521 215/246/521 216/247/521
+f 194/225/216 193/224/216 208/239/216
+f 201/232/217 216/247/217 217/248/217
+f 195/226/218 194/225/218 209/240/218
+f 195/226/221 210/241/221 211/242/221
+f 188/219/222 203/234/222 204/235/222
+f 196/227/223 211/242/223 212/243/223
+f 189/220/224 204/235/224 205/236/224
+f 216/247/225 231/262/225 232/263/225
+f 210/241/226 209/240/226 224/255/226
+f 210/241/229 225/256/229 226/257/229
+f 203/234/230 218/249/230 219/250/230
+f 211/242/231 226/257/231 227/258/231
+f 204/235/232 219/250/232 220/251/232
+f 213/244/233 212/243/233 227/258/233
+f 205/236/234 220/251/234 221/252/234
+f 213/244/235 228/259/235 229/260/235
+f 207/238/236 206/237/236 221/252/236
+f 215/246/237 214/245/237 229/260/237
+f 207/238/238 222/253/238 223/254/238
+f 215/246/239 230/261/239 231/262/239
+f 209/240/240 208/239/240 223/254/240
+f 228/259/241 243/274/241 244/275/241
+f 222/253/242 221/252/242 236/267/242
+f 230/261/243 229/260/243 244/275/243
+f 222/253/244 237/268/244 238/269/244
+f 230/261/245 245/276/245 246/277/245
+f 224/255/246 223/254/246 238/269/246
+f 232/263/247 231/262/247 246/277/247
+f 225/256/248 224/255/248 239/270/248
+f 225/256/251 240/271/251 241/272/251
+f 218/249/252 233/264/252 234/265/252
+f 226/257/253 241/272/253 242/273/253
+f 220/251/254 219/250/254 234/265/254
+f 228/259/255 227/258/255 242/273/255
+f 220/251/256 235/266/256 236/267/256
+f 240/271/522 255/286/522 256/287/522
+f 233/264/260 248/279/260 249/280/260
+f 241/272/261 256/287/261 257/288/261
+f 234/265/262 249/280/262 250/281/262
+f 243/274/263 242/273/263 257/288/263
+f 235/266/264 250/281/264 251/282/264
+f 243/274/265 258/289/265 259/290/265
+f 237/268/266 236/267/266 251/282/266
+f 245/276/267 244/275/267 259/290/267
+f 237/268/268 252/283/268 253/284/268
+f 245/276/269 260/291/269 261/292/269
+f 239/270/270 238/269/270 253/284/270
+f 246/277/271 261/292/271 262/293/271
+f 240/271/523 239/270/523 254/285/523
+f 252/283/273 251/282/273 266/297/273
+f 260/291/274 259/290/274 274/305/274
+f 252/283/275 267/298/275 268/299/275
+f 260/291/276 275/306/276 276/307/276
+f 254/285/277 253/284/277 268/299/277
+f 261/292/278 276/307/278 277/308/278
+f 255/286/279 254/285/279 269/300/279
+f 255/286/282 270/301/282 271/302/282
+f 249/280/283 248/279/283 263/294/283
+f 256/287/284 271/302/284 272/303/284
+f 249/280/285 264/295/285 265/296/285
+f 258/289/286 257/288/286 272/303/286
+f 250/281/287 265/296/287 266/297/287
+f 258/289/288 273/304/288 274/305/288
+f 270/301/289 285/316/289 286/317/289
+f 264/295/290 263/294/290 278/309/290
+f 271/302/291 286/317/291 287/318/291
+f 264/295/524 279/310/524 280/311/524
+f 273/304/293 272/303/293 287/318/293
+f 265/296/294 280/311/294 281/312/294
+f 273/304/295 288/319/295 289/320/295
+f 267/298/296 266/297/296 281/312/296
+f 275/306/297 274/305/297 289/320/297
+f 267/298/298 282/313/298 283/314/298
+f 275/306/525 290/321/525 291/322/525
+f 269/300/300 268/299/300 283/314/300
+f 277/308/301 276/307/301 291/322/301
+f 270/301/302 269/300/302 284/315/302
+f 290/321/305 289/320/305 304/335/305
+f 282/313/306 297/328/306 298/329/306
+f 290/321/307 305/336/307 306/337/307
+f 284/315/308 283/314/308 298/329/308
+f 292/323/309 291/322/309 306/337/309
+f 285/316/310 284/315/310 299/330/310
+f 285/316/313 300/331/313 301/332/313
+f 278/309/314 293/324/314 294/325/314
+f 286/317/315 301/332/315 302/333/315
+f 279/310/316 294/325/316 295/326/316
+f 288/319/317 287/318/317 302/333/317
+f 280/311/318 295/326/318 296/327/318
+f 288/319/319 303/334/319 304/335/319
+f 282/313/320 281/312/320 296/327/320
+f 293/324/321 309/371/321 310/372/321
+f 301/332/322 317/379/322 318/380/322
+f 294/325/323 310/372/323 311/373/323
+f 303/334/324 302/333/324 318/380/324
+f 295/326/325 311/373/325 312/374/325
+f 303/334/326 319/381/326 320/382/326
+f 297/328/327 296/327/327 312/374/327
+f 305/336/328 304/335/328 320/382/328
+f 297/328/329 313/375/329 314/376/329
+f 305/336/330 321/383/330 322/384/330
+f 299/330/331 298/329/331 314/376/331
+f 306/337/526 322/384/526 323/385/526
+f 300/331/333 299/330/333 315/377/333
+f 300/331/336 316/378/336 317/379/336
+f 313/375/337 328/390/337 329/391/337
+f 321/383/527 336/398/527 337/399/527
+f 315/377/339 314/376/339 329/391/339
+f 322/384/340 337/399/340 338/400/340
+f 316/378/341 315/377/341 330/392/341
+f 316/378/344 331/393/344 332/394/344
+f 309/371/345 324/386/345 325/387/345
+f 317/379/346 332/394/346 333/395/346
+f 310/372/347 325/387/347 326/388/347
+f 319/381/348 318/380/348 333/395/348
+f 311/373/349 326/388/349 327/389/349
+f 319/381/350 334/396/350 335/397/350
+f 312/374/351 327/389/351 328/390/351
+f 321/383/352 320/382/352 335/397/352
+f 332/394/353 347/409/353 348/410/353
+f 325/387/354 340/402/354 341/403/354
+f 334/396/355 333/395/355 348/410/355
+f 326/388/356 341/403/356 342/404/356
+f 334/396/357 349/411/357 350/412/357
+f 328/390/358 327/389/358 342/404/358
+f 336/398/359 335/397/359 350/412/359
+f 328/390/360 343/405/360 344/406/360
+f 336/398/361 351/413/361 352/414/361
+f 330/392/362 329/391/362 344/406/362
+f 337/399/363 352/414/363 353/415/363
+f 331/393/364 330/392/364 345/407/364
+f 331/393/367 346/408/367 347/409/367
+f 324/386/368 339/401/368 340/402/368
+f 351/413/369 366/440/369 367/442/369
+f 345/407/370 344/406/370 359/426/370
+f 352/414/371 367/442/371 368/445/371
+f 346/408/528 345/407/528 360/428/528
+f 346/408/529 361/430/529 362/432/529
+f 339/401/376 354/416/376 355/418/376
+f 347/409/377 362/432/377 363/434/377
+f 341/403/378 340/402/378 355/418/378
+f 349/411/379 348/410/379 363/434/379
+f 341/403/380 356/420/380 357/422/380
+f 349/411/381 364/436/381 365/438/381
+f 343/405/382 342/404/382 357/422/382
+f 351/413/383 350/412/383 365/438/383
+f 343/405/384 358/424/384 359/426/384
+f 364/437/385 363/435/385 378/455/385
+f 356/421/386 371/448/386 372/449/386
+f 364/437/387 379/456/387 380/457/387
+f 358/425/388 357/423/388 372/449/388
+f 366/441/389 365/439/389 380/457/389
+f 358/425/390 373/450/390 374/451/390
+f 366/441/391 381/458/391 382/459/391
+f 360/429/392 359/427/392 374/451/392
+f 367/443/393 382/459/393 383/460/393
+f 361/431/530 360/429/530 375/452/530
+f 361/431/531 376/453/531 377/454/531
+f 354/417/398 369/446/398 370/447/398
+f 362/433/399 377/454/399 378/455/399
+f 356/421/400 355/419/400 370/447/400
+f 382/459/401 397/474/401 398/475/401
+f 376/453/402 375/452/402 390/467/402
+f 376/453/405 391/468/405 392/469/405
+f 369/446/406 384/461/406 385/462/406
+f 377/454/407 392/469/407 393/470/407
+f 371/448/408 370/447/408 385/462/408
+f 379/456/409 378/455/409 393/470/409
+f 371/448/410 386/463/410 387/464/410
+f 379/456/411 394/471/411 395/472/411
+f 373/450/412 372/449/412 387/464/412
+f 381/458/413 380/457/413 395/472/413
+f 373/450/414 388/465/414 389/466/414
+f 381/458/415 396/473/415 397/474/415
+f 375/452/416 374/451/416 389/466/416
+f 386/463/417 401/478/417 402/479/417
+f 394/471/418 409/486/418 410/487/418
+f 388/465/419 387/464/419 402/479/419
+f 396/473/420 395/472/420 410/487/420
+f 388/465/421 403/480/421 404/481/421
+f 397/474/422 396/473/422 411/488/422
+f 390/467/423 389/466/423 404/481/423
+f 397/474/424 412/489/424 413/490/424
+f 391/468/425 390/467/425 405/482/425
+f 391/468/428 406/483/428 407/484/428
+f 385/462/429 384/461/429 399/476/429
+f 392/469/430 407/484/430 408/485/430
+f 385/462/431 400/477/431 401/478/431
+f 394/471/432 393/470/432 408/485/432
+f 406/483/433 405/482/433 420/497/433
+f 406/483/436 421/498/436 422/499/436
+f 399/476/437 414/491/437 415/492/437
+f 407/484/438 422/499/438 423/500/438
+f 401/478/439 400/477/439 415/492/439
+f 409/486/440 408/485/440 423/500/440
+f 401/478/441 416/493/441 417/494/441
+f 409/486/442 424/501/442 425/502/442
+f 403/480/443 402/479/443 417/494/443
+f 411/488/444 410/487/444 425/502/444
+f 403/480/445 418/495/445 419/496/445
+f 411/488/446 426/503/446 427/504/446
+f 405/482/447 404/481/447 419/496/447
+f 412/489/448 427/504/448 428/505/448
+f 424/501/449 439/516/449 440/517/449
+f 418/495/450 417/494/450 432/509/450
+f 426/503/451 425/502/451 440/517/451
+f 418/495/452 433/510/452 434/511/452
+f 426/503/453 441/518/453 442/519/453
+f 420/497/454 419/496/454 434/511/454
+f 427/504/455 442/519/455 443/520/455
+f 421/498/456 420/497/456 435/512/456
+f 421/498/459 436/513/459 437/514/459
+f 414/491/460 429/506/460 430/507/460
+f 422/499/461 437/514/461 438/515/461
+f 416/493/462 415/492/462 430/507/462
+f 424/501/463 423/500/463 438/515/463
+f 416/493/464 431/508/464 432/509/464
+f 436/513/467 451/528/467 452/529/467
+f 430/507/468 429/506/468 444/521/468
+f 437/514/469 452/529/469 453/530/469
+f 430/507/470 445/522/470 446/523/470
+f 439/516/471 438/515/471 453/530/471
+f 431/508/472 446/523/472 447/524/472
+f 439/516/473 454/531/473 455/532/473
+f 433/510/474 432/509/474 447/524/474
+f 441/518/475 440/517/475 455/532/475
+f 433/510/476 448/525/476 449/526/476
+f 441/518/477 456/533/477 457/534/477
+f 435/512/478 434/511/478 449/526/478
+f 442/519/479 457/534/479 458/535/479
+f 436/513/480 435/512/480 450/527/480
+f 448/525/481 447/524/481 462/539/481
+f 456/533/482 455/532/482 470/547/482
+f 448/525/483 463/540/483 464/541/483
+f 456/533/484 471/548/484 472/549/484
+f 450/527/485 449/526/485 464/541/485
+f 458/535/486 457/534/486 472/549/486
+f 451/528/487 450/527/487 465/542/487
+f 451/528/490 466/543/490 467/544/490
+f 444/521/491 459/536/491 460/537/491
+f 452/529/492 467/544/492 468/545/492
+f 446/523/493 445/522/493 460/537/493
+f 454/531/494 453/530/494 468/545/494
+f 446/523/495 461/538/495 462/539/495
+f 454/531/496 469/546/496 470/547/496
+f 466/543/497 4/4/497 5/5/497
+f 460/537/498 459/536/498 474/551/498
+f 467/544/499 5/5/499 478/555/499
+f 461/538/500 460/537/500 475/552/500
+f 468/545/501 478/555/501 6/6/501
+f 462/539/502 461/538/502 1/1/502
+f 469/546/503 6/6/503 479/556/503
+f 463/540/504 462/539/504 476/553/504
+f 471/548/505 470/547/505 479/556/505
+f 464/541/506 463/540/506 2/2/506
+f 471/548/507 480/557/507 481/558/507
+f 465/542/508 464/541/508 477/554/508
+f 472/549/509 481/558/509 482/559/509
+f 466/543/510 465/542/510 3/3/510
diff --git a/src/main/resources/assets/tectech/models/StarLayer0.png b/src/main/resources/assets/tectech/models/StarLayer0.png
new file mode 100644
index 0000000000..5b0ac0ac67
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/StarLayer0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/models/StarLayer1.png b/src/main/resources/assets/tectech/models/StarLayer1.png
new file mode 100644
index 0000000000..a1b9b25c35
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/StarLayer1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/models/StarLayer2.png b/src/main/resources/assets/tectech/models/StarLayer2.png
new file mode 100644
index 0000000000..d23f1c6915
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/StarLayer2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/models/spaceLayer.png b/src/main/resources/assets/tectech/models/spaceLayer.png
new file mode 100644
index 0000000000..7a327d9126
--- /dev/null
+++ b/src/main/resources/assets/tectech/models/spaceLayer.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds.json b/src/main/resources/assets/tectech/sounds.json
new file mode 100644
index 0000000000..e23f1c1196
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds.json
@@ -0,0 +1,52 @@
+{
+ "microwave_ding": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.microwave_ding",
+ "sounds": [{"name": "microwave_ding","stream": false}]
+ },
+ "fx_scan": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_scan",
+ "sounds": [{"name": "fx_scan","stream": false}]
+ },
+ "fx_alarm": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_alarm",
+ "sounds": [{"name": "fx_alarm","stream": false}]
+ },
+ "fx_click": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_click",
+ "sounds": [{"name": "fx_click","stream": false}]
+ },
+ "fx_lo_freq": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_lo_freq",
+ "sounds": [{"name": "fx_lo_freq","stream": false}]
+ },
+ "fx_mid_freq": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_mid_freq",
+ "sounds": [{"name": "fx_mid_freq","stream": false}]
+ },
+ "fx_hi_freq": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_hi_freq",
+ "sounds": [{"name": "fx_hi_freq","stream": false}]
+ },
+ "fx_noise": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_noise",
+ "sounds": [{"name": "fx_noise","stream": false}]
+ },
+ "fx_woo_uu": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_woo_uu",
+ "sounds": [{"name": "fx_woo_uu","stream": false}]
+ },
+ "fx_whooum": {
+ "category": "block",
+ "subtitle": "tectech.subtitle.fx_whooum",
+ "sounds": [{"name": "fx_whooum","stream": false}]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/sounds/fx_alarm.ogg b/src/main/resources/assets/tectech/sounds/fx_alarm.ogg
new file mode 100644
index 0000000000..6156f6b1eb
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_alarm.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_click.ogg b/src/main/resources/assets/tectech/sounds/fx_click.ogg
new file mode 100644
index 0000000000..3211d0d12e
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_click.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg b/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg
new file mode 100644
index 0000000000..bb21d14ea5
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg b/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg
new file mode 100644
index 0000000000..f02581ae56
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg b/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg
new file mode 100644
index 0000000000..10ac371e19
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_noise.ogg b/src/main/resources/assets/tectech/sounds/fx_noise.ogg
new file mode 100644
index 0000000000..0bb3a58dc0
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_noise.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_scan.ogg b/src/main/resources/assets/tectech/sounds/fx_scan.ogg
new file mode 100644
index 0000000000..0b50e0ca76
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_scan.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_whooum.ogg b/src/main/resources/assets/tectech/sounds/fx_whooum.ogg
new file mode 100644
index 0000000000..4e9331924d
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_whooum.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg b/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg
new file mode 100644
index 0000000000..51a35371a1
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/sounds/microwave_ding.ogg b/src/main/resources/assets/tectech/sounds/microwave_ding.ogg
new file mode 100644
index 0000000000..489c3749d7
--- /dev/null
+++ b/src/main/resources/assets/tectech/sounds/microwave_ding.ogg
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png b/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png
new file mode 100644
index 0000000000..0176d7f27a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png b/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png
new file mode 100644
index 0000000000..d03659020c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta b/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png b/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png
new file mode 100644
index 0000000000..92c6a3691c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png b/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png
new file mode 100644
index 0000000000..d8b0bed4ae
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png
new file mode 100644
index 0000000000..ad6cc6eaa3
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png
new file mode 100644
index 0000000000..401b8ba303
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png
new file mode 100644
index 0000000000..a6d05e419b
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png
new file mode 100644
index 0000000000..6642e5646c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png
new file mode 100644
index 0000000000..ba328f6ed6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png
new file mode 100644
index 0000000000..a6dc35f9a6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png
new file mode 100644
index 0000000000..ba0d727722
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png
new file mode 100644
index 0000000000..c4f62763f7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png
new file mode 100644
index 0000000000..cb3aa9325d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png
new file mode 100644
index 0000000000..9a88af8a0e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png
new file mode 100644
index 0000000000..03c11338c3
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png
new file mode 100644
index 0000000000..e9cbd7d06f
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png
new file mode 100644
index 0000000000..9d709ad4b9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png
new file mode 100644
index 0000000000..d8f9721be0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png
new file mode 100644
index 0000000000..3313d24d7d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png
new file mode 100644
index 0000000000..13102c6823
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png b/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png
new file mode 100644
index 0000000000..8c3a027773
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/entity/projectileEM.png b/src/main/resources/assets/tectech/textures/entity/projectileEM.png
new file mode 100644
index 0000000000..0f2aca19d0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/entity/projectileEM.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/assLineRender.png b/src/main/resources/assets/tectech/textures/gui/assLineRender.png
new file mode 100644
index 0000000000..cc1cd35a7d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/assLineRender.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png b/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png
new file mode 100644
index 0000000000..8a4dc47307
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/green_glow.png b/src/main/resources/assets/tectech/textures/gui/background/green_glow.png
new file mode 100644
index 0000000000..ff6c8ac7f5
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/green_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png b/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png
new file mode 100644
index 0000000000..1e3d22f8c6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png b/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png
new file mode 100644
index 0000000000..434e23ad42
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png b/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png
new file mode 100644
index 0000000000..3f70db25e7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png b/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png
new file mode 100644
index 0000000000..f1afff2b70
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png b/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png
new file mode 100644
index 0000000000..d35be3f276
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/space.png b/src/main/resources/assets/tectech/textures/gui/background/space.png
new file mode 100644
index 0000000000..4ecf8caa09
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/space.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/star.png b/src/main/resources/assets/tectech/textures/gui/background/star.png
new file mode 100644
index 0000000000..ad21ad0868
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/star.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/background/white_glow.png b/src/main/resources/assets/tectech/textures/gui/background/white_glow.png
new file mode 100644
index 0000000000..79df16e73b
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/background/white_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/button/celestial.png b/src/main/resources/assets/tectech/textures/gui/button/celestial.png
new file mode 100644
index 0000000000..5b9bc0688a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/button/celestial.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png b/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png
new file mode 100644
index 0000000000..c2d191d9ce
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png b/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png
new file mode 100644
index 0000000000..4071b19033
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png
new file mode 100644
index 0000000000..04d5ab80bd
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png
new file mode 100644
index 0000000000..ce3e3ed119
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png
new file mode 100644
index 0000000000..75832441e8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png
new file mode 100644
index 0000000000..07c606ec11
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png
new file mode 100644
index 0000000000..48bcca969b
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png
new file mode 100644
index 0000000000..d4307a802c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png
new file mode 100644
index 0000000000..45f6bdf8ce
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png
new file mode 100644
index 0000000000..585859a7b2
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png
new file mode 100644
index 0000000000..8d55a58ff5
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png
new file mode 100644
index 0000000000..d57bbee6e6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png
new file mode 100644
index 0000000000..a7c940c97b
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png
new file mode 100644
index 0000000000..442c9161b7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png
new file mode 100644
index 0000000000..a47abc5829
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png
new file mode 100644
index 0000000000..300c06cbf5
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png
new file mode 100644
index 0000000000..ab7dcec9bb
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png
new file mode 100644
index 0000000000..8edbc8ae1a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png
new file mode 100644
index 0000000000..9887dfefd9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png
new file mode 100644
index 0000000000..6021472296
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png
new file mode 100644
index 0000000000..be40408929
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png
new file mode 100644
index 0000000000..366fb5c8d7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png
new file mode 100644
index 0000000000..1a033c8aec
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png
new file mode 100644
index 0000000000..bc2b89a234
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png
new file mode 100644
index 0000000000..0d06a43a68
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png
new file mode 100644
index 0000000000..c5907fa3fd
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png
new file mode 100644
index 0000000000..4beeaf609c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png
new file mode 100644
index 0000000000..125ff851f0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png
new file mode 100644
index 0000000000..6e28c85673
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png
new file mode 100644
index 0000000000..498246457d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png
new file mode 100644
index 0000000000..f8c25b8625
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png
new file mode 100644
index 0000000000..f900fba9a2
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png
new file mode 100644
index 0000000000..a0ca048fa7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png
new file mode 100644
index 0000000000..5f88156010
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png
new file mode 100644
index 0000000000..cfe3bc8922
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png
new file mode 100644
index 0000000000..cc04de0089
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png
new file mode 100644
index 0000000000..84d45df4c2
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png
new file mode 100644
index 0000000000..45f1196611
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png
new file mode 100644
index 0000000000..685991502e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png
new file mode 100644
index 0000000000..8e9c590652
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png
new file mode 100644
index 0000000000..3fae38f805
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png
new file mode 100644
index 0000000000..477400df07
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png b/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png
new file mode 100644
index 0000000000..a782e3dd7a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png b/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png
new file mode 100644
index 0000000000..8abaf83263
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector.png b/src/main/resources/assets/tectech/textures/gui/picture/connector.png
new file mode 100644
index 0000000000..c333d0ded8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/connector.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png b/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png
new file mode 100644
index 0000000000..c043180b5c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png b/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png
new file mode 100644
index 0000000000..f72c959a52
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png b/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png
new file mode 100644
index 0000000000..cdc6b609af
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png b/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png
new file mode 100644
index 0000000000..daa67e29c0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png b/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png
new file mode 100644
index 0000000000..238409ace8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png b/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png
new file mode 100644
index 0000000000..28ac50bdc0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png
new file mode 100644
index 0000000000..7085898445
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png
new file mode 100644
index 0000000000..6787270397
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png
new file mode 100644
index 0000000000..5fec5cdded
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png
new file mode 100644
index 0000000000..148c8c9202
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png
new file mode 100644
index 0000000000..5a2f011349
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png
new file mode 100644
index 0000000000..a37e194cb0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png
new file mode 100644
index 0000000000..2ecf6e0617
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png
new file mode 100644
index 0000000000..952c00a526
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png
new file mode 100644
index 0000000000..8e2bb24af4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png
new file mode 100644
index 0000000000..e49c9d70c4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png
new file mode 100644
index 0000000000..bbfc03392f
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png
new file mode 100644
index 0000000000..e189df603f
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png
new file mode 100644
index 0000000000..bcd4f367d9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png
new file mode 100644
index 0000000000..3bb337dcf9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png
new file mode 100644
index 0000000000..1595bfde06
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png
new file mode 100644
index 0000000000..685bcd0c4a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png
new file mode 100644
index 0000000000..4464db4ef9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png
new file mode 100644
index 0000000000..8838c9b61b
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png b/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png
new file mode 100644
index 0000000000..d934b38063
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png b/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png
new file mode 100644
index 0000000000..89b957b19a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png b/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png
new file mode 100644
index 0000000000..704d04c26d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png b/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png
new file mode 100644
index 0000000000..bf12f0ccdb
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png
new file mode 100644
index 0000000000..fc56d4663d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png
new file mode 100644
index 0000000000..a5b0d20b38
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png
new file mode 100644
index 0000000000..39ec7d8ef0
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png
new file mode 100644
index 0000000000..b6a26cd8b1
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png
new file mode 100644
index 0000000000..4bc12814a4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png
new file mode 100644
index 0000000000..c4e0f07e22
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png
new file mode 100644
index 0000000000..1dce4d241d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png
new file mode 100644
index 0000000000..17c55cb05d
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png
new file mode 100644
index 0000000000..0d25fffa61
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png
new file mode 100644
index 0000000000..f7c4d01ff6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png
new file mode 100644
index 0000000000..2510a1a99c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png
new file mode 100644
index 0000000000..b5d1afe3b8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png
new file mode 100644
index 0000000000..3837244126
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png
new file mode 100644
index 0000000000..aa0d038e86
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png
new file mode 100644
index 0000000000..66ef4ee2af
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png
new file mode 100644
index 0000000000..bffac90814
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png
new file mode 100644
index 0000000000..1c66b00bc1
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png
new file mode 100644
index 0000000000..17a5f107d4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png
new file mode 100644
index 0000000000..68617d1f96
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png
new file mode 100644
index 0000000000..0ea0bddaed
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png
new file mode 100644
index 0000000000..1801437459
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png
new file mode 100644
index 0000000000..89181e29e9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png
new file mode 100644
index 0000000000..60e831ab7e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png
new file mode 100644
index 0000000000..6c61bd82f3
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png
new file mode 100644
index 0000000000..b3dcc01f22
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png
new file mode 100644
index 0000000000..7e24ef4e71
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png
new file mode 100644
index 0000000000..526576713f
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png
new file mode 100644
index 0000000000..cf0925e421
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png
new file mode 100644
index 0000000000..a09d6c94b8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png
new file mode 100644
index 0000000000..dde5ea73c4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png
new file mode 100644
index 0000000000..a13093b3f5
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png
new file mode 100644
index 0000000000..1945e452d8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png
new file mode 100644
index 0000000000..e1c451f81a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png
new file mode 100644
index 0000000000..974a02f281
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png
new file mode 100644
index 0000000000..f1ba80dec7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png
new file mode 100644
index 0000000000..dc9794a424
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png
new file mode 100644
index 0000000000..e1e659718c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png
new file mode 100644
index 0000000000..fd29923b87
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png
new file mode 100644
index 0000000000..0dbe68fba6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png
new file mode 100644
index 0000000000..a9488280c1
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png
new file mode 100644
index 0000000000..6cefaa0186
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png
new file mode 100644
index 0000000000..90cb09abac
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png
new file mode 100644
index 0000000000..6a11d2df4a
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png
new file mode 100644
index 0000000000..bbe69099c2
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemAstralArray.png b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png
new file mode 100644
index 0000000000..b6dd9a88e6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png
new file mode 100644
index 0000000000..124188d3bd
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png
new file mode 100644
index 0000000000..3500d8f6cb
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png
new file mode 100644
index 0000000000..028f8a467e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png
new file mode 100644
index 0000000000..13d1d0667e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png
new file mode 100644
index 0000000000..0801e3f0d7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png
new file mode 100644
index 0000000000..fc364e52c3
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png b/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png
new file mode 100644
index 0000000000..29b30dc63e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemConstructable.png b/src/main/resources/assets/tectech/textures/items/itemConstructable.png
new file mode 100644
index 0000000000..dd2b6911c9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemConstructable.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png b/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png
new file mode 100644
index 0000000000..3fdfb7f429
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png b/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png
new file mode 100644
index 0000000000..173d0c4e6c
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta b/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png
new file mode 100644
index 0000000000..73c5274ef9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png
new file mode 100644
index 0000000000..006ae1e62f
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png b/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png
new file mode 100644
index 0000000000..201f7e4090
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png b/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png
new file mode 100644
index 0000000000..a3297c5dd4
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png b/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png
new file mode 100644
index 0000000000..2d5d2b2ad9
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png b/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png
new file mode 100644
index 0000000000..2bdbb54ab7
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png b/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png
new file mode 100644
index 0000000000..b61a1725af
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png b/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png
new file mode 100644
index 0000000000..85f8a77b77
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png b/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png
new file mode 100644
index 0000000000..77441e2b21
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png b/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png
new file mode 100644
index 0000000000..8a19f7a142
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png b/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png
new file mode 100644
index 0000000000..f3688b33b8
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png b/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png
new file mode 100644
index 0000000000..e346fc2236
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png b/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png
new file mode 100644
index 0000000000..db124817cc
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png
Binary files differ